Eine Stack-Datei lesen¶
Diese Seite geht eine echte Stack-Datei Block für Block durch: syslet/werner/stack-hedgedoc.cue, HedgeDoc mit Datenbank.
Die anderen Stack-Dateien sind nach demselben Muster aufgebaut.
Am besten öffnest du die Datei daneben; die Abschnitte hier folgen ihr von oben nach unten. Die Sprache erklärt CUE lesen, unsere Konventionen syslet in diesem Repo.
Überblick¶
flowchart LR
caddy["caddy"]
server["hedgedoc-server"]
db[("hedgedoc-postgres")]
exporter["hedgedoc-postgres-exporter"]
prom["Prometheus<br>auf containerhost"]
subgraph netcaddy ["Netzwerk caddy"]
caddy
end
subgraph nethedgedoc ["Netzwerk hedgedoc (intern)"]
db
end
caddy --> server
server --> db
exporter --> db
prom -->|"Port 9189"| exporter
hedgedoc-server und der Exporter hängen an beiden Netzwerken.
Block für Block¶
Kopf¶
package syslet und die import-Zeilen für die Definitionen aus syslet.
Danach die Version von HedgeDoc in image: hedgedoc: tag:; nur hier wird sie bei einem Update geändert.
Netzwerk¶
Das Netzwerk hedgedoc ist intern (Internal: "true"): Die Container darin erreichen sich gegenseitig, aber nicht das Internet, und von außen ist keiner davon erreichbar.
reclaimPolicy: core.#ReclaimPolicyRetain bewahrt es davor, gelöscht zu werden.
Volumes¶
Drei Volumes: die Dateien der Datenbank, ihre Dumps und die Dateien, die in HedgeDoc hochgeladen werden. Sie werden hier nur angelegt; eingebunden werden sie bei den Containern.
Container hedgedoc-server¶
Die App selbst.
Unit: WantsundUnit: Aftersorgen dafür, dass die Datenbank und Caddy mitgestartet werden und die Datenbank zuerst läuft (Add dependencies between containers in der syslet-Doku).Imagesetzt sich aus dem Namen des Images und der Version von oben zusammen.Labelerzeugt die Labels fürs Monitoring.Environmententhält die Einstellungen von HedgeDoc, darunter die Adressen von Authentik für die Anmeldung (CMD_OAUTH2_*). Was die einzelnen Variablen bedeuten, steht in der Doku von HedgeDoc, nicht hier.Secretgibt die drei Secrets auscreds-hedgedoc-server.enc.yamlals Umgebungsvariablen weiter (siehe Secret-Namen).Volumebindet die Uploads mit:zein, weil auch der Backup-Container sie liest (siehe SELinux).
Sein Speicherlimit steht in syslet/werner/host.cue.
Container hedgedoc-postgres¶
Die Datenbank.
ReadOnly: "true": Das Dateisystem des Containers ist schreibgeschützt; schreiben kann die Datenbank nur in ihre Volumes.User,UIDMapundGIDMaplegen fest, unter welchem Benutzer sie läuft._memrechnet aus den Einstellungen für Postgres aus, wie viel Speicher die Datenbank höchstens braucht; daraus werdenMemoryund die Startparameter inExec.Environmententhält das Passwort der Datenbank im Klartext; warum das in Ordnung ist, steht in Secrets im Repo.Volumebindet die Datenbankdateien mit:Z,Uein (nur dieser Container) und das Volume für die Dumps mit:z,U(auch der Backup-Container);Upasst den Besitzer der Dateien an den Benutzer im Container an.- Die
Health…-Zeilen sind ein Healthcheck: Alle 30 Sekunden prüftpg_isready, ob die Datenbank antwortet; schlägt das mehrmals fehl, wird der Container beendet (HealthOnFailure: "kill") und von systemd neu gestartet. configFileslegt die Skripte aussyslet/scripts/in den Container, mit denen vor jedem Backup der Dump geschrieben wird (siehe Backup).
Container hedgedoc-postgres-exporter¶
Liest Messwerte aus der Datenbank und stellt sie auf Port 9189 des Hosts bereit, wo Prometheus sie über den WireGuard-Tunnel abholt (siehe Monitoring).
Netzwerke zuweisen¶
tools.#SysdefAssignNetwork hängt hedgedoc-server und den Exporter an caddy und alle drei Container an hedgedoc.
hedgedoc-server ist damit an beiden Netzwerken: über caddy erreicht ihn Caddy, über hedgedoc erreicht er die Datenbank.
Die Datenbank hängt nur am internen Netzwerk.
Ingress¶
Macht hedgedoc-server unter https://md.garage-lab.de erreichbar; HedgeDoc lauscht im Container auf Port 3000.
Damit das Zertifikat ausgestellt werden kann, braucht es zusätzlich den passenden Eintrag in desec/ (siehe Caddy).
Backup¶
Gesichert werden die Uploads vollständig und vom Dump-Volume nur die Datei pg.dump.
Das Volume mit den Datenbankdateien selbst steht hier nicht; die Datenbank wird nur über den Dump gesichert.
Locks¶
Gesperrt sind das Netzwerk, alle drei Container und die beiden Datenbank-Volumes (siehe Locks).
Weiterlesen¶
- syslet in diesem Repo: unsere Konventionen für Stack-Dateien
- Podman: was Container, Volumes und Netzwerke sind
- App hinzufügen
- Image-Version anheben