# 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 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): ```powershell $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: ```powershell # 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) ```powershell 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.