Skip to content

Commit e49c6b6

Browse files
committed
Restructure backup config to allow future expansion
1 parent c3124ef commit e49c6b6

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

db-auto-backup.py

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from datetime import datetime
66
from io import StringIO
77
from pathlib import Path
8-
from typing import Callable, Dict, Optional, Sequence
8+
from typing import Callable, Dict, NamedTuple, Optional, Sequence
99

1010
import docker
1111
import pycron
@@ -17,6 +17,12 @@
1717
BackupCandidate = Callable[[Container], str]
1818

1919

20+
class BackupProvider(NamedTuple):
21+
patterns: list[str]
22+
backup_method: BackupCandidate
23+
file_extension: str
24+
25+
2026
def get_container_env(container: Container) -> Dict[str, Optional[str]]:
2127
"""
2228
Get all environment variables from a container.
@@ -45,23 +51,29 @@ def backup_mysql(container: Container) -> str:
4551
return f"bash -c 'mysqldump {auth} --all-databases'"
4652

4753

48-
BACKUP_MAPPING: Dict[str, BackupCandidate] = {
49-
"postgres": backup_psql,
50-
"mysql": backup_mysql,
51-
"mariadb": backup_mysql, # Basically the same thing
52-
"*/linuxserver/mariadb": backup_mysql, # LSIO have their own MariaDB container
53-
}
54+
BACKUP_PROVIDERS: list[BackupProvider] = [
55+
BackupProvider(
56+
patterns=["postgres"], backup_method=backup_psql, file_extension="sql"
57+
),
58+
BackupProvider(
59+
patterns=["mysql", "mariadb", "*/linuxserver/mariadb"],
60+
backup_method=backup_mysql,
61+
file_extension="sql",
62+
),
63+
]
64+
5465

5566
BACKUP_DIR = Path(os.environ.get("BACKUP_DIR", "/var/backups"))
5667
SCHEDULE = os.environ.get("SCHEDULE", "@daily")
5768
SHOW_PROGRESS = sys.stdout.isatty()
5869

5970

60-
def get_backup_method(container_names: Sequence[str]) -> Optional[BackupCandidate]:
71+
def get_backup_provider(container_names: Sequence[str]) -> Optional[BackupProvider]:
6172
for name in container_names:
62-
for container_pattern, backup_candidate in BACKUP_MAPPING.items():
63-
if fnmatch.fnmatch(name, container_pattern):
64-
return backup_candidate
73+
for provider in BACKUP_PROVIDERS:
74+
for pattern in provider.patterns:
75+
if fnmatch.fnmatch(name, pattern):
76+
return provider
6577

6678
return None
6779

@@ -74,12 +86,12 @@ def backup(now: datetime) -> None:
7486

7587
for container in docker_client.containers.list():
7688
container_names = [tag.rsplit(":", 1)[0] for tag in container.image.tags]
77-
backup_method = get_backup_method(container_names)
78-
if backup_method is None:
89+
backup_provider = get_backup_provider(container_names)
90+
if backup_provider is None:
7991
continue
8092

81-
backup_command = backup_method(container)
82-
backup_file = BACKUP_DIR / f"{container.name}.sql"
93+
backup_command = backup_provider.backup_method(container)
94+
backup_file = BACKUP_DIR / f"{container.name}.{backup_provider.file_extension}"
8395
_, output = container.exec_run(backup_command, stream=True, demux=True)
8496

8597
with tqdm.wrapattr(

0 commit comments

Comments
 (0)