No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Christian Säum 4fcca33be2
All checks were successful
CI – Validate & Release / validate (push) Successful in 10s
CI – Validate & Release / mirror (push) Successful in 3s
CI – Validate & Release / release (push) Has been skipped
Merge pull request 'chore(license): AGPL-3.0-or-later + Copyright-Hinweis' (#1) from chore/add-license into main
2026-09-02 19:47:22 +00:00
.forgejo/workflows fix(ci): retry Codeberg pushes on 502/504, prefer compose v2 2026-06-21 18:48:53 +02:00
.idea feat(docker-backup): reusable backup daemon template 2026-06-13 13:53:20 +02:00
.env feat(docker-backup): reusable backup daemon template 2026-06-13 13:53:20 +02:00
.gitignore chore(gitignore): ignore dist/ (CI build artifacts) 2026-06-21 14:30:14 +02:00
AGENTS.md feat(docker-backup): reusable backup daemon template 2026-06-13 13:53:20 +02:00
CICD-Actions.md docs(ci): align docs with hardened pipeline (compose v2 runner image, Codeberg 502/504 retry) 2026-06-21 18:57:47 +02:00
CLAUDE.md feat(docker-backup): reusable backup daemon template 2026-06-13 13:53:20 +02:00
docker-compose.yml feat(docker-backup): reusable backup daemon template 2026-06-13 13:53:20 +02:00
LICENSE chore(license): add AGPL-3.0-or-later license and copyright notice 2026-09-02 21:31:57 +02:00
Projekt.md feat(docker-backup): reusable backup daemon template 2026-06-13 13:53:20 +02:00
README.md chore(license): add AGPL-3.0-or-later license and copyright notice 2026-09-02 21:31:57 +02:00

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 .env vollstä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

  1. .env anpassen: HOSTRULE (Dashboard-Domain), BASIC_AUTH_USERS, ggf. BACKUP_PATH.

  2. Basic-Auth-Hash erzeugen (Doppel-$$ ist Pflicht):

    docker run --rm -it httpd:alpine htpasswd -nB DEIN_NUTZERNAME | sed 's/\$/\$\$/g'
    
  3. 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 eigenem path). 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/volumes ist 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 auf main + Tags): docker compose config -q, yamllint (relaxed) und gitleaks (nur Working-Tree). Es wird docker compose v2 genutzt (Runner-Image catthehacker/ubuntu:act-latest; nötig u. a. für v2-Keys wie dockerfile_inline), apt nur als Fallback – kein 64-MB-github-Download.
  • mirror (nur Push, needs: validate): spiegelt main + Tags erst nach grünen Checks nach Codeberg (Org Docker-Stacks), mit Retry gegen transiente 502/504. Forgejos eingebauten Push-Mirror dafür nicht zusätzlich aktivieren.
  • release (nur Tag v*): 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.