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.
Find a file
Tellsanguis fd01ea59ee Commit initial : infrastructure Ansible pour homeserver
- 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é
2025-11-23 19:40:17 +01:00
inventory Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00
roles Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00
stacks Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00
templates/env Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00
vars Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00
.gitignore Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00
LICENSE Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00
playbook.yml Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00
README.md Commit initial : infrastructure Ansible pour homeserver 2025-11-23 19:40:17 +01:00

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

  1. Créer stacks/<service>/compose.yml
  2. Ajouter les labels Traefik pour le routage
  3. Si secrets nécessaires : créer templates/env/<service>.env.j2
  4. 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