2026.07.30 (Jeu)

✹ RĂ©sumĂ© de GPT-5.6 Sol

Le rĂ©cit de la configuration du disque, du SSH interne et d’une adresse stable sur un Ubuntu Server dĂ©diĂ©, de la sĂ©paration des droits entre personnes, AI Cells et runtimes d’automatisation, puis de la documentation du rĂ©seau entier comme socle d’exploitation que Codex peut reprendre.

J’ai enfin montĂ© un serveur Linux dĂ©diĂ© aux services de l’entreprise.

Mais je n’ai pas simplement construit un ordinateur capable de dĂ©marrer Ubuntu. Il s’agissait plutĂŽt d’un socle d’exploitation conçu pour que des personnes, des IA et des services d’automatisation puissent fonctionner simultanĂ©ment sur le mĂȘme serveur sans empiĂ©ter sur les droits ni l’état des autres.

Lorsque j’ai obtenu le SSD, mon raisonnement Ă©tait simple : installer Linux sur un PC Windows, m’y connecter en SSH, et voilĂ  un serveur. Je me suis aussitĂŽt interrogĂ© sur l’interface graphique. Est-ce que je n’allais pas regretter de m’obstiner Ă  utiliser seulement la CLI pour faire « vrai serveur » le jour oĂč j’aurais besoin d’une connexion par navigateur ou de Computer Use ?

En examinant chaque point, j’ai compris que le serveur ait besoin d’une GUI et que j’aie besoin d’utiliser une GUI Ă©taient deux questions totalement diffĂ©rentes. Si OAuth ou une connexion Ă  Codex est nĂ©cessaire, je peux ouvrir dans le navigateur du MacBook l’URL affichĂ©e dans la session SSH. Si Computer Use est nĂ©cessaire, je peux l’exĂ©cuter sur mon Mac ou un appareil professionnel, tout en gardant Linux comme Runtime oĂč le rĂ©sultat sera dĂ©ployĂ©.

Un serveur n’est pas une machine qui affiche un Ă©cran. C’est un environnement qui continue de fonctionner.

UEFI, GPT et LVM pour préserver le disque Windows

MĂȘme la clĂ© USB d’installation m’a dĂ©routĂ©. Je pensais que si la clĂ© Ventoy utilisait MBR, Ubuntu serait lui aussi installĂ© en MBR. Lorsque UEFI: USB, Partition 2 est apparu dans le menu de dĂ©marrage, je ne savais mĂȘme pas si c’était le bon chemin.

Le partitionnement de la clĂ© USB et celui du SSD qui reçoit Ubuntu sont indĂ©pendants. Il suffisait de lancer l’installateur par l’entrĂ©e UEFI et de sĂ©lectionner prĂ©cisĂ©ment le bon SSD. Je n’ai pas touchĂ© au NVMe Windows existant et j’ai créé l’EFI System Partition, /boot, LVM et le root filesystem uniquement sur le nouveau SSD de 250 Go.

Le plus effrayant n’était pas la difficultĂ© de Linux, mais le risque d’effacer le mauvais disque. En voyant mĂȘme la partition Windows RĂ©servĂ© au systĂšme, elle paraissait presque supprimable. J’ai de nouveau comparĂ© les modĂšles et les capacitĂ©s dans l’installateur, puis choisi uniquement le SSD rĂ©servĂ© Ă  Ubuntu. Le disque Windows est restĂ© intact.

J’ai choisi l’installation standard d’Ubuntu Server 24.04.4 LTS, ni minimized ni Desktop image. Sans GUI, il ne restait qu’une base centrĂ©e sur SSH et systemd, prĂȘte Ă  accueillir ensuite un Docker Runtime.

RĂ©servation DHCP et SSH interne avant l’adresse fixe

Pendant l’installation, le rĂ©seau filaire a immĂ©diatement reçu une adresse par DHCP. Au dĂ©part, je pensais que Create bond amĂ©liorerait la connexion SSH ou fixerait l’adresse. Mais un bond agrĂšge plusieurs NIC pour la redondance ou l’addition de bande passante. Cela n’a rien Ă  voir avec l’adresse d’une seule NIC filaire.

