mirror of
https://github.com/kevinveenbirkenbach/docker-volume-backup.git
synced 2025-12-27 11:06:35 +00:00
- Replace legacy standalone scripts with a proper src-layout Python package (baudolo backup/restore/configure entrypoints via pyproject.toml) - Remove old scripts/files (backup-docker-to-local.py, recover-docker-from-local.sh, databases.csv.tpl, Todo.md) - Add Dockerfile to build the project image for local/E2E usage - Update Makefile: build image and run E2E via external runner script - Add scripts/test-e2e.sh: - start DinD + dedicated network - recreate DinD data volume (and shared /tmp volume) - pre-pull helper images (alpine-rsync, alpine) - load local baudolo:local image into DinD - run unittest E2E suite inside DinD and abort on first failure - on failure: dump host+DinD diagnostics and archive shared /tmp into artifacts/ - Add artifacts/ debug outputs produced by failing E2E runs (logs, events, tmp archive) https://chatgpt.com/share/694ec23f-0794-800f-9a59-8365bc80f435
94 lines
2.6 KiB
Python
94 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
import os
|
|
from pathlib import Path
|
|
|
|
|
|
def _default_repo_name() -> str:
|
|
"""
|
|
Derive the repository name from the folder that contains `src/`.
|
|
|
|
Expected layout:
|
|
<repo-root>/src/baudolo/backup/cli.py
|
|
|
|
=> parents[0]=backup, [1]=baudolo, [2]=src, [3]=repo-root
|
|
"""
|
|
try:
|
|
return Path(__file__).resolve().parents[3].name
|
|
except Exception:
|
|
return "backup-docker-to-local"
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
dirname = os.path.dirname(__file__)
|
|
default_databases_csv = os.path.join(dirname, "databases.csv")
|
|
|
|
p = argparse.ArgumentParser(description="Backup Docker volumes.")
|
|
|
|
p.add_argument(
|
|
"--compose-dir",
|
|
type=str,
|
|
required=True,
|
|
help="Path to the parent directory containing docker-compose setups",
|
|
)
|
|
p.add_argument(
|
|
"--docker-compose-hard-restart-required",
|
|
nargs="+",
|
|
default=["mailu"],
|
|
help="Compose dir names that require 'docker-compose down && up -d' (default: mailu)",
|
|
)
|
|
|
|
p.add_argument(
|
|
"--repo-name",
|
|
default=_default_repo_name(),
|
|
help="Backup repo folder name under <backups-dir>/<machine-id>/ (default: git repo folder name)",
|
|
)
|
|
p.add_argument(
|
|
"--databases-csv",
|
|
default=default_databases_csv,
|
|
help=f"Path to databases.csv (default: {default_databases_csv})",
|
|
)
|
|
p.add_argument(
|
|
"--backups-dir",
|
|
default="/Backups",
|
|
help="Backup root directory (default: /Backups)",
|
|
)
|
|
|
|
p.add_argument(
|
|
"--database-containers",
|
|
nargs="+",
|
|
required=True,
|
|
help="Container names treated as special instances for database backups",
|
|
)
|
|
p.add_argument(
|
|
"--images-no-stop-required",
|
|
nargs="+",
|
|
required=True,
|
|
help="Image name patterns for which containers should not be stopped during file backup",
|
|
)
|
|
p.add_argument(
|
|
"--images-no-backup-required",
|
|
nargs="+",
|
|
default=[],
|
|
help="Image name patterns for which no backup should be performed",
|
|
)
|
|
|
|
p.add_argument(
|
|
"--everything",
|
|
action="store_true",
|
|
help="Force file backup for all volumes and also execute database dumps (like old script)",
|
|
)
|
|
p.add_argument(
|
|
"--shutdown",
|
|
action="store_true",
|
|
help="Do not restart containers after backup",
|
|
)
|
|
p.add_argument(
|
|
"--dump-only",
|
|
action="store_true",
|
|
help="Only create DB dumps (skip ALL file rsync backups)",
|
|
)
|
|
|
|
return p.parse_args()
|