Third backup tier (after Dalidou local + T420 off-host): pull-based backup to the user's Windows main computer. - scripts/windows/atocore-backup-pull.ps1: PowerShell script using built-in OpenSSH scp. Fail-open: exits cleanly if Dalidou unreachable (e.g., laptop on the road). Pulls whole snapshots dir (~45MB, bounded by Dalidou's retention policy). - docs/windows-backup-setup.md: Task Scheduler setup (automated + manual). Runs daily 10:00 local, catches up missed days via StartWhenAvailable, retries 2x on failure. Verified: pulled 3 snapshots (45MB) to C:\Users\antoi\Documents\ATOCore_Backups\. Task "AtoCore Backup Pull" registered in Task Scheduler, State: Ready. Three independent backup tiers now: Dalidou local, T420 off-host, user Windows machine. Any two can fail without data loss. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.2 KiB
Windows Main-Computer Backup Setup
The AtoCore backup pipeline runs nightly on Dalidou and already pushes snapshots
off-host to the T420 (papa@192.168.86.39). This doc sets up a second,
pull-based daily backup to your Windows main computer at
C:\Users\antoi\Documents\ATOCore_Backups\.
Pull-based means the Windows machine pulls from Dalidou. This is simpler than push because Dalidou doesn't need SSH keys to reach Windows, and the backup only runs when the Windows machine is powered on and can reach Dalidou.
Prerequisites
- Windows 10/11 with OpenSSH client (built-in since Win10 1809)
- SSH key-based auth to
papa@dalidoualready working (you're using it today) C:\Users\antoi\ATOCore\scripts\windows\atocore-backup-pull.ps1present
Test the script manually
powershell.exe -ExecutionPolicy Bypass -File `
C:\Users\antoi\ATOCore\scripts\windows\atocore-backup-pull.ps1
Expected output:
[timestamp] === AtoCore backup pull starting ===
[timestamp] Dalidou reachable.
[timestamp] Pulling snapshots via scp...
[timestamp] Pulled N snapshots successfully (total X MB, latest: ...)
[timestamp] === backup complete ===
Target directory: C:\Users\antoi\Documents\ATOCore_Backups\snapshots\
Logs: C:\Users\antoi\Documents\ATOCore_Backups\_logs\backup-*.log
Register the Task Scheduler task
Option A — automatic registration (recommended)
Run this PowerShell command as your user (no admin needed — uses HKCU task):
$action = New-ScheduledTaskAction -Execute 'powershell.exe' `
-Argument '-ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden -File C:\Users\antoi\ATOCore\scripts\windows\atocore-backup-pull.ps1'
# Run daily at 10:00 local time; if missed (computer off), run at next logon
$trigger = New-ScheduledTaskTrigger -Daily -At 10:00AM
$trigger.StartBoundary = (Get-Date -Format 'yyyy-MM-ddTHH:mm:ss')
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-ExecutionTimeLimit (New-TimeSpan -Minutes 10) `
-RestartCount 2 `
-RestartInterval (New-TimeSpan -Minutes 30)
Register-ScheduledTask -TaskName 'AtoCore Backup Pull' `
-Description 'Daily pull of AtoCore backup snapshots from Dalidou' `
-Action $action -Trigger $trigger -Settings $settings `
-User $env:USERNAME
Key settings:
-StartWhenAvailable: if the computer was off at 10:00, run as soon as it comes online-AllowStartIfOnBatteries: works on laptop battery too-ExecutionTimeLimit 10min: kill hung tasks-RestartCount 2: retry twice if it fails (Dalidou temporarily unreachable)
Option B -- Task Scheduler GUI
- Open Task Scheduler (
taskschd.msc) - Create Basic Task -> name:
AtoCore Backup Pull - Trigger: Daily, 10:00 AM, recur every 1 day
- Action: Start a program
- Program:
powershell.exe - Arguments:
-ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden -File "C:\Users\antoi\ATOCore\scripts\windows\atocore-backup-pull.ps1"
- Program:
- Finish, then edit the task:
- Settings tab: check "Run task as soon as possible after a scheduled start is missed"
- Settings tab: "If the task fails, restart every 30 minutes, up to 2 times"
- Conditions tab: uncheck "Start only if computer is on AC power" (if you want it on battery)
Verify
After the first scheduled run:
# Most recent log
Get-ChildItem C:\Users\antoi\Documents\ATOCore_Backups\_logs\ |
Sort-Object Name -Descending |
Select-Object -First 1 |
Get-Content
# Latest snapshot present?
Get-ChildItem C:\Users\antoi\Documents\ATOCore_Backups\snapshots\ |
Sort-Object Name -Descending |
Select-Object -First 3
Unregister (if needed)
Unregister-ScheduledTask -TaskName 'AtoCore Backup Pull' -Confirm:$false
How it behaves
- Computer on, Dalidou reachable: pulls latest snapshots silently in ~15s
- Computer on, Dalidou unreachable (remote work, network down): fail-open, exits without error, logs "Dalidou unreachable"
- Computer off at scheduled time: Task Scheduler runs it as soon as the computer wakes up
- Many days off: one run catches up; scp only transfers files not already present (snapshots are date-stamped directories, idempotent overwrites)
What gets backed up
The snapshots tree contains:
YYYYMMDDTHHMMSSZ/config/— project registry, AtoCore configYYYYMMDDTHHMMSSZ/db/— SQLite snapshot of all memory, state, interactionsYYYYMMDDTHHMMSSZ/backup-metadata.json— SHA, timestamp, source info
Chroma vectors are not in the snapshot by default
(ATOCORE_BACKUP_CHROMA=false on Dalidou). They can be rebuilt from the
source documents if lost. To include them, set ATOCORE_BACKUP_CHROMA=true
in the Dalidou cron environment.
Three-tier backup summary
After this setup:
| Tier | Location | Cadence | Purpose |
|---|---|---|---|
| Live | Dalidou /srv/storage/atocore/backups/snapshots/ |
Nightly 03:00 UTC | Fast restore |
| Off-host | T420 papa@192.168.86.39:/home/papa/atocore-backups/ |
Nightly after Dalidou | Dalidou dies |
| User machine | C:\Users\antoi\Documents\ATOCore_Backups\ |
Daily 10:00 local | Full home-network failure |
Three independent copies. Any two can be lost simultaneously without data loss.