Files
ATOCore/docs/windows-backup-setup.md
Anto01 33a6c61ca6 feat: daily backup to Windows main computer via pull-based scp
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>
2026-04-16 20:04:00 -04:00

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@dalidou already working (you're using it today)
  • C:\Users\antoi\ATOCore\scripts\windows\atocore-backup-pull.ps1 present

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

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

  1. Open Task Scheduler (taskschd.msc)
  2. Create Basic Task -> name: AtoCore Backup Pull
  3. Trigger: Daily, 10:00 AM, recur every 1 day
  4. Action: Start a program
    • Program: powershell.exe
    • Arguments: -ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden -File "C:\Users\antoi\ATOCore\scripts\windows\atocore-backup-pull.ps1"
  5. 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 config
  • YYYYMMDDTHHMMSSZ/db/ — SQLite snapshot of all memory, state, interactions
  • YYYYMMDDTHHMMSSZ/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.