Files
esh-pfi-infrastructure/configs/restic/nh3-dev
vh 76a0768fdb restic: drop scheduled forget across all 6 hosts
Forget against an --append-only rest-server fails every night (delete
ops blocked). The resulting daily failure cluttered service status and
logs without ever actually retiring old snapshots. Schedule is now
removed from the forget block in all six profiles; the keep-daily /
keep-weekly / keep-monthly / keep-yearly policy remains so manual
invocations (during prune ceremonies, when --append-only is
temporarily off) honor the intended retention.

Files:
  configs/restic/ana-docker/profiles.yaml
  configs/restic/ana-ml2/profiles.yaml
  configs/restic/nh3-docker/profiles.yaml
  configs/restic/esh-docker-vm/profiles.yaml
  configs/restic/vm-esh-nas/profiles.yaml
  configs/restic/nh3-dev/profiles.yaml

Each file has an inline comment marking why the schedule was dropped
so a future reader doesn't re-add it thinking it was an oversight.

STATUS.md: removed the "install Backrest nightly-restart timer" line
item. User confirmed the UI timeout hits even at startup, so periodic
restart wouldn't actually help. Root cause remains deferred.
2026-04-21 17:00:23 -07:00
..

restic / nh3-dev

User workstation at the NH3 site (nh3-dev.phasefinal.com). Not a server — active dev machine with ~12 GB of code in ~/development that wasn't being captured by any fleet backup.

Writes site-local to the Synology rest-server (10.100.50.50:8000) as user nh3-dev. Same target as nh3-docker.

What's backed up

Path Purpose
/home/lkraven Dev code, dotfiles, shell history, notes, Claude Code memory, scripts
/etc Host config
/root Root's state (ssh keys, scripts)

What's excluded

Roughly 8 GB of regenerable caches/build-outputs:

  • Language toolchain caches: .cache, .rustup, .cargo/registry, .cargo/git, .npm, .pnpm-store, .m2, .gradle, .conda, go/pkg, .dotnet
  • Editor caches: .vscode-server, .vscode
  • Project build output: node_modules, __pycache__, .venv, venv, target, dist, build, .pytest_cache, .tox, .next, .nuxt
  • Trash, browser caches, Steam

Expected first snapshot: ~14 GB. Incrementals should be small once dedup kicks in.

Deploy

1. Install resticprofile (restic already present)

sudo bash -c "
  curl -sfL https://raw.githubusercontent.com/creativeprojects/resticprofile/master/install.sh \
    | sh -s -- -b /usr/local/bin
"
/usr/local/bin/resticprofile version

2. Add nh3-dev entry on the Synology rest-server .htpasswd

The Synology-side .htpasswd for rest-server-nh3 lives wherever its DATA_DIR points (see stacks/rest-server-nh3/README.md — probably /volume1/Backup/restic/.htpasswd or similar).

Generate the bcrypt line from this workstation using the same pattern we used for ana side:

# Generate locally, print the hash line
docker run --rm httpd:2.4-alpine htpasswd -nbB nh3-dev "<NEW-PW>"
# Copy the output line to clipboard

Then append it on the Synology. Options in order of friction:

  • DSM File Station: navigate to the restic data dir → open .htpasswd in the built-in text editor → paste the line → save.
  • DSM Container Manager: open the rest-server-nh3 container's Terminal tab → echo '<bcrypt-line>' >> /data/.htpasswd (exact path matches the container's volume mount for DATA_DIR).
  • Once SSH to the Synology is set up (tabled earlier): ssh + docker exec rest-server-nh3 sh -c '...' or direct file append.

3. Install restic creds on nh3-dev (local workstation)

sudo install -d -o root -g root -m 0700 /etc/restic /var/lib/restic

# REST URL
sudo bash -c "cat > /etc/restic/restic.env && chmod 600 /etc/restic/restic.env"
# paste: RESTIC_REPOSITORY=rest:http://nh3-dev:<HTPASSWD-PW>@10.100.50.50:8000/nh3-dev/
# Enter, Ctrl-D

# Passphrase (generate in password manager first, then paste)
sudo bash -c "cat > /etc/restic/password && chmod 600 /etc/restic/password"
# paste: <REPO-PASSPHRASE>
# Enter, Ctrl-D

4. Init the repo

sudo bash -c '
  set -a; . /etc/restic/restic.env; set +a
  restic init
'
# prompt for passphrase twice — paste the same one you just installed

If you get config file already exists, a repo was created in an earlier session. Either use the existing passphrase (overwrite /etc/restic/password with it) or wipe and reinit — same dance as we did for ana-ml2 and esh-docker-vm.

5. Verify

sudo bash -c '
  set -a; . /etc/restic/restic.env; set +a
  RESTIC_PASSWORD_FILE=/etc/restic/password restic snapshots
'
# expect: no snapshots found

6. Deploy profile

sudo install -o root -g root -m 0644 \
  /home/lkraven/development/eshpfi-management/configs/restic/nh3-dev/profiles.yaml \
  /etc/restic/profiles.yaml

sudo resticprofile --config /etc/restic/profiles.yaml show

7. Schedule + first backup

sudo resticprofile --config /etc/restic/profiles.yaml schedule --all
systemctl list-timers "resticprofile*"

# First backup — this will take a while (14 GB, initial dedup work)
sudo resticprofile --config /etc/restic/profiles.yaml backup --verbose

Expect the first run to take 5-15 minutes depending on NH3 LAN speed and how much of /home/lkraven/development has high-entropy (compressed) content.

Restoring

sudo bash -c '
  set -a; . /etc/restic/restic.env; set +a
  RESTIC_PASSWORD_FILE=/etc/restic/password \
    restic restore --target /tmp/restore latest --path /home/lkraven/development
'

Watch items after first run

  • First snapshot size — if much above 14 GB, something large slipped past excludes. Inspect with restic stats latest --host nh3-dev.
  • Schedule catches missed runs — the workstation is frequently off at 01:00. systemd's Persistent=true (resticprofile sets this by default for system-level schedules) catches up after boot. After a few days of normal use, confirm timer history with:
    journalctl -u "resticprofile-backup@profile-default.service" --no-pager -n 20