v2.31.0-dev23 58a92f3

backups.md RawHistoryFolder

Backups Configuration

Gordon has two backup flows:

  • Database backups: PostgreSQL logical dumps via pg_dump, stored on the local filesystem.
  • Volume backups: best-effort filesystem archives of Gordon-managed named volumes, uploaded to S3.

Database backups

[backups.databases]
enabled = true
schedule = "daily"
storage_dir = "~/.gordon/backups"

[backups.databases.retention]
hourly = 24
daily = 7
weekly = 4
monthly = 12
Key Default Description
backups.databases.enabled false Enables PostgreSQL backup service wiring
backups.databases.schedule "daily" Scheduler preset: hourly, daily, weekly, monthly
backups.databases.storage_dir "" Root backup directory; defaults to {server.data_dir}/backups
backups.databases.retention.* 0 Number of backups to keep per DB and schedule tier

Volume backups to S3

[backups.volumes]
enabled = true
interval = "24h"
compression = "gzip"
timeout = "2h"
max_concurrency = 2
helper_image = "alpine:3.20"

[backups.volumes.s3]
bucket = "gordon-backups"
region = "eu-west-3"
prefix = "prod/gordon"
# endpoint = "https://s3.example.com"
# path_style = false
# sse_algorithm = "AES256"
# sse_kms_key_id = ""

[backups.volumes.retention]
keep = 14
Key Default Description
backups.volumes.enabled false Enables automatic volume archives
backups.volumes.interval "24h" Interval between scheduled runs
backups.volumes.compression "gzip" gzip or zstd; helper image must provide the tool
backups.volumes.timeout "2h" Per-volume archive/upload timeout
backups.volumes.max_concurrency 2 Maximum concurrent volume backups
backups.volumes.helper_image "alpine:3.20" Helper container image used for tar/compression
backups.volumes.s3.bucket "" Required when volume backups are enabled
backups.volumes.s3.region "" Required when volume backups are enabled
backups.volumes.s3.prefix "" Object key prefix
backups.volumes.s3.endpoint "" Optional S3-compatible endpoint
backups.volumes.s3.path_style false Use path-style addressing for S3-compatible storage
backups.volumes.retention.keep 14 Completed archives to keep per domain + volume

Volume backup objects are stored under:

<prefix>/domains/<domain>/volumes/<volume>/<timestamp>-<id>.tar.gz   # gzip
<prefix>/domains/<domain>/volumes/<volume>/<timestamp>-<id>.tar.zst  # zstd

Notes

  • Volume backups include named volumes mounted by Gordon-managed route or attachment containers.
  • Bind mounts, tmpfs mounts, anonymous volumes, and non-Gordon volumes are excluded.
  • Live volume archives are best-effort; consistency requires application quiesce, pause, or stop.
  • Automated volume restore is not part of the MVP.
  • Snapshots are not generic across Docker/Podman volumes and require backend-specific support such as ZFS, Btrfs, LVM, EBS, or a snapshot-capable volume driver.
  • S3 credentials should come from the environment, shared config, instance role, or Gordon secret conventions. Use least-privilege IAM for the configured prefix.
source
1# Backups Configuration
2
3Gordon has two backup flows:
4
5- **Database backups**: PostgreSQL logical dumps via `pg_dump`, stored on the local filesystem.
6- **Volume backups**: best-effort filesystem archives of Gordon-managed named volumes, uploaded to S3.
7
8## Database backups
9
10```toml
11[backups.databases]
12enabled = true
13schedule = "daily"
14storage_dir = "~/.gordon/backups"
15
16[backups.databases.retention]
17hourly = 24
18daily = 7
19weekly = 4
20monthly = 12
21```
22
23| Key | Default | Description |
24|---|---:|---|
25| `backups.databases.enabled` | `false` | Enables PostgreSQL backup service wiring |
26| `backups.databases.schedule` | `"daily"` | Scheduler preset: `hourly`, `daily`, `weekly`, `monthly` |
27| `backups.databases.storage_dir` | `""` | Root backup directory; defaults to `{server.data_dir}/backups` |
28| `backups.databases.retention.*` | `0` | Number of backups to keep per DB and schedule tier |
29
30## Volume backups to S3
31
32```toml
33[backups.volumes]
34enabled = true
35interval = "24h"
36compression = "gzip"
37timeout = "2h"
38max_concurrency = 2
39helper_image = "alpine:3.20"
40
41[backups.volumes.s3]
42bucket = "gordon-backups"
43region = "eu-west-3"
44prefix = "prod/gordon"
45# endpoint = "https://s3.example.com"
46# path_style = false
47# sse_algorithm = "AES256"
48# sse_kms_key_id = ""
49
50[backups.volumes.retention]
51keep = 14
52```
53
54| Key | Default | Description |
55|---|---:|---|
56| `backups.volumes.enabled` | `false` | Enables automatic volume archives |
57| `backups.volumes.interval` | `"24h"` | Interval between scheduled runs |
58| `backups.volumes.compression` | `"gzip"` | `gzip` or `zstd`; helper image must provide the tool |
59| `backups.volumes.timeout` | `"2h"` | Per-volume archive/upload timeout |
60| `backups.volumes.max_concurrency` | `2` | Maximum concurrent volume backups |
61| `backups.volumes.helper_image` | `"alpine:3.20"` | Helper container image used for tar/compression |
62| `backups.volumes.s3.bucket` | `""` | Required when volume backups are enabled |
63| `backups.volumes.s3.region` | `""` | Required when volume backups are enabled |
64| `backups.volumes.s3.prefix` | `""` | Object key prefix |
65| `backups.volumes.s3.endpoint` | `""` | Optional S3-compatible endpoint |
66| `backups.volumes.s3.path_style` | `false` | Use path-style addressing for S3-compatible storage |
67| `backups.volumes.retention.keep` | `14` | Completed archives to keep per domain + volume |
68
69Volume backup objects are stored under:
70
71```text
72<prefix>/domains/<domain>/volumes/<volume>/<timestamp>-<id>.tar.gz   # gzip
73<prefix>/domains/<domain>/volumes/<volume>/<timestamp>-<id>.tar.zst  # zstd
74```
75
76## Notes
77
78- Volume backups include named volumes mounted by Gordon-managed route or attachment containers.
79- Bind mounts, tmpfs mounts, anonymous volumes, and non-Gordon volumes are excluded.
80- Live volume archives are best-effort; consistency requires application quiesce, pause, or stop.
81- Automated volume restore is not part of the MVP.
82- Snapshots are not generic across Docker/Podman volumes and require backend-specific support such as ZFS, Btrfs, LVM, EBS, or a snapshot-capable volume driver.
83- S3 credentials should come from the environment, shared config, instance role, or Gordon secret conventions. Use least-privilege IAM for the configured prefix.
84
85## Related
86
87- [Attachments Configuration](./attachments.md)
88- [CLI Backup Command](../cli/backup.md)
89- [Configuration Reference](./reference.md)

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close