60 KiB
60 KiB
Journal d'exécution — Migration G9 (G8)
Chaque action est journalisée : date, action, raison, résultat, rollback. Rempli pendant la migration. Ce fichier est la trace de ce qui a réellement été fait.
| Date | Phase | Action | Raison | Résultat | Rollback |
|---|---|---|---|---|---|
| 2026-10-06 | — | Kit d'exécution préparé (scripts + configs + compose) | Migration G9 à venir | Prêt à exécuter | — |
| 2026-10-06 | — | Conformisation des scripts à la charte G1–G10 | Audit des garde-fous (C1–C5) | journal() 6 colonnes (G8) dans les 10 scripts ; renvois garde-fous en en-tête (G1) ; tableau G→script dans README (G2) ; secrets hors git confirmés (G9) |
git checkout des fichiers modifiés |
| 2026-10-06 | — | Corrections post-revue (6 findings) | Revue de code du kit G9 | Binds compose → 0.0.0.0 (accessibles LAN via J5040, ufw restreint) ; retrait mount /etc/timezone (Gitea) ; user DB dédié photoprism ; fstab USB = vrai FSTYPE ; docs credentiels import ; suppression fichiers morts (ufw.rules, smb.conf, RESTIC_APPEND_ONLY) | git checkout des fichiers modifiés |
| 2026-10-09 | 1 (T1.4-a1) | Backup Valheim J5040 → .11:/run/media/folzo/Folzo Save/migration-j5040/valheim/ |
G2 : filet avant migration ; serveur arrêté proprement (shutdown backup 20261009-074115) | 3 artefacts : valheim-world.tar.gz (53.6 Mo), valheim-backups.tar.gz (53.6 Mo), valheim-steam.tar.gz (2.13 Go) + valheim-env.json (chmod 600) ; sha256 source == destination vérifiés | Suppression du dossier migration-j5040/valheim/ sur Folzo Save (aucune donnée source touchée) |
| 2026-10-09 | 1 (T1.4-b1) | Valheim UP sur G9 .24 (conteneur direct, sans Pterodactyl) | Ami joueur — priorité ; serveur source J5040 redémarré (double-run G4) | Docker installé sur G9 (T2.3 de fait) ; image valheim-pterodactyl:1 transférée par docker save/load (ghcr denied) ; monde restauré : 37 chunks sha256 identiques source ; conteneur healthy, ports 2456-2458 ouverts, lobby enregistré (ZDOS:84), UDP 2456 joignable depuis J5040 |
docker compose down + docker rmi sur G9 ; J5040 intact (serveur source redémarré et healthy) |
| 2026-10-09 | 1 (T1.4-a) | Inventaire J5040 + backup stateful → Folzo Save | G2 : filet complet avant formatage | 34 conteneurs + mounts + 116 images inventoriés ; 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, compose+env. 12 Go sur .11:/run/media/folzo/Folzo Save/migration-j5040/ avec SHA256SUMS.txt (sha256sum -c : Réussi). Inventaire → g9-migration/INVENTAIRE-J5040.md |
Suppression du dossier migration-j5040/ (données sources J5040 intactes) |
| 2026-10-09 | 1 (T1.4-b) | Migration stack IA J5040 → PC IA .11 | Délester J5040 avant formatage ; IA sur GPU .11 | 22 images transférées docker save/load ; stack monté dans ~/migration-j5040 (binds :z SELinux) ; endpoints vérifiés : open-webui/searxng/pipelines/qdrant (6 collections)/couchdb/mcpo/tts 200, dify 307 (14 healthy), llm-proxy 3011/3012/3017, ollama 28 modèles, whisper large-v3. Test LLM bout en bout : proxy 3012 → « MIGRATION-OK ». Doublons supprimés (whisper/ocr/stt déjà présents) |
docker compose down + docker rmi sur .11 ; J5040 inchangé (source des images) |
| 2026-10-09 | 1 (T1.1-a) | Inventaire des conteneurs xpenology .25 : 30 conteneurs (sudo docker ps -a DSM), cross-check 12 projects compose /volume1/docker + 7 conteneurs GUI |
Base du durcissement watchtower et de l'inventaire stateful | g9-migration/conteneurs-xpenology.csv (nom, image:tag, mode, stateful, label, data_paths) ; 15 yml compose récupérés via ssh cat dans /tmp/nas-yml/ (+ .orig) ; tailles du -sh mesurées par projet |
Fichiers locaux, aucune action destructive sur .25 |
| 2026-10-09 | 1 (T1.4-c) | Migration n8n + notes → G9 .24 | Continuité des services notes/automatisation | 3 images (n8n/obsidian/couchdb) transférées save/load ; données : n8n database.sqlite sha 693ee229 IDENTIQUE source, obsidian-vault 79M, couchdb-data. Compose ~/docker-compose.yml+g9.env (600) : n8n 5678→200, couchdb 5984→200, obsidian 3100→200 |
docker compose down sur .24 ; J5040 intact, backups Folzo Save intacts |
| 2026-10-09 | 1 (T1.1-b) | Labels watchtower.enable=false — stack .24 appliqué, .25 BLOQUÉ |
Durcissement : exclure les stateful du auto-update | .24 : n8n, couchdb, obsidian, valheim → label false vérifié docker inspect ; watchtower → label true. .25 bloqué : clé id_ed25519_effi_server retirée de ~/.ssh (11:43) + mot de passe refusé (Synology a bloqué le compte effi). 22 conteneurs .25 + 7 GUI = labels non appliqués, yml préparés localement /tmp/nas-yml/ prêts à pousser. Action requise côté utilisateur : débloquer effi (Panneau → Utilisateurs, blocage IP) |
Retirer les labels avec docker compose up -d (yml .orig sauvegardés sur .25 en .bak) |
| 2026-10-09 | 1 (T1.1-c) | Watchtower durci sur .24 : image pinnée par digest + CLEANUP=false + INCLUDE_STOPPED=false | Durcissement S11.4 (pas de :latest, pas de cleanup des états) | Image nickfedor/watchtower@sha256:45b54f6d... (digest épinglé, 1.23.0, fork maintenu — containrrr/watchtower:1 n'existe pas sur Docker Hub, vérifié API). Env vérifiés : CLEANUP=false, INCLUDE_STOPPED=false, POLL=3600, label-scope. Statut running, API Docker v1.52. À répliquer sur .25 (watchtower .25 = :latest CLEANUP=true → yml durci prêt /tmp/nas-yml/watchtower.yaml) |
Rester sur containrrr/watchtower:latest avec CLEANUP=true (state actuel .25, non durable) |
| 2026-10-09 | 1 (T1.1-d) | Notification watchtower → webhook n8n → Matrix — chaîne complète testée sur .24 | Exigence ops : tracer chaque MAJ d'image | Watchtower (shoutrrr generic) → webhook n8n POST /webhook/watchtower (workflow w1pfhX0A7KvaDrtk, Webhook→Build log→Matrix→Respond) → Synapse .24:8008 salon ops. Notification réelle de startup watchtower reçue (exec #10) + 2 notifs de test distinctes (exec #31/#32, event_ids $OSVIb…/$XcR0…/$bu5f… vérifiés dans event_json de Synapse). Utilisateurs : ops-bot (token), n8n login owner recréé. Points techniques : n8n v2.42 exige publication (workflow_history+published_version) ; URL Matrix = expression full ={{ }} (URL statique non évaluée en prod) ; txnId = image+timestamp Build log (ids sandbox déterministes → doublons sinon). Notification sur .25 : yml prêt (watchtower .25 durci + URL webhook → n8n .24) |
Désactiver WATCHTOWER_NOTIFICATION_URL sur .24 ; supprimer salon/ops-bot via Synapse admin |
| 2026-10-09 | 1 (T1.1-d) | Ouverture salon Matrix ops sur Synapse .24 + user ops-bot | Forwarding notifications (Synapse absent de .11, déjà déployé sur .24) | Room !mp7MFx9QbrJ0ARtzw… ("ops") créée via createRoom (room_creation: true ajouté à homeserver.yaml via sudo, restart synapse) ; user ops-bot enregistré ; 6 messages de probe redactés |
Supprimer room + user via administration Synapse ; retirer room_creation: true |
| 2026-10-10 | 1 (T1.1-b) | Labels watchtower.enable=false .25 : 28/28 stateful labellés |
Accès .25 débloqué (compte Master, port 222, clé id_ed25519_synology + NOPASSWD sudo). Compose (13 projets) : yml avec labels installés (backups .bak-labels) + compose up -d (12/13 OK, postgres16 géré GUI). GUI (8 conteneurs dont postgres16) : docker update --label-add indisponible sur docker 24.0.2 → clonage via API unix socket (rename -old-lbl, create avec labels racine, start ; backup auto si échec). |
Vérif docker inspect loop : les 28 stateful = false, watchtower = true. Preuves dans /tmp/clone_labels.py + logs session |
Supprimer label : restaurer .bak-labels + compose up -d ; conteneurs clonés = mêmes binds/env (données intactes) |
| 2026-10-10 | 1 (T1.1-c/.25) | Watchtower durci sur .25 : nickfedor/watchtower@sha256:45b54f6d… + CLEANUP=false + INCLUDE_STOPPED=false + POLL=3600 + label-scope |
Réplication du durcissement .24 sur NAS (watchtower .25 était :latest CLEANUP=true). Projet compose watchpower (COMPOSE_PROJECT_NAME requis, up -d OK). Nickfedor refuse SCHEDULE+POLL ensemble → POLL 3600 conservé. |
Notification startup réelle reçue dans Matrix : « Watchtower 1.23.0 using Docker API v1.43 … Next scheduled run 02:48 » (event vérifié). Nœud n8n corrigé (payload shoutrrr generic = title/message, pas event_name/image_name) | Restaurer compose.yaml.bak-labels + compose up -d (containrrr/watchtower:latest CLEANUP=true) |
| 2026-10-10 | 1 (T1.4-e) | GO utilisateur — vérification finale services sans .27, avant formatage | Condition posée : .27 éteint + tout vérifié OK = GO (formatage SSD fait par l'utilisateur). | Vérifiés depuis .11 : OpenFox .11:10369 200 (thread survit à la bascule), dify/open-webui/llm-proxy 3011-3012 .11 200, n8n/couchdb/obsidian/matrix .24 OK (API 200), NAS .25 : 31/31 conteneurs Up, labels stateful 28/28 false (0 exception), watchtower digest healthy (notif Matrix confirmée). Clé SSH .25 recréée sur .11 (id_ed25519_openfox11, authorized_keys Master). Backup Folzo Save 24 Go SHA256 23/23. GO donné, formatage J5040 par l'utilisateur | Rollback : rallumer .27 (données intactes, rien de destructive n'a été fait sur .27) |
| 2026-10-09 | 1 (T1.2-a) | Inventaire stateful .25 → g9-migration/INVENTAIRE-STATEFUL.md |
Préparer l'export/migration des données sans perte | 30 conteneurs docker ps -a couverts (cross-check CSV), pour chaque stateful : image:tag, data paths, du -sh mesuré, type DB, mode GUI/compose, dépendances, méthode d'export + destination (G9/.11/.25/supprimé). Tailles : n8n 75M, Joplin 706M, NextCloud 2.3G, valheim 2.8G, openwebui 4.7G, beszel 11M, InfluxDB 188K, gitea 2M, vaultwarden 8.8M, Leantime 298M, AFFiNE 94M, postgres16 70M. Points de vigilance : 7 GUI sans CLI labels, flux .25→.11 |
Suppression du fichier INVENTAIRE-STATEFUL.md (aucune action sur .25) |
| 2026-10-10 | 1 (T1.4-f) | OpenFox recopié J5040 (.27) → PC IA .11 : thread + sessions préservés avant formatage | Les sessions OpenFox vivent dans .27:~/.local/share/openfox/sessions.db (66 sessions, 107 Mo) → formatage = perte sans copie. |
Bundle openfox-share.tar.gz 942M (projets ~/openfox 1.1G, .config/openfox 486M auth+config, .local/share/openfox 922M sessions, node v24 global) + node-bin.tar.gz 52M vers .11, SHA256 vérifiés « Réussi », archivés sur Folzo Save. Déploiement .11 : extract, symlink /home/effi → /home/folzo, launcher corrigé, SELinux chcon -R -t bin_t, unit systemd openfox.service activé → HTTP 200 sur .11:10369 (LAN), thread OpenFox re-pris sur .11 après bascule proxy. Vérifié sans .27 (éteint) : endpoints .11/.24/.25 tous OK |
systemctl disable --now openfox + suppression ~/.config/openfox et ~/.local/share/openfox sur .11 ; .27 non touché (données intactes avant formatage) |
| 2026-10-10 12:52 | 2 | hardening : SSH keys-only activé | Durcissement SSH (G6) | PasswordAuthentication no, PermitRootLogin prohibit-password | Re-activer PasswordAuthentication yes dans sshd_config |
| 2026-10-10 12:52 | 2 | hardening : ufw activé | Firewall LAN-only (G6) | deny incoming, allow outgoing, OpenSSH + services LAN-only 192.168.1.0/24 (TCP 2342 3000 3100 5678 5984 8008 8009 8080 8081 8096 + Valheim 2456-2458 TCP/UDP) | ufw disable |
| 2026-10-10 12:52 | 2 | hardening : unattended-upgrades activé | Mises à jour de sécurité auto (G7) | installé + activé | systemctl disable --now unattended-upgrades |
| 2026-10-10 12:52 | 2 | hardening : fail2ban activé | Anti brute-force SSH (G7) | installé + activé | systemctl disable --now fail2ban |
| 2026-10-10 12:53 | 2 | data : Espace /data créé (Option 0) | Données famille sur mono-disque 990 Pro, LUKS abandonné (protection = ufw LAN + restic chiffré) | /data, /data/famille, /data/docker (owner folzo, 2775) | rmdir /data/famille /data/docker /data |
| 2026-10-10 12:53 | 2 | docker : Docker + compose installés | Runtime conteneurs du G9 | folzo dans le groupe docker | apt-get remove docker.io docker-compose-v2 |
| 2026-10-10 12:53 | 2 | smb : Samba installé, partage [famille] (invité LAN) | Accès SMB données famille sans maintenance par appareil | partage [famille] → /data/famille, guest ok, force user folzo, ufw SMB LAN-only | systemctl disable --now smbd nmbd ; suppression [famille] ; ufw delete règles SMB |
| 2026-10-10 13:05 | 2 | hardening : correctif drop-in 50-cloud-init.conf |
Ubuntu 26 : Include sshd_config.d en tête → 1re occurrence gagne → PasswordAuthentication yes gagnait | sshd -T : passwordauthentication no effectif ; script 01 patché (boucle drop-ins) ; anti-lockout vérifié (session clés OK, auth mot de passe refusée) |
Restaurer .bak du drop-in + restart ssh |
| 2026-10-10 13:10 | 2 | smb : netbios activé + smbclient + tests R/W | Ubuntu default disable netbios=Yes bloque la découverte par nom |
Partage \\192.168.1.24\famille visible depuis .11 (LAN) ; put/get/rm testés avec diff sha → SMB_RW_OK ; invité (guest ok, force user folzo) |
disable netbios = Yes + restart smbd/nmbd |
| 2026-10-10 13:20 | 2 | docs : bascule G9 mono-disque 990 Pro + abandon LUKS (Option 0, validation utilisateur) | 2ᵉ disque interne prévu = aucun ; données familiales non critiques ; fuite internet = ufw/edge, pas LUKS | DOSSIER-RECREATION.md v2.3 (R1/R3/3.1/R4/R5/R8/plan 0.4 + changelog) ; DOSSIER-SOFTWARE.md S9/S10/AC5/AC6 + statut révisé 10/10 ; g9-migration/README.md (02-data.sh, note disque) ; 02-disk-luks.sh supprimé → 02-data.sh (non destructif) ; prompt Kanban Phase 2 T2.2 réaligné |
git checkout des docs (historique non destructif, aucune donnée touchée) |
| 2026-10-10 16:50 | 2 | beszel : agent v0.21.0 installé (hub .25:8090) | Monitoring G9 (T2.5) — token universel fourni par l'utilisateur, transmis hors journal (G9), fichiers temporaires supprimés | service beszel-agent active, logs : « WebSocket connected host=192.168.1.25:8090 » → G9 visible dans le hub ; script 05 réécrit (get.beszel.dev, version épinglée, token par env) |
systemctl disable --now beszel-agent ; install-agent.sh -u |
| 2026-10-10 16:58 | 2 | smb : correctif nmbd (disable netbios = No) |
Ubuntu 26 pose disable netbios = yes par défaut → nmbd inactive (découverte par nom impossible) |
smbd+nmbd active, testparm OK, partage famille visible, guest map OK ; script 04 patché |
disable netbios = yes + restart |
| 2026-10-10 17:30 | 2 | corrections post-revue code (8 findings) | Revue de code du kit (diff Phase 2) | 1 watchtower compose aligné déploiement réel (nickfedor digest + POLL 3600 + shoutrrr→n8n, placeholder marqué) ; 2 vaultwarden compose : ADMIN_TOKEN_FILE/TRUSTED_HOSTS, ./data:/data, healthcheck curl /alive ; 3 restic : append-only déplacé après 1er backup avec latest ; 4 07-migrate : stop/start conteneurs source autour du rsync (cohérence bases + manifeste stable, G4 respecté) ; 5 secrets 644 (n8n uid 1000) ; 6 scripts chmod +x ; 7 accès xpenology → Master/clé (07/08/README) ; 8 06b : grep || true + fstab fsck 0 pour ntfs/exfat. Vérif : bash -n 10/10 OK, YAML compose OK |
git checkout des fichiers modifiés |
| 2026-10-10 18:40 | 2 | stack .24 : correctifs tests utilisateur (Element, n8n) | Tests Phase 2 : Element tournait en boucle (lisait /app/config.json défaut matrix.org, le mount /config.json n'est pas lu) ; n8n refusait l'accès http par IP (secure cookie) | element recréé avec ./config.json:/app/config.json:ro → homeserver 192.168.1.24:8008 chargé ; n8n : N8N_SECURE_COOKIE=false + N8N_HOST=192.168.1.24 + N8N_PROTOCOL=http ; vérif HTTP 200 sur 8009 et 5678 ; backups .bak.$TS des 2 compose. Obsidian 3100 : « secure connection required » = attendu (web viewer exige HTTPS) → résolu en Phase 4 via Caddy TLS (obsidian.folzocorp.fr), pas de fix Phase 2 |
restaurer les .bak + compose up -d |
| 2026-10-10 17:55 | 2 | valheim : diagnostic connexion jeu (ufw FORWARD + port de jeu) | Utilisateur : « serveurs indisponibles » en jeu | Cause 1 : ufw FORWARD DROP cassait l'UDP docker (TCP passait via docker-proxy) → règle DOCKER-USER -A -p udp --dport 2456:2458 -j ACCEPT posée (+ RETURN, à persister dans /etc/ufw/before.rules). Cause 2 : le serveur Valheim lie le port de jeu = UDP 2457 (2456 = steam query, non bindé) — tcpdump prouve que les paquets 2457 arrivent bien au conteneur. → En jeu, rejoindre 192.168.1.24:2457. Amis hors LAN : redirection Freebox UDP 2456-2458 → .24 (action utilisateur, G6 ; l'ancienne redirection pointait .27) |
iptables -D DOCKER-USER 1 |
| 2026-10-10 20:05 | 2 | valheim : restauration du VRAI monde + persistance | Le serveur tournait dans un monde NEUF : le SAVE_LOCATION de l'image (valheim-pterodactyl) pointe /home/steam/.config (couche conteneur, non persistée) → le monde restauré Phase 1 a été perdu à la recréation du conteneur (09/10 20:34). Sauvegarde saine unique = backup .11 Folzo Save (172 chunks, 848 saves, sha 8e68a82f vérifié) | sha vérifié sur .24 ; monde neuf archivé (monde-neuf-20261010-archivage) ; vrai monde extrait dans le bind data/save (33 chunks, _main.848.db2) ; compose: SAVE_LOCATION=/home/container/save (persistant) ; serveur relancé avec -savedir /home/container/save. À faire: l'utilisateur rejoint 192.168.1.24:2457 et valide la base. Note: le job AUTO_BACKUP de l'image regarde l'ancien chemin (backups auto à reconfigurer sur /home/container/save) |
restaurer compose .bak + monde neuf depuis l'archivage |
| 2026-10-10 20:15 | 2 | valheim : restauration du monde depuis le SSD J5040 (USB) | La build de l'ami (10/10 matin) était sur .27, postérieure au backup .11 (848). SSD branché USB sur .24, LVM intact (non formaté) | VG USB renommé j5040-vg (nom dupliqué avec le VG système, collision) ; monté RO ; monde trouvé wings/data/aff5199c…/steam/.config/.../worlds_local/LeRepaireDuGrandFrak = _main.897 du 10/10 06:20 ; serveur stoppé, version 848 archivée (monde-848-20261010-archivage), 897 + player.list/prefs/lists déployés dans le bind persistant data/save (chown 1000) ; serveur redémarré, world chargé puis save 898. USB démonté, VG désactivé. À valider en jeu : base de l'ami visible. |
mv des dossiers d'archivage (monde-848-20261010-archivage) vers data/save ; redémarrer le serveur |
| 2026-10-10 20:22 | 2 | backup .11 Folzo Save : valheim-world.tar.gz écrasé par la version 897 (10/10 06:20) | Demande utilisateur expresse : la copie de référence doit être la plus récente (build de l'ami) | Nouveau tar 64.6 Mo (worlds_local 897/898 + backups auto + player.list/prefs/lists), sha256 e766ae2c… (ancien 8e68a82f… remplacé dans SHA256SUMS.txt, sha256sum -c OK) |
L'archive valheim-backups.tar.gz sur .11 conserve les versions antérieures |
| 2026-10-10 20:30 | 2 | reboot test G9 validé (GO utilisateur) | Valider la persistance post-reboot (durcissement, montages, services) | G9 up en ~75 s ; ufw actif + règle DOCKER-USER valheim persistée (before.rules) ; passwordauthentication no effectif ; smbd/nmbd/fail2ban/unattended/beszel-agent actifs ; 7 conteneurs up (valheim healthy) ; /data/famille présent ; partage famille visible ; endpoints 5678/8008/8009/5984/3100 OK ; monde valheim 897/898 intact | — |
| 2026-10-10 20:32 | 2 | G9 éteint (poweroff) sur demande — déplacement physique sur onduleur | Fin de Phase 2, tâche Kanban déplacée en Done par l'utilisateur | G9 éteint proprement (ping KO après poweroff) ; données saines (valheim 898, world .11 sha e766ae2c). Prochain boots : tout est persistant (validé par reboot test). Prévu : onduleur USB → installer NUT (nut-server) en Phase 3 pour arrêt propre sur batterie | rallumer = action physique utilisateur |
| 2026-10-10 20:12 | 3 | restic : premier backup OK | Backup chiffré du G9 (G2) | snapshot 21de0787 — 4 564 fichiers, 6.956 GiB lus / 4.178 GiB stockés, sources /data /home/folzo /etc ; conteneurs stateful stoppés (valheim, n8n, synapse, couchdb, obsidian) puis relancés | restic forget 21de0787 && restic prune |
| 2026-10-10 20:20 | 3 | transport backup : SMB/CIFS écarté, rclone retenu | mount.cifs (vers 1.0) + restic → chmod … no such file or directory (chmod impossible sur le partage) ; rclone mount FUSE → cache d'écriture qui a perdu des objets du repo ; rclone 1.60 (apt) sans backend smb |
Transport final = backend rclone de restic (FTP/SMB), repo rclone:freeboxftp:Freebox/backup/g9 ; 3 repos de test ont été créés puis purgés (4.176 GiB libérés) |
retirer -o rclone.args=… --append-only des jobs ; restaurer le mount CIFS depuis /etc/fstab.bak.* + unité rclone-freebox.service |
| 2026-10-10 20:22 | 3 | repo restic initialisé sur la Freebox | Backup chiffré + versionné du G9 | Repo Freebox/backup/g9 (Delta, 1.79 To, 1.785 To libres) ; clé de repo générée par openssl dans /etc/restic/repo.key (600, jamais affichée) |
rclone purge freeboxftp:Freebox/backup/g9 (DESTRUCTIF, volontaire) |
| 2026-10-10 20:53 | 3 | append-only vérifié | Anti-ransomware (G2) | forget --prune REFUSÉ par rclone serve restic --stdio --append-only (rc=1), snapshots toujours lisibles ; repo de preuve _appendonly-test créé puis purgé |
retirer -o rclone.args=… --append-only des jobs |
| 2026-10-10 20:53 | 3 | test de restauration OK | Vérification G2 (restauration testée) | /data/famille/Test/PXL_20261009_130502121.jpg_compressed.JPEG restauré depuis la Freebox, sha256 9352a905d9bb… identique à l'original |
restauration dans un dossier temporaire, aucun impact sur les données sources |
| 2026-10-10 20:55 | 3 | jobs + cron installés | Backup automatique quotidien + alerte | /usr/local/bin/restic-{daily,prune,health,notify}.sh (root 755) ; cron root : 03:30 backup, 04:00 prune, 09:15 health (alerte webhook n8n → Matrix) |
supprimer les 4 lignes du crontab root + les 4 scripts |
| 2026-10-10 20:31 | 3 | artefact secret supprimé | G9 : les secrets ne doivent pas traîner | dossier racine créé par erreur (heredoc collé) contenant le mot de passe SMB, mode 600 root → supprimé ; le mot de passe n'a jamais été affiché ; cifs.cred / rclone-smb.cred / ftp.conf / repo.key restent en 600 (root) |
rien (suppression) |
| 2026-10-10 20:47 | 3 | unité systemd rclone-freebox retirée |
Mount CIFS abandonné au profit du backend rclone : plus besoin de montage persistant | service désactivé, unit et /etc/systemd/system/rclone-*.d/override.conf supprimés, daemon-reload ; ligne fstab CIFS ajoutée puis retirée (sauvegardes /etc/fstab.bak.*) |
recréer l'unit + l'override |
| 2026-10-10 21:12 | 3 | alerte Matrix en place (directe, sans n8n) | Prévenir l'ops si le backup échoue (C3) | restic-notify.sh poste sur Synapse (http://192.168.1.24:8008, salon ops, token ops-bot récupéré du workflow n8n « Watchtower Notification », écrit dans /etc/restic/matrix.env 600 root, jamais affiché) ; 2 messages de test envoyés et reçus ; fallback webhook n8n conservé |
retirer les 3 lignes de /etc/restic/matrix.env + les 3 lignes cron |
| 2026-10-10 21:12 | 3 | accès n8n : à recréer (bloquant pour la voie n8n → Matrix) | L'utilisateur n'a plus accès à n8n | 1 workflow présent (« Watchtower Notification »), CLI n8n 2.42.5 sans création d'utilisateur → recréer l'accès par l'UI (propriétaire) puis créer une clé API (Settings → n8n API) ; la voie directe Matrix est opérationnelle en attendant | — |
| 2026-10-10 21:19 | 3 | jobs lancés à la main + logs | Vérifier que le backup et la purge s'exécutent hors kit (C3) | restic-daily.sh rc=0 → snapshot cccdb2c7 (+5.175 MiB stockés, parent 21de0787) ; restic-prune.sh rc=0 ; logs /var/log/restic-{daily,prune,health}.log ; restic check --read-data-subset=1% sans erreur |
restic forget cccdb2c7 && restic prune |
| 2026-10-10 21:19 | 3 | rétention appliquée (7/4/12/5) | Rétention et espace (C5) | forget --prune exécuté (append-only refusé → purge appliquée sans append-only, alerte envoyée), 2 snapshots conservés ; repo 4.19 GiB pour 1.785 TiB libres sur le RAID5 de la Delta (1.79 TiB) — marge conforme aux 2 To |
rien (rétention non destructrice à ce stade) |
| 2026-10-10 21:20 | 3 | lock stale supprimé + unlock sans append-only |
Le lock laissé par une exécution interrompue bloquait le prune (rc=11) | restic unlock (1 lock retiré) ; règle intégrée aux jobs : unlock tourne sans l'option append-only (les locks sont supprimables), ajout en tête de restic-daily.sh et restic-prune.sh |
retirer les lignes unlock des jobs |
| 2026-10-10 21:25 | 3 | incident : crontab root effacé par le kit (corrigé) | Le bloc cron du kit pipait crontab -l | grep -vE … dans crontab - ; avec set -e, le grep sans correspondance tuait le sous-shell → stdin vide → crontab vidé |
détecté et documenté : le crontab root ne contenait que les 3 lignes restic (aucune ligne utilisateur perdue) ; kit corrigé (grep … || true + écriture dans un fichier + contrôle « 3 lignes attendues » avant installation, refus et crontab intact sinon) ; crontab re-créé puis vérifié après reboot |
restaurer le crontab : sudo crontab -l (3 lignes restic) |
| 2026-10-10 21:36 | 3 | reboot G9 validé (persistance post-reboot) | Valider C1 après le changement de transport (plus de montage CIFS) | systemctl reboot (21:36:32), retour SSH en ~75 s ; 06c-postboot-check.sh : 15 contrôles OK / 0 KO (binaires, env 600, clé repo, config rclone, aucun montage CIFS requis, 3 lignes cron, 4 jobs, restic snapshots, check --read-data-subset=1%, health < 26 h, 5 conteneurs stateful relancés) |
rien (validation en lecture seule) |
| 2026-10-10 21:40 | 3 | .gitignore élargi (secrets) |
Renforcer G9 côté dépôt local | ajout de *.cred, *.key, repo.key, matrix.env (les patterns *.env et le chemin explicite couvraient déjà) ; vérifié : aucun secret dans le repo (recherche du mot de passe SMB et du token Matrix = 0 occurrence), git check-ignore OK, aucun fichier suivi par git de type env/cred/key |
retirer les lignes ajoutées |
| 2026-10-10 21:52 | 3 | configs/restic.env.example rechargé sur le transport retenu |
Revue T3.1 : l'exemple restait sur le mount CIFS/rclone-FUSE abandonné (C8) | exemple aligné sur RESTIC_REPOSITORY=rclone:freeboxftp:Freebox/backup/g9 + RESTIC_RCLONE_REMOTE/PATH, RCLONE_CONFIG, RESTIC_RCLONE_APPENDONLY=1, SCRATCH_REPO, RESTIC_VERSION/SHA256, G9_JOURNAL, alerte Matrix directe (/etc/restic/matrix.env) + webhook n8n de secours, transports écartés documentés (CIFS/FUSE/SMB/FTPES) ; aucun secret dans le fichier |
restaurer l'exemple depuis git (fichier versionné) |
| 2026-10-10 21:55 | 3 | sous-point « thermique Freebox < 70 °C » déchargé de T3.1 | Revue T3.1 (C0) : jamais mesuré, et non mesurable par l'agent | décision utilisateur (10/10/2026) : API Freebox OS = appairage requis (mot de passe Freebox OS + code saisi sur l'écran de la Freebox) ; SSH Delta fermé (port 22 refused, testé) → relevé reporté en Phase 1 / T1.3 (COMPTE-RENDU-PHASE-1.md, DOSSIER-RECREATION plan 0.2 : seuil 85 °C) ; à lire dans Freebox OS (app Sapeur) puis journaliser | réintégrer le sous-point dès qu'un relevé est disponible |
| 2026-10-10 21:55 | 3 | énoncé C1 réaligné sur le transport réellement retenu | Revue T3.1 : C1 décrivait un montage CIFS (/mnt/freebox, vers=2.x, x-systemd.automount) exécutée en rclone/FTP |
critère réécrit : cible = rclone:freeboxftp:Freebox/backup/g9, aucun montage, snapshots + check --read-data-subset=1% OK, persistance prouvée par reboot réel (15/15) ; abandon CIFS/FUSE tracé (20:20, 20:47) |
réécrire l'énoncé si la cible change (Phase 5 : rest: en VM) |
| 2026-10-10 22:05 | 3 | format du journal corrigé (6 colonnes) | Revue T3.1 : la ligne « transport SMB/CIFS écarté » (20:20) n'avait que 5 colonnes (Rollback absent) — violation G8 | 19 lignes phase 3 toutes en 6 colonnes (vérifié par rendu markdown, 0 ligne non conforme) ; rollback ajouté sur la ligne 20:20 (retirer -o rclone.args=… --append-only / restaurer le mount CIFS depuis /etc/fstab.bak.* + unité) ; rollback isolé en 6ᵉ cellule sur la ligne valheim 20:15 (phase 2) |
restaurer les lignes depuis git (journal versionné) |
| 2026-10-10 22:08 | 3 | RCLONE_CONFIG harmonisé sur un seul fichier |
Revue T3.1 : docs annonçaient rclone.conf, le live pointait ftp.conf (2 fichiers, 2 remotes séparés) |
les 2 remotes réunis dans /root/.config/rclone/rclone.conf ([freeboxftp] FTP + [freebox] SMB secours, 600 root, .bak.1791670085 daté) ; /etc/restic.env → RCLONE_CONFIG=/root/.config/rclone/rclone.conf ; vérifié : FTP liste le repo, SMB lit 4.184 GiB, restic snapshots = 2, kit rejoué rc=0 ; ftp.conf conservé en copie FTP-only (600) ; docs (kit + RESTORE-G9.md) alignés |
cp /root/.config/rclone/rclone.conf.bak.1791670085 à l'emplacement + remettre l'ancien RCLONE_CONFIG |
| 2026-10-10 22:09 | 3 | repo de preuve append-only purgé | Artefact du test append-only laissé sur la Freebox (_appendonly-test) |
rclone purge freeboxftp:Freebox/backup/_appendonly-test → il ne reste que g9/ sur le partage ; kit rejoué rc=0 (append-only prouvé, restore testée) |
re-créé automatiquement par le kit à chaque exécution (puis purgé) |
| 2026-10-10 22:40 | 3 | corrections post-revue code (12 findings) | Revue de code du kit (diff T3.1) | 1 jq installé par le kit + garde command -v jq avec repli JSON dans restic-notify.sh ; 2 configs/excludes.txt.example créé et installé par le kit s'il est absent (jamais écrasé) + contrôle dans 06c ; 3 restic-notify.sh || true dans le job prune ; 4 le refus d'append-only au prune est journalisé seulement (plus d'alerte « normale » quotidienne ; vérifié : 0 ligne PURGE dans le log, alerte uniquement si la purge sans append-only échoue) ; 5 03b-secrets.sh : wording 644 aligné sur le code (3 endroits) ; 6 lignes vides intra-tableau supprimées dans journal.md ; 7 branche restic ls | awk morte supprimée (fichier test = find déterministe) ; 8 rclone épinglé v1.75.2 + sha256 349ac8fb…3702 vérifié ; 9 transport/append-only canonique dans RESTORE-G9.md §6 (tableau des transports testés), README/env.example/en-tête du script = pointeurs ; 10 liste stateful dynamique (RESTIC_STATEFUL) dans 06c ; 11 arbre vide Save/migration-j5040/ supprimé + .gitignore dégraissé ; 12 règles ufw sauvegardées avant ufw --force reset (/etc/ufw/{before,user}.rules.bak.<epoch>) + note « liste de ports à aligner sur les compose ». Vérif live : kit rc=0, prune rc=0 (0 alerte), notify rc=0, 06c = 17 OK / 0 KO, excludes intacts (6 lignes) |
git checkout des fichiers du kit ; restaurer /etc/ufw/*.rules.bak.<epoch> |
| 2026-10-11 07:32 | 4 | migrate:gitea : backup restic pré-migration | Garde-fou G2 avant import Gitea | snapshot restic Freebox (voir logs /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:35 | 4 | migrate:gitea : backup restic pré-migration | Garde-fou G2 avant import Gitea | snapshot restic Freebox (voir logs /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:36 | 4 | migrate:gitea : backup restic pré-migration | Garde-fou G2 avant import Gitea | snapshot restic Freebox (voir logs /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:36 | 4 | migrate:gitea : import ÉCHEC intégrité (repositories) | Vérification G4 | manifeste sha256 source ≠ stage | purger stage/repositories et re-exécuter |
| 2026-10-11 07:37 | 4 | migrate:gitea : backup restic pré-migration | Garde-fou G2 avant import Gitea | snapshot restic Freebox (voir logs /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:38 | 4 | migrate:gitea : backup restic pré-migration | Garde-fou G2 avant import Gitea | snapshot restic Freebox (voir logs /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:39 | 4 | migrate:gitea : backup restic pré-migration | Garde-fou G2 avant import Gitea | snapshot restic Freebox (voir logs /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:40 | 4 | migrate:gitea : Gitea migré + lancé sur le G9 | T4.4 (double-run G4, .25 lecture seule) | pg_dump fcab4f2231ee… restauré ; dépôts+LFS+appdata sha256 identiques ; healthz ; .25 intact | docker compose -f /data/docker/gitea/docker-compose.yml down + rm -rf /data/docker/gitea (G9 seul) |
| 2026-10-11 07:50 | 4 | migrate:gitea : validation T4.4 (T4.4) | Critère C-T4.4 (service accessible + données importées) | Gitea G9 : 15 repos (13 importés + g9-migration + obsidian-vault), 4 users (3 importés + g9ops) ; git ls-remote OK sur Folzo/hermes (privé), Folzo/effi, Folzo/jean ; clone + push testés depuis le G9 ; vault Obsidian 80 Mo / 346 fichiers commité et poussé ; healthz 200 ; .25 intact (13 repos / 3 users revérifiés) | docker compose -f /data/docker/gitea/docker-compose.yml down + rm -rf /data/docker/gitea (G9) ; repos g9-migration/obsidian-vault supprimables via API |
| 2026-10-11 07:47 | 4 | migrate:gitea : compte ops g9ops créé | API Gitea bloque les comptes « must_change_password » hérités de la source (master/antoine/folzo) → compte d'automatisation dédié nécessaire | gitea admin user create g9ops --admin --must-change-password=false (mot de passe dans /data/docker/gitea/secrets/g9ops-pass, 644 root, hors git) + token API « ops-phase4 » (read/write user+repository, 600, jamais affiché) ; endpoint 1.27 = POST /api/v1/user/repos | gitea admin user delete -u g9ops ; révocation du token via l'UI |
| 2026-10-11 07:36 | 4 | kit : transport .25 → G9 = tar sur SSH (rsync/scp refusés) | Le sshd de DSM refuse rsync --server (« Permission denied, please try again. ») et scp (subsystem request failed, sftp = internal-sftp) |
ssh 'sudo tar cz' + ssh 'sudo cat' fonctionnels ; 07a-migrate-gitea.sh réécrit sur ce transport ; manifestes sha256 avec LC_ALL=C sort (le tri local fr_FR ≠ tri DSM → faux échecs d'intégrité) |
restaurer l'ancien transport depuis git (kit versionné) |
| 2026-10-11 07:55 | 4 | migrate:vaultwarden : backup restic pré-migration | Garde-fou G2 avant import Vaultwarden | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:55 | 4 | migrate:vaultwarden : backup restic pré-migration | Garde-fou G2 avant import Vaultwarden | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:56 | 4 | migrate:vaultwarden : backup restic pré-migration | Garde-fou G2 avant import Vaultwarden | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 07:57 | 4 | migrate:vaultwarden : coffre importé + service lancé | T4.1 (double-run G4) | Source stoppée → tar/ssh → source relancée healthy ; 621 fichiers sha256 identiques (source == stage == G9) ; G9 = 953 ciphers / 1 user (identiques à .25, revérifié après coup : .25 healthy 953) ; migrations diesel OK (v.20260902120000) ; alive 200, WebVault 200 ; DOMAIN conservé = pass.folzocorp.fr (clients existants intacts) ; image épinglée 1.37.4 (génération source, image .25 pullée 2026-10-05) |
docker compose -f /data/docker/vaultwarden/docker-compose.yml down + rm -rf /data/docker/vaultwarden ; .25 intact |
| 2026-10-11 08:01 | 4 | migrate:vaultwarden : 2FA + ADMIN_TOKEN + emergency access | T4.1 (critères 2FA + emergency access) | 2FA TOTP déjà actif côté source et importé avec le coffre : twofactor(atype=0, enabled=1, last_used=59703916) identique sur le G9 → l'appli d'authentification de l'utilisateur continue sans re-scannage ; ADMIN_TOKEN haché argon2id (m=64MiB,t=3,p=4 — preset bitwarden, python3-argon2) : avis « plain text ADMIN_TOKEN » disparu, login admin 200 (dashboard Users/Invitations/Organizations/Emergency accessibles) ; token clair dans /data/docker/vaultwarden/secrets/admin-plain (600 root, à consigner dans le coffre puis supprimer) ; EMERGENCY_ACCESS_ALLOWED=true + INVITATIONS_ALLOWED=true posés |
restaurer secrets/admin (token clair) + restart ; retirer les 2 env |
| 2026-10-11 08:13 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 08:16 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 08:21 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 08:28 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 08:35 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 08:40 | 4 | audit .25 : « disparition » de /volume1/docker-REC = VUE de partage DSM, pas une perte | Inventaire d'abord pris sur /volume1/docker-REC (60 entrées), puis 10 entrées une heure plus tard, propriétaire de « . » passé de Master à root, mtime /volume1 = 03:01 | docker inspect = vérité terrain : nextcloud_app → /volume2/docker-REC/NextCloud/{data,config} (+ volume nommé /volume1/@docker/volumes/f5f0…/_data), vaultwarden-server-1 → /volume1/docker/vaultwarden, gitea → /volume1/docker/Gitea/data. /volume1/docker-REC est une vue multi-volumes du partage « docker-REC », remontée à 03:01. Aucune donnée perdue : /volume2/docker-REC/NextCloud/data = 1.9 Go / 2608 fichiers ; db.sqlite3 de vaultwarden sha256 2cad5eea42ef4b04… identique entre .25 et le G9 |
lecture seule, aucune action ; chemins canoniques consignés dans 07c (XP_DATA/XP_CONF = /volume2/…) |
| 2026-10-11 08:42 | 4 | kit : lancer les scripts de migration en folzo, jamais en sudo global |
sudo remplace $HOME par /root → « Identity file /root/.ssh/id_ed25519_openfox11 not accessible » puis « Host key verification failed » (root n'a ni clé ni known_hosts) ; 3 runs de 07c échoués en préflight |
07c réécrit : appels « G9 » en local (sh -c + sudo local, la machine de pilotage EST le G9), clé en chemin absolu ; import du dump via MARIADB_USER/MARIADB_PASSWORD (env du conteneur MariaDB G9, pas MYSQL_*) |
relancer en root avec SSH_KEY= explicite si besoin |
| 2026-10-11 09:03 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 09:10 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 09:18 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 10:10 | 4 | clarification 08:42 : le 07c déposé est la variante SSH, pas « local » | La ligne 08:42 décrit une réécriture « appels G9 en local » jamais commitée ; le 07c-migrate-nextcloud.sh du dépôt passe TOUTES les ops G9 par SSH (folzo@.24, clé sur le pilot) — cohérent avec son en-tête |
07c déposé = variante SSH : préflight SSH .25 + .24, import rsync/ssh, restore via MARIADB_USER + secrets/dbpass. La formulation « local » de 08:42 ne décrit PAS le code du dépôt. + garde-fou idempotence backup (07c/07d) + nettoyage dumps (07c) + n8n.env builder (03b) + mount secrets collabora + label watchtower collabora=false | aucune — ligne documentaire |
| 2026-10-11 10:46 | 4 | récupération du thread Phase 4 supprimé (session e67f1166…) |
suppression accidentelle de la session 07:20 UTC (cascade events) ; le runner a continué à travailler (journal 09:18→10:13) |
thread réinséré : 130 messages / 64 657 événements / 33,85 Mo ; caravage des pages SQLite libérées = 51 420 payloads JSON (34,68 Mo) + 79 830 entrées d'index ; ~35 % du volume, prose en fragments désordonnés, messages utilisateur quasi tous perdus ; intégrité ok avant/après ; rapport complet g9-migration/PHASE4-RECOLLEMENT.md |
chirurgical : DELETE FROM events WHERE session_id='e67f1166…'; DELETE FROM sessions WHERE id='e67f1166…' — ou restauration snap2 (voir §4 du rapport) |
| 2026-10-11 11:05 | 4 | corrections post-revue code (5 findings) | Revue de code du diff Phase 4 | 1 sécurité : collabora ne lisait PAS password_file (non supporté par collabora/code) → console 9980 sans mot de passe ; remplacé par env_file: ./secrets/collabora.env (password=…) généré par 03b (pattern n8n) ; 2 import 07c : DEFINER retirés du dump + import en root (rootpass) + rc contrôlé (l'ancien | tail -5 masquait ERROR 1227) ; 3 07c : SRC_USERS avec || true (préflight tué par grep rc=1) ; 4 07d : progression tar --checkpoint=50000 sur la copie 530 Go ; 5 README : arborescence + ligne phase 4 = 07a–07d (07-migrate-stateful = générique rsync, inopérant sur DSM) ; 6 PHASE4-RECOLLEMENT.md dégraissé (821→75 l., dump §5 hors dépôt). Vérif : bash -n 3/3 OK, YAML compose OK (env_file présent, password_file absent), sed DEFINER testé |
git checkout des fichiers modifiés (compose nextcloud, 03b, 07c, 07d, README) |
| 2026-10-11 12:44 | 4 | migrate:nextcloud : backup restic pré-migration | Garde-fou G2 avant import Nextcloud | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 10:45 | 4 | migrate:nextcloud : migration complète (07c) | T4.2 (double-run G4) | export app stoppée (db vivante, mysqldump --single-transaction 31,9 Mo) + tars data (1,9 Go, 2608 fichiers sha256 identiques) + config + custom_apps → app .25 relancée healthy ; import G9 : MariaDB 10.11 (utf8mb4_bin, DEFINER retirés, import root, filecache=2727, users=8), occ status installed/maintenance off, version 35.0.1.1 = image épinglée, occ upgrade « No upgrade required », occ app:list identique à la source (66 apps) ; overrides LAN dans config/g9-double-run.config.php (réversible) ; dumps supprimés sur les 3 machines (hashs mots de passe users) | docker compose -f /data/docker/nextcloud/docker-compose.yml down + rm -rf /data/docker/nextcloud ; .25 intact |
| 2026-10-11 11:02 | 4 | migrate:nextcloud : Collabora — TLS interne désactivé | L'image collabora/code:26.04 sert TLS par défaut : discovery http = 000, https -k = 200 ; env extra_features/EXTRA_FEATURES et O:ssl.enable non appliqués (mesuré : entrypoint = coolwsd --use-env-vars sans script) |
fix = command: --o:ssl.enable=false (CMD appendu à l'entrypoint) → logs « SSL is disabled », discovery http 200 ; wopi_url = http://192.168.1.24:9980 (occ, persisté) ; Caddy (T4.6) terminera le TLS | retirer la ligne command: du compose + restart |
| 2026-10-11 13:40 | 4 (T4.5) | jellyfin : wizard + auth API | Déploiement frais G9 (aucun Jellyfin sur .25 — stack *arr reste sur .25) ; média par RÉFÉRENCE : bind /mnt/usb-media → /media:ro (aucune copie) | wizard 10.9.11 accompli via navigateur (langue → admin « g9ops » → médiathèque « Films3 » → /media/films) ; PIÈGE mesuré : le wizard laisse Users.EnableLocalPassword=0 → AuthenticateByName = « Invalid username or password » ; fix = UPDATE sqlite + restart (hash PBKDF2-SHA512 vérifié == secret) ; en-tête API requis = X-Emby-Authorization combiné (400 « Value cannot be null » sans lui) ; médiathèques vides doublons supprimées → 1 lib « Films3 » = /media/films ; Items?IncludeItemTypes=Movie = 1 (test-reference.mkv, 0 octet, média de test en lecture seule) ; /system/info 200 ; label watchtower=false ; ufw 8096 ALLOW IN 192.168.1.0/24 |
DELETE /Library/VirtualFolders?name=… + UPDATE Users SET EnableLocalPassword=0 ; compose down (données source : aucune touchée) |
| 2026-10-11 13:55 | 4 (T4.2) | collabora : healthcheck retiré du compose | Limage collabora/code:26.04.5.1.1 est minimale : ni sh ni curl dans limage → CMD curl = « executable file not found » = unhealthy permanent (mesuré : 3 échecs successifs dans le log de santé) |
healthcheck retiré (source de vérité = kit) + recréation du conteneur → healthy ; re-vérifications T4.2 complètes : occ installed/maintenance off 35.0.1.1, users=8, files:scan --all = 1522 fichiers 0 erreur, wopi_url (oc_appconfig richdocuments) = http://192.168.1.24:9980, discovery 200, status.php 200, 67 apps activés ; .25 relancé (nextcloud_app/db/redis + vaultwarden + gitea up) | remettre un healthcheck si une image avec shell est épinglée |
| 2026-10-11 13:50 | 4 | edge : déploiement Caddy (T4.6) | Reverse proxy LAN + HTTPS interne (CA interne) pour vaultwarden/nextcloud/gitea/jellyfin/n8n/matrix | Caddyfile validate OK ; conteneur edge up ; ufw 443/tcp exposé WAN (seul), 80 redirect, 9980 LAN-only ; HTTPS+SNI vérifiés sur les 5 briques | docker compose -f /data/docker/edge/docker-compose.yml down ; ufw delete allow 443 (briques joignables en http direct LAN) |
| 2026-10-11 14:10 | 4 (T4.6) | edge : Caddy déployé (reverse proxy LAN + HTTPS interne) | Briquage T4.6 : TLS interne pour vaultwarden/nextcloud/gitea/jellyfin/n8n/matrix, sous-domaines déjà configurés côté apps (DOMAIN/ROOT_URL/N8N_HOST) → aucune brique touchée | caddy:2 (digest f2a1290d…) up healthy (healthcheck = caddy validate) ; tls internal = CA interne (LE + DNS challenge = suite S9.1 via AdGuard J5040) ; PIÈGES mesurés : (1) snippet (name) importé → « ambiguous site definition » si utilisé comme adresse ; (2) request_id nest PAS un directive site (validate KO) ; (3) Caddy logue les en-têtes reçus du client, pas ceux envoyés en amont → preuve X-Forwarded prise côté app ; ufw 443/tcp exposé WAN (seul, default deny protège les ports briques) + 80 redirect + 9980 LAN-only ; Nextcloud : merge config = array_replace_recursive (le dépôt dun 2e fichier *.config.php a été avalé par lentrée existante → résolu en écrivant g9-double-run.config.php = source de vérité du kit, monté :ro) → occ : overwritehost=cloud.folzocorp.fr, overwriteprotocol=https, trusted_proxies=[192.168.1.0/24, 172.16.0.0/12] ; preuve côté app : redirect https://cloud.folzocorp.fr/ → Location https://cloud.folzocorp.fr/index.php/login (schéma https + host forwardé rendus par Nextcloud) ; curl -k via edge : pass 200 / git 200 / cloud 200 / media 200 / n8n 200 / matrix 302 / SNI IP 200 ; vaultwarden TRUSTED_HOSTS += 172.16.0.0/12 (aligné) |
docker compose -f /data/docker/edge/docker-compose.yml down ; ufw delete allow 443 ; supprimer g9-double-run.config.php (retour double-run http LAN) |
| 2026-10-11 14:20 | 4 (T4.7) | watchtower : vérification scope stateless + dry-run | S11.4 : MAJ auto uniquement des briques stateless ; leçon incident Nextcloud 06/10 = CLEANUP=false | Conteneur up healthy, image nickfedor/watchtower épinglée par digest sha256:45b54f6d… (fork : containrrr/watchtower:1 n'existe pas) ; env mesuré = POLL=3600, LABEL_ENABLE=true, CLEANUP=false, INCLUDE_STOPPED=false ; labels vérifiés sur les 16 conteneurs .24 : stateful enable=false = nextcloud, collabora, jellyfin, nextcloud_db, nextcloud_redis, vaultwarden, gitea, gitea-db, valheim, n8n, element, synapse, couchdb, obsidian ; enable=true = edge (stateless, T4.6) + watchtower ; dry-run docker run --rm -v /var/run/docker.sock nickfedor/watchtower@sha256:45b54f6d… --label-enable --monitor-only -R → « Only checking containers with label … enable », scanned=2 updated=0 failed=0 = les 14 stateful sont ignorés ; notification : webhook n8n testé en POST depuis le réseau Docker → 200 (le compose affichait un placeholder https://n8n.folzocorp.fr → aligné sur generic+http://n8n:5678, nom de service : l'edge n'écoute que 443) ; nickfedor : SCHEDULE et POLL exclusifs, pas de --once (=-R) |
docker compose -f /data/docker/watchtower/docker-compose.yml down ; aucun effet sur les briques (label-driven) |
| 2026-10-11 14:25 | 4 (clôture) | Phase 4 consolidée + kit poussé sur Gitea | Clôture Phase 4 (critère 5) | PHASE4-RECOLLEMENT.md §0 ajouté : briques déployées + versions épinglées (vaultwarden 1.37.4, nextcloud 35.0.1/mariadb 10.11/redis 7/collabora 26.04.5.1.1, gitea 1.27.3/postgres 16, jellyfin 10.9.11, caddy 2 digest f2a1290d, watchtower digest 45b54f6d), 6 incidents + correctifs mesurés, alignement proxy (trusted_proxies/overwrite/TRUSTED_HOSTS/ufw 443 seul WAN), état .25 (services relancés, dumps supprimés, rien de destructif) ; PhotoPrism T4.3 = reportée (script 07d prêt, copie 530 Go) ; README aligné (07e + compose/edge + jellyfin T4.5) ; push gitea master : HEAD local 366c5ca == gitea/master 366c5ca (API Gitea vérifiée) ; vault Obsidian = repo g9ops/obsidian-vault présent (47 Mo, import T4.4) ; zéro secret dans git : git ls-files (secrets/*.env/token/key/cred) = 0 fichier de secret, git grep des valeurs (token, hash jellyfin, Pw=) = 0, historique -S token = 0 ; durcissement : token retiré de l'URL du remote → ~/.git-credentials 600 + credential.helper store |
git push gitea a1864c6:master (fast-forward annulable) ; suppression de ~/.git-credentials |
| 2026-10-11 15:49 | 4 | migrate:photoprism : backup restic pré-migration | Garde-fou G2 avant import PhotoPrism | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 15:56 | 4 | migrate:photoprism : backup restic pré-migration | Garde-fou G2 avant import PhotoPrism | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 16:21 | 4 | migrate:photoprism : backup restic pré-migration | Garde-fou G2 avant import PhotoPrism | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-11 16:10 | J5040 (E1) | durcissement J5040 .27 (01-hardening paramétré) | E1 : edge Ubuntu 26.04 neuf, RAM 8 Go test (décision utilisateur) | SSH keys-only + ufw actif (LAN-only 53/3000/8081 + WAN 80/443/51820) + unattended-upgrades + fail2ban ; sudo NOPASSWD folzo ; clés SSH pilot installées ; portable à ajouter via ssh-copy-id | restaurer sshd_config .bak + ufw disable |
| 2026-10-11 16:12 | J5040 (E1) | Docker + compose installés sur .27 | Runtime edge | docker 29.1.3 + compose 2.40.3, folzo dans groupe docker | apt-get remove docker.io docker-compose-v2 |
| 2026-10-11 16:14 | 07d : copie SANS gzip (photos déjà compressées) | gzip sur CPU NAS = 10-13 Mo/s mesuré → flux brut ~17 Mo/s | tar c | x (sans compression), copie relancée propre (originals purgés, rien de destructif sur .25) | restaurer le script depuis git |
| 2026-10-11 16:20 | J5040 (E2) | AdGuard Home déployé sur .27 (migration depuis VM Freebox .1) | E2 : DNS filtré sur l'edge | config VM récupérée en LECTURE SEULE (ssh master@.1, AdGuardHome.yaml 415 l. : 2 filtres 182128+6540 règles, safe_search, services bloqués parents, users bcrypt conservé) ; image épinglée digest aba9e3bf ; UI 8081 LAN, DNS 53 LAN ; systemd-resolved désactivé sur .27 ; tests : doubleclick→0.0.0.0, example.org résolu, UI 302 | docker compose down -v ; VM .1 intacte ; resolv.conf .27 restauré |
| 2026-10-11 17:05 | J5040 (E3) | Préparation DHCP : baux statiques récupérés (38 appareils, capture Freebox via OCR utilisateur) + /srv/dnsmasq/leases (35 entrées, .1 réservé E4, VM adguard exclue) + 09-j5040-dhcp.sh | E3 : pré-bascule bridge, G6 = baux identiques (mêmes IP) | dnsmasq --test = syntax OK ; scan ARP cross-check (g9 48:ea:62, j5040 60:be:b4, nas 10:e7:c6, backup-218 .26 00:11:32) ; anomalie relevée : VM debian 02:11:32 en conflit sur .24 → à repositionner .23 côté Freebox (utilisateur) | rien (préparation, dnsmasq non démarré) |
| 2026-10-11 17:15 | J5040 (E2) | Bascule DNS : Freebox DHCP DNS1 .1 → .27 (GO utilisateur) + bail G9 renouvelé | E2 : AdGuard J5040 remplace la VM Freebox | resolvectl G9 = DNS .27 ; doubleclick→0.0.0.0, example.org résolu ; clients = renouvellement de bail progressif (baux 12 h) ; VM .1 conservée en secours (arrêt = action utilisateur G3 après stabilité) ; .254 freebox intact | remettre DNS1=.1 dans la Freebox (VM intacte, rollback immédiat) |
| 2026-10-11 18:05 | J5040 (E4) | Clé API OVH du NAS retrouvée (LE env, longueurs 16/32/32 OK) mais NON SOUSCRITE/EXPIRÉE (test /auth/credential → 404) | E4 : LE DNS-01 nécessite clé valide | secret copié en 600 sur J5040 (compose/edge-j5040/secrets/ovh.env, hors git) ; NAS : renewal LE cassée depuis expiration → nouvelle clé requise (droits API legacy /domain/zone/folzocorp.fr/*, utilisateur) | rien |
| 2026-10-11 18:40 | J5040 (E4) | Nouvelle clé API OVH créée+souscrite (droits legacy /domain/zone) ; clé NAS expirée confirmée (90 j) | E4 : LE DNS-01 | python-ovh GET /domain/zone/folzocorp.fr/record = 12 records OK ; secrets 600 sur J5040 (ovh.env hors git) ; NAS : mettra la nouvelle clé lors du renouvellement LE | révoquer la clé dans manager OVH |
| 2026-10-11 18:45 | J5040 (E4) | Caddy OVH déployé sur .27 : 7/7 certs Let's Encrypt émis (DNS-01) + proxy 6 briques | E4 : TLS auto achève T4.6/S9.1 | maxcryger/caddy-ovh digest 502996b5 healthy ; cloud 302/pass 200/git 200/media 302/photos 502 (stack en copie)/n8n 200/matrix 302, issuer = Let's Encrypt ; WAN (forward Freebox→G9) et démontage edge G9 = après bascule bridge E3 | docker compose down ; révoquer clé |
| 2026-10-11 18:10 | 07d : copie parallèle 4 flux (tar par dossier racine) | mono-flux SSH plafonné ~13 Mo/s (lecture HDD NAS, CPU NAS 7% = non saturé) | 29 dirs, xargs -P4 ; + chmod u+rwX post-copie ; intégrité/stack/index = 07d SKIP_COPY=1 | rien (source .25 lecture seule) | |
| 2026-10-11 21:30 | 4 | décision chiffrement restic MAINTENU | Critère 3 : arbitrage chiffrement vs simplicité restore | Décision utilisateur : chiffrement restic conservé, clé de repo locale G9 (/etc/restic/repo.key 600, sauvegardée hors repo git), restore simple via sudo restic sur le G9 ; test restore photo prévu par scripts/10-verify-restore-photo.sh | révoquer/cloner la clé si changement de politique |
| 2026-10-12 13:40 | 4 | migrate:photoprism : backup restic pré-migration | Garde-fou G2 avant import PhotoPrism | snapshot restic Freebox (log /var/log/restic-daily.log) | restic forget && restic prune |
| 2026-10-12 14:06 | 4 | migrate:photoprism : intégration PhotoPrism | copie de 530 Go à vérifier avant indexation | manifeste chemins+tailles identique (433941 fichiers, 567394182751 o) + échantillon sha256 200/200 | re-copie ciblée via tar/ssh |
| 2026-10-12 14:11 | 4 | migrate:photoprism : intégration PhotoPrism | copie de 530 Go à vérifier avant indexation | manifeste chemins+tailles identique (433941 fichiers, 567394182751 o) + échantillon sha256 200/200 | re-copie ciblée via tar/ssh |
| 2026-10-12 14:17 | 4 | migrate:photoprism : intégration PhotoPrism | copie de 530 Go à vérifier avant indexation | manifeste chemins+tailles identique (433941 fichiers, 567394182751 o) + échantillon sha256 200/200 | re-copie ciblée via tar/ssh |
| 2026-10-12 14:18 | 4 | migrate:photoprism : stack PhotoPrism déployée + indexation lancée | T4.3 : stack saine, index progressif (photothèque 530 Go sur le G9) | image épinglée 260919, MariaDB 10.11 (watchtower OFF), secrets via env_file 600, port 2342 LAN ; originals = copie locale | docker compose down + rm -rf /data/docker/photoprism |
| 2026-10-12 15:07 | 4 | test restauration photo depuis restic | Critère 3 : preuve restore du snapshot incluant les photos | snapshot 06a7e3b89ef3e97d5f5c1dc9098496fab8ad79d48f4455eabdde07255143e33b contient 505836 entrées sous /data/docker/photoprism/originals ; restore 1 fichier ; sha256 restauré == source .25 (00cbfed8da81…) ; chiffrement maintenu (clé locale G9) | rm -rf /tmp/restore-photo-test (fait) |
| 2026-10-12 14:17 | 4.5 | registre : 11-registry.sh génère la moitié technique |
T-A.1 : inventaire généré (pas de saisie manuelle) | REGISTRE-BRIQUES.md : 21 conteneurs (.24+.27), endpoints Caddy mappés, images/labels lus par docker ps/inspect en lecture seule ; 13 constats réels (4 images :latest non épinglées : n8n, element, synapse, obsidian ; 6 conteneurs non déclarés dans le kit : n8n, element, synapse, couchdb, obsidian, valheim ; 1 conteneur inconnu sweet_feynman .27 sans label Watchtower) |
git rm REGISTRE-BRIQUES.md scripts/11-registry.sh scripts/registry_*.py (aucun effet sur les briques) |
| 2026-10-12 14:27 | 4.5 | sondes applicatives : 12-probes.sh installé sur le G9 (cron root) |
T-C.1/C.2/C.5 : le trou mesuré est up ≠ utilisable (5 incidents de la semaine avec conteneur up) |
install /usr/local/bin/g9-probes.sh + 2 lignes cron (*/15 + digest 08:30) ; passe = 13 OK / 0 KO (nextcloud login + occ status, vaultwarden /alive, gitea /api/v1/version, jellyfin /System/Info/Public, photoprism /, collabora discovery, n8n healthz, synapse versions, element, edge TCP 443, cloud WAN 200, AdGuard UI) ; --selftest → NOTIFY_OK 200 (KO provoqué sans toucher aucune brique) ; g9-verify-alert.py 20 → payloads JSON conformes: 1 / non conformes: 0, VERIFY_OK |
sudo bash /usr/local/bin/g9-probes.sh --uninstall (cron retiré, script + état supprimés) |
| 2026-10-12 14:40 | 4.5 | docs identité : REGISTRE-IDENTITES.md (moitié humaine) |
T-A.2/A.3/A.4/A.8/A.9/A.11 : « quel compte a servi ? » | table par brique (.24 + .27) : compte, type, 2FA, référence d'entrée coffre, comment réinitialiser, responsable + 4 procédures de récupération (n8n owner, Gitea must_change_password, Jellyfin EnableLocalPassword, Synapse sans admin) + convention coffre infra//famille//enfants/ + hygiène (~/.git-credentials en clair traité en T-A.5) ; 0 secret (références seules) |
git rm REGISTRE-IDENTITES.md |
| 2026-10-12 14:45 | 4.5 | docs : RUNBOOKS/ ×7, PARTAGE-SECRET-MAITRE.md, RESTORE-NAS-USB.md |
T-C.3 (runbooks = matière première de l'IA, G11) + T-A.9 + T6.5 | 7 runbooks (nextcloud, matrix, jellyfin, photoprism, vaultwarden, registre, digest) sur les pièges mesurés du journal ; procédure de partage du secret maître (détenteurs à nommer, enveloppe, test annuel — test non réalisé) ; procédure lecture disques DSM hors boîtier (mdadm/LVM, lecture seule, interdits — test non réalisé, critère Phase 6) | git rm -r RUNBOOKS PARTAGE-SECRET-MAITRE.md RESTORE-NAS-USB.md |
| 2026-10-12 14:50 | 4.5 | études : EXPOSITION-INTERNET.md + BRIDGE-WHATSAPP.md |
T-D (étude, 0 règle) + T-W (étude, 0 install) | exposition mesurée (ufw status numbered .24/.27, ss -ltnu .27) : constats — 22/tcp et 443/tcp ouverts au WAN sur le G9 sans nécessité, edge G9 en TLS auto-signé, Tailscale actif sur le pilot (voie non documentée), CouchDB 5984 LAN sans auth ; grille par brique + playbook classé 8 rangs + 5 décisions à rendre ; 0 règle posée. Pont WhatsApp : AGPL-3.0, session QR/12 jours, risque de bannissement → numéro familial interdit, 0 installation |
git rm EXPOSITION-INTERNET.md BRIDGE-WHATSAPP.md (aucun changement réseau) |
| 2026-10-12 14:55 | 4.5 | 08-decommission.sh : texte aligné sur son comportement |
T-A.6 : l'en-tête annonçait « ARRÊTE et WIPE » + saisie WIPE XPENOLOGY alors que le corps fait arrêt + consignes GUI/débranchement (wipe optionnel) |
en-tête = « aucun wipe exécuté par le kit », prereq = « éteint et débranché, disques intacts, 0 effacement », confirmation = ETEINDRE XPENOLOGY, étape 3 = étiqueter/conserver + pointeur RESTORE-NAS-USB.md, journal rollback = « rebrancher (données intactes) ». Corps du script inchangé (mêmes commandes, même gates) |
git checkout scripts/08-decommission.sh |
| 2026-10-12 15:00 | 4.5 | charte G11 + docs DOSSIER-SOFTWARE.md v1.6 |
G11 (paliers IA) + S8/S9.2/S11/S14 alignés sur les décisions 12/10 | README : G11 (L0→L3, portes chiffrées, interdits, traçabilité) + arborescence (11/12/g9-notify/g9-verify-alert/lib-notify) + docs d'identité/observabilité ; S8 = complément (plus « remplace WhatsApp »), S9.2 = pass/prisme/photos alignés, S11 = registre + sondes, S14.7→S14.10 (coffre, identité, suivi, IA) |
git checkout DOSSIER-SOFTWARE.md g9-migration/README.md |