From 854da1a00059a2d4fe1893f7adf08f5707c80b6a Mon Sep 17 00:00:00 2001 From: Gulum Date: Sun, 19 Jul 2026 10:13:01 +0200 Subject: [PATCH] fix(deploy): postgres:18-Mount /var/lib/postgresql + backup ohne cron - db-Volume auf /var/lib/postgresql (v18 legt PGDATA in .../18/docker; Mount auf .../data laesst v18 nicht starten -> db unhealthy -> App-Rollback) - Backup-Sidecar: Shell-Scheduler statt Alpine-crond (/etc/crontabs fehlt im Debian-postgres:18-Image -> Crash-Loop) Verifiziert auf TrueNAS: Custom-App gerbilmanager RUNNING, 2370 Tiere, Port 8090. Co-Authored-By: Claude Opus 4.8 (1M context) --- deploy/truenas/compose.yaml | 4 +++- deploy/truenas/custom-app.compose.yaml | 5 ++++- deploy/truenas/scripts/entrypoint.sh | 30 ++++++++++++++++++-------- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/deploy/truenas/compose.yaml b/deploy/truenas/compose.yaml index 1c9f03e..6b836ed 100644 --- a/deploy/truenas/compose.yaml +++ b/deploy/truenas/compose.yaml @@ -20,7 +20,9 @@ services: POSTGRES_DB: gerbilmanager POSTGRES_USER: postgres volumes: - - pgdata:/var/lib/postgresql/data + # postgres:18: Volume auf /var/lib/postgresql (PGDATA landet in .../18/docker). + # Mount auf .../data laesst v18 nicht starten -> db unhealthy. + - pgdata:/var/lib/postgresql healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d gerbilmanager"] interval: 10s diff --git a/deploy/truenas/custom-app.compose.yaml b/deploy/truenas/custom-app.compose.yaml index a8be2dd..cc71ab7 100644 --- a/deploy/truenas/custom-app.compose.yaml +++ b/deploy/truenas/custom-app.compose.yaml @@ -28,7 +28,10 @@ services: POSTGRES_USER: postgres TZ: Europe/Berlin volumes: - - /mnt/JailStorage/DockerVolumes/gerbilmanager/pgdata:/var/lib/postgresql/data + # postgres:18 legt PGDATA unter /var/lib/postgresql/18/docker ab und deklariert + # das Volume als /var/lib/postgresql (NICHT .../data). Mount an .../data -> Start + # scheitert ("data in unused mount/volume") -> db unhealthy. + - /mnt/JailStorage/DockerVolumes/gerbilmanager/pgdata:/var/lib/postgresql healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d gerbilmanager"] interval: 10s diff --git a/deploy/truenas/scripts/entrypoint.sh b/deploy/truenas/scripts/entrypoint.sh index fafefc9..ab959e3 100644 --- a/deploy/truenas/scripts/entrypoint.sh +++ b/deploy/truenas/scripts/entrypoint.sh @@ -1,16 +1,28 @@ #!/bin/sh # Backup-Sidecar Entrypoint -# Installiert den Cron-Job und startet crond im Vordergrund. +# ========================== +# Image-unabhaengiger Shell-Scheduler (kein cron noetig): laeuft im Vordergrund und +# stoesst backup.sh einmal taeglich zur konfigurierten Stunde an. Funktioniert auf +# Debian (postgres:18, GNU date) wie auf Alpine — der fruehere crond-Ansatz brauchte +# /etc/crontabs (Alpine-only) und crashte im Debian-Image. set -e -# Cron-Job: taeglich um 03:00 Uhr -CRON_SCHEDULE="${BACKUP_CRON:-0 3 * * *}" -echo "$CRON_SCHEDULE /bin/sh /scripts/backup.sh >> /backups/backup.log 2>&1" > /etc/crontabs/root +BACKUP_HOUR="${BACKUP_HOUR:-3}" # Stunde (0-23) fuer das taegliche Backup +HHMM=$(printf '%02d:00' "$BACKUP_HOUR") -echo "[$(date)] Backup-Sidecar gestartet. Naechste Sicherung: $CRON_SCHEDULE" +echo "[$(date)] Backup-Sidecar gestartet (Shell-Scheduler, taeglich $HHMM)." echo "[$(date)] Backup-Verzeichnis: /backups Fotos: /data/photos" -# Ersten Backup-Lauf direkt beim Start ausfuehren (optional, auskommentieren wenn unerwuenscht) -# /bin/sh /scripts/backup.sh - -exec crond -f -l 6 +while :; do + now=$(date +%s) + target=$(date -d "$HHMM" +%s 2>/dev/null || echo "") + if [ -z "$target" ]; then + # Fallback ohne GNU 'date -d': einfach 24h schlafen. + sleep 86400 + else + [ "$target" -le "$now" ] && target=$(date -d "$HHMM tomorrow" +%s) + sleep "$((target - now))" + fi + echo "[$(date)] Starte Backup ..." + /bin/sh /scripts/backup.sh >> /backups/backup.log 2>&1 || echo "[$(date)] WARNUNG: backup.sh Exit $?" +done