Backups and Recovery
The recovery system distinguishes portable application exports, generic volume archives, ZFS snapshots, and a separate monthly copy.
| Protection layer | Destination | Frequency and retention |
|---|---|---|
| Application exports and volume archives | TrueNAS backup dataset | Daily; seven-day default retention |
| Dataset snapshots | TrueNAS ZFS snapshots | Varies by dataset |
| Selected important datasets | Western Digital 2 TB external hard drive | Manual, approximately monthly |
flowchart LR
subgraph sources["APPLICATION HOSTS"]
apps["Applications"] --> native["Native exports"]
volumes[("Container volumes")] --> archive["Stopped-volume archives"]
end
native --> verify["Validate manifests<br/>and SHA-256"]
archive --> verify
verify -->|"daily · 7-day retention"| nas[("TrueNAS<br/>backup dataset")]
nas -->|"varying frequency"| snapshots["ZFS snapshots"]
nas ==>|"monthly manual copy<br/>selected datasets"| usb[("WD 2 TB<br/>external drive")]
classDef source fill:#211b32,stroke:#9c82d4,color:#e3d9fa;
classDef process fill:#2b1d15,stroke:#c47d4a,color:#f3d1ba;
classDef storage fill:#10271e,stroke:#58b184,color:#c7efda;
class apps,volumes source;
class native,archive,verify process;
class nas,snapshots,usb storage;
Daily application backups
Persistent systemd timers run staggered overnight sequences on the application and edge hosts. Scripts lock against concurrent runs, require mounted network storage, preserve the previously running container set, and fail if a service does not return. Timestamped sets default to seven days of retention.
| Application | Capture method |
|---|---|
| Gitea | Native dump plus SSH host identity |
| Paperless-ngx | Native document export with manifest validation |
| Immich | Compressed PostgreSQL dump; media stays on TrueNAS |
| OpenProject | PostgreSQL dump plus uploaded assets |
| Vaultwarden | SQLite online backup plus durable files |
| Matrix Synapse | Consistent data including signing identity |
| Umami | PostgreSQL custom-format dump |
Applications without a portable exporter are briefly stopped while selected named volumes are archived. Downloaded models, reproducible caches, and large NAS-resident media are not duplicated into daily application archives. Jellyfin configuration is outside the current backup manifest.
Dataset protection
Important datasets receive ZFS snapshots at frequencies appropriate to their rate of change and recovery value. Approximately monthly, selected datasets are copied manually to the external drive. Its capacity makes this a selective copy rather than a complete replica of the media collection.
Restores
Documented procedures cover PostgreSQL applications, Immich, Vaultwarden, Matrix, Gitea, Paperless, and generic volume archives. Restores verify checksums or application integrity and refuse destructive volume replacement without explicit confirmation.