Translate the whole site to English: English routes with 301 redirects from the Dutch paths, English UI, docs, seeds and captions, one-time live content migration
This commit is contained in:
+14
-14
@@ -160,17 +160,17 @@ async def process_backup_async(row, codec):
|
||||
|
||||
class BackupService(BaseService):
|
||||
name = "backup"
|
||||
title = "Back-ups"
|
||||
description = "Verwerkt de back-upwachtrij, plant automatische back-ups en snoeit oude archieven."
|
||||
title = "Backups"
|
||||
description = "Works through the backup queue, schedules automatic backups and prunes old archives."
|
||||
default_interval = 10
|
||||
min_interval = 5
|
||||
metrics_interval = 30
|
||||
config_fields = [
|
||||
ConfigField("schedule_hours", "int", 24, "Automatisch elke N uur (0 = uit)", minimum=0, maximum=720, group="Planning"),
|
||||
ConfigField("schedule_target", "select", "database", "Automatisch doel", options=list(TARGETS), group="Planning"),
|
||||
ConfigField("keep_last", "int", 14, "Bewaar laatste N", minimum=1, maximum=1000, group="Bewaren"),
|
||||
ConfigField("codec", "select", "zstd", "Compressie", options=["zstd", "brotli"], group="Archief"),
|
||||
ConfigField("offload", "bool", "0", "Offload via rclone", group="Archief"),
|
||||
ConfigField("schedule_hours", "int", 24, "Automatic every N hours (0 = off)", minimum=0, maximum=720, group="Schedule"),
|
||||
ConfigField("schedule_target", "select", "database", "Automatic target", options=list(TARGETS), group="Schedule"),
|
||||
ConfigField("keep_last", "int", 14, "Keep last N", minimum=1, maximum=1000, group="Retention"),
|
||||
ConfigField("codec", "select", "zstd", "Compression", options=["zstd", "brotli"], group="Archive"),
|
||||
ConfigField("offload", "bool", "0", "Offload via rclone", group="Archive"),
|
||||
]
|
||||
|
||||
def __init__(self):
|
||||
@@ -190,30 +190,30 @@ class BackupService(BaseService):
|
||||
cfg = self.get_config()
|
||||
if self._schedule_due(int(cfg["schedule_hours"])):
|
||||
enqueue_backup(cfg["schedule_target"], "system")
|
||||
self.log(f"automatische back-up ingepland: {cfg['schedule_target']}")
|
||||
self.log(f"automatic backup scheduled: {cfg['schedule_target']}")
|
||||
for row in pending_backups():
|
||||
update_backup(row["uid"], status="running")
|
||||
ok = await process_backup_async(row, cfg["codec"])
|
||||
self.processed += 1
|
||||
self.log(f"back-up {row['target']} {'klaar' if ok else 'mislukt'}")
|
||||
self.log(f"backup {row['target']} {'finished' if ok else 'failed'}")
|
||||
primary = admin_uids_ordered()[:1]
|
||||
for uid in primary:
|
||||
create_notification(uid, "backup.finished" if ok else "backup.failed", f"Back-up {row['target']} {'klaar' if ok else 'mislukt'}", "/admin/backups")
|
||||
create_notification(uid, "backup.finished" if ok else "backup.failed", f"Backup {row['target']} {'finished' if ok else 'failed'}", "/admin/backups")
|
||||
if ok and cfg["offload"] == "1":
|
||||
done = [item for item in list_backups(limit=5) if item["uid"] == row["uid"]]
|
||||
if done:
|
||||
self.log(f"offload: {offload(backup_path(done[0]))}")
|
||||
pruned = prune_backups(int(cfg["keep_last"]))
|
||||
if pruned:
|
||||
self.log(f"{pruned} oude back-ups gesnoeid")
|
||||
self.log(f"{pruned} old backups pruned")
|
||||
|
||||
def collect_metrics(self):
|
||||
rows = list_backups(limit=200)
|
||||
return {
|
||||
"cards": [
|
||||
{"label": "Archieven", "value": sum(1 for row in rows if row["status"] == "done")},
|
||||
{"label": "Wachtrij", "value": sum(1 for row in rows if row["status"] == "pending")},
|
||||
{"label": "Verwerkt sinds start", "value": self.processed},
|
||||
{"label": "Archives", "value": sum(1 for row in rows if row["status"] == "done")},
|
||||
{"label": "Queue", "value": sum(1 for row in rows if row["status"] == "pending")},
|
||||
{"label": "Processed since start", "value": self.processed},
|
||||
],
|
||||
"table": None,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user