Zum Inhalt

App entfernen

Mit dem Stack verschwinden auch die Daten

Sobald die Sperre aufgehoben ist (Schritt 4), löscht syslet beim Entfernen des Stacks auch die Volumes der App mit allen Daten. Klär vorher, ob die Daten noch gebraucht werden und ob es ein Backup davon gibt (Schritt 2).

Ziel

Eine App läuft nicht mehr, und nichts erinnert mehr an sie: kein Container, kein DNS-Eintrag, keine Zeile in der Token-Policy, keine Anbindung in Authentik und kein Eintrag im Backup-Lauf.

Voraussetzungen

Schritte

1. Neuesten Stand holen und plan ausführen

Wie in Änderung ausrollen, Schritt 1 bis 3, im Ordner des Hosts der App und in desec/.

Erwartet: überall „No changes“.

2. Backup klären

Sieh auf der Seite der App unter „Backup“ nach, ob sie gesichert wird.

  • Wird sie gesichert, prüf, dass der letzte Lauf geklappt hat:

    Bash
    cue cmd -t unit=system-backup.service status
    

    Erwartet: status=0/SUCCESS und das Datum der letzten Nacht. Nach dem Entfernen bleiben die Daten der App in den bisherigen Snapshots, bis Backrest diese nach den eingestellten Regeln aufräumt (siehe Backup). Sollen sie länger aufgehoben werden, kläre das vorher in Signal. - Wird sie nicht gesichert, sind die Daten nach Schritt 6 weg. Willst du sie behalten, setz in Schritt 4 bei den Volumes zusätzlich reclaimPolicy: core.#ReclaimPolicyRetain, wie beim Netzwerk in syslet/werner/stack-hedgedoc.cue; dann bleiben sie auf dem Host liegen.

3. Backup-Lauf anpassen

Nur wenn die App in rootfs/werner/usr/bin/system-backup vorkommt. Lösch dort die Zeilen der App und in rootfs/werner/etc/systemd/system/system-backup.service ihre Zeile Requires=, dann kopier beide Dateien auf werner:

Bash
1
2
3
scp rootfs/werner/usr/bin/system-backup werner.garage-lab.de:/usr/bin/system-backup
scp rootfs/werner/etc/systemd/system/system-backup.service werner.garage-lab.de:/etc/systemd/system/system-backup.service
ssh werner.garage-lab.de systemctl daemon-reload

Erwartet: keine Ausgabe außer dem Fortschritt von scp. Committe und pushe die beiden Dateien.

Das muss vor Schritt 6 passieren; sonst sucht der nächste Backup-Lauf nach Containern, die es nicht mehr gibt, und schlägt fehl.

4. Sperre aufheben

Lösch in der Stack-Datei der App den ganzen Block tools.#SysdefLock und roll das aus, wie in Änderung ausrollen, Schritt 5 bis 10.

Erwartet bei plan: für jede Unit der App nur geänderte [X-Syslet]-Werte, etwa:

Text Only
1
2
3
4
5
6
7
8
--- hedgedoc-postgres-data.volume
changed:
  [X-Syslet] RemovalAllowed
    old: false
    new: true
  [X-Syslet] ReclaimPolicy
    old: Retain
    new: Delete

Bei Volumes, die du in Schritt 2 behalten wolltest, fehlt die Zeile ReclaimPolicy. Es startet nichts neu.

Dieser Schritt braucht ein eigenes apply: syslet liest die Sperre vom Host, nicht aus dem Repo. Löschst du Sperre und Stack in einem Zug, bleibt alles stehen (siehe Removing specs in der syslet-Doku).

5. Dateien der App löschen

Bash
git rm syslet/<host>/stack-<app>.cue
git rm syslet/<host>/creds-<app>-*.enc.yaml

Lösch außerdem:

Prüfen, ob noch etwas auf die App verweist:

Bash
grep -rn '<app>' syslet/

Erwartet: keine Ausgabe.

6. Stack entfernen

Wie in Änderung ausrollen, Schritt 5 bis 10, im Ordner des Hosts, danach für den Exporter auch in syslet/containerhost.

