5.1 KiB
BACKUP.md
Gitea-Backup mit Portainer Community Edition
Diese Anleitung beschreibt ein praxistaugliches Backup für eine Gitea-Instanz, die per Docker Compose bereitgestellt und über Portainer Community Edition verwaltet wird. Portainer CE bietet keine nativen Scheduled Tasks wie die Business Edition, daher sollte das eigentliche Backup über den Docker-Host per Cron ausgeführt werden.[web:40]
Ausgangslage
In der gezeigten Compose-Datei läuft Gitea als Service server mit dem Container-Namen forgejo, und das Verzeichnis /data im Container ist als Bind-Mount auf /home/hans/forgejo/data auf dem Host gelegt. Dadurch kann ein im Container erzeugtes Backup direkt auf dem Host-Dateisystem abgelegt und dort weiterverarbeitet werden.
Empfohlene Methode
Für eine Gitea-Instanz mit SQLite ist der eingebaute Befehl gitea dump die sauberste Backup-Methode. Laut Gitea-Dokumentation enthält der Dump die Datenbank, Repositories, Konfiguration und weitere Instanzdaten in einem Archiv.[web:1]
Gleichzeitig weist die Gitea-Dokumentation darauf hin, dass für vollständige Konsistenz die Instanz während des Backups gestoppt werden sollte, weil Datenbank, Dateien und Repositories sich während des Betriebs ändern können.[web:1]
Für die vorliegende Portainer-CE-Variante ist deshalb folgendes Vorgehen praxisnah:
- Standardfall:
gitea dumpim laufenden Betrieb, wenn eine kleine Inkonsistenz im Fehlerfall tolerierbar ist.[web:1] - Strenger Fall: Container kurz stoppen, Backup erstellen, Container wieder starten, wenn maximale Konsistenz wichtiger ist.[web:1]
Backup im laufenden Betrieb
Der Backup-Befehl für die vorliegende Konfiguration lautet:
docker exec -u git -w /data forgejo /app/gitea/gitea dump -c /data/gitea/conf/app.ini --file /data/gitea-dump-$(date +%Y%m%d-%H%M).zip
Da /data auf /home/hans/forgejo/data gemountet ist, liegt die erzeugte ZIP-Datei anschließend direkt auf dem Host. Das vereinfacht Rotation, Kopieren auf ein NAS und Restore-Tests deutlich.
Backup mit kurzer Downtime
Wenn das Backup konsistent sein muss, sollte Gitea laut offizieller Dokumentation während der Sicherung gestoppt werden.[web:1]
docker stop forgejo
docker run --rm -v /home/hans/forgejo/data:/data -u 1000:1000 gitea/gitea:latest /app/gitea/gitea dump -c /data/gitea/conf/app.ini --file /data/gitea-dump-$(date +%Y%m%d-%H%M).zip
docker start forgejo
Diese Variante minimiert Race Conditions zwischen SQLite-Datei, Repositories und Metadaten. Für produktionsnahe Setups ist sie die konservativere und technisch sauberere Lösung.[web:1]
Backup-Skript für Portainer CE
Das folgende Skript ist für Portainer CE geeignet, weil es unabhängig von Portainer direkt auf dem Docker-Host läuft. Es erstellt den Dump, verschiebt ihn in ein separates Backup-Verzeichnis und löscht alte Sicherungen automatisch.[web:1][web:40]
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/backup/gitea"
DATA_DIR="/home/hans/forgejo/data"
CONTAINER_NAME="forgejo"
RETENTION_DAYS=14
mkdir -p "$BACKUP_DIR"
TIMESTAMP=$(date +%Y%m%d-%H%M)
TMP_FILE="$DATA_DIR/gitea-dump.zip"
FINAL_FILE="$BACKUP_DIR/gitea-dump-$TIMESTAMP.zip"
/usr/bin/docker exec -u git -w /data "$CONTAINER_NAME" /app/gitea/gitea dump -c /data/gitea/conf/app.ini --file /data/gitea-dump.zip
mv "$TMP_FILE" "$FINAL_FILE"
chmod 600 "$FINAL_FILE"
find "$BACKUP_DIR" -name 'gitea-dump-*.zip' -mtime +$RETENTION_DAYS -delete
Empfohlener Speicherort ist /usr/local/bin/gitea-backup.sh. Das Skript sollte nur für root schreibbar sein.
Zeitgesteuerte Ausführung
Da Portainer CE keine Business-Scheduled-Tasks bereitstellt, ist ein Cronjob auf dem Host der robuste Standardweg.[web:40]
30 2 * * * root /usr/local/bin/gitea-backup.sh >> /var/log/gitea-backup.log 2>&1
Zusätzlich sinnvoll ist ein Monitoring auf Datei-Alter oder Exit-Code, damit fehlgeschlagene Backups nicht unbemerkt bleiben.
Restore
Gitea bietet keinen automatischen Restore-Befehl; die Wiederherstellung ist laut Dokumentation ein manueller Prozess. Nach dem Zurückspielen der Daten sollten die Git-Hooks neu generiert werden, damit Pushes wieder korrekt funktionieren.[web:1]
docker stop forgejo
cd /tmp
unzip /backup/gitea/gitea-dump-YYYYMMDD-HHMM.zip
rm -rf /home/hans/forgejo/data/*
cp -a data/* /home/hans/forgejo/data/
cp -a repos/* /home/hans/forgejo/data/git/repositories/
chown -R 1000:1000 /home/hans/forgejo/data
docker start forgejo
docker exec -u git forgejo /app/gitea/gitea -c /data/gitea/conf/app.ini admin regenerate hooks
Ein Restore sollte regelmäßig in einer Testumgebung geprüft werden. Nur ein erfolgreich getesteter Restore ist ein verlässliches Backup.[web:1]
Härtung
Portainer wird üblicherweise mit Zugriff auf den Docker-Socket betrieben. Dadurch ist Portainer ein mächtiges Verwaltungswerkzeug, aber auch sicherheitsrelevant und sollte per HTTPS und mit restriktivem Zugriff betrieben werden.[web:40]
Außerdem sollten Backups nicht nur lokal auf demselben Host liegen. Ein zusätzliches Ziel wie NAS, rsync-Backup oder S3-kompatibler Storage reduziert das Risiko bei Host-Ausfall erheblich.