- Jinja 65.4%
- PHP 29.5%
- Shell 5.1%
|
Some checks failed
CI / lint (push) Has been cancelled
- 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> |
||
|---|---|---|
| .gitea/workflows | ||
| docs | ||
| group_vars/all | ||
| roles | ||
| .ansible-lint | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| .yamllint | ||
| ansible.cfg | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| dev-server-setup.yml | ||
| inventory | ||
| README.md | ||
| requirements.yml | ||
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(fournitcommunity.dockerpourdocker_compose_v2). - Optionnel :
pip install pre-commit && pre-commit install(gitleaks + lint avant chaque commit). - Acces SSH au serveur cible (via
~/.ssh/configou l'option-i).
Configuration
- Cible — edite
inventoryet remplaceyour-server.example.compar le FQDN (ou l'IP) de ton serveur. Ajusteansible_usersi besoin (defaut root). - Comptes — edite la liste
usersdansgroup_vars/all/vars.yml:users: - { name: alice, comment: "Admin", sudo: true } - { name: bob, comment: "Dev", sudo: false }sudo: true-> groupessudo+docker;sudo: false->devlopper+docker. - 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. - Domaine Traefik — par defaut
domain_namevaut le FQDN de l'hote. Surcharge-le dansgroup_vars/all/vars.ymlpour 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 :
- Secrets — remplis
group_vars/all/vault.ymlpuis chiffre-le :htpasswd -nbB prom 'TON_MDP' # -> vault_metrics_basicauth ansible-vault encrypt group_vars/all/vault.yml - DNS — cree l'enregistrement
metrics.<server>.<domaine>vers l'IP de l'hote AVANT le run (sinon Let's Encrypt echoue). - Opt-in — passe
monitoring_enabled: truedans l'inventory (variable d'hote) ougroup_vars(defautfalse: le role ne fait rien ailleurs). - Run —
ansible-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 :
- Run initial (
ansible_user=root,ssh_lockdowna false) : deploie les comptes et leurs cles SSH publiques (roles/users/files/keys/<name>.pub). - Verifie dans un NOUVEAU terminal :
ssh yan@serveurpar cle, puissudo. Ne ferme pas ta session root tant que ca ne marche pas. - Bascule
inventory:ansible_user=yan+become: yes, et metsssh_lockdown: true. - 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 dessh_allow_groups(defautsudo 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_forwardreste à 1 (réseau Docker). monitoring: cadvisor et process-exporter tournent désormais sansprivileged. À vérifier au live après le premier run : les métriques cadvisor et la liste des process doivent rester collectées.tools: plus deignore_errors— un déploiement Traefik raté fait échouer le run (viadocker_compose_v2). Installe les collections (requirements.yml) sur le nœud de contrôle.
Securite
- Aucun secret en clair dans le depot.
.envetacme.jsonsont des placeholders vides. - Avant de mettre un vrai secret dans
.env(ex.POSTGRES_PASSWORD), bascule-le en Ansible Vault.