- compose/gitea : SQLite -> Postgres (source = paquet App Center DSM, gitea_db 13 repos/3 users), image épinglée 1.27.3, push-to-create - scripts/07a-migrate-gitea.sh : export pg_dump (MVCC, .25 lecture seule) + tar/ssh (sshd DSM refuse rsync/scp) + manifestes sha256 - scripts/03b-secrets.sh : secrets gitea ajoutés - journal.md : entrées Phase 4
8.8 KiB
Compte rendu — PHASE 1 : Prérequis & sécurisation
Date de clôture : 2026-10-10
Statut : ✅ TERMINÉE — 12/12 critères validés, GO utilisateur donné, tâche Kanban « PHASE 1 » déplacée en Done.
Traçabilité complète : g9-migration/journal.md (18 entrées, 6 colonnes, G8).
1. Périmètre et objectifs
| Étape Kanban | Objectif | Résultat |
|---|---|---|
| T1.1 | Sécuriser le xpenology (.25) : stateful hors Watchtower, CLEANUP=false, notifications | ✅ Fait sur .25 et répliqué sur .24 |
| T1.2 | Inventaire des stateful xpenology + plan d'export | ✅ INVENTAIRE-STATEFUL.md |
| T1.3 | Thermique Freebox < 70 °C | ⏭️ Hors périmètre agent (action manuelle utilisateur, hors G10 sans validation) |
| T1.4 | J5040 edge / délestage avant formatage | ✅ Stack IA迁移 .11, Valheim + n8n/notes sur G9, OpenFox .27→.11, GO formatage |
Charte G1–G10 respectée : aucune suppression de données source (G4), backup vérifié avant toute migration (G2), aucune action destructive (G3 — formatage SSD exécuté par l'utilisateur), journal tenu (G8), aucun secret commité (G9).
2. T1.1 — Durcissement Watchtower (.25 + .24)
T1.1-a · Inventaire conteneurs .25
- 30 conteneurs (
sudo docker ps -aDSM), cross-check 12 projets compose/volume1/docker+ conteneurs GUI. - Livrable :
conteneurs-xpenology.csv(name, image:tag, mode GUI/compose, stateful, label, data_paths). - 22 stateful, 2 stateless (flaresolverr, mini-qr), 1 watchtower. 15 yml compose récupérés.
T1.1-b · Labels watchtower.enable=false
- .24 : n8n, couchdb, obsidian, valheim → label
false(docker inspect), watchtowertrue. - .25 : 28/28 stateful = false, vérifié par boucle
docker inspect(0 exception).- 13 projets compose : labels dans les yml +
compose up -d(backups.bak-labelssur le NAS, InfluxDB recréé). - 8 conteneurs GUI (postgres16, vaultwarden-server-1, qbittorrent, sonarr, radarr, jackett, prowlarr, deluge) :
docker update --label-addindisponible sur docker 24.0.2 (DSM) → clonage via API unix socket : stop → rename-old-lbl→ create avecLabelsau niveau racine du payload (les labels nichés dansConfigsont épurés par le daemon Synology) → start. Données intactes (mêmes binds/env), restauration automatique en cas d'échec.
- 13 projets compose : labels dans les yml +
- Incident résolu en cours de route : accès .25 bloqué (clé retirée + compte
effibloqué par Synology) → déblocage par l'utilisateur, nouvel accès via compteMasterport 222.
T1.1-c · Watchtower durci (digest-pinné)
- Image :
nickfedor/watchtower@sha256:45b54f6dc15227cfb38dbb826f2881aa0f56aaf0c255cdbb38bd80e598bdca9a(1.23.0 ; digest vérifié =:1/:1.23/:latestvia API registry —containrrr/watchtower:1n'existe pas). - Env sur .24 et .25 :
CLEANUP=false,INCLUDE_STOPPED=false,POLL_INTERVAL=3600,LABEL_ENABLE=true, labeltrue. - .25 était
containrrr/watchtower:latestCLEANUP=true (dangereux) → remplacé ; projet composewatchpower(COMPOSE_PROJECT_NAMErequis). - Contrainte fork nickfedor : refuse
SCHEDULE+POLLsimultanés → POLL 3600 conservé.
T1.1-d · Notifications Watchtower → n8n → Matrix
- Chaîne : watchtower (shoutrrr generic) → n8n .24 workflow
w1pfhX0A7KvaDrtk(Webhook → Build log → Matrix → Respond) → Synapse .24:8008, salon ops!mp7MFx9QbrJ0ARtzw…, userops-bot. - Preuves : notifs .24 (exec #10, #31, #32) + notif startup réelle du watchtower .25 reçue (« Watchtower 1.23.0 using Docker API v1.43 … Next scheduled run 02:48 »), event_ids vérifiés dans
event_jsonde Synapse. - Correctif : payload shoutrrr generic =
title/message(le workflow lisaitevent_name/image_name→ affichait « undefined »). - Points techniques notés : n8n v2.42 exige publication du workflow ; URL Matrix en expression full
={{ }}; txnId = image+timestamp (évite les doublons).
3. T1.2 — Inventaire stateful .25
Livrable : INVENTAIRE-STATEFUL.md — pour chaque stateful : image:tag, data paths, taille du -sh mesurée, type DB, mode GUI/compose, dépendances, méthode d'export et destination (G9 / .11 / .25 / supprimé).
Tailles clés : NextCloud 2.3G, valheim 2.8G, openwebui 4.7G, Joplin 706M, Leantime 298M, AFFiNE 94M, postgres16 70M, n8n 75M, gitea 2M, vaultwarden 8.8M, beszel 11M, InfluxDB 188K.
Vigilances relevées : conteneurs GUI sans CLI labels (passage par API), flux .25→.11 (AFFiNE/OpenWebUI → LLM proxy), credentiels DB d'origine conservés à l'import (les seeds G9 sont ignorés sur base initialisée — documenté dans 07-migrate-stateful.sh).
4. T1.4 — J5040 (.27) : délestage, migrations, GO formatage
Backups (G2, avant toute migration)
- Valheim : world 53.6M + backups + env + pterodactyl.tar 4.7G → Folzo Save, SHA256 vérifiés.
- Inventaire complet J5040 : 34 conteneurs, 116 images, dumps DB (dify 671M, n8n sqlite, pterodactyl wings 4.7G), volumes nommés (open-webui 3.4G, whisper-cache 2.0G), home 1.8G, cron 6 jobs → 12 Go sur
.11:/run/media/folzo/Folzo Save/migration-j5040/avec SHA256SUMS.txt (sha256sum -c: 23/23 « Réussi » — l'unique « Échec » est l'auto-référence de SHA256SUMS.txt). - OpenFox :
openfox-share.tar.gz942M +node-bin.tar.gz52M archivés + SHA256 vérifiés.
Migrations réalisées
| Cible | Contenu | Preuve |
|---|---|---|
| PC IA .11 | Stack IA complète (22 images save/load) : open-webui, searxng, pipelines, qdrant (6 collections), couchdb, mcpo, tts, dify (14 healthy), llm-proxy 3011/3012/3017, ollama 28 modèles, whisper large-v3 | Test LLM bout en bout → « MIGRATION-OK » ; endpoints 200 |
| G9 .24 | Valheim : monde restauré, 37 chunks sha256 identiques source, conteneur healthy, UDP 2456 joignable | Double-run G4 : source redémarrée healthy |
| G9 .24 | n8n + Obsidian + CouchDB : database.sqlite sha 693ee229 IDENTIQUE source, vault 79M |
n8n 5678→200, couchdb 5984→200, obsidian 3100 OK |
| PC IA .11 | OpenFox (66 sessions, thread préservé) : systemd openfox.service, HTTP 200 sur .11:10369, symlink /home/effi→/home/folzo, SELinux chcon -R -t bin_t |
Thread de migration repris sur .11 après bascule proxy |
T1.4-e · GO utilisateur
Vérification sans .27 (éteint) : OpenFox .11 200, IA .11 200, n8n/couchdb/obsidian/Matrix .24 OK, NAS .25 31/31 Up + labels 28/28 false + watchtower digest healthy. Backup 24 Go SHA256 23/23. GO donné par l'utilisateur — formatage SSD J5040 exécuté par l'utilisateur lui-même (conforme G3).
5. Livrables produits
| Fichier | Contenu |
|---|---|
g9-migration/journal.md |
18 entrées 6 colonnes (G8), toutes les actions Phase 1 |
g9-migration/conteneurs-xpenology.csv |
Inventaire 30 conteneurs .25 |
g9-migration/INVENTAIRE-STATEFUL.md |
Inventaire stateful + plan d'export (base Phase 4) |
g9-migration/INVENTAIRE-J5040.md |
Inventaire J5040 avant formatage |
Backups .11:/run/media/folzo/Folzo Save/migration-j5040/ |
24 Go, SHA256SUMS vérifié |
/tmp/nas-yml/ (session) |
yml compose .25 modifiés + .orig (répliqués sur le NAS avec .bak-labels) |
6. Améliorations post-revue (5 findings, tous résolus)
README.mdracine : ligne ajoutée pourg9-migration/README.mddans le tableau de lecture.01-hardening.sh: garde anti-lockout SSH (refusePasswordAuthentication nosiauthorized_keysvide).07-migrate-stateful.sh: multiplexage SSH (ControlMaster/ControlPath/ControlPersist) → 1 seule session par brique au lieu de 4+ ; pré-testcommand -v rsyncsur le NAS..gitignore: règle no-op!*.env.examplesupprimée.restic.env.example: suppression du faux backendsmb://; voies supportées documentées (sftp:, rclonesmb:, montage CIFS).
7. Restes et points d'attention pour la Phase 2
- T1.3 (thermique Freebox) : non traitée par l'agent (matériel, hors périmètre) — à valider manuellement par l'utilisateur (< 70 °C en charge).
- Cron BomberFox (J5040) : spécifique J5040, à reconfigurer après formatage.
- Proxy inverse openfox.folzocorp.fr : bascule .27→.11 à confirmer définitivement côté utilisateur.
- Clés SSH : la clé
.25utilisée estid_ed25519_openfox11(nouvelle, ajoutée auxauthorized_keysdu compte Master) ; les clés de l'ancien bundle .27 sont à reconstituer/archiver. - Les imports Phase 4 conservent les credentiels DB d'origine du xpenology (documenté).
- Rollback global Phase 1 : rien de destructif sur les sources (.25 lecture seule + labels réversibles via
.bak-labels, .27 éteint intact, backups Folzo Save).
8. Dépendances levées pour la suite
Phase 2 (Base G9) peut démarrer : docker est déjà opérationnel sur .24 (T2.3 de fait), durcissement SSH/ufw/fail2ban reste à faire (scripts 01-hardening.sh, 02-disk-luks.sh, 03-docker.sh prêts et conformes à la charte).