102 lines
3.2 KiB
Markdown
102 lines
3.2 KiB
Markdown
# Agrarian Project Backup Runbook
|
|
|
|
Agrarian project backups run from the Codex/dev host and write encrypted,
|
|
deduplicated restic snapshots to Linastorage.
|
|
|
|
## Paths
|
|
|
|
- Source: `/mnt/projects/AgrarianGameBulid`
|
|
- NAS mount: `/mnt/backups/linastorage`
|
|
- Backup root: `/mnt/backups/linastorage/backups/agrarian-game/project`
|
|
- Restic repository: `/mnt/backups/linastorage/backups/agrarian-game/project/restic-repository`
|
|
- State files: `/mnt/backups/linastorage/backups/agrarian-game/project/state`
|
|
- Password file: `/root/.backup-secrets/agrarian-project-restic.password`
|
|
- Script: `/usr/local/sbin/agrarian-project-backup`
|
|
- Service: `agrarian-project-backup.service`
|
|
- Timer: `agrarian-project-backup.timer`
|
|
|
|
## Schedule
|
|
|
|
The timer runs every two hours with a small randomized delay. The script exits
|
|
without creating a snapshot when there are no changes compared to the latest
|
|
snapshot.
|
|
|
|
The first implementation attempt used `rsync --link-dest`, but Linastorage over
|
|
SMB did not support the hard-link operations required for that model. The active
|
|
job uses restic instead. Restic stores encrypted, deduplicated chunks as normal
|
|
files, which is a better fit for this SMB target.
|
|
|
|
Manual snapshots can be created before risky work:
|
|
|
|
```bash
|
|
sudo /usr/local/sbin/agrarian-project-backup --manual
|
|
```
|
|
|
|
Force a scheduled-style snapshot even if no changes are detected:
|
|
|
|
```bash
|
|
sudo /usr/local/sbin/agrarian-project-backup --force
|
|
```
|
|
|
|
Check whether a snapshot would be created:
|
|
|
|
```bash
|
|
sudo /usr/local/sbin/agrarian-project-backup --dry-run
|
|
```
|
|
|
|
## Included
|
|
|
|
- Unreal project files.
|
|
- Git metadata, including unpushed local history when practical.
|
|
- Local source data under `Data/`, including raw terrain source inputs excluded
|
|
from GitHub.
|
|
- Scripts, docs, configs, plugins, content, and project metadata.
|
|
|
|
## Excluded
|
|
|
|
- `DerivedDataCache/`
|
|
- `Intermediate/`
|
|
- `Saved/`
|
|
- `Binaries/`
|
|
- `Builds/`
|
|
- transient Git LFS temp files
|
|
- local Visual Studio temp files
|
|
|
|
## Retention
|
|
|
|
The script uses restic retention:
|
|
|
|
- All snapshots within 7 days.
|
|
- Daily snapshots for 30 days.
|
|
- Weekly snapshots for 12 weeks.
|
|
- Monthly snapshots for 12 months.
|
|
|
|
The script records a source signature and skips scheduled runs when no project
|
|
changes are detected.
|
|
|
|
## Restore Test
|
|
|
|
Restore one file to a temporary path:
|
|
|
|
```bash
|
|
mkdir -p /tmp/agrarian-project-restore-test
|
|
sudo sh -c 'RESTIC_PASSWORD_FILE=/root/.backup-secrets/agrarian-project-restic.password \
|
|
restic -r /mnt/backups/linastorage/backups/agrarian-game/project/restic-repository \
|
|
dump latest /mnt/projects/AgrarianGameBulid/AGRARIAN_DEVELOPMENT_ROADMAP.md \
|
|
> /tmp/agrarian-project-restore-test/AGRARIAN_DEVELOPMENT_ROADMAP.md'
|
|
diff -q /mnt/projects/AgrarianGameBulid/AGRARIAN_DEVELOPMENT_ROADMAP.md \
|
|
/tmp/agrarian-project-restore-test/AGRARIAN_DEVELOPMENT_ROADMAP.md
|
|
```
|
|
|
|
List snapshots:
|
|
|
|
```bash
|
|
sudo RESTIC_PASSWORD_FILE=/root/.backup-secrets/agrarian-project-restic.password \
|
|
restic -r /mnt/backups/linastorage/backups/agrarian-game/project/restic-repository \
|
|
snapshots --tag agrarian-game --tag project
|
|
```
|
|
|
|
Record restore tests in `Docs/Ops/BackupRestoreTestLog.md` with the snapshot
|
|
name, restored path, result, and cleanup status. Summarize the latest result in
|
|
handoff notes when useful.
|