No description
  • Jinja 65.4%
  • PHP 29.5%
  • Shell 5.1%
Find a file
Yan-Shenron b16c0668a0
Some checks failed
CI / lint (push) Has been cancelled
docs: guide operateur, workflow deploiement serveur, CLAUDE.md racine
- docs/GUIDE-CORENTIN.md : guide operateur (deploiement, durcissement SSH
  2-runs, migration WordPress, cutover, rollback, depannage, securite).
- docs/WORKFLOW-DEPLOIEMENT-SERVEUR.md : procedure reutilisable en 7 phases
  (mapping BYAN FD) pour tout nouveau serveur.
- CLAUDE.md : point d'entree du repo (usage deploy + migration, garde-fous).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 17:02:08 +02:00
.gitea/workflows feat: outillage projet (ansible.cfg, lint, tags, CI Gitea) 2026-07-01 13:41:50 +02:00
docs docs: guide operateur, workflow deploiement serveur, CLAUDE.md racine 2026-07-10 17:02:08 +02:00
group_vars/all feat: role migration-wp (WordPress Prime Mover migration) 2026-07-10 17:01:56 +02:00
roles feat: role migration-wp (WordPress Prime Mover migration) 2026-07-10 17:01:56 +02:00
.ansible-lint feat: outillage projet (ansible.cfg, lint, tags, CI Gitea) 2026-07-01 13:41:50 +02:00
.gitignore feat: role migration-wp (WordPress Prime Mover migration) 2026-07-10 17:01:56 +02:00
.pre-commit-config.yaml feat: anti-fuite secrets (pre-commit, .env/acme generes sur l'hote) 2026-07-01 13:41:50 +02:00
.yamllint feat: outillage projet (ansible.cfg, lint, tags, CI Gitea) 2026-07-01 13:41:50 +02:00
ansible.cfg feat: outillage projet (ansible.cfg, lint, tags, CI Gitea) 2026-07-01 13:41:50 +02:00
CHANGELOG.md feat: role migration-wp (WordPress Prime Mover migration) 2026-07-10 17:01:56 +02:00
CLAUDE.md docs: guide operateur, workflow deploiement serveur, CLAUDE.md racine 2026-07-10 17:02:08 +02:00
dev-server-setup.yml feat: role migration-wp (WordPress Prime Mover migration) 2026-07-10 17:01:56 +02:00
inventory refactor: parametrer l'hote pour cibler n'importe quel serveur 2026-06-30 16:00:22 +02:00
README.md docs: changelog et readme P3 2026-07-01 13:41:51 +02:00
requirements.yml refactor: tools remonte les erreurs (docker_compose_v2, requirements.yml) 2026-07-01 12:22:18 +02:00

Ansible — mise en service d'un serveur

Playbook de provisioning d'un serveur Debian : paquets de base, Docker, comptes utilisateurs, pare-feu, et stack Traefik.

Prerequis

  • Ansible (core 2.16+) sur le noeud de controle.
  • Collections : ansible-galaxy collection install -r requirements.yml (fournit community.docker pour docker_compose_v2).
  • Optionnel : pip install pre-commit && pre-commit install (gitleaks + lint avant chaque commit).
  • Acces SSH au serveur cible (via ~/.ssh/config ou l'option -i).

Configuration

  1. Cible — edite inventory et remplace your-server.example.com par le FQDN (ou l'IP) de ton serveur. Ajuste ansible_user si besoin (defaut root).
  2. Comptes — edite la liste users dans group_vars/all/vars.yml :
    users:
      - { name: alice, comment: "Admin", sudo: true }
      - { name: bob,   comment: "Dev",   sudo: false }
    
    sudo: true -> groupes sudo + docker ; sudo: false -> devlopper + docker.
  3. Cles SSH — depose la cle publique de chaque compte dans roles/users/files/keys/<name>.pub. Sans cle, le compte est cree mais accessible seulement par mot de passe initial.
  4. Domaine Traefik — par defaut domain_name vaut le FQDN de l'hote. Surcharge-le dans group_vars/all/vars.yml pour un domaine dedie.

Lancement

ansible-playbook dev-server-setup.yml

ansible.cfg fournit deja inventory = inventory : l'option -i n'est plus obligatoire. Chaque role porte un tag (--tags users, --tags firewall...), mais un run cible suppose que common a tourne au moins une fois sur l'hote (il installe curl/zsh/git dont dependent les autres roles).

Mots de passe initiaux

Les mots de passe sont generes au run et ecrits sur le noeud de controle dans ~/.ansible-credentials/<host>/<user> (permissions 0700/0600). Ils ne sont pas affiches en clair pendant le run : seul le chemin est indique. Chaque compte doit changer son mot de passe a la premiere connexion.

Reseau Docker

Traefik cree et gere le reseau admin_proxy (172.100.10.0/24). Un autre stack peut le rejoindre en external par ce nom :

networks:
  admin_proxy:
    external: true

Monitoring (optionnel)

Le role monitoring deploie un agent de supervision (node-exporter, cadvisor, process-exporter exposes via le Traefik local en HTTPS + Basic Auth, et promtail qui pousse les logs vers Loki). Grafana/Loki/Prometheus central existent ailleurs, hors de ce depot.

Activation par hote :

  1. Secrets — remplis group_vars/all/vault.yml puis chiffre-le :
    htpasswd -nbB prom 'TON_MDP'        # -> vault_metrics_basicauth
    ansible-vault encrypt group_vars/all/vault.yml
    
  2. DNS — cree l'enregistrement metrics.<server>.<domaine> vers l'IP de l'hote AVANT le run (sinon Let's Encrypt echoue).
  3. Opt-in — passe monitoring_enabled: true dans l'inventory (variable d'hote) ou group_vars (defaut false : le role ne fait rien ailleurs).
  4. Runansible-playbook -i inventory dev-server-setup.yml --ask-vault-pass.

Variables utiles (roles/monitoring/defaults/main.yml) : monitoring_base_domain, monitoring_entrypoint, monitoring_certresolver, images epinglables.

Durcissement (wave P1)

A appliquer de maniere SUPERVISEE. Le comportement reseau (firewall, DOCKER-USER) et la coupe SSH ne peuvent pas etre valides hors d'un serveur reel : garde une session SSH de secours ouverte pendant le premier run.

1. Roter le credential du dashboard Traefik (une fois)

Le hash du dashboard a fuite dans l'historique git ; le retrait du fichier ne suffit pas, il faut changer le mot de passe :

htpasswd -nbB admin 'NOUVEAU_MDP_FORT'      # -> admin:$2y$...
# colle la sortie dans group_vars/all/vault.yml -> vault_traefik_dashboard_auth
ansible-vault encrypt group_vars/all/vault.yml

2. Durcir SSH sans se verrouiller (role hardening/ssh)

Le durcissement est OPT-IN (ssh_lockdown, defaut false) et coupe root + l'auth par mot de passe. Procedure en 2 runs :

  1. Run initial (ansible_user=root, ssh_lockdown a false) : deploie les comptes et leurs cles SSH publiques (roles/users/files/keys/<name>.pub).
  2. Verifie dans un NOUVEAU terminal : ssh yan@serveur par cle, puis sudo. Ne ferme pas ta session root tant que ca ne marche pas.
  3. Bascule inventory : ansible_user=yan + become: yes, et mets ssh_lockdown: true.
  4. Run de lockdown : le role pose le drop-in, valide sshd -t, recharge sshd (les sessions ouvertes survivent). Une garde refuse la coupe si aucun membre de ssh_allow_groups (defaut sudo devlopper) n'a de cle.

3. Pare-feu et edge Docker (role firewall)

Le pare-feu est idempotent (plus de flush ni de restart Docker). La chaine DOCKER-USER ferme les ports publies par les conteneurs — l'INPUT DROP ne les protege PAS (Docker route via nat avant INPUT). Seuls 80/443 sont ouverts en edge. Verifie firewall_external_interface (affichee au run) si l'hote a plusieurs interfaces. Un service qui ne doit pas etre expose se publie sur 127.0.0.1.

4. Baseline OS et conteneurs (wave P2)

  • Rôle hardening/os-baseline (actif par défaut) : fail2ban (jail sshd), unattended-upgrades (patchs auto), sysctl de durcissement réseau/kernel, needrestart en mode liste. ip_forward reste à 1 (réseau Docker).
  • monitoring : cadvisor et process-exporter tournent désormais sans privileged. À vérifier au live après le premier run : les métriques cadvisor et la liste des process doivent rester collectées.
  • tools : plus de ignore_errors — un déploiement Traefik raté fait échouer le run (via docker_compose_v2). Installe les collections (requirements.yml) sur le nœud de contrôle.

Securite

  • Aucun secret en clair dans le depot. .env et acme.json sont des placeholders vides.
  • Avant de mettre un vrai secret dans .env (ex. POSTGRES_PASSWORD), bascule-le en Ansible Vault.