Zum Inhalt

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: Wants und Unit: After sorgen dafür, dass die Datenbank und Caddy mitgestartet werden und die Datenbank zuerst läuft (Add dependencies between containers in der syslet-Doku).
  • Image setzt sich aus dem Namen des Images und der Version von oben zusammen.
  • Label erzeugt die Labels fürs Monitoring.
  • Environment enthä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.
  • Secret gibt die drei Secrets aus creds-hedgedoc-server.enc.yaml als Umgebungsvariablen weiter (siehe Secret-Namen).
  • Volume bindet die Uploads mit :z ein, 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, UIDMap und GIDMap legen fest, unter welchem Benutzer sie läuft.
  • _mem rechnet aus den Einstellungen für Postgres aus, wie viel Speicher die Datenbank höchstens braucht; daraus werden Memory und die Startparameter in Exec.
  • Environment enthält das Passwort der Datenbank im Klartext; warum das in Ordnung ist, steht in Secrets im Repo.
  • Volume bindet die Datenbankdateien mit :Z,U ein (nur dieser Container) und das Volume für die Dumps mit :z,U (auch der Backup-Container); U passt den Besitzer der Dateien an den Benutzer im Container an.
  • Die Health…-Zeilen sind ein Healthcheck: Alle 30 Sekunden prüft pg_isready, ob die Datenbank antwortet; schlägt das mehrmals fehl, wird der Container beendet (HealthOnFailure: "kill") und von systemd neu gestartet.
  • configFiles legt die Skripte aus syslet/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