Audit
Lecture seule de votre serveur. Rapport noté A–E : risques, preuves, recommandations. Aucune modification.
Vos serveurs, sous contrôle.
Analyser, sécuriser, déployer et sauvegarder — toujours avec un plan et votre accord.
Solutions
Même outil, même discipline : analyser → proposer → confirmer → exécuter → prouver.
Lecture seule de votre serveur. Rapport noté A–E : risques, preuves, recommandations. Aucune modification.
Sécurisation, conteneurs, HTTPS, déploiement depuis Git, reprise des données, sauvegardes chiffrées quotidiennes.
Sauvegardes vérifiées, exercice de restauration mensuel, alertes e-mail, déploiements à la demande, rapport.
Méthode
OS, CPU, RAM, ports, logiciels. Automatique. Aucune écriture.
Sécurité, Docker, Traefik, base, déploiement, alertes. Plan affiché, confirmation obligatoire.
Réinstall, suppression massive, drop : refusés. Jamais d’accès root libre à une IA.
Connexion sécurisée pour les comptes autorisés. Cockpit local pour l’opérateur mono-poste.
Aide utilisateur
Tu colles l’IP de ton VPS. L’agent lit ce serveur, puis n’installe que ce que tu confirmes.
Profil platform : comptes + RBAC (connexion). Profil défaut : un opérateur, console locale.
Ce qui est déjà posé sur cette machine n’est pas reproposé. Un autre VPS reprend les mêmes traitements depuis le début.
Tu as un VPS. Au lieu d’installer Docker, un reverse-proxy ou une base « à la main », tu passes par cet outil.
L’IA ne reçoit jamais un accès root libre. Les scripts sont versionnés, pas inventés à la volée.
Menu Cockpit. Renseigne au minimum :
autopilot). Il est créé par la méthode D de l’étape 3, quelle que soit la distribution. Les comptes livrés par l’hébergeur (ubuntu, debian, root…) ne servent qu’à la méthode A.22 sauf si tu l’as changéAuto convientTant que tu n’as pas cliqué Analyser le VPS avec succès, le tableau reste vide. Pas de données d’exemple.
L’agent se présente avec une paire de clés : privée sur ce PC,
publique sur le VPS (fichier ~/.ssh/authorized_keys).
Générer la clé une fois, sur ce PC (PowerShell) :
ssh-keygen -t ed25519 -f $HOME\.ssh\vps-autopilot -C "vps-autopilot" -N ""
S’il demande d’écraser : n.
Fichiers : vps-autopilot (secret) et vps-autopilot.pub (à coller sur le serveur).
Clé déjà présente sur ce PC.
vps-autopilot.pub, affiché juste en dessous. C’est une seule ligne
qui commence par ssh-ed25519 AAAA….
Ne colle jamais vps-autopilot (sans .pub) : c’est la clé secrète, elle reste sur ce PC.
Clé publique de cet agent (une seule ligne) — c’est celle-ci à copier :
Chargement…
Pour l’afficher toi-même dans PowerShell : Get-Content $HOME\.ssh\vps-autopilot.pub.
Elle va sur le VPS dans ~/.ssh/authorized_keys de l’utilisateur avec lequel l’agent se connecte
(le même que dans le champ Utilisateur, ex. autopilot).
root ? Sur le serveur, ~ désigne alors /root, pas
le compte de l’agent. Pour l’utilisateur vps, le fichier est /home/vps/.ssh/authorized_keys.
La méthode D ci-dessous écrit le bon chemin pour toi.
Quatre façons de la poser sur le VPS :
ubuntu ou root).Le mot de passe n’est pas enregistré. Une ligne dans authorized_keys.
Fiche du VPS chez l’hébergeur (pas la page « clés SSH ») → console web (KVM / VNC) → connecte-toi avec l’utilisateur de l’agent (sinon méthode D), puis :
mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys nano ~/.ssh/authorized_keys
Dans nano, colle la ligne ssh-ed25519 … copiée plus haut (clic droit dans la console web),
sur une seule ligne, sans espace avant. Enregistrer : Ctrl+O, Entrée, Ctrl+X.
ssh ubuntu@IP "mkdir -p ~/.ssh; chmod 700 ~/.ssh; touch ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys" type $HOME\.ssh\vps-autopilot.pub | ssh ubuntu@IP "cat >> ~/.ssh/authorized_keys"
Recommandé, et seul moyen pour un serveur que tu n’administres pas (ex. le serveur de ton organisation) : envoie ce bloc à
l’administrateur. Il le colle dans sa propre session root (ou après sudo -i).
Le bloc crée le compte de l’agent s’il n’existe pas (Ubuntu, Debian, RHEL, Rocky, Alma, Fedora…), puis y pose
la clé. Personne ne te donne de mot de passe, et le compte n’a aucun droit sudo par défaut :
assez pour l’analyse. La dernière ligne, commentée, donne sudo sans mot de passe ; à activer seulement si
l’agent doit installer ou déployer.
autopilot
(nom par défaut : autopilot). Il est modifiable, de deux façons :
U=autopilot, par
exemple U=agentweb.- ou _, commence par une lettre.
Saisis ensuite le même nom dans le champ Utilisateur SSH pour analyser.
Chargement…
Le bloc est rempli avec la clé publique de cet agent et l’Utilisateur saisi dans le cockpit.
Il n’ajoute pas la clé deux fois. La dernière ligne affichée doit être la clé ssh-ed25519 … de cet agent.
Pour retirer l’accès plus tard : supprimer cette ligne du fichier.
Vérifier (PowerShell) : cette commande doit ouvrir une session sans demander de mot de passe.
ssh -i $HOME\.ssh\vps-autopilot ubuntu@IP
Utilisateur, IP et port sont repris du cockpit. Si elle demande un mot de passe : la clé n’est pas dans le bon
authorized_keys (mauvais utilisateur, ou ligne coupée). Tape exit, puis
Analyser le VPS dans la console.
Le compte de l’agent n’a aucun droit sudo par défaut : assez pour analyser. Certaines opérations demandent de lire ou d’écrire ce que seul root peut toucher. Exemples : sauvegarder toutes les applications d’un serveur avant de les remettre en conteneurs (bases de données, fichiers protégés, configurations), ou préparer le serveur. Dans ce cas, l’administrateur donne temporairement sudo au compte, puis le retire.
1. L’admin donne les droits, dans sa session root (ou après sudo -i).
Le compte est celui du champ Utilisateur SSH du cockpit (autopilot).
Les droits se retirent tout seuls au bout de 4 heures (sur les systèmes avec systemd, c’est-à-dire
presque tous).
Chargement…
2. Vérifier depuis ton PC (PowerShell) : la réponse doit être SUDO_OK.
Chargement…
3. Retirer les droits dès que l’opération est finie, sans attendre les 4 heures (session
root de l’admin). La vérification de l’étape 2 doit alors échouer.
Chargement…
/var/log/auth.log ou /var/log/secure).Bouton Analyser le VPS. L’empreinte SSH est enregistrée, puis lecture seule. Si « Authentification refusée » : la clé n’est pas sur ce compte — étape 3.
Ensuite seulement : OS, CPU, RAM, disque, logiciels de ce VPS.
Mes serveurs (haut du panneau de gauche) : chaque serveur analysé avec succès y est gardé (nom, adresse, utilisateur, port ; jamais de mot de passe). Un clic rouvre sa session : les champs sont remplis et la dernière analyse s’affiche aussitôt, avec sa date, sans se reconnecter. Relance Analyser le VPS pour la rafraîchir. Au démarrage, le cockpit rouvre le dernier serveur utilisé. Oublier le retire de la liste (l’analyse enregistrée sur ce PC n’est pas effacée).
Réglages (sous chaque serveur), à fixer avant les installations :
http://.8080 vers 80),
les liens et la vérification après déploiement utilisent ce port. Vide = port standard.
Sur un serveur désigné par son adresse IP (pas de nom de domaine), les plateformes sont routées par
chemin seul (/app, /app/api) : la même URL marche par
l’adresse publique et par l’adresse interne.
Après l’analyse, le cockpit n’affiche qu’une étape à la fois : Analyser → Préparer le serveur → Plateforme → Accès Git → Données → En ligne. La carte « Prochaine étape » dit quoi faire et propose un seul bouton.
Les étapes faites restent cliquables pour y revenir. Mode expert réaffiche tous les panneaux (choix fin des installations, apps simples).
Options de connexion (rail de gauche) réaffiche mot de passe, clé et empreinte une fois connecté.
Nom d’hôte avec {{HOST}} : remplacé au déploiement — après le mapping DNS, change le nom d’hôte, Enregistrer, Déployer.
La carte Installations (le bouton Installer) est juste sous le tableau. La liste « Que doit installer l’agent ? » est en dessous, dans un menu fermé : clique le titre pour déplier. Elle décrit ce que tu veux sur ce VPS, ce n’est pas le bouton.
deploy, groupe docker, pas de sudo, clé de l’agent copiée. Aucune app n’est lancée.Ordre conseillé : clé SSH → analyser → sécurité → Docker → Traefik → MariaDB → compte deploy → app (Git).
apps.mondomaine.com) : les apps deviennent https://mon-app.apps.mondomaine.com. DNS * → IP du VPS. Sans domaine : fallback lab identifiant.<IP>.sslip.io (aussi en HTTPS).mon-app), pas le domaine. Nom d’hôte = DNS complet. Git = https://… public, ou git@github.com:org/repo.git + clé lecture seule (Deploy key, pas d’écriture).8080). Git HTTPS public, ou SSH + Deploy key. Nom d’hôte : DNS vers le VPS, ou app.<IP>.sslip.io./api/v1/health. Aucun CHANGE depuis Internet. Le cockpit reste sur 127.0.0.1:8088. Plus tard (V9) : cockpit en ligne derrière login, une session et des paramètres par opérateur.db.env sur le serveur, hors git).git@… + une clé lecture seule par dépôt), un port interne, des besoins (MariaDB, Redis, volume fichiers). Sous-dossier optionnel si le Dockerfile n’est pas à la racine du dépôt (monorepo).api. / www.) ou chemins sur un seul hôte (/ + /api + /admin). En chemins, Traefik retire le préfixe : l’app écoute à la racine du conteneur.NEXT_PUBLIC_API_URL vers l’URL publique de l’API (sous-domaine ou https://hote/api).platforms/…/src comme copie de secours ; ne pas garder les efface après le build (images seules). Les deux options sont valides — à choisir par plateforme.Dockerfile.autopilot sur le serveur, sans toucher au dépôt. (Avant V7-06 : pas de modèle pour les plateformes.)/chemin (Next basePath, Spring context-path). Sinon Traefik retire le préfixe.CLE=valeur) : figées dans l’image, ex. NEXT_PUBLIC_API_URL. Variables d’exécution : lues au démarrage du conteneur, ex. SPRING_PROFILES_ACTIVE. {{HOST}} est remplacé par le nom d’hôte du service. Les secrets (mots de passe, tokens) s’affichent ******** : laisse-les ainsi pour garder la valeur enregistrée. Mieux : pose-les avec Secrets d’exécution (ligne suivante), ils ne sont alors jamais enregistrés sur ce poste.MAIL_PASSWORD) et la valeur (saisie masquée), puis Poser le secret (à confirmer). La valeur est écrite directement dans svc-<service>.local.env sur le VPS (600, compte deploy), prime sur une variable de même nom de la fiche, et le service est redémarré si la case est cochée. Elle n’est jamais enregistrée sur ce poste, jamais réaffichée, jamais dans le journal. Voir les noms posés liste les noms, jamais les valeurs. Retirer supprime la ligne. Refusé : apostrophe droite ' ou retour à la ligne dans la valeur. La plateforme doit avoir été déployée une fois./, back-office Next /admin, API Spring Boot /api avec base, cache et fichiers). Remplace l’identifiant et les dépôts Git par les tiens, ajuste les chemins, puis Enregistrer.git@… : Générer, Copier, ouvrir le lien « Deploy keys », coller la clé avec Allow write access décoché.backups/…-before-sql-….sql.gz, 20 gardées) avant exécution. Arrêt à la première erreur. Refusé : DROP, TRUNCATE, droits, autres bases, fichiers du serveur, commandes client. Fichier .sql de 5 Mo max ; au-delà, « Restaurer les données »..sql / .sql.gz) et/ou archive des fichiers (.tar.gz / .zip, contenu à la racine). À faire avant le premier Déployer pour une app qui ne crée pas sa base seule. La base et les fichiers déjà présents sont sauvegardés sur le VPS (/opt/vps-autopilot/platforms/<id>/backups) avant d’être remplacés. Préfère une base de démonstration aux données réelles. Si l’import échoue, la base revient automatiquement à cette sauvegarde et les services sont relancés. Erreur de clé étrangère (ERROR 1452) : décoche « Vérifier les clés étrangères pendant l’import » et relance.vps-autopilot-keepalive) qui relance toutes les 2 minutes, et au démarrage, les services de plateforme arrêtés. Pour arrêter volontairement une plateforme plus de 2 minutes, crée /opt/vps-autopilot/platforms/<id>/.maintenance (pris en compte 2 h).Bande Rapport (mode expert), après une analyse. Facultatif : le nom du client à afficher. Rapport d’audit client télécharge une page HTML ; ouvre-la puis Imprimer › PDF pour l’envoyer.
Installe d’abord Backups chiffrés (Installations). Le VPS sauvegarde alors chaque nuit vers 02:30 MariaDB (toutes les bases) et les fichiers déposés par les utilisateurs (volumes /app/data des plateformes et des apps) : deux fichiers chiffrés de même horodatage, 14 sauvegardes gardées dans /opt/vps-autopilot/backups. Un serveur équipé avant cette mise à jour apparaît « à installer » : réinstalle Backups chiffrés pour ajouter les fichiers. Bande Sauvegardes (mode expert) :
state/backups/<serveur>/) et les vérifie. Si la liaison coupe, la copie reprend où elle s’était arrêtée ; relancer « Copier la dernière » reprend aussi. Refusé sur un serveur en lecture seule./var/tmp et ses fichiers comptés par volume. Tes bases et volumes ne sont pas touchés. Fais-le au moins une fois par mois : une sauvegarde qui ne se restaure pas n’existe pas./var/tmp, les tables et fichiers sont comptés contre le contenu de la sauvegarde, puis tout est supprimé. Le résultat s’affiche au-dessus de la liste après une analyse, et dans le rapport d’audit (échec = risque élevé ; plus de 40 jours sans exercice = constat faible). Un serveur équipé avant apparaît « à installer » : réinstalle Backups chiffrés.state/backup.key sur ce poste (et sur le VPS, lisible par root seul). Sans elle, aucune sauvegarde ne s’ouvre : garde-en une copie en lieu sûr.Bande Journal (mode expert) : chaque action lancée depuis la console sur ce serveur (analyse, installation, déploiement, sauvegarde, exercice, restauration, SQL, rapport d’audit) avec la date, le compte Windows qui l’a lancée, l’utilisateur SSH, le résultat et, en cas d’échec ou de refus, le message.
state/journal/ ; les réglages faits sans serveur sont dans _poste.jsonl. On n’y efface rien depuis la console.À faire dans les 2 jours ouvrés après la fin du mandat. Procédure complète, avec la vérification du client à chaque étape : .docs/commercial/retrait-acces.md.
state/backup.key par un canal convenu (jamais avec les sauvegardes).vps-autopilot-git-readonly… de chaque dépôt./etc/sudoers.d/90-vps-autopilot-temp et le fichier du compte de l’agent.authorized_keys (chaque compte où elle est posée), supprimer le compte dédié s’il ne sert plus. Le client vérifie que la connexion est refusée.state/backups/<serveur>/ à la date prévue, garder le journal le temps convenu.Les sauvegardes, l’exercice mensuel, la garde en ligne et les sites restent sur le serveur et continuent de tourner sans l’agent : ils appartiennent au client.
Alertes e-mail : si le compte SMTP était le tien, Retirer les alertes (bande Sauvegardes) avant de partir, ou laisse le client poser son propre compte.
Bande Sauvegardes, panneau Alertes e-mail. Le VPS envoie lui-même ses messages, même si ce poste est éteint.
/opt/vps-autopilot/notify.env, 600, root), jamais sur ce poste, jamais réaffiché, jamais dans le journal. Laisser le champ vide garde celui déjà posé.platform)ADR-046 / V9. Lancer avec --spring.profiles.active=platform (et PLATFORM_BOOTSTRAP_EMAIL pour le premier super-admin).
/login.html — e-mail + mot de passe. Défaut usine : VpsAutopilot!ChangeMe (changé à la 1re connexion sur /change-password.html). Lien magique encore dispo en lab.platform (1.x) reste sans login sur 127.0.0.1.Le tableau est découpé en bandes : État du serveur, Logiciels, Applications et plateformes, Pile et installations, Rapport, Sauvegardes. Filet à gauche, teintes calmes.
platform = login + RBAC, ADR-046).Rapport d’activité
Chronologie claire des actions sur un serveur — filtre par jour, export client ou envoi e-mail.
La date filtre aussi l’export et le mail. SQL et mots de passe n’apparaissent jamais ici.
Aucun tableau tant que le VPS n’est pas analysé.
Renseigne IP, utilisateur, port — puis Analyser. Pas de données fictives.
—
Étape
État du serveur
Système
—
Risque
Aucune modification du serveur
CPU
—
Mémoire
Disque
SSH
—
Logiciels
Applications et plateformes
CHANGE · Git → image → Traefik
Dépôt HTTPS public ou git@github.com:org/repo.git (clé lecture seule ci-dessous). Dockerfile à la racine (ou rattrapage template). Compte deploy + Traefik requis.
Sans domaine : fallback identifiant.<IP>.sslip.io. Avec domaine : DNS *.domaine → IP du VPS, puis Enregistrer le domaine.
Clé Git lecture seule (V7-05)
Pour un dépôt privé : génère la clé, colle la publique en Deploy key (read-only) sur GitHub/GitLab, saisis git@github.com:org/repo.git.
V7 · Git → images → Traefik
Un produit = plusieurs services (site, API, admin…). Enregistre d’abord, puis Tout déployer ou Déployer <service> (CHANGE confirmé). Un seul déploiement à la fois par serveur. Compose généré, aucun port public.
Routage : sous-domaines (un DNS par service) ou chemins (un DNS, / / /api / /admin).
Coché (défaut) : les clones restent sous platforms/…/src — utile comme copie locale de secours. Décoché : ils sont effacés dès que les images tournent (plus de sources ni .git sur le VPS ; au prochain déploiement l’agent re-clone). Les deux choix sont valides.
Hôte d’un service si le champ est vide : id.plateforme.domaine — ou sslip si tu as analysé une IP.
Restaurer les données (avant ou après Déployer)
Pour une appli qui ne sait pas créer sa base seule : envoie un dump SQL (.sql ou .sql.gz, MySQL ou MariaDB) et/ou une archive des fichiers (.tar.gz ou .zip, contenu à la racine). La base actuelle est sauvegardée sur le VPS avant d’être remplacée. Utilise de préférence une base de démonstration, pas les données réelles de tes utilisateurs.
Décoche seulement si l’import échoue sur une erreur de clé étrangère (ERROR 1452) : les lignes sont alors importées telles quelles, sans contrôle des références entre tables.
Clés Git par dépôt privé
GitHub refuse la même Deploy key sur deux dépôts : une clé par dépôt git@…. Pour chaque ligne : Générer, Copier, ouvre le lien, colle la clé (case Allow write access décochée), puis Déployer.
Console SQL · base de la plateforme
Exécute du SQL dans la base de la plateforme sur le VPS, avec l’utilisateur de la plateforme (aucun accès aux autres bases). Lecture (SELECT, SHOW, DESCRIBE, EXPLAIN) : immédiate, 1000 lignes max. Écriture (INSERT, UPDATE, DELETE, ALTER, CREATE…) : tu confirmes, l’agent sauvegarde toute la base sur le VPS, puis exécute. Refusé : DROP, TRUNCATE, droits, autres bases, fichiers du serveur.
Secrets d’exécution · sur le VPS seulement
Mot de passe SMTP, jeton d’API… La valeur part directement dans svc-<service>.local.env sur le VPS (600, lu au démarrage du conteneur) :
jamais enregistrée sur ce poste, jamais réaffichée, jamais dans le journal. Elle prime sur une variable de même nom de la fiche.
Pile et installations
Actions · CHANGE
Le bouton Installer est ici, pas dans le menu des cases. Il n’apparaît que si quelque chose manque sur ce VPS (y compris un détail Docker encore coché). Les actions à faire sont en haut. Déjà conforme = « déjà installé », sans bouton.
Pile voulue · ce VPS
Ceci est la liste voulue (cases), pas le bouton. Coche une section. Les détails et les explications sont dans des menus fermés. Pour poser ce qui manque : carte Installations au-dessus.
Rapport
Rapport
—
Sauvegardes
Sauvegardes · ce VPS
Le VPS sauvegarde MariaDB chaque nuit (fichier chiffré, 14 gardés). Copier la dernière l’amène sur ce poste et la lit en entier. Exercice la réimporte dans une base jetable du VPS puis l’efface : tes bases ne sont pas touchées. Restaurer remplace la base d’une plateforme (l’actuelle est d’abord sauvegardée).
Alertes e-mail · envoyées par le VPS lui-même
Le serveur écrit seul, même si ce poste est éteint : alerte si la sauvegarde de nuit ou l’exercice de restauration échoue, et (option) un résumé après chaque exercice mensuel réussi. Mets le client et toi en destinataires. Le mot de passe SMTP part directement sur le VPS (fichier 600, root) : jamais enregistré sur ce poste, jamais réaffiché, jamais dans le journal.
Journal
Journal des interventions · ce VPS
Chaque action lancée depuis cette console est enregistrée sur ce poste (state/journal/). Les requêtes SQL et les mots de passe ne sont jamais recopiés.
Traitement
0 s
Laisse cette fenêtre ouverte jusqu’à la fin. Rien n’est inventé : script versionné, déjà confirmé.
CHANGE · confirmation
À faire : lis le plan, puis Annuler ou Confirmer le CHANGE. Rien ne part sans ce clic.
Tuto · 1 minute