3 Container fielen heimlich aus dem täglichen pg_dump-Backup raus:
1. moodlit-postgres, herbatrium-postgres — neu seit 2026-05-18 bzw.
2026-05-17, fehlten im db_user_for_container-case (defaultete auf
'postgres', der in diesen Containern nicht existiert).
2. wordeck-postgres — Cards-Rebrand 2026-05-17 hat den Container
umbenannt, der case zeigte aber noch auf 'cards-postgres' → kein
Match → default 'postgres' → role nicht da.
Zusätzlich: psql -U <user> versuchte ohne -d zur DB '<user>' zu
connecten (Default-Verhalten), das gibt's bei den Greenfield-Apps
nicht (DBs heißen mana_moodlit / mana_herbatrium / wordeck). Mit
expliziter `-d template1` (existiert in jeder Postgres-Instanz)
funktioniert die Liste-Datenbanken-Query universell.
Verifiziert per manuellem Run am 2026-05-18:
OK: moodlit-postgres/mana_moodlit (1.0K)
OK: wordeck-postgres/wordeck (575K)
OK: herbatrium-postgres/mana_herbatrium (2.8K)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Brand-Rebrand 2026-05-18 nachgezogen. lesen-postgres existiert nicht
mehr, pageta-postgres läuft mit User pageta in DB pageta. Ohne dieses
Mapping fällt der Container in den Default-Branch (User postgres) und
backup failt still.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Memory `project_backup_cron_todo`: das Skript erkennt postgres-
Container automatisch via `*postgres*`-Pattern, hat aber für jeden
einen expliziten DB-User-Mapping in db_user_for_container().
Drei Container fehlten: seepuls-postgres, manameme-postgres,
lesen-postgres — wurden bisher mit Default-User `postgres`
versucht und schlugen still im Log fehl.
Stand der LIVE-Container am 2026-05-17:
cards-postgres, chorportal-prod-postgres, lesen-postgres,
mana-infra-postgres, manameme-postgres, manaspur-postgres,
nutriphi-postgres, seepuls-postgres, zitare-postgres
Alle drei neuen User entsprechen dem App-Eigen-User-Pattern
(Container-Name ohne `-postgres`-Suffix = App = DB-User).
.env.macmini contains MANA_AI_PUBLIC_KEY_PEM=-----BEGIN PUBLIC KEY----- ...
which bash parses as 'PUBLIC: command not found' under set -e.
Plus drop set -e so a single failed container doesn't abort the rest.
Failures already collected in FAILED_DBS for the summary report.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aktuell deckte das Skript nur mana-infra-postgres ab. Greenfield-Apps
(Cards seit 2026-05-08, Nutriphi seit 2026-05-08, Zitare seit 2026-05-08,
Manaspur seit 2026-05-13) haben eigene Container und waren komplett
NICHT gebackupt.
Plus: launchd-Job lief seit 2026-02-12 nicht — Pfad zeigte auf
mana-monorepo/, das nicht mehr existiert. plist-Update folgt separat.
Test-Run: bash backup-databases.sh sollte jetzt 6 Container × N DBs
dumpen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
High priority stability features:
- Add all LaunchD plists to Git for version control
- Handle crash-looping containers (Restarting status) in ensure-containers.sh
- Add database backup script with daily/weekly rotation
- Add Docker log rotation setup (50MB max, 3 files per container)
New files:
- scripts/mac-mini/backup-databases.sh - Daily pg_dump with rotation
- scripts/mac-mini/setup-docker-logging.sh - Configure daemon.json
- scripts/mac-mini/launchd/*.plist - All 8 LaunchD service configs
- scripts/mac-mini/launchd/README.md - Documentation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>