Discovered live: upgrading the test server to v0.2.0 crash-looped with "rules: read dir: open .: no such file or directory". Its /etc/deklarix/deklarix.env predates RULES_DIR entirely (created on first install, before that variable existed) — postinst never overwrites an existing env file, by design, so the variable was simply missing rather than set. main.go's relative default "rules" then resolved against WorkingDirectory=/var/lib/deklarix instead of the actual install path (/usr/share/deklarix/rules). postinst now appends RULES_DIR with its packaged default whenever it's absent, on both fresh installs and upgrades — never overwriting an existing value. Same healing pattern enconf uses for DB_SSLMODE. Verified: reinstalling over the broken config fixed it and the service came back up. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
80 lines
4.1 KiB
Bash
Executable File
80 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# Deklarix — postinst
|
|
set -e
|
|
|
|
SERVICE_USER="deklarix"
|
|
CONFIG_DIR="/etc/deklarix"
|
|
DATA_DIR="/var/lib/deklarix"
|
|
LOG_DIR="/var/log/deklarix"
|
|
|
|
case "$1" in
|
|
configure)
|
|
# ─── apt-Quelle einrichten/aktualisieren ────────────────────
|
|
# Gleiches Muster wie enconf: Gitea-Debian-Registry, Suite =
|
|
# OS-Codename, Komponente = Kanal (aktuell nur "testing"). Ein
|
|
# bereits gewählter Kanal bleibt über Upgrades hinweg erhalten.
|
|
mkdir -p /etc/apt/keyrings
|
|
curl -fsSL "https://git.netcell-it.de/api/packages/projekte/debian/repository.key" \
|
|
-o /etc/apt/keyrings/deklarix-gitea.asc 2>/dev/null || true
|
|
if [ -f /etc/apt/keyrings/deklarix-gitea.asc ]; then
|
|
DX_CODENAME="$(. /etc/os-release 2>/dev/null; echo "${VERSION_CODENAME:-}")"
|
|
case "$DX_CODENAME" in bookworm|trixie) ;; *) DX_CODENAME="trixie" ;; esac
|
|
DX_CHANNEL="$(grep -oE 'projekte/debian[[:space:]]+[a-z]+[[:space:]]+(stable|testing)' \
|
|
/etc/apt/sources.list.d/deklarix.list 2>/dev/null | awk '{print $NF}' | head -1)"
|
|
case "$DX_CHANNEL" in stable|testing) ;; *) DX_CHANNEL="testing" ;; esac
|
|
echo "deb [signed-by=/etc/apt/keyrings/deklarix-gitea.asc] https://git.netcell-it.de/api/packages/projekte/debian $DX_CODENAME $DX_CHANNEL" \
|
|
> /etc/apt/sources.list.d/deklarix.list
|
|
fi
|
|
|
|
# ─── System-User + Verzeichnisse ────────────────────────────
|
|
if ! id -u "$SERVICE_USER" >/dev/null 2>&1; then
|
|
useradd -r -s /usr/sbin/nologin -d "$DATA_DIR" "$SERVICE_USER"
|
|
fi
|
|
mkdir -p "$DATA_DIR" "$LOG_DIR" "$CONFIG_DIR"
|
|
chown "$SERVICE_USER:$SERVICE_USER" "$DATA_DIR" "$LOG_DIR"
|
|
|
|
# ─── Konfiguration ───────────────────────────────────────────
|
|
# Erstinstall: Vorlage kopieren, nicht scharf schalten (Secrets
|
|
# fehlen noch). Upgrade: bestehende deklarix.env bleibt unberührt.
|
|
if [ ! -f "$CONFIG_DIR/deklarix.env" ]; then
|
|
cp "$CONFIG_DIR/deklarix.env.example" "$CONFIG_DIR/deklarix.env"
|
|
chmod 640 "$CONFIG_DIR/deklarix.env"
|
|
chown "root:$SERVICE_USER" "$CONFIG_DIR/deklarix.env"
|
|
fi
|
|
|
|
# ─── Healing: fehlende Variablen aus älteren Installationen ───
|
|
# deklarix.env wird bei Upgrades nie überschrieben (Secrets/
|
|
# Anpassungen bleiben erhalten) — Variablen, die erst nach einer
|
|
# Erstinstallation dazugekommen sind, fehlen dort sonst schlicht
|
|
# und lassen den Dienst mit einem für den Admin überraschenden
|
|
# Fehler abbrechen (z. B. RULES_DIR fehlt -> main.go sucht Regeln
|
|
# im falschen Verzeichnis, obwohl DATABASE_URL längst gesetzt
|
|
# war). Bekannte Variablen mit unkritischem Default werden hier
|
|
# ergänzt, falls sie fehlen — nie überschrieben, nur angehängt.
|
|
if [ -f "$CONFIG_DIR/deklarix.env" ]; then
|
|
grep -q '^RULES_DIR=' "$CONFIG_DIR/deklarix.env" || \
|
|
echo "RULES_DIR=/usr/share/deklarix/rules" >> "$CONFIG_DIR/deklarix.env"
|
|
fi
|
|
|
|
systemctl daemon-reload 2>/dev/null || true
|
|
systemctl enable deklarix.service >/dev/null 2>&1 || true
|
|
|
|
# Nicht blind starten — ohne gesetzte DATABASE_URL würde der Dienst
|
|
# nur in eine Restart-Schleife laufen (main.go bricht sonst bewusst
|
|
# mit log.Fatal ab, siehe CLAUDE.md "keine stillen Fallbacks"). Die
|
|
# Vorlage liefert sie auskommentiert aus — ein Treffer hier bedeutet
|
|
# also wirklich "vom Admin gesetzt", nicht den Platzhalter.
|
|
if grep -qE '^DATABASE_URL=.+' "$CONFIG_DIR/deklarix.env" 2>/dev/null; then
|
|
systemctl restart deklarix.service
|
|
else
|
|
echo ""
|
|
echo " → Deklarix installiert, aber noch nicht gestartet."
|
|
echo " DATABASE_URL in $CONFIG_DIR/deklarix.env setzen, dann:"
|
|
echo " systemctl start deklarix"
|
|
echo ""
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
exit 0
|