Au lieu d’inscrire une static IP arbitraire dans le serveur, j’ai associĂ© l’adresse MAC de la NIC Ă  une IP interne grĂące Ă  une rĂ©servation DHCP sur le routeur principal. Le serveur reste un DHCP client, mais reçoit la mĂȘme adresse aprĂšs chaque redĂ©marrage. Le routeur permet aussi de vĂ©rifier les conflits avec les autres appareils rĂ©servĂ©s.

Je n’ai pas non plus exposĂ© SSH Ă  Internet. J’ai créé une clĂ© Ed25519 rĂ©servĂ©e au MacBook, comparĂ© la host key du serveur avec la console, puis l’ai Ă©pinglĂ©e Ă  l’adresse du rĂ©seau interne. Je n’ai créé aucun forwarding externe du port 22 sur le routeur.

Juste aprĂšs l’installation, ssh.service apparaissait comme disabled, et j’ai cru un instant que SSH avait Ă©tĂ© mal installĂ©. En rĂ©alitĂ©, ssh.socket Ă©tait actif et Ă©coutait sur le port 22 ; le public-key login a continuĂ© Ă  rĂ©ussir aprĂšs redĂ©marrage. Socket activation peut dĂ©marrer le service correspondant Ă  l’arrivĂ©e d’une requĂȘte : il ne fallait donc pas diagnostiquer une panne Ă  partir d’une seule ligne d’état du service.1

La diffĂ©rence entre DHCP lease, reservation et IP–MAC binding, apprise quelques jours plus tĂŽt en rĂ©parant la panne Internet du routeur de l’entreprise, a directement servi Ă  construire ce socle serveur. Recevoir une adresse et pouvoir administrer une machine de maniĂšre sĂ»re par cette adresse sont deux choses diffĂ©rentes.

Personnes, AI Cells et services sĂ©parĂ©s d’un compte unique

DĂšs que SSH a fonctionnĂ©, j’ai failli installer comme d’habitude Oh My Zsh, Powerlevel10k et mes alias personnels. Puis je me suis de nouveau arrĂȘtĂ©.

Le premier compte créé pendant l’installation appartient Ă  l’entreprise et sert au bootstrap et Ă  la rĂ©cupĂ©ration. Regrouper mon shell quotidien, le AI Runtime et Operations Automation dans ce compte serait pratique. Mais il deviendrait impossible de distinguer qui a exĂ©cutĂ© quoi avec quels droits, et tout s’emmĂȘlerait lorsqu’un autre responsable arriverait ou qu’il faudrait rĂ©voquer un compte.

J’ai donc commencĂ© par sĂ©parer les comptes selon ces rĂšgles.

administrateur bootstrap
└─ utilisĂ© uniquement pour l’installation et la rĂ©cupĂ©ration

usr-<person>
└─ compte utilisĂ© par une personne pour SSH, sudo et le dĂ©veloppement

aio-cell-<person>
└─ compte sous lequel un AI Cell personnel fonctionne en continu

svc-<domain>-<purpose>
└─ Runtime d’application, importer de donnĂ©es ou broker d’opĂ©rations restreintes

Ne pas inclure le nom de l’entreprise ni le mĂ©tier dans le username Ă©tait Ă©galement intentionnel. Une personne reste la mĂȘme mĂȘme si son rattachement et son rĂŽle changent. Il vaut mieux que le Linux login ne reprĂ©sente qu’une identitĂ© stable, tandis que les droits d’administrateur, de dĂ©veloppeur ou de participant Ă  un projet Ă©voluent sĂ©parĂ©ment par groups et RBAC.

J’ai dĂ©cidĂ© de conserver OMZ, P10K et mes alias uniquement dans le compte humain. Les AI Cells et service accounts ne liront pas la configuration de l’interactive shell ; ils seront exĂ©cutĂ©s par des systemd units fixes, des EnvironmentFiles et des chemins absolus. Un beau prompt amĂ©liore ma productivitĂ©, mais n’a aucun rapport avec la stabilitĂ© du service.

