From 95a69c0a07c5aefc2ce3c03e772083e157f24968 Mon Sep 17 00:00:00 2001 From: Amolith Date: Sun, 15 Mar 2026 10:30:52 -0600 Subject: [PATCH] Reorganise examples directory with systemd integration --- examples/README.md | 79 +++++++++++++++++++ examples/keld/config.toml | 21 +++++ .../keld/config_long.toml | 0 .../timers/media@rest_repo_media-verify.env | 1 + .../keld/timers/media@rest_repo_media.env | 1 + examples/systemd/user/keld-backup@.service | 9 +++ examples/systemd/user/keld-backup@.timer | 11 +++ examples/systemd/user/keld-verify@.service | 9 +++ examples/systemd/user/keld-verify@.timer | 11 +++ 9 files changed, 142 insertions(+) create mode 100644 examples/README.md create mode 100644 examples/keld/config.toml rename example/config.toml => examples/keld/config_long.toml (100%) create mode 100644 examples/keld/timers/media@rest_repo_media-verify.env create mode 100644 examples/keld/timers/media@rest_repo_media.env create mode 100644 examples/systemd/user/keld-backup@.service create mode 100644 examples/systemd/user/keld-backup@.timer create mode 100644 examples/systemd/user/keld-verify@.service create mode 100644 examples/systemd/user/keld-verify@.timer diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f4af1633ebe09806315349cef8d9e3df6d487b3f --- /dev/null +++ b/examples/README.md @@ -0,0 +1,79 @@ +## Example setup + +[`keld/`](./keld/) is example content for `~/.config/keld`. It contains a config and some env files for the systemd stuff. [`systemd/user/`](./systemd/user/) contains that systemd stuff. Backup runs daily, verify runs monthly, both read from the env files to ping healthchecks.io and let you know whether your backups failed. Both also use mise to install/execute runitor (for healthchecks) and keld. + +[`config_long.toml`](./keld/config_long.toml) is more exhaustive. + +### 1. Copy the configs + +```bash +mkdir -p ~/.config/keld/timers +cp -r examples/keld/* ~/.config/keld/ +``` + +### 2. Edit + +Open `~/.config/keld/config.toml` and customize it for your backups: + +- Define your presets (e.g., `media@hetzner_media`, `docs@b2_docs`) +- Set your repository URLs +- Configure environment variables for authentication +- Set backup sources via `_arguments` + +Repeat this to add backups later. + +### 3. Set up healthchecks.io (optional) + +Create two checks on [healthchecks.io](https://healthchecks.io) for each backup: + +- One for the backup job +- One for the verify job + +Create env files in `~/.config/keld/timers/`: + +```bash +# ~/.config/keld/timers/mybackup@myrepo.env +CHECK_UUID=your-backup-check-uuid-here + +# ~/.config/keld/timers/mybackup@myrepo-verify.env +CHECK_UUID=your-verify-check-uuid-here +``` + +Repeat this to add backups later. + +### 4. Install the systemd units + +```bash +mkdir -p ~/.config/systemd/user +cp examples/systemd/user/* ~/.config/systemd/user/ +``` + +### 5. Enable and start the timers + +For each backup preset you defined (e.g., `media@hetzner_media`): + +```bash +# Escape the @ symbol for systemd instance names +systemctl --user enable keld-backup@media@hetzner_media.timer +systemctl --user start keld-backup@media@hetzner_media.timer + +systemctl --user enable keld-verify@media@hetzner_media.timer +systemctl --user start keld-verify@media@hetzner_media.timer +``` + +Repeat this to add backups later. + +### 6. Verify everything is working + +```bash +# List active timers +systemctl --user list-timers + +# Check service status +systemctl --user status keld-backup@media@hetzner_media.service + +# Test a dry run +keld --dry-run media@hetzner_media backup +``` + +Repeat this to add backups later. diff --git a/examples/keld/config.toml b/examples/keld/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..8ad775286f989596e5945e3c6572f2e56a5c91a9 --- /dev/null +++ b/examples/keld/config.toml @@ -0,0 +1,21 @@ +[global.backup] +exclude-if-present = ".nobackup" + +["media@".environ] +RESTIC_PASSWORD_COMMAND = "op read 'op://Example Vault/Media Backup/password'" + +["media@".backup] +_arguments = "/home/example/Music/Final" + +["media@hetzner_media"] +repository = "rclone:hetzner-restic-media:/" + +["media@b2_media"] +repository = "s3:https://s3.us-west-004.backblazeb2.com/example-bucket-id" + +["media@b2_media".environ] +AWS_ACCESS_KEY_ID = "B2_EXAMPLE_ACCESS_KEY_ID" +AWS_SECRET_ACCESS_KEY = "B2_EXAMPLE_SECRET_ACCESS_KEY" + +["media@rest_repo_media"] +repository = "rest:https://example-user:example-password@example.repo.borgbase.com" diff --git a/example/config.toml b/examples/keld/config_long.toml similarity index 100% rename from example/config.toml rename to examples/keld/config_long.toml diff --git a/examples/keld/timers/media@rest_repo_media-verify.env b/examples/keld/timers/media@rest_repo_media-verify.env new file mode 100644 index 0000000000000000000000000000000000000000..252af479270718c99a057fe9cf8310dd32bf655a --- /dev/null +++ b/examples/keld/timers/media@rest_repo_media-verify.env @@ -0,0 +1 @@ +CHECK_UUID=22222222-2222-4222-8222-222222222222 diff --git a/examples/keld/timers/media@rest_repo_media.env b/examples/keld/timers/media@rest_repo_media.env new file mode 100644 index 0000000000000000000000000000000000000000..9dec1ac6fa6837abbf04455d268c5119be7eb06a --- /dev/null +++ b/examples/keld/timers/media@rest_repo_media.env @@ -0,0 +1 @@ +CHECK_UUID=11111111-1111-4111-8111-111111111111 diff --git a/examples/systemd/user/keld-backup@.service b/examples/systemd/user/keld-backup@.service new file mode 100644 index 0000000000000000000000000000000000000000..69f8e214e1cdc8e60a884ad91cb0ec0e313a709c --- /dev/null +++ b/examples/systemd/user/keld-backup@.service @@ -0,0 +1,9 @@ +[Unit] +Description=keld %I backup + +[Service] +Nice=19 +IOSchedulingClass=idle +KillSignal=SIGINT +EnvironmentFile=-%h/.config/keld/timers/%I.env +ExecStart=%h/.local/bin/mise x github:bdd/runitor -- runitor -- mise x http:keld -- keld %I backup diff --git a/examples/systemd/user/keld-backup@.timer b/examples/systemd/user/keld-backup@.timer new file mode 100644 index 0000000000000000000000000000000000000000..2a79b229fcb82ae800b8af90f75402cd3dc7d39c --- /dev/null +++ b/examples/systemd/user/keld-backup@.timer @@ -0,0 +1,11 @@ +[Unit] +Description=Daily keld %I backup + +[Timer] +OnCalendar=daily +AccuracySec=1m +RandomizedDelaySec=1h +Persistent=true + +[Install] +WantedBy=timers.target diff --git a/examples/systemd/user/keld-verify@.service b/examples/systemd/user/keld-verify@.service new file mode 100644 index 0000000000000000000000000000000000000000..9e1aa59f8662d485a5838bbec159766f58e38655 --- /dev/null +++ b/examples/systemd/user/keld-verify@.service @@ -0,0 +1,9 @@ +[Unit] +Description=keld %I verify + +[Service] +Nice=19 +IOSchedulingClass=idle +KillSignal=SIGINT +EnvironmentFile=-%h/.config/keld/timers/%I-verify.env +ExecStart=%h/.local/bin/mise x github:bdd/runitor -- runitor -- mise x http:keld -- keld %I verify diff --git a/examples/systemd/user/keld-verify@.timer b/examples/systemd/user/keld-verify@.timer new file mode 100644 index 0000000000000000000000000000000000000000..73696be32463e1808130982af2ba96c9812d8172 --- /dev/null +++ b/examples/systemd/user/keld-verify@.timer @@ -0,0 +1,11 @@ +[Unit] +Description=Monthly keld %I verify + +[Timer] +OnCalendar=monthly +AccuracySec=1m +RandomizedDelaySec=1h +Persistent=true + +[Install] +WantedBy=timers.target