From 4fb07b05af1041252bbc7a88db7b2bbf73ac7469 Mon Sep 17 00:00:00 2001 From: "Claude (Mac)" Date: Fri, 10 Jul 2026 22:48:32 +0100 Subject: [PATCH] =?UTF-8?q?docs:=20VPS=20memory-node=20(Objectif=20A)=20?= =?UTF-8?q?=E2=80=94=20miroir=20git=20+=20rsync=20+=20restic=20en=20pull,?= =?UTF-8?q?=20MAJ=20swap-hdd=20(claude-oversight=20scop=C3=A9,=20NAS?= =?UTF-8?q?=E2=86=92VPS=2022=20KO)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- _INDEX.md | 1 + common/vps-memory-node.md | 57 +++++++++++++++++++++++++++++++ common/vps-transition-swap-hdd.md | 4 ++- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 common/vps-memory-node.md diff --git a/_INDEX.md b/_INDEX.md index e7cf65a..d393452 100644 --- a/_INDEX.md +++ b/_INDEX.md @@ -14,6 +14,7 @@ | [PROTOCOL-INFRA — règles opérationnelles](common/PROTOCOL-INFRA.md) | maj continue | infra, protocole | | [Ports Registry NAS (source de vérité services — miroir de /volume1/docker/ports-registry.md)](common/ports-registry.md) | 2026-07-04 | infra, ports, registry | | [mcp-nas — référence opérationnelle consolidée (run_command v2, contraintes post-audit)](common/mcp-nas-reference.md) | 2026-07-09 | infra, mcp-nas, scripting | +| [VPS memory-node — Objectif A : nœud mémoire persistante (miroir git + rsync + restic, pull depuis VPS)](common/vps-memory-node.md) | 2026-07-10 | vps, memoire, backup, restic, tailscale | | [Git push depuis mcp-nas (172.17.0.1, API Gitea si git absent)](common/git-push-depuis-mcp-nas.md) | 2026-07-08 | infra, git, mcp-nas | | [Boîte à idées Claude (radar non décisionnel)](common/boite-a-idees-claude.md) | 2026-07-08 | infra, veille, ideation | | [Vision fondatrice Nyora + SOUL.md 3 instances](common/nyora-definition-fondatrice.md) | 2026-06-23 | nyora, soul, vision | diff --git a/common/vps-memory-node.md b/common/vps-memory-node.md new file mode 100644 index 0000000..7362e52 --- /dev/null +++ b/common/vps-memory-node.md @@ -0,0 +1,57 @@ +# VPS memory-node — Objectif A : nœud mémoire persistante (10/07/2026) + +**Statut** : en production. Le VPS Contabo (`contabo-vps-qbt`, tailnet 100.94.90.119) réplique en continu la mémoire du NAS : miroir git `nas-runbooks`, données NyoraNotes et context-hub, avec snapshots restic versionnés. + +## Architecture — PULL depuis le VPS (pas push depuis le NAS) +Choix imposé par deux constats du 10/07 : +1. Pas de root/cron utilisable sur le NAS (mot de passe sudo de Best0f périmé dans la mémoire Claude). +2. **NAS→VPS port 22 KO par le tailnet** (timeout), alors que VPS→NAS fonctionne. Cause : Tailscale Synology en mode userspace. Conséquence jour J : le « delta final NAS→VPS » se fera en **pull depuis le VPS**. + +Tout tourne donc sur le VPS, user **`claude-oversight`** (cron) : + +| Quoi | Script | Cadence | +|---|---|---| +| Miroir git + rsync données | `/opt/memory-node/bin/memory-sync.sh` | horaire (h+17) | +| Snapshot restic | `/opt/memory-node/bin/backup-push.sh` | quotidien 03:30 | +| Vérif intégrité + restauration test | `/opt/memory-node/bin/backup-verify.sh` | hebdo dim. 04:00 | + +Échec de job → alerte Telegram (bot hermes-perso → Nabil) via `notify-telegram.sh`. + +## Contenu répliqué +- `/opt/memory-node/git/nas-runbooks.git` : miroir bare, pull horaire depuis Gitea (`100.86.197.88:3232`, token Gitea lecture `vps-memory-node-mirror`, credentials dans la config du remote, home 700). +- `/opt/memory-node/data/nyora-notes/` et `data/context-hub/` : rsync `--delete` depuis `/volume1/docker/…`. +- **Exclusions délibérées** : `.env`, `*.bak`, `@eaDir`, `.DS_Store` — aucun secret répliqué sur le VPS ; les `.env` se récupèrent via le backup USB. +- Snapshots restic : `/opt/restic-repo` (rétention 14 j + 8 sem., `forget --prune` à chaque push). + +## Mot de passe restic — emplacements (jamais dans ce repo) +- **Maître** : NAS `/volume1/docker/scripts/.restic-password` (chmod 600, Best0f). +- **Copie runtime** : VPS `/opt/memory-node/.restic-pass` (chmod 600, claude-oversight) — nécessaire car restic s'exécute sur le VPS. +- Les deux fichiers contiennent la même valeur. Si rotation : regénérer sur le NAS, recopier sur le VPS, `restic init` d'un nouveau repo (l'ancien devient illisible). + +## Accès VPS +- **Tailscale SSH uniquement** (port 22 tailnet ; 22 public filtré par ufw, 2222/22222 fermés). `root` = mode `check` (ré-auth web périodique) ; `claude-oversight` = accept. +- `claude-oversight` : **sudoers scopé** (`/etc/sudoers.d/claude-oversight`) — start/stop/restart de qbittorrent-nox, docker, tailscaled + journalctl/status. PAS de NOPASSWD:ALL. +- Connexion interactive claude-oversight → alerte Telegram (`/etc/profile.d/claude-oversight-login-alert.sh`). +- Docker 29 + compose v5 installés (prérequis doublure jour J), aucun conteneur lancé. + +## Accès NAS depuis le VPS (le seul sens qui marche) +Clé `id_ed25519` de claude-oversight autorisée pour Best0f (port 22222) mais **bridée par forced-command** `~/.ssh/vps-memory-pull.sh` : +- source exigée 127.0.0.1 (= proxy userspace Tailscale ; un `from="100.94.90.119"` classique ne marche PAS, le NAS voit 127.0.0.1) ; +- seule commande admise : `rsync --server --sender` (lecture seule) sur `nyora-notes/` et `context-hub/`. + +## Vérifications rapides +```bash +ssh claude-oversight@100.94.90.119 # depuis le Mac (tailnet) +tail /opt/memory-node/log/memory-sync.log # rc=0 attendu +restic -r /opt/restic-repo --password-file /opt/memory-node/.restic-pass snapshots --compact +git -C /opt/memory-node/git/nas-runbooks.git log --oneline -1 # doit suivre Gitea à 1 h près +``` + +## Restauration (perte du NAS) +1. `git clone /opt/memory-node/git/nas-runbooks.git` → savoir complet. +2. `restic restore latest --target /tmp/r` → données NyoraNotes/context-hub datées. +3. Relancer les services sur le VPS avec ces données (Docker déjà prêt). + +## Reste à faire (hors Objectif A) +- Renommer le nœud tailnet NAS `ahmed---yesmine` → `nas` (console admin Tailscale, ou sudo NAS avec le mot de passe actuel). +- Mot de passe sudo Best0f à remettre à jour dans la mémoire Claude (celui connu est périmé). diff --git a/common/vps-transition-swap-hdd.md b/common/vps-transition-swap-hdd.md index 1205175..e87990b 100644 --- a/common/vps-transition-swap-hdd.md +++ b/common/vps-transition-swap-hdd.md @@ -24,7 +24,9 @@ Tailscale sur **VPS + NAS + iPhone + iPad** (wg-easy décommissionné 08/07). Co - **Montée maison = 2 Mo/s** (piège : réel 16 Mbps, pas 2 Mbps). → **Pré-charger à J-3**, seulement un **delta** le jour J. Jamais de lift complet en direct. ## mcp-vps = mes mains sur le VPS pendant le blackout -Instance linux-mcp sur le VPS, calquée sur linux-mcp-nas, sur l'user **`claude-oversight`** (sudo NOPASSWD:ALL en place, alerte Telegram par connexion, PermitRootLogin off). Joignable par le tailnet. +Instance linux-mcp sur le VPS, calquée sur linux-mcp-nas, sur l'user **`claude-oversight`**. MAJ 10/07/2026 : user créé (Objectif A) avec **sudoers scopé** (pas NOPASSWD:ALL), alerte Telegram sur connexion interactive, accès Tailscale SSH seul. L'instance linux-mcp elle-même reste à déployer. Voir `common/vps-memory-node.md`. + +⚠️ Constat 10/07 : **NAS→VPS port 22 tailnet KO** (Tailscale Synology en userspace) — VPS→NAS fonctionne. Le « delta final NAS→VPS » du jour J se fera en **pull depuis le VPS** (clé restreinte déjà en place, cf. vps-memory-node.md). ## Séquence jour J 1. **J-3** : VPS pré-chargé (noyau + volumes), qBittorrent/restic gelés.