[đ ] IT Operations #2: Pour le serveur Linux de lâentreprise, jâai conçu lâexploitation avant dâinstaller les services
⚠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
-
Une socket unit systemd peut surveiller un socket et activer le service correspondant Ă lâarrivĂ©e dâincoming traffic. Manuel officiel de systemd.socket â©
-
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