Container

Entwickelt: 2022 ... 2023

Das mag jetzt ein wenig verwirren - Container werden doch schon auf etlichen Erklärbär-Seiten beschrieben. Hier geht es aber mehr um einige kleine Helferlein im Zusammenhang mit den Backups auf meinen Servern, die habe ich in die PreBackup- und PostBackup-Scripts gepackt.

Vor ...
Ich bin vorsichtig: Auf den Servern, die docker-compose-Installationen beherbergen, fahre ich die vor einem Backup runter, damit ich einen konsistenten Zustand der Images und Volumes ins Backup kriege. Geht ganz simpel mit cd /path/to/compose_app && docker-compose down. Da ich die nicht im produktiven (also immer-verfügbar-sein-müssen) Betrieb nutze und die Backups per cron zu einer Zeit laufen, wo selbst ich normalerweise schlafe, stört mich das eher nicht.

...und nach dem Backup
Genau so einfach ist dann nach dem Backup das Aktivieren: cd /path/to/compose_app && docker-compose up -d.

systemd:
Auf einem Raspi4 mit RaspberryPi-OS konnte ich die docker-compose-Konstrukte auch als systemd-Services zum Laufen bringen, das Service-Script sieht so aus:

[Unit]
Description=jt_app
Requires=docker.service
After=docker.service

[Service]
Restart=always
User=pi
Group=docker
WorkingDirectory=/path/to/jt_app
# Shutdown container (if running) when unit is started
ExecStartPre=/usr/local/bin/docker-compose -f docker-compose.yml down
# Start container when unit is started
ExecStart=/usr/local/bin/docker-compose -f docker-compose.yml up
# Stop container when unit is stopped
ExecStop=/usr/local/bin/docker-compose -f docker-compose.yml down

[Install]
WantedBy=multi-user.target
Damit sehen die Pre- und PostBackup-Scripts dann so aus:
systemctl stop jt_app.service
und
systemctl start jt_app.service.

PostgreSQL:
Auf einem Debian11-Server habe ich es nicht hingekriegt, die Volumes für meine PostgreSQL-Datenbanken wie gewünscht in das Verzeichnis des DB-Containers zu mappen - die liegen in irgendwelchen obskuren Verzeichnissen unterhalb meines Home. Deshalb mache ich da vor dem Runterfahren von docker-compose im Container einen pg_dump:

# backup dir and current backup file
export BKP_DIR=/path/to/docker-compose/pg_db/pg_backup
export BKP_FILE=$BKP_DIR/pg_$(/usr/bin/date +"%Y-%m-%d").dump

# dump into and compress backup file
echo "dump portal database"
docker exec -t portal_app-pg-db-1 /bin/su postgres -c \
  "/usr/bin/pg_dump -U postgres -h localhost portal" >$BKP_FILE
tar czf ${BKP_FILE}.tgz $BKP_FILE && rm $BKP_FILE

# cleanup oldest backups
echo "removing oldest postgres backups"
cd $BKP_DIR
export bkp_no=1
ls -t | while read bkp_file; do
  test $bkp_no -gt 7 && rm $bkp_file
  bkp_no=`expr $bkp_no + 1`
done

exit 0