| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| .idea | ||
| .env | ||
| .gitignore | ||
| AGENTS.md | ||
| CICD-Actions.md | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| LICENSE | ||
| Projekt.md | ||
| README.md | ||
Docker-Backup (shyim) – Backup-Daemon (Stack-Template)
shyim/docker-backup sichert Datenbanken und Volumes automatisch und bietet ein Web-Dashboard. Dieser Stack ist nur der Daemon – die eigentlichen Backup-Jobs werden per Docker-Label auf den jeweiligen Service-Containern in deren Stacks definiert.
Template-Hinweis: Dieses Repo enthält nur Platzhalter (
example.com,CHANGE_ME). Vor dem Produktiveinsatz die.envvollständig anpassen.
1. Voraussetzungen
- Docker + Docker Compose v2
- Externes Netz
traefik_proxy_network(vom Traefik-Stack) - Das Backup-Verzeichnis
${BACKUP_PATH}(Default/Daten/Backups) muss auf dem Host existieren
2. Einrichtung
-
.envanpassen:HOSTRULE(Dashboard-Domain),BASIC_AUTH_USERS, ggf.BACKUP_PATH. -
Basic-Auth-Hash erzeugen (Doppel-
$$ist Pflicht):docker run --rm -it httpd:alpine htpasswd -nB DEIN_NUTZERNAME | sed 's/\$/\$\$/g' -
Starten:
docker compose up -d
Dashboard danach unter der HOSTRULE-Domain (hinter Basic-Auth).
3. Speicherstruktur (fix vom Tool vorgegeben)
${BACKUP_PATH}/<container-name>/<config-name>/<YYYY-MM-DD>/<HHMMSS>.ext
Beispiel: /Daten/Backups/mobirex-sw6-sql/db/2026-06-13/030000.sql.gz
Das Tool kennt keinen frei wählbaren Pfad/Prefix pro Backup. Eine Gruppierung in
STACK/…-Unterordnern ginge nur über separate Storage-Pools (pro Stack ein Pool mit eigenempath). Dieser Stack nutzt bewusst einen flachen Pool (/backups).
4. Backup-Jobs definieren (in den ANDEREN Stacks!)
Die Jobs konfigurierst du per Label auf dem jeweiligen DB-/App-Container. Schema:
docker-backup.<name>.<subkey> (Schedule = 5-Feld-Cron).
Datenbank-Backup (Beispiel Postgres)
services:
datenbank:
image: postgres:16
labels:
docker-backup.enable: "true"
docker-backup.db.type: "postgres" # oder: mysql, clickhouse
docker-backup.db.schedule: "0 3 * * *" # taeglich 03:00
docker-backup.db.retention: "7"
Volume-/Datei-Backup (das, was bei dir bisher fehlte!)
services:
app:
image: meine-app
labels:
docker-backup.enable: "true"
docker-backup.files.type: "volume"
docker-backup.files.schedule: "0 4 * * *"
docker-backup.files.retention: "14"
Wichtig: Dass bisher nur DB-Backups liefen, lag an fehlenden
…type=volume-Labels auf den App-Containern – nicht am Daemon. Der Zugriff auf die Volumes ist hier bereits eingerichtet (/var/lib/docker/volumesist gemountet).
Mehrere Jobs pro Container sind möglich (unterschiedliche <name>), z. B. db und files.
5. Verfügbare Label-Subkeys
| Subkey | Bedeutung |
|---|---|
enable |
true aktiviert Backups für den Container |
<n>.type |
postgres, mysql, clickhouse oder volume |
<n>.schedule |
5-Feld-Cron |
<n>.retention |
Anzahl aufzubewahrender Backups (Default 7) |
<n>.storage |
Storage-Pool-Name (Default: local) |
<n>.notify |
Notification-Provider überschreiben |
6. Nützliche Befehle
docker compose config -q # Konfiguration validieren
docker compose up -d # Starten
docker logs -f shyim-docker-backup
docker compose down # Stoppen
# Was liegt im Backup-Ziel?
ls -R /Daten/Backups | head
Restore läuft über das Dashboard (Backup auswählen → wiederherstellen).
7. Troubleshooting
Ein Container wird nicht gesichert:
docker-backup.enable: "true"gesetzt?- Richtiger
type? (DB vs.volume) - Daemon-Log prüfen:
docker logs shyim-docker-backup
Stack startet nicht:
- Externes Netz vorhanden?
docker network ls | grep traefik_proxy_network ${BACKUP_PATH}existiert auf dem Host?
8. CI/CD & Spiegelung
Die Pipeline (.forgejo/workflows/ci.yml) läuft self-hosted auf Forgejo, ganz ohne externe Actions (Checkout per git clone):
validate(jeder Push/PR aufmain+ Tags):docker compose config -q,yamllint(relaxed) undgitleaks(nur Working-Tree). Es wird docker compose v2 genutzt (Runner-Imagecatthehacker/ubuntu:act-latest; nötig u. a. für v2-Keys wiedockerfile_inline), apt nur als Fallback – kein 64-MB-github-Download.mirror(nur Push,needs: validate): spiegeltmain+ Tags erst nach grünen Checks nach Codeberg (OrgDocker-Stacks), mit Retry gegen transiente 502/504. Forgejos eingebauten Push-Mirror dafür nicht zusätzlich aktivieren.release(nur Tagv*): baut ein schlankes Deploy-ZIP und hängt es an ein Forgejo-Release und – als Backup – an ein Codeberg-Release (die Releases-Unit am Codeberg-Repo wird dabei automatisch aktiviert).
Release auslösen:
git tag v1.1
git push origin v1.1
Details siehe CICD-Actions.md.
Lizenz
Copyright (C) 2026 Christian Säum – web-seo-consulting.eu
Dieses Projekt steht unter der GNU Affero General Public License, Version 3
oder (nach deiner Wahl) einer späteren Version (AGPL-3.0-or-later). Der
vollständige Lizenztext steht in der Datei LICENSE.
Du darfst die Software nutzen, weitergeben und – auch kommerziell – verkaufen.
Gibst du eine veränderte Fassung weiter oder betreibst du sie über ein
Netzwerk (z. B. als Dienst), muss deren vollständiger Quellcode ebenfalls
unter der AGPL-3.0-or-later verfügbar sein. Der Copyright-Hinweis und die
Nennung des ursprünglichen Autors dürfen nicht entfernt werden.
Diese Angabe betrifft nur die in diesem Repository enthaltenen eigenen Dateien (Konfiguration, Skripte, Anpassungen). Eingebundene Fremdsoftware und Container-Images unterliegen weiterhin ihren eigenen Lizenzen.