# 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.
