Pipeline CI/CD complet : un git push provisionne automatiquement une VM sur Proxmox (Hetzner), la sécurise via UFW, et déploie un serveur web avec certificat SSL automatique.
Zéro port exposé sur internet. Accès exclusif via Mesh VPN. 100% as-code.
┌─────────────────────────────────────────────────────────────┐
│ Poste Dev (Ubuntu Management VM) │
│ git push → GitHub (Concurrency Lock: Active) │
└─────────────────────────┬───────────────────────────────────┘
│
▼
GitHub Actions Runner
│
┌───────────┴───────────┐
│ │
▼ ▼
Checkov + Trivy Tailscale Node
(IaC Security) (Runner joins Mesh)
│ │
└───────────┬───────────┘
│ Tailscale encrypted tunnel
▼
Proxmox Hetzner (100.108.39.48)
subnet: 192.168.192.0/18
│
▼
┌───────────────────────────┐
│ VM 505 (Ubuntu 22.04) │
│ 🔒 UFW: Tailscale Only │
│ 🌐 HTTPS: Tailscale Cert│
│ DNS: vm-test-proxmox-1 │
└───────────────────────────┘
Gestion de flux : cancel-in-progress: false garantit l'intégrité du State Terraform.
git push (main)
│
├── [Job 1] Scan IaC : Checkov & Trivy (Export SARIF)
│
├── [Job 2] Terraform : Provisionnement VM Proxmox
│ └── Clone VM template Cloud-Init (IP statique + SSH)
│
└── [Job 3] Ansible : Configuration & Hardening
├── Join Tailnet (via authkey dédiée)
├── SSL : Provisionnement cert via 'tailscale cert'
├── Nginx : Config HTTPS & Headers de sécurité
└── UFW : Fermeture totale IP publique (Inbound Deny)
- Terraform
bpg/proxmoxprovider — Provisionnement via API Proxmox. - Cloud-init — Injection clé SSH ed25519 + IP statique.
- Terraform Cloud — Backend distant pour le state.
- Ansible — Playbook idempotent pour Nginx et la sécurisation système.
- UFW (Firewall) — Stratégie Default Deny. Seul le trafic via tailscale0 est autorisé.
- Tailscale Cert — HTTPS automatique sans exposition de ports publics.
test-tailscale/
├── .github/
│ └── workflows/
│ └── deploy.yml # Pipeline CI/CD complet
├── ansible/
│ ├── inventory.ini # VM cible via DNS Tailscale
│ └── install_nginx.yml # Playbook : Nginx + SSL + UFW
├── main.tf # VM Proxmox + cloud-init
└── README.md
| Secret | Rôle |
|---|---|
TAILSCALE_AUTHKEY |
Auth key éphémère pour le Runner |
TAILSCALE_VM_AUTHKEY |
Auth key pour l'enregistrement de la VM cible |
PM_API_URL |
URL API Proxmox via Tailscale |
PM_API_TOKEN_ID |
ID token API Proxmox |
PM_API_TOKEN_SECRET |
Secret UUID du token Proxmox |
SSH_PRIVATE_KEY |
Clé ed25519 privée pour Ansible |
TF_API_TOKEN |
Token Terraform Cloud |
- Node Proxmox avec Tailscale et subnet routing activé (
192.168.192.0/18). - Template Ubuntu 22.04 cloud-init (VM ID 9000).
#Test du certificat SSL (Cadenas vert 🔒)
curl -v https://vm-test-proxmox-1.your-tailnet.ts.net
# Test du Pare-feu (Accès IP publique bloqué)
curl --connect-timeout 5 http://<IP_PUBLIQUE_HETZNER>
# → Connection timed out| Axe | Technologies | Implémentation |
|---|---|---|
| Infrastructure as Code | Terraform + Proxmox | Provisionnement immuable via API & Cloud-Init |
| Configuration Management | Ansible | Playbooks idempotents & Hardening système |
| CI/CD Pipeline | GitHub Actions | Workflow multi-jobs avec gestion de concurrence |
| Networking & Sécurité | Tailscale + UFW | VPN Mesh Zero-Trust & Firewalling strict |
| DevSecOps | Checkov + Trivy | Analyse statique IaC & Scan de vulnérabilités |
Brahim Hashas Cloud & Automation Engineer Orienté pratique DevSecOps sur infrastructures Bare-Metal (Hetzner/Proxmox).