Ce dépôt contient une configuration Ansible complète pour provisionner et gérer un homeserver personnel. L'approche "Infrastructure as Code" (IaC) permet un déploiement automatisé, reproductible et facilement personnalisable.
- Playbooks Ansible avec rôles (common, cockpit, docker, services) - 30+ stacks Docker Compose avec reverse proxy Traefik - Ansible Vault pour gestion secrets - Intégration CrowdSec pour détection intrusions - Versions images Docker fixées pour reproductibilité |
||
|---|---|---|
| inventory | ||
| roles | ||
| stacks | ||
| templates/env | ||
| vars | ||
| .gitignore | ||
| LICENSE | ||
| playbook.yml | ||
| README.md | ||
Homeserver Infrastructure
Infrastructure as Code (IaC) pour provisionner un homeserver Ubuntu avec Ansible et Docker Compose.
Prérequis
- Ansible 2.15+
- Accès SSH au serveur cible
- Python 3.x sur la machine de contrôle
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ Internet │
└─────────────────────────┬───────────────────────────────────────┘
│
┌───────────▼───────────┐
│ Traefik Public │ ← Reverse proxy (192.168.1.2)
│ + CrowdSec Bouncer │ SSL via Cloudflare DNS
└───────────┬───────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌────────┐ ┌──────────┐ ┌──────────┐
│Services│ │ Services │ │ Services │
│Publics │ │ Protégés │ │ Locaux │
└────────┘ │(TinyAuth)│ └──────────┘
└──────────┘ │
│
┌───────────────▼───────────┐
│ Traefik Private │
│ (192.168.1.3) │
└───────────────────────────┘
Rôles Ansible
| Rôle | Description |
|---|---|
common |
Paquets de base, dnsmasq (DNS local *.local.tellserv.fr), firewalld |
cockpit |
Interface web d'administration serveur |
docker |
Docker CE, réseau traefik_network |
services |
Synchronisation et déploiement des stacks Docker |
Services déployés
Infrastructure : Traefik, CrowdSec, Watchtower, Autoheal, Beszel, Uptime-Kuma, Dockge, Kopia
Productivité : Vaultwarden, Vikunja, Paperless-ngx, Kavita, FreshRSS, SearXNG
Media : Plex, Photoprism, Audiobookshelf, qBittorrent
Autres : Gotify, Glance, Ghost (blog), Mobilizon, EteSync
Installation
1. Configuration de l'inventaire
Modifiez inventory/hosts.yml avec l'IP et l'utilisateur SSH de votre serveur :
all:
children:
homeserver:
hosts:
192.168.x.x:
ansible_user: votre_utilisateur
ansible_ssh_private_key_file: ~/.ssh/votre_cle
2. Configuration des secrets
# Copier le fichier d'exemple
cp vars/secrets.yml.example vars/secrets.yml
# Éditer avec vos vraies valeurs
nano vars/secrets.yml
# Chiffrer avec Ansible Vault
ansible-vault encrypt vars/secrets.yml
3. Exécution
# Provisionnement complet
ansible-playbook -i inventory/hosts.yml playbook.yml --ask-vault-pass
# Générer uniquement les fichiers .env (sans déployer)
ansible-playbook -i inventory/hosts.yml playbook.yml --tags env --ask-vault-pass
# Déployer un service spécifique
ansible-playbook -i inventory/hosts.yml playbook.yml --tags traefik --ask-vault-pass
Structure du projet
.
├── inventory/
│ └── hosts.yml # Inventaire des serveurs
├── roles/
│ ├── common/ # Configuration système de base
│ ├── cockpit/ # Interface web admin
│ ├── docker/ # Installation Docker
│ └── services/ # Déploiement des stacks
├── stacks/ # Docker Compose projects
│ ├── traefik/
│ ├── vaultwarden/
│ └── ...
├── templates/
│ └── env/ # Templates .env.j2 (secrets)
├── vars/
│ ├── secrets.yml # Secrets chiffrés (Vault)
│ └── secrets.yml.example # Template des secrets
└── playbook.yml # Playbook principal
Ajout d'un nouveau service
- Créer
stacks/<service>/compose.yml - Ajouter les labels Traefik pour le routage
- Si secrets nécessaires : créer
templates/env/<service>.env.j2 - Ajouter le service dans
roles/services/tasks/main.yml
Sécurité
- Secrets : Tous les secrets sont gérés via Ansible Vault
- CrowdSec : Protection IPS avec blocage automatique
- TinyAuth : Authentification OAuth pour les services sensibles
- Firewalld : Pare-feu configuré automatiquement
- TLS : Certificats Let's Encrypt via Cloudflare DNS challenge
CI/CD
Le CI/CD n'est pas implémenté dans ce dépôt. Le projet migre vers Forgejo.
Une approche CI/CD possible :
- Forgejo Runner pour l'exécution des pipelines
- Secrets Forgejo pour l'IP serveur et l'utilisateur SSH (génération de
inventory/hosts.yml) - Renovate Bot pour les mises à jour d'images Docker via PR automatiques (alternative à Watchtower)
License
MIT License - voir LICENSE