Déployez UniFi OS Server complet sur Oracle Cloud Always Free.
- ✅ 100% gratuit avec Oracle Cloud Always Free
- ✅ UniFi OS Server 5.0.6
- ✅ Conteneurs Podman - Isolation et sécurité maximale
- ✅ Mises à jour de sécurité automatiques - Quotidiennes via unattended-upgrades
- ✅ Infrastructure as Code - Terraform + Ansible
- ✅ Configuration simplifiée - Un seul fichier
terraform.tfvars - ✅ Données préservées - Recréation de l'instance depuis le boot volume existant (cloud-init mis à jour sans perte de données)
- ✅ Idempotence -
terraform applypeut être exécuté plusieurs fois sans risque
- Infrastructure : Terraform
- Configuration : Ansible avec le provider Terraform Ansible
- OS : Ubuntu LTS
- Conteneurs : Podman + slirp4netns
- Application : UniFi OS Server 5.0.6 (ARM64)
- Outils : Mise
Ce projet utilise une architecture en trois couches avec Terraform et Ansible :
-
Terraform : Gestion de l'infrastructure cloud (compute, network, storage)
- Provisionnement des ressources Oracle Cloud
- Définition de l'inventaire Ansible via
ansible_hostetansible_group - Exécution automatique du playbook Ansible via la ressource
ansible_playbook
-
Cloud-init : Bootstrap minimal (Python, configuration de base)
-
Ansible : Configuration applicative complète
- Rôles : common, ufw, unifi_os_server, unattended_upgrades, ddclient, unifi_easy_encrypt
- Inventaire dynamique : Lecture du state Terraform via
cloud.terraform.terraform_provider - Idempotence : Exécution multiple sans risque de reconfiguration inutile
Avantages :
- ✅ Modifications de configuration sans recréer la VM
- ✅ Configuration idempotente (exécution multiple sans risque)
- ✅ Inventaire dynamique géré par Terraform
- ✅ Séparation claire des responsabilités
- ✅ Rôles réutilisables et modulaires
- ✅ Testabilité et rollback faciles
- VM Ampere A1 (ARM) : 2 vCPU, 12 GB RAM
- Ou VM.Standard.E2.1.Micro (AMD) : 1 vCPU, 1 GB RAM
- Boot Volume : 50 GB
- IP publique réservée (2 IPs incluses dans Always Free)
- VCN avec subnet public
- Security Lists (firewall)
Coût : 0€ (100% gratuit avec Always Free)
IP Réservée : L'instance utilise une IP publique réservée (gratuite, 2 incluses dans Always Free). L'IP reste toujours la même, même si vous recréez l'instance. L'IP est protégée contre la suppression accidentelle (
prevent_destroy = true).
-
Créer un compte gratuit : https://www.oracle.com/cloud/free/
-
Configurer les credentials API OCI :
mkdir -p ~/.oci # Générer une clé API dans la console OCI # Télécharger la clé privée dans ~/.oci/oci_api_key.pem chmod 600 ~/.oci/oci_api_key.pem
- Mise - Gestion des outils et automatisation
- Installe automatiquement Terraform, Python et Ansible via
mise run setup
- Installe automatiquement Terraform, Python et Ansible via
- Clé SSH pour accéder à l'instance
Note : Vous n'avez pas besoin d'installer Terraform ou Ansible manuellement. Mise s'occupe de tout !
# Installer Mise
curl https://mise.run | sh
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
source ~/.bashrc
# Cloner le projet
git clone <votre-repo>
cd unifi-oracle-cloud
# Installer tous les outils (Terraform, Python, Ansible + collections)
mise run setupQue fait mise run setup ?
- ✅ Installe Terraform 1.14.3
- ✅ Installe Python 3.12
- ✅ Installe Ansible dans
- ✅ Installe les collections Ansible (community.general, ansible.posix, cloud.terraform)
Tout est automatique, aucune installation manuelle nécessaire !
# Copier et éditer la configuration
cp terraform/terraform.tfvars.example terraform/terraform.tfvars
nano terraform/terraform.tfvarsLe fichier terraform/terraform.tfvars contient toute la configuration :
- Credentials Oracle Cloud : tenancy_ocid, user_ocid, fingerprint, etc.
- Configuration instance : shape, CPU, RAM, stockage
- Configuration réseau : VCN, subnet
- Configuration UniFi OS Server : timezone, URL de téléchargement
- Configuration ports : activation/désactivation individuelle des ports
- Mises à jour système : activation des mises à jour de sécurité
Voir terraform/terraform.tfvars.example pour la liste complète des variables disponibles.
Pourquoi ? Stocker le tfstate dans OCI Object Storage (Always Free) :
- ✅ Sécurité : Le tfstate peut contenir des données sensibles
- ✅ Collaboration : Plusieurs personnes peuvent travailler ensemble
- ✅ State locking : Évite les modifications concurrentes
- ✅ Versioning : Historique des changements
- ✅ Gratuit : 20 GB inclus dans Always Free
# 1. Configurer les credentials pour backend-setup
cp terraform/backend-setup/terraform.tfvars.example terraform/backend-setup/terraform.tfvars
nano terraform/backend-setup/terraform.tfvars
# 2. Créer le bucket OCI Object Storage
mise run backend-setup
# 3. Dans la console OCI : User Settings → Customer Secret Keys → Generate
# Copier Access Key et Secret Key (pour authentification S3-compatible)
# 4. Configurer backend.tf (copier les valeurs affichées par backend-setup)
cp terraform/backend.tf.example terraform/backend.tf
nano terraform/backend.tf
# 5. Migrer le state
cd terraform && terraform init -migrate-stateSi vous sautez cette étape, le tfstate sera stocké localement (fonctionnel mais moins sécurisé).
# Initialiser Terraform
mise run init
# Déployer l'infrastructure complète
mise run deployC'est tout ! 🎉
Le déploiement se déroule en plusieurs phases :
- Terraform crée l'infrastructure Oracle Cloud (~2 min)
- Cloud-init prépare la VM (Python, config de base) (~2 min)
- Ansible configure l'application (~5-8 min) :
- Configuration système de base (hostname, timezone, packages)
- Installation de Podman et dépendances
- Téléchargement et installation d'UniFi OS Server 5.0.6
- Configuration du firewall UFW (ports dynamiques)
- Configuration des mises à jour automatiques (unattended-upgrades)
- Configuration de ddclient (DNS dynamique - optionnel)
- Installation d'UniFi Easy Encrypt (Let's Encrypt SSL - optionnel)
Durée totale : 10-12 minutes
Note : Ansible est exécuté automatiquement par Terraform. Vous n'avez rien à faire manuellement.
# Vérifier l'état de l'installation
mise run status
# Voir les logs en temps réel
mise run logs
# Afficher l'URL de l'interface
mise run urlUne fois l'installation terminée (vérifier avec mise run status) :
# Afficher l'URL
mise run url
# Exemple : https://XXX.XXX.XXX.XXX:11443Console UniFi OS Server : https://<votre-ip>:11443
Ouvrez l'URL dans votre navigateur et suivez l'assistant de configuration UniFi.
mise run init # Initialiser Terraform
mise run plan # Planifier les changements
mise run deploy # Déployer tout (avec confirmation automatique)
mise run apply # Déployer tout (avec confirmation manuelle)
mise run destroy # Détruire l'infrastructuremise run status # Vérifier l'état de l'installation
mise run logs # Voir les logs en temps réel
mise run url # Afficher l'URL UniFi
mise run ssh # Se connecter en SSHmise run ansible-inventory # Afficher l'inventaire dynamique
mise run ansible-graph # Afficher le graph de l'inventaire
mise run ansible-ping # Tester la connectivité
mise run ansible-run # Exécuter le playbook manuellement
mise run ansible-check # Dry-run du playbook
mise run ansible-tags # Lister les tags disponibles
mise run ansible-setup # Réinstaller les collections AnsibleUn des principaux avantages de l'architecture Terraform + Ansible est la possibilité de modifier la configuration sans recréer la VM.
# Éditer terraform/terraform.tfvars
enable_port_http = true# Appliquer
cd terraform && terraform apply→ Ansible reconfigure UFW en 2-3 minutes sans toucher à la VM ✅
# Éditer terraform/terraform.tfvars
unifi_os_server_download_url = "https://...nouvelle-version..."# Appliquer
cd terraform && terraform apply→ Ansible réinstalle UniFi en 5-8 minutes sans recréer la VM ✅
# Éditer terraform/terraform.tfvars
ddclient_enabled = true
ddclient_protocol = "cloudflare"
ddclient_zone = "example.com"
ddclient_hostname = "unifi.example.com"
ddclient_password = "votre-token-api"# Appliquer
cd terraform && terraform apply→ Ansible installe et configure ddclient en 2 minutes ✅
Vous avez deux méthodes pour exécuter la configuration Ansible :
La ressource ansible_playbook exécute automatiquement le playbook lors d'un terraform apply :
cd terraform
terraform applyAvantages :
- ✅ Tout-en-un : infrastructure + configuration en une seule commande
- ✅ Variables Terraform automatiquement passées à Ansible via
ansible_host - ✅ Exécution à chaque apply (grâce à
replayable = true) - ✅ Gestion centralisée de l'état
Pour ré-exécuter uniquement Ansible sans toucher à Terraform :
# Via Mise (recommandé)
mise run ansible-run # Exécuter le playbook
mise run ansible-check # Dry-run
mise run ansible-inventory # Voir l'inventaire
# Ou directement
cd ansible
ansible-playbook playbook.yml
ansible-playbook playbook.yml --tags ufw
ansible-inventory --listAvantages :
- ✅ Plus rapide si vous ne voulez que reconfigurer l'application
- ✅ Permet de tester des changements Ansible sans Terraform
- ✅ Utilise le même inventaire dynamique (lecture depuis le state Terraform)
Note : Les deux méthodes utilisent l'inventaire dynamique qui lit les hosts depuis le state Terraform via le plugin cloud.terraform.terraform_provider. Pas besoin de fichier statique !
tenancy_ocid = "ocid1.tenancy.oc1..aaaaa..."
user_ocid = "ocid1.user.oc1..aaaaa..."
fingerprint = "aa:bb:cc:dd:ee:ff..."
private_key_path = "~/.oci/oci_api_key.pem"
region = "eu-paris-1"
compartment_ocid = "ocid1.compartment.oc1..aaaaa..."
ssh_public_key_path = "~/.ssh/id_rsa.pub"instance_shape = "VM.Standard.A1.Flex" # ARM ou VM.Standard.E2.1.Micro
instance_ocpus = 2 # 2-4 pour Always Free
instance_memory_in_gbs = 12 # 12-24 pour Always Free
boot_volume_size_in_gbs = 50 # 50-200 pour Always Freetimezone = "Europe/Paris"
# URL de téléchargement UniFi OS Server (version ARM64)
# Par défaut : Version 5.0.6
unifi_os_server_download_url = "https://fw-download.ubnt.com/data/unifi-os-server/df5b-linux-arm64-5.0.6-f35e944c-f4b6-4190-93a8-be61b96c58f4.6-arm64"Pour installer une version différente de UniFi OS Server :
- Trouver l'URL de téléchargement sur le site Ubiquiti
- Mettre à jour
unifi_os_server_download_urldansterraform/terraform.tfvars - Redéployer :
mise run apply
ubuntu_version = "24.04" # Version Ubuntu (22.04 ou 24.04)
auto_updates = true # Mises à jour de sécurité autoLes mises à jour de sécurité sont activées par défaut via unattended-upgrades :
- ✅ Installation quotidienne des patches de sécurité
- ✅ Redémarrage automatique si nécessaire (3h du matin)
- ✅ Logs dans
/var/log/unattended-upgrades/
Stratégie à deux niveaux :
-
OCI Security Lists (Niveau 1 - Cloud) ⭐
- Filtrage IP pour SSH et tous les ports UniFi (via
allowed_ssh_cidrs,allowed_unifi_cidrs) - Protection avant même d'atteindre l'instance
- Géré par Terraform (source unique de vérité)
- Filtrage IP pour SSH et tous les ports UniFi (via
-
UFW (Niveau 2 - Instance) 🛡️
- Protège contre les erreurs de configuration OCI
- Ouvre uniquement les ports nécessaires
- Par défaut : permet tous IPs (ACL gérées par OCI)
Ports UniFi OS Server (configurables individuellement) :
| Port | Protocol | Service | Requis | Par défaut |
|---|---|---|---|---|
| 22 | TCP | SSH | ✅ | Activé (restriction IP) |
| 53 | TCP/UDP | DNS | ✅ | Géré par l'OS |
| 80 | TCP | HTTP (Let's Encrypt HTTP-01 Challenge) | ❌ | Désactivé |
| 3478 | UDP | STUN for device adoption | ✅ | Activé |
| 5005 | TCP | UniFi Port (Unknown use) | ❓ | Désactivé |
| 5514 | UDP | Remote Syslog Capture | ❌ | Désactivé |
| 5671 | TCP | Traffic Flow logging (UXG) | ❌ | Non configuré |
| 6789 | TCP | Mobile Speed Test | ✅ | Activé |
| 8080 | TCP | Device and Application Communication | ✅ | Activé (restriction IP) |
| 8443 | TCP | Application GUI/API (UniFi Console) | ✅ | Activé |
| 8843 | TCP | Hotspot Portal Redirection (HTTPS) | ❌ | Activé (hotspot) |
| 8444 | TCP | Secure Portal for Hotspot | ❌ | Activé (hotspot) |
| 8880 | TCP | Hotspot Portal Redirection (HTTP) | ❌ | Activé |
| 8881 | TCP | Hotspot Portal Redirection (HTTP) | ❌ | Activé |
| 8882 | TCP | Hotspot Portal Redirection (HTTP) | ❌ | Désactivé |
| 9543 | TCP | UniFi Port (Unknown use) | ❓ | Désactivé |
| 10001 | UDP | Device Discovery during Adoption | ✅ | Activé |
| 10003 | UDP | UniFi Port (Unknown use) | ❓ | Désactivé |
| 11084 | TCP | UniFi Port (Unknown use) | ❓ | Désactivé |
| 11443 | TCP | Application GUI/API (Web Browser + Remote Management) | Activé (requis) | |
| 27117 | TCP | Local Database Communication | ✅ | Géré par conteneur |
| 1900 | UDP | L2 Discovery | ❌ | Non configuré |
| ICMP | - | Ping | ❌ | Activé (diagnostics réseau) |
Configuration des ports :
Chaque port peut être activé/désactivé individuellement dans terraform/terraform.tfvars :
# Exemple : Activer le port HTTP pour Let's Encrypt (HTTP-01 challenge)
enable_port_http = true
# Exemple : Désactiver le port console après configuration
enable_port_websockets = false
# Activer les ports additionnels UniFi (unknown use)
enable_port_unifi_5005 = true
enable_port_unifi_9543 = true
enable_port_unifi_10003 = true
enable_port_unifi_11084 = true
# Désactiver les ports optionnels
enable_port_remote_logging = false
enable_port_hotspot_8882 = falsePuis appliquer :
mise run applyPour limiter SSH à votre IP uniquement, dans terraform/terraform.tfvars :
allowed_ssh_cidrs = ["VOTRE_IP/32"]Puis :
mise run applyRecommandé pour la sécurité ! Limitez l'accès au port 8080 (adoption des appareils) aux IPs de votre réseau local uniquement.
Dans terraform/terraform.tfvars :
# Autoriser uniquement votre réseau local
allowed_unifi_cidrs = ["192.168.1.0/24"]
# Ou plusieurs réseaux
allowed_unifi_cidrs = ["192.168.1.0/24", "10.0.0.0/8"]Puis appliquer :
mise run applyNote : Le port 8080 est utilisé pour l'adoption des appareils UniFi. Restreindre ce port empêche les tentatives d'adoption non autorisées depuis Internet.
Aucun secret n'est committé :
terraform.tfvarsest gitignore- Fichier
terraform/terraform.tfvars.examplefourni comme template - Les clés privées restent locales
Automatique ! Les mises à jour de sécurité s'installent quotidiennement.
Pour forcer une mise à jour :
mise run ssh
sudo apt update && sudo apt upgrade -yLes mises à jour de UniFi OS Server se font via l'interface web (port 443) ou manuellement :
mise run ssh
sudo podman ps # Lister les conteneurs
sudo podman pull <nouvelle-image> # Si disponiblemise run ssh
sudo podman ps
sudo podman logs <container-id>Pour changer les ressources, dans terraform/terraform.tfvars :
instance_ocpus = 4 # Max Always Free
instance_memory_in_gbs = 24 # Max Always FreePuis appliquer :
mise run applyPar défaut : Ce projet utilise une IP réservée (Always Free - 2 IPs incluses)
- ✅ IP permanente : Ne change JAMAIS, même si vous recréez l'instance
- ✅ Gratuite : Incluse dans Always Free (2 IPs réservées)
- ✅ Protection : Terraform empêche la suppression accidentelle (
prevent_destroy = true) - ✅ DNS friendly : Vous pouvez pointer un nom de domaine dessus sans risque
Pour supprimer l'IP réservée (si vraiment nécessaire) :
# 1. Retirer la protection dans compute.tf
# Commenter : prevent_destroy = true
# 2. Détruire l'infrastructure
mise run destroyLes instances A1.Flex sont très demandées. Solutions :
-
Réessayer plus tard
-
Essayer un autre Availability Domain
-
Utiliser la shape AMD dans
terraform/terraform.tfvars:instance_shape = "VM.Standard.E2.1.Micro"
# Voir les logs en temps réel
mise run logs
# Ou directement
ssh ubuntu@$(cd terraform && terraform output -raw instance_public_ip) \
"tail -f /var/log/unifi-install.log"mise run ssh
sudo podman ps # Vérifier les conteneurs
sudo podman logs <container-id> # Voir les logs
sudo podman restart <container-id> # Redémarrermise run ssh
sudo systemctl status podman
sudo journalctl -u podman -n 100
df -h # Vérifier l'espace disque- ansible/README.md - Documentation Ansible (rôles, playbooks, utilisation)
- terraform/README.md - Documentation Terraform (variables, outputs, ressources)
- CONTRIBUTING.md - Guide de contribution
0€ avec Oracle Cloud Always Free !
Ressources utilisées :
- 1x VM A1.Flex (2 OCPU, 12GB RAM) Gratuit
- 1x Boot Volume 50GB Gratuit
- 1x IP publique réservée Gratuit (2 incluses)
- VCN et réseau Gratuit
- 10 TB bande passante/mois Gratuit
Configuration recommandée (2 OCPU, 12 GB RAM) :
- 50-100 appareils UniFi
- 500-1000 clients WiFi simultanés
- Suite complète : Network, Protect, Talk, Access
Pour augmenter la capacité, modifier terraform/terraform.tfvars :
instance_ocpus = 4 # Max Always Free
instance_memory_in_gbs = 24 # Max Always FreeLes contributions sont les bienvenues ! Voir CONTRIBUTING.md pour les détails.
Ce projet est sous licence MIT. Voir LICENSE pour plus de détails.
- Issues : GitHub Issues
- Communauté UniFi : UniFi Community
- UniFi OS Server Docs : Official Documentation
Note : Ce projet n'est pas affilié à Ubiquiti Networks ou Oracle Corporation.
Créé avec ❤️ pour la communauté UniFi et Oracle Cloud