Erwartet bei plan:

  • unter Unit files to delete: die Units der App
  • unter Podman volumes to delete: ihre Volumes, außer denen, die du in Schritt 2 behalten wolltest; die Daten darin sind nach dem apply weg
  • unter Secret changes: die Secrets der App mit -
  • in der Zusammenfassung jede Unit der App mit removed, dazu caddy.container mit config updated, reloaded und, wenn die App gesichert wurde, restic.container mit unit updated, restarted

Steht eine Unit der App mit skipped: protected (removalAllowed: false) in der Zusammenfassung, hat Schritt 4 sie nicht erfasst; nimm die Datei mit git restore --staged --worktree syslet/<host>/stack-<app>.cue zurück und mach Schritt 4 noch einmal.

Committe die gelöschten und geänderten Dateien zusammen und push sofort.

7. DNS-Eintrag und Token-Policy löschen

Erst jetzt, wenn Caddy den Hostnamen nicht mehr bedient. Lösch in der Zonendatei des Hosts (desec/desec_garage_lab_de.cue bzw. desec/desec_garage_lab_net.cue) die Einträge mit subname: "<subdomain>" und in der Token-Policy die Zeile _acme-challenge.<subdomain>.

Roll das im Ordner desec/ aus wie in Änderung ausrollen. Erwartet bei plan etwa:

Text Only
1
2
3
4
5
6
7
8
9
Token Policies:
  Token 2262403e-a7f8-41bf-b2f1-d32030cd26b5:
    - delete policy {domain=garage-lab.de subname=_acme-challenge.beispiel type=TXT}
  (no changes) token 2f198c18-934a-4db4-872b-b1ab604c8728

RRsets:
  Domain "garage-lab.de":
    - delete  beispiel                 A
    - delete  beispiel                 AAAA

Bei einer App auf containerhost bitte in Signal außerdem jemanden mit Zugang zum Gateway, den Namen dort zu entfernen.

8. Anbindung in Authentik entfernen

Nur wenn die App an Authentik angebunden war. Lösch in apps/authentik/tf-core/ die Datei application_<app>.tf und die Access-Gruppe der App in group_access.tf, in apps/authentik/tf-groups/ ihre App-Gruppen in group_applications.tf. Roll beide Ordner aus wie in Terraform ausführen.

Erwartet bei terraform plan: nur Ressourcen der App mit will be destroyed.

9. Überwachung und Doku

  • Ist die App öffentlich erreichbar gewesen, bitte jemanden mit Zugang, sie in der Web-Oberfläche von Uptime Kuma zu entfernen (siehe Uptime-Monitoring).
  • Trag die App in docs/explanation/general/apps.md unter „Nicht im Einsatz“ ein oder lösch ihre Zeile; lösch ihre Seite und den Eintrag in nav in zensical.toml, wenn sie nicht wiederkommt, und prüf mit make docs.

Prüfen

  • cue cmd plan zeigt im Ordner des Hosts, in desec/ und gegebenenfalls in syslet/containerhost „No changes“, terraform plan in beiden Authentik-Ordnern No changes.
  • cue cmd ingress listet den Hostnamen nicht mehr.
  • grep -rn '<app>' syslet/ desec/ apps/authentik/ rootfs/ findet nichts mehr.
  • Am Morgen nach dem nächsten Backup zeigt cue cmd -t unit=system-backup.service status status=0/SUCCESS.

Wenn etwas schiefgeht

  • plan bricht ab mit references undefined volume oder references undefined network: Ein Container einer anderen App nutzt noch ein Volume oder Netzwerk dieser App; prüfe mit grep -rn in syslet/<host>/, wer, und frag in Signal nach.
  • Das nächste Backup schlägt fehl: Schritt 3 fehlt oder die Dateien sind nicht auf dem Host; Backup-Meldung von healthchecks.io
  • Daten werden doch noch gebraucht: App aus dem Backup wiederherstellen, solange es Snapshots mit der App gibt
  • Allgemeines: Removing specs und Lock resources in der syslet-Doku