NAS-logo — Serveur Photos sur Mac Mini
Provisioning reproductible et idempotent d'un Mac Mini Apple Silicon en serveur de photos personnel, accessible depuis n'importe où via VPN.
Objectif : lancer make install sur un Mac Mini vierge et obtenir, sans intervention manuelle :
- Immich fonctionnel et accessible via Tailscale
- Monitoring opérationnel avec alertes mobiles
- Sauvegarde automatique chiffrée vers Hetzner Storage Box
- Système entièrement re-déployable si le matériel est remplacé
Stack technique
| Composant | Technologie |
|---|---|
| Automatisation | Ansible (rôles idempotents) |
| Photos | Immich (self-hosted) |
| Conteneurs | Docker Desktop for Mac |
| Réseau VPN | Tailscale |
| Monitoring | Prometheus + Grafana + cAdvisor |
| Alertes | ntfy (push mobile) |
| Sauvegarde | rclone → Hetzner Storage Box (SFTP) |
| Secrets | ansible-vault (AES256) |
Architecture Ansible
Le projet est structuré en rôles indépendants, chacun couvrant un périmètre fonctionnel :
roles/
├── base/ → Homebrew, Python, dépendances système
├── stockage/ → Vérification SSD, arborescence des volumes
├── docker/ → Installation Docker Desktop
├── immich/ → docker-compose + .env chiffré
├── monitoring/ → Prometheus, Grafana, cAdvisor, LaunchAgent macOS
├── sauvegarde/ → rclone, dump PostgreSQL, cron via LaunchAgent
├── securite/ → Tailscale, FileVault, firewall macOS
└── acces/ → SSH hardening (sshd_config templaté)
Interface opérationnelle (Makefile)
make bootstrap # Homebrew + Ansible sur Mac Mini vierge
make preflight # Vérifie SSD, Hetzner, Tailscale avant déploiement
make dryrun # --check --diff : aperçu sans modification
make install # Déploiement complet
make health # Vérification post-déploiement
make backup # Sauvegarde manuelle immédiate
Points clés DevOps
- Idempotence : un double
make installne produit aucun changement - Zéro secret en clair : tous les credentials dans
vault.yml(AES256) - Zéro exposition publique : tous les services accessibles via Tailscale uniquement
- Observabilité : alerte ntfy sur mobile si le disque dépasse 80 %
- Modules FQCN :
ansible.builtin.*etcommunity.general.*systématiquement