Document généré automatiquement depuis /home/jerome/pub/docs/00-installation-k3.md sur kimsufi3, le 11 September 2026 à 14:03. Toute modification faite ici sera écrasée à la prochaine régénération : éditer le fichier source.
Phase 0 du projet de paire actif/veille. Ce document est la marche à suivre complète, du manager OVH jusqu’au premier transfert de données.
k3 sera intégralement effacé. Tout ce qui lui était propre a été sauvegardé dans ~/claude/dockersync/sauvegarde-k3-avant-reinstall/ sur k4 (répertoire en mode 700 : il contient le topic ntfy, qui est un secret).
Ce qui est déjà vérifié
| Point |
État |
| Ubuntu 26.04.1 LTS « Resolute Raccoon » |
disponible (sortie du 23/04/2026) |
Docker CE pour resolute |
29.8.0, soit exactement la version de k4 |
Sonde sonde-chabod.sh |
sauvegardée ; ne diffère de la source de vérité que par un commentaire |
/etc/crontab de k3 |
sauvegardé (les 4 lignes rsync partent à la poubelle) |
Étape 1 — Avant de lancer quoi que ce soit
a. Vérifier que k3 ne contient rien d’unique. FAIT le 09/09/2026. Voir 01-audit-k3-avant-effacement.md. Verdict : feu vert, rien d’unique sur k3. Le courrier y est répliqué à la minute près et sa structure est identique à celle de k4 ; les 14 dépôts Subversion sont archivés et vérifiés sur k4 ; le reste est du résidu. Au passage : 254 Go des 1004 Go sont des déchets accumulés faute de --delete, dont 223 Go pour la seule base tt-rss, qui fait 84 Mo sur k4.
b. Abaisser les TTL DNS — à faire maintenant, c’est le geste le plus rentable. kimsufi4.chabod.eu est à 86 400 s (24 h), et il couvre 7 sous-domaines. Abaisser un TTL ne prenant effet qu’après expiration de l’ancien, aucune bascule ne peut aboutir rapidement tant que ce n’est pas fait depuis plus de 24 h. Le minimum chez LWS est 900 s. Voir 04-dns-bascule.md pour le détail des 6 enregistrements et la répartition LWS / OVH.
c. Sauvegarder l’identité SSH de k3. FAIT le 09/09/2026. Les 6 clés d’hôte sont dans sauvegarde-k3-avant-reinstall/identite-hote/ssh_host_keys.tar (mode 600 : il contient des clés privées). Les restaurer après réinstallation évite que tous tes clients affichent REMOTE HOST IDENTIFICATION HAS CHANGED.
d. Vérifier que la sauvegarde quotidienne de k4 a tourné cette nuit. Pendant la réinstallation et le retransfert, NCData n’existera qu’en un seul exemplaire. /opt/backup/daily-backup-2.tar.encrypt ne le contient pas — c’est un trou connu — mais le reste doit être sain.
Étape 2 — Manager OVH
Serveur kimsufi3 → Réinstaller → installation personnalisée.
- Système : Ubuntu 26.04 LTS (server, 64 bits)
- Nom d’hôte :
kimsufi3.chabod.eu
- Clé SSH : y déposer la clé publique
jerome@kimsufi4 (~/.ssh/id_ed25519.pub sur k4) pour avoir un accès immédiat
- Partitionnement : personnalisé (voir ci-dessous). C’est la raison principale de cette réinstallation, ne pas laisser le schéma par défaut.
- Script post-installation : le laisser vide. Voir ci-dessous.
Pourquoi ne pas utiliser le script post-installation d’OVH
Le manager propose de faire exécuter un script en root à la fin de l’installation, depuis une URL. Ce n’est pas le bon outil ici :
| Exposition |
Le script devrait être publié sur une URL publique. Il contient les 9 clés publiques avec leurs commentaires (jerome@dellg3, JuiceSSH, SHADOW-LS26FAO4…) : ce ne sont pas des secrets, mais c’est la cartographie du parc offerte à qui passe. |
| Inefficace |
La restauration de l’identité d’hôte reste impossible par ce canal — le tar contient des clés privées. Or c’est elle qui évite de reconfigurer tous les clients. Une passe manuelle resterait donc nécessaire. |
| Sans filet |
Le script coupe l’accès root et change le port SSH. Sans supervision, si cloud-init repasse derrière, on ne le découvre qu’en tentant de se connecter — et le seul recours est le mode rescue. |
| Sans gain |
deployer-sur-k3.sh fait déjà tout en une commande, avec points d’arrêt et vérification des empreintes. |
Le champ « clé SSH » du manager, lui, est à utiliser : il évite l’étape ssh-copy-id.
Partitionnement cible
Le schéma actuel gaspille 495 Go : / fait 503 Go pour 8,5 Go utilisés, alors que /var — le seul qui compte — est saturé à 81 %.
| Point de montage |
Type |
Taille |
/boot |
ext4 |
1 Go |
/ |
ext4 |
120 Go |
swap |
swap |
8 Go (contre 512 Mo aujourd’hui) |
/var |
ext4 |
tout le reste, ~1,67 To |
Le swap à 8 Go n’est pas un luxe : k3 n’a que 3,8 Go de RAM et devra porter mailcow, Home Assistant et Nextcloud simultanément.
Étape 3 — Post-installation
Dans le manager OVH, dépose la clé publique de k4 au moment de la réinstallation. C’est ce qui rend la suite automatique. Sinon OVH envoie un mot de passe root par courriel, et il faudra d’abord faire, depuis un vrai terminal :
ssh-copy-id -p 22 -i ~/.ssh/id_ed25519.pub root@kimsufi3.chabod.eu
Ensuite, une seule commande depuis k4 :
bash ~/claude/dockersync/scripts/deployer-sur-k3.sh
Elle enchaîne les huit étapes : contrôle de joignabilité, purge de known_hosts, transfert du script et de l’identité, restauration de l’identité, vérification que les empreintes sont bien celles d’origine, configuration complète, puis validation de l’accès sur le port 22103.
Pourquoi ce script existe : la clé d’hôte change deux fois
C’est le piège de l’opération, et il n’est pas évident :
- La réinstallation donne à k3 une nouvelle clé d’hôte → k4 refuse la connexion (
HOST KEY CHANGED) tant que known_hosts n’est pas purgé.
--restaurer-identite lui rend son ancienne clé → elle change donc une seconde fois, et il faut purger à nouveau.
Le script purge aux deux moments, dans le bon ordre. À la fin, il compare les empreintes obtenues à celles relevées avant l’effacement :
SHA256:+R1BfgFFUgpC3NF4ygNirV8BOz7ZdE/Mtt77xpjcN4U (RSA)
SHA256:luVObYOfse3Pn3dBh6rnsJuYG2NZFEJSDlcRRldnsOw (ECDSA)
SHA256:biSvhMMQS/h3Ef7BCcxc/6XtqWZagijoVXkPhJa5OQU (ED25519)
Si ces trois empreintes reviennent identiques, aucun de tes clients n’aura quoi que ce soit à reconfigurer. Si elles diffèrent, le script le dit et s’interrompt pour confirmation : c’est le seul contrôle qui prouve que la restauration a réellement fonctionné.
Le .tar contient des clés privées d’hôte. Il n’est pas embarqué dans le script, se transfère à part, et le script le détruit par shred -u juste après usage.
Le script post-install-k3.sh fait, dans l’ordre :
- contrôle du partitionnement (
/var ≥ 1,4 To, swap ≥ 7 Go) — c’est la raison de la réinstallation, autant le vérifier tout de suite ;
- fuseau
Europe/Luxembourg ;
- paquets de base :
rsync, jq, curl, git, util-linux ;
- purge d’
apache2 et de mysql-server s’ils sont présents ;
- Docker CE depuis
download.docker.com, pas le paquet Ubuntu ;
- utilisateur
jerome en uid/gid 1001, groupe docker, sudo NOPASSWD, et les 9 clés clientes reprises de k4 — chacune validée par ssh-keygen avant installation ;
net.ipv4.ip_unprivileged_port_start=0, requis par Traefik ;
- authentification par clé uniquement (voir plus bas) ;
Port 22103 en gardant le port 22 ouvert.
Le port SSH est le point dangereux
k3 est une machine distante : perdre sshd, c’est perdre la machine. Le script ouvre donc 22103 en gardant le port 22, et vérifie que 22103 écoute avant de rendre la main. La fermeture du 22 est une seconde commande, délibérée :
# 1. valider depuis k4 que le nouveau port répond
ssh -p 22103 jerome@kimsufi3.chabod.eu 'id'
# 2. seulement alors, fermer le 22
ssh -p 22103 jerome@kimsufi3.chabod.eu 'sudo bash /root/post-install-k3.sh --fermer-22'
Sur Ubuntu 24.04 et suivantes, c’est ssh.socket qui écoute, pas sshd. Un générateur (sshd-socket-generator) relit sshd_config et régénère le socket : poser Port 22103 suffit donc, à condition de faire systemctl daemon-reload puis restart ssh.socket — ce que le script fait.
Authentification par clé uniquement
Trois directives, pas une :
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
PasswordAuthentication no seul ne suffit pas : avec UsePAM yes, un mot de passe passe encore par le canal clavier-interactif. Il faut couper les deux.
Le script ne se contente pas d’écrire ces lignes, il vérifie qu’elles sont effectives avec sshd -T, qui donne la configuration réellement appliquée une fois tous les fragments de sshd_config.d/ fusionnés. Ubuntu en pose deux (50-cloud-init.conf, 60-cloudimg-settings.conf) : sur k3 et k4 ils mettent déjà PasswordAuthentication no, donc pas de conflit, mais c’est le genre de fichier qui réactive silencieusement les mots de passe après une réinstallation. Vérifier la config effective plutôt que celle qu’on croit avoir écrite est le seul contrôle qui vaille.
Si un fragment prenait le dessus, le script le signale et indique quoi inspecter.
Les clés, côté serveur et côté hôte
Deux choses distinctes, souvent confondues :
|
Rôle |
Effet si on ne fait rien |
authorized_keys |
qui a le droit d’entrer |
plus personne ne peut se connecter |
clés d’hôte (/etc/ssh/ssh_host_*) |
l’identité de la machine |
tous les clients alertent et refusent |
Le script traite les deux. Restaurer l’identité d’hôte n’est pas qu’un confort : habituer des utilisateurs à passer outre REMOTE HOST IDENTIFICATION HAS CHANGED est précisément ce qui rendrait une vraie attaque invisible. C’est légitime ici parce que la réinstallation est volontaire — à ne pas faire si la machine avait été compromise, son identité pouvant alors être entre d’autres mains.
La clé root@kimsufi3 est volontairement exclue du jeu réinstallé : sa partie privée disparaît avec le disque, et c’est justement l’accès root de k3 vers k4 que le projet cherche à fermer.
Identités à respecter
jerome doit avoir uid 1001 et gid 1001, comme sur k4. OVH crée souvent le premier compte en uid 1000 ; le script corrige. Sans cette correspondance, les fichiers répliqués avec --numeric-ids arriveraient avec un propriétaire inexistant. Le store ACME, lui, est en 2000:2000 sans compte hôte associé — c’est normal, Traefik tourne sous ces numéros.
Étape 4 — Premier transfert
Priorité absolue à NCData (725 Go) : c’est la donnée qui n’existe nulle part ailleurs. Une nuit suffit en intra-OVH (2 ms de latence entre les deux machines).
Le reste (mailcow, /opt/dockerscripts, /var/www) suit ensuite ; c’est l’affaire de quelques minutes.
Après cette phase
Phase 1 : mécanisme de rôle actif/veille. Voir le plan complet dans ~/.claude/plans/.