Aller au contenu

Migrer le matériel d'une passerelle

Remplacer l’ordinateur d’une passerelle sans perdre sa configuration ni ses données. La différence avec une installation neuve tient en une phrase : la machine est neuve, l’état ne l’est pas.

C’est de là que viennent presque tous les pièges de cette page.

Repris automatiquementÀ reprendre à la main
DNS et DHCP de la zoneDonnées des services
Registre des services, portail, reverse proxyDépôt de sauvegarde
Cibles de supervision, tags de déploiementIdentité VPN
Destinataires des secrets sopsPropriétaires des fichiers restaurés
Clés SSH de déploiementsystem.stateVersion

Les secrets ne sont pas liés au nom d’hôte : le fichier de règles sops ne connaît que la clé d’administration et la clé d’infrastructure. Un renommage n’y change rien.

Rien n’est modifié à cette étape : on collecte ce qui devra être écrit dans la configuration.

  1. Démarrer sur la clé USB (image just build-iso), carte Wi-Fi USB branchée dans le port qui sera son port définitif.

  2. Relever interfaces, adresses MAC et disques

    Fenêtre de terminal
    ip -o link
    lsblk -o NAME,SIZE,MODEL,SERIAL,TYPE

    La MAC permanente d’une carte Wi-Fi diffère de sa MAC courante, souvent aléatoire. C’est la permanente qui compte, visible dans le champ permaddr.

  3. Identifier physiquement quel port sera le WAN et lesquels le LAN, en débranchant et rebranchant. Étiqueter les prises.

Les interfaces Wi-Fi n’ont pas à figurer dans gateway.lan.interfaces : hostapd place lui-même son interface dans le pont.

etc/config.yaml
zones:
maison:
gateway:
wan:
interface: "eno0"
lan:
interfaces: ["eno1", "eno2", "eno3"]
hosts:
- hostname: "gw"
zone: "maison:1.1"
profile: "gateway"
mac: "00:00:5e:00:53:00"
disko:
profile: "luks-btrfs-1-disk"
devices:
main: "/dev/nvme0n1"

Renommer l’hôte au passage est le bon moment, la machine étant de toute façon réinstallée. Un alias portant le nouveau nom doit alors être supprimé : le générateur refuse qu’un nom soit à la fois alias et nom d’hôte.

Côté dossier machine, git mv usr/machines/<ancien> usr/machines/gw, puis importer ./generated-configuration.nix et ./disko.nix dans default.nix.

Fenêtre de terminal
just install gw nixos <ip>

La commande formate, installe et redémarre. Sur un disque chiffré, la passphrase d’installation est demandée pendant le partitionnement : la noter, just luks en aura besoin.

Préférer les étapes séparées à just full-install : sur un disque chiffré, l’attente du retour de la machine suppose un démarrage sans intervention, ce que la saisie de la passphrase interdit.

  1. Sauvegarder, sur l’ancienne passerelle

    Fenêtre de terminal
    systemctl stop forgejo postgresql
    systemctl start restic-backups-system-main.service

    Ne pas arrêter le résolveur DNS de la zone : la cible de sauvegarde est désignée par son nom, l’arrêter la rend introuvable.

  2. Renommer le dépôt, sur le serveur de sauvegarde

    Fenêtre de terminal
    mv /mnt/backup/restic/<ancien> /mnt/backup/restic/gw

    Le chemin d’un dépôt contient le nom d’hôte. Renommer conserve tout l’historique, alors qu’un nouveau nom repartirait d’un dépôt vide.

  3. Échanger le matériel : extinction, déplacement des disques de données, câblage identique, démarrage et déverrouillage du disque.

  4. Configurer et déployer

    Fenêtre de terminal
    just configure gw
    just apply-verbose gw

    just configure pousse la clé d’infrastructure : c’est l’étape qui débloque sops, et donc l’accès console de secours.

  5. Republier les comptes de sauvegarde sur le serveur qui les héberge

    Fenêtre de terminal
    just apply-local

Le serveur de sauvegarde isole les dépôts par hôte : l’utilisateur authentifié doit être égal au premier segment du chemin. Le dépôt renommé reste donc inaccessible tant que le serveur n’a pas republié le nouveau compte.

Fenêtre de terminal
restic-system-main snapshots

Cette vérification est le vrai contrôle : elle doit lister l’historique de l’ancienne machine. Un dépôt vide signale une authentification réussie mais sur un mauvais chemin, ne rien restaurer dans ce cas.

  1. Arrêter les services dont l’état va être remplacé.

  2. Vider les répertoires d’état avant de restaurer.

  3. Restaurer, un mode à la fois

    Fenêtre de terminal
    restic-system-main restore latest --target / \
    --include /var/lib/forgejo --include /var/lib/postgresql
  4. Rétablir les propriétaires, par nom.

  5. Redémarrer les services et contrôler.

ContrôleAttendu
systemctl --failedaucune unité
ls /var/lib/postgresqlune seule majeure
Comptes et dépôts applicatifsceux d’avant la migration
restic-system-main snapshotshistorique complet
Adresse sur le maillage VPNinchangée
Points d’accès Wi-Fiprésents, clients servis
Redémarrage à froidla machine remonte seule

Le bloc disko d’etc/config.yaml n’est lu qu’à l’installation, le commenter une fois la migration terminée. Détail des recettes dans Justfile et des clés de configuration dans Le fichier config.yaml.