# serveur_ops **Poste d'exploitation** : la machine depuis laquelle l'écosystème se reconstruit lui-même. Ansible épinglé, le génome cloné depuis **sa propre forge**, et une clé SSH qui n'appartient qu'à lui. ## Principe Un écosystème pouvait jusqu'ici **détenir** son génome sans savoir l'exécuter. Les cinq dépôts vivaient sur sa forge — moteur, plans, modèles, étiquette signée — mais Set-OPS ne tournait que depuis le poste de son mainteneur. L'écosystème possédait le livre ; personne, chez lui, ne savait le lire à voix haute. `serveur_ops` est la différence entre une **archive** et une **matrice**. ## Ce que le poste emporte ```text /opt/setops/ Set-OPS-public/ le moteur ← cloné depuis genome/set-ops-public OPS-/ le plan ← cloné depuis genome/ops- venv/ ansible-core 2.18 (épinglé) .ssh/id_ed25519 la clé du poste LISEZ-MOI.md mode d'emploi, généré ``` Le moteur et les instances sont des **dossiers frères**, comme sur le poste du mainteneur : c'est cette fraternité que `scripts/instances.py` découvre pour proposer les instances pilotables. Le lien `instance` désigne celle qu'on pilote. ## D'où vient le génome : de sa propre forge Le poste clone depuis `https://forge./genome/…`, **pas** depuis la forge parente. Les dépôts y sont des miroirs, resynchronisés toutes les huit heures : la copie est vivante, et l'écosystème se reconstruit depuis **lui-même**. Le clone est **anonyme** — les dépôts du génome sont lisibles sur la forge interne. Un secret de moins sur une machine qui en concentre déjà beaucoup. La confiance TLS vient de `client_pki` (racine step-ca dans le magasin système). Sans elle, `git clone` refuse le certificat de la forge, et il a raison de refuser. ## Les deux choses qu'il n'a PAS **Le mot de passe de la voûte.** Il se saisit à l'exécution. Une machine qui détiendrait à la fois le plan, l'accès SSH à toute la flotte et la clé des secrets n'aurait plus aucune profondeur : la compromettre serait compromettre l'écosystème entier. **Le fichier de voûte lui-même.** Les dépôts d'instance excluent `vault.yml` de git — c'est la règle « aucun secret en clair ». Le génome cloné ici porte donc le plan **sans les secrets**. Conséquence à connaître, et qui n'est pas un défaut mais une conception : ```text la STRUCTURE de l'écosystème se reconstruit depuis la forge les SECRETS se restaurent depuis la sauvegarde (restic) ``` Deux sources distinctes, qu'un même incident n'atteint pas ensemble. ## Sa clé doit être autorisée Le poste fabrique sa propre paire, distincte de celle du mainteneur : deux exploitants, deux révocations possibles, et l'accès du poste se lit dans les `authorized_keys` de la flotte au lieu de se confondre avec celui d'un humain. Tant que cette clé publique n'est pas portée aux intrants SSH du plan, **le poste ne joint aucun hôte**. Le rôle l'affiche au déploiement ; elle se relit à tout moment : ```bash cat /opt/setops/.ssh/id_ed25519.pub ``` C'est volontairement un geste humain : donner à une machine le droit d'entrer partout mérite une décision, pas un effet de bord. ## Variables principales | Variable | Défaut | Rôle | |---|---|---| | `serveur_ops_utilisateur` | `setops` | compte d'exploitation | | `serveur_ops_racine` | `/opt/setops` | racine du poste | | `serveur_ops_ansible` | `ansible-core>=2.18,<2.19` | version **épinglée** | | `serveur_ops_forge_url` | `https://forge.` | source du génome | | `serveur_ops_depots` | moteur + instance | quoi cloner, et où | | `serveur_ops_instance` | l'instance du plan | cible du lien `instance` | | `serveur_ops_cle_generer` | `true` | fabriquer la clé du poste | ## Dépendances `serveur_forgejo` (la source du génome) — déclaré dans `docs/dependances-groupes.yml`, avec `sauf_si serveur_ops_forge_externe` pour l'écosystème qui lit son génome ailleurs. `serveur_step_ca` est **utilisé si présent** : sans confiance PKI, le clone échoue sur le certificat. ## Ce que ce rôle ne fait pas Il n'ouvre aucun service, n'écoute sur aucun port, ne publie rien à l'edge. Il ne sauvegarde rien non plus : tout ce qu'il contient se recompose depuis la forge.