Je n’ai pas encore créé tous ces comptes dans la prĂ©cipitation. J’ai d’abord fixĂ© leurs noms, la propriĂ©tĂ© des fichiers, l’autorisation de connexion et les limites d’accĂšs Ă  sudo et Docker. DĂ©finir ces frontiĂšres quand le serveur est vide est bien plus simple que de tout sĂ©parer aprĂšs l’avoir mĂ©langĂ© dans un seul compte.

La frontiĂšre d’un AI Cell s’étend jusqu’à UID, HOME et OAuth

Le plus grand changement dans ma compréhension cette fois concernait les systÚmes multi-utilisateurs.

Lorsqu’on ne voit que les GUI de bureau, on a l’impression que l’utilisateur affichĂ© sur l’écran de connexion occupe tout l’ordinateur. Sous Linux, l’écran de connexion visible et les utilisateurs dont les processus tournent sont deux notions diffĂ©rentes. Plusieurs utilisateurs peuvent se connecter en SSH en mĂȘme temps, et les processus de service accounts non connectĂ©s peuvent continuer Ă  fonctionner sous systemd.

Cette structure Ă©tait particuliĂšrement importante pour Ă©tendre Ă  Linux le modĂšle d’AI Cell que j’avais redĂ©fini par utilisateur macOS. Un AI Cell n’était pas un simple nom de process.

1 AI Cell
= 1 ensemble Linux UID et HOME
= 1 ensemble OAuth et CODEX_HOME
= 1 ensemble Gateway et Port
= 1 ensemble Session, Memory et Workspace
= 1 ensemble systemd unit et cgroup budget

Lorsque le Cell de chaque personne possĂšde son propre UID et HOME, l’authentification, la mĂ©moire et l’espace de travail se sĂ©parent naturellement. Chaque Cell fonctionne sur un port ou un Unix socket diffĂ©rent, et systemd le maintient actif aprĂšs le dĂ©marrage mĂȘme si l’utilisateur n’est pas connectĂ© en SSH. Plusieurs Cells peuvent coexister sur un serveur sans que l’OAuth ou la Memory de l’un serve de fallback Ă  un autre.

En revanche, j’ai dĂ©cidĂ© de ne pas donner aux AI Cells sudo, un mount complet du NAS, les credentials d’administrateur de la DB de production ni le Docker socket. La documentation officielle de Docker avertit aussi que le group docker accorde des privilĂšges de niveau root.2 Ajouter par commoditĂ© les comptes humains, IA et service Ă  ce group effacerait en pratique les frontiĂšres que je venais de tracer.

Les opĂ©rations Docker seront effectuĂ©es explicitement par un administrateur humain avec sudo, ou par un helper limitĂ© appartenant Ă  root et une systemd unit n’acceptant que des opĂ©rations prĂ©dĂ©finies. L’IA pourra coordonner un dĂ©ploiement, mais ne disposera pas directement d’un shell arbitraire ni de tous les droits Docker.

Le NAS comme ingress, Linux comme application Runtime

Le serveur Linux n’est pas consacrĂ© au seul AI Orchestration. Le Web, l’API et la DB d’Operations Automation doivent Ă©galement fonctionner dessus dans un Docker Runtime. Cela ne signifie pas tout placer dans un seul compte, un seul Compose project et une seule network.

Les connexions externes continueront d’utiliser le HTTPS et le reverse proxy dĂ©jĂ  gĂ©rĂ©s par le NAS. Linux exĂ©cutera les applications elles-mĂȘmes.

utilisateur externe
→ HTTPS 443
→ routeur de l’entreprise
→ TLS et hostname reverse proxy du NAS
→ frontend Linux
→ API interne Docker
→ DB interne Docker

Il n’est pas nĂ©cessaire d’exposer directement Ă  Internet le port d’administration du NAS, le SSH Linux ni les ports de l’API et de la DB. Le NAS reste l’ingress qui gĂšre hostnames et certificats, ainsi qu’un point de storage et de backup ; Linux prend en charge l’application Runtime. Je ne jette pas le chemin HTTPS externe créé en migrant l’automatisation des congĂ©s vers le NAS : seul le backend final sera dĂ©placĂ© vers le serveur dĂ©diĂ©.

J’ai Ă©galement sĂ©parĂ© le dĂ©ploiement du code de l’import des donnĂ©es RH depuis le NAS.

code
→ vĂ©rifier release et artifact hash
→ deploy helper restreint
→ health check et rollback

données RH
→ dossier read-only approuvĂ© sur le NAS
→ staging, validation et preview
→ approbation
→ DB transaction et audit

AI Orchestration peut analyser un changement et demander une approbation. Le dĂ©ploiement rĂ©el et l’import de donnĂ©es seront toutefois exĂ©cutĂ©s sĂ©parĂ©ment par un broker et un importer qui n’acceptent que des opĂ©rations dĂ©finies. Le MacBook peut servir au dĂ©veloppement, au dry-run, au contrĂŽle des previews et au lancement d’un travail approuvĂ©, mais ne sera pas le point de canonical mutation de la DB de production.

Le serveur Linux n’a pas encore Docker ni d’application DB. Je ne l’ai donc pas appelĂ© production backend simplement parce que la rĂ©servation DHCP et SSH fonctionnaient. Le target du reverse proxy NAS ne pourra changer qu’une fois prĂȘts le frontend port exact, le health check, backup et restore, et rollback.

Un Codex Skill qui conserve toute la topology du réseau

La continuitĂ© avec la conversation suivante comptait autant que la configuration du serveur elle-mĂȘme.

J’ai mis Ă  jour un Codex Skill dĂ©diĂ© au rĂ©seau de l’entreprise et son inventaire dĂ©taillĂ© avec les relations entre le routeur, les deux NAS, le Mac Runtime existant, le nouveau serveur Linux, le HTTPS externe et le SSH interne. Il ne s’agit pas d’une simple liste d’IP : il distingue le rĂŽle de chaque Ă©quipement ainsi que l’origine, les hops intermĂ©diaires et le Runtime final de chaque flux de traffic.

Le Skill ne mélange pas non plus les faits accomplis avec la structure future.

  • L’installation et le redĂ©marrage d’Ubuntu, ainsi que le SSH interne, sont terminĂ©s.
  • Les identities multi-utilisateurs et les limites de droits sont dĂ©finies, mais les comptes ne sont pas encore créés.
  • Docker, les AI Cells et Operations Automation ne sont pas encore dĂ©ployĂ©s sous Linux.
  • Le reverse proxy du NAS ne basculera vers Linux qu’aprĂšs la mise en place de health et rollback.

DĂ©sormais, mĂȘme dans une nouvelle session Codex, je n’ai plus besoin de commencer par expliquer : « Quelle Ă©tait l’IP du serveur ? », « Le NAS exĂ©cute-t-il l’application ? » ou « Pourquoi le service SSH Ă©tait-il disabled ? ». Le Skill transmet ensemble la topology rĂ©elle, les frontiĂšres de sĂ©curitĂ©, l’état vĂ©rifiĂ© et ce qui reste inachevĂ©.

Ce serveur n’est donc pas encore un production server achevĂ©, mais ce n’est pas non plus un SSD vide sur lequel seul Ubuntu est installĂ©. La prochaine Ă©tape consiste Ă  mettre rĂ©ellement en service les comptes humains, les AI Cells et l’Operations Automation Runtime dans les frontiĂšres dĂ©jĂ  dĂ©finies.

DĂ©sormais, chaque fois que j’installerai quelque chose, je pense que je demanderai d’abord : « Sous quel compte cela s’exĂ©cutera-t-il ? », « Quels HOME et credentials possĂ©dera-t-il ? » et « Quels ports et data flows seront autorisĂ©s ? ». Plus que d’avoir construit un serveur, j’ai le sentiment d’avoir d’abord dĂ©fini les rĂšgles qui permettront de l’agrandir sans le casser sans cesse.

Références

  1. Une socket unit systemd peut surveiller un socket et activer le service correspondant Ă  l’arrivĂ©e d’incoming traffic. Manuel officiel de systemd.socket ↩

  2. Le group docker, qui peut accĂ©der au Unix socket du Docker daemon, accorde des privilĂšges de niveau root. Étapes aprĂšs l’installation de Docker Engine sous Linux ↩

Laisser un commentaire