[{"data":1,"prerenderedAt":146},["ShallowReactive",2],{"seo-verification":3,"blog-opentofu-terraform-vps-automatiser-infrastructure-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"slugs":9,"title":12,"excerpt":13,"readTime":14,"views":15,"isPinned":16,"publishedAt":17,"category":18,"categories":23,"featuredImage":25,"bgImage":26,"posterImage":27,"relatedSolution":25,"intro":28,"sections":29,"ctaTitle":94,"ctaBody":95,"ctaButton":96,"ctaUrl":97,"relatedPosts":98},297,"opentofu-terraform-vps-automatiser-infrastructure",{"fr":8,"en":10,"ar":11},"opentofu-manage-your-vps-fleet-with-infrastructure-as-code","opentofu-إدارة-أسطول-vps-الخاص-بك-بالبنية-التحتية-كبيانات","OpenTofu : gérer votre flotte de VPS en Infrastructure as Code","OpenTofu, le fork CNCF de Terraform, vous permet de décrire votre flotte de VPS en HCL et de la provisionner en une commande. Guide pratique pour agences et développeurs.",10,0,false,"2026-08-23T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},2,"Automatisation","automatisation","bg-brand-action\u002F10 text-brand-action",[24],{"id":19,"name":20,"slug":21,"color":22,"icon":21},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fopentofu-terraform-vps-automatiser-infrastructure-poster.svg","Vous gérez dix VPS, puis vingt, et chaque nouveau serveur exige la même checklist manuelle : commande, réseau, Docker, reverse proxy, certificat. Une étape oubliée dans l'ordre, et c'est une livraison qui tombe. OpenTofu, le fork open source de Terraform hébergé sous la CNCF, inverse cette logique : vous décrivez l'état cible de votre infrastructure en HCL, vous lancez `tofu apply`, et l'outil calcule le delta entre ce qui existe et ce qui doit exister. Ce guide couvre le provisionnement de VPS — la création, la mise à jour et la destruction de serveurs — en complément de la configuration système qu'Ansible gère déjà.",[30,34,45,48,73,77,80,83,91],{"type":31,"title":32,"body":33},"h2","Pourquoi OpenTofu plutôt que de continuer en SSH manuel","Jusqu'à cinq ou six clients, la gestion manuelle tient : vous vous souvenez de ce qui tourne où, et la checklist de mise en service est connue par cœur. Au-delà, la mémoire devient un risque opérationnel. Un VPS provisionné à la main n'a pas d'état lisible : vous ne savez pas, sans vous connecter, si le pare-feu est configuré, si Docker a bien la version attendue, ou si ce serveur fait encore partie de la rotation.\n\nOpenTofu résout un problème différent d'Ansible. Ansible gère la *configuration* d'un serveur qui existe déjà — ce qui tourne dessus, les fichiers présents, les services démarrés. OpenTofu gère le *cycle de vie* du serveur lui-même : création, mise à jour des attributs, destruction. Il tient un fichier d'état (`terraform.tfstate`) qui sait exactement ce qui est provisionné et ce qui ne l'est plus. Les deux outils sont complémentaires : OpenTofu provisionne, Ansible configure.\n\nEn août 2023, HashiCorp a changé la licence de Terraform de MPL-2.0 vers BUSL-1.1, une licence non libre qui interdit certains usages commerciaux. La communauté a répondu en créant OpenTofu, un fork compatible HCL pour les versions antérieures à Terraform 1.6, aujourd'hui hébergé sous la CNCF (Cloud Native Computing Foundation) et la Linux Foundation. La commande est `tofu`, pas `terraform`, mais les fichiers `.tf` et la logique sont identiques.",{"type":35,"title":36,"items":37},"ul","Ce que vous gagnez avec un état déclaratif",[38,39,40,41,42,43,44],"**Inventaire fiable** — le fichier `terraform.tfstate` dit exactement quels serveurs existent, avec quelles IPs et quels attributs, sans aller se connecter un par un.","**Reproductibilité** — un nouveau client ou un nouveau projet reçoit le même VPS configuré de la même façon, depuis le même fichier `.tf` versionné dans Git.","**Destruction propre** — `tofu destroy` retire les ressources dans le bon ordre, sans laisser de serveurs orphelins qui continuent à être facturés.","**Diff lisible** — `tofu plan` affiche exactement ce qui sera créé, modifié ou détruit avant d'agir, comme un `git diff` de votre infrastructure.","**Complémentarité Ansible** — OpenTofu crée le VPS et pose les métadonnées (clé SSH, nom, réseau) ; Ansible prend la main pour déployer Docker, Nginx et vos applications.","**Versionnable et auditable** — votre infrastructure devient un dépôt Git avec des commits, des revues de code et un historique des changements.","**Licence open source pérenne** — OpenTofu est sous MPL-2.0, sans restriction commerciale, avec une gouvernance communautaire sous la CNCF.",{"type":31,"title":46,"body":47},"Prérequis avant de commencer","Ce guide suppose que vous disposez d'un VPS avec accès root et IPv4 dédiée pour faire tourner vos workloads, et d'un poste de développement (macOS, Linux ou Windows avec WSL2) depuis lequel vous lancez `tofu`. OpenTofu lui-même ne tourne pas sur le VPS cible : il s'exécute localement et parle à l'API du fournisseur ou au daemon Docker du serveur.\n\nPour suivre les exemples, vous avez besoin de : OpenTofu installé en local (voir \u003Ca href=\"https:\u002F\u002Fopentofu.org\u002Fdocs\u002Fintro\u002Finstall\u002F\">opentofu.org\u002Fdocs\u002Fintro\u002Finstall\u003C\u002Fa>), d'un accès API ou de credentials SSH vers le VPS cible, et de Git pour versionner vos fichiers `.tf`. Aucune dépendance supplémentaire n'est requise — OpenTofu télécharge lui-même les providers au `tofu init`.\n\nPour piloter Docker sur un VPS distant via OpenTofu, le daemon Docker du serveur doit écouter sur son socket Unix (par défaut) ou sur un port TCP sécurisé. Le provider `kreuzwerker\u002Fdocker` se connecte à ce socket via SSH ou TCP.",{"type":49,"title":50,"steps":51},"steps","Mettre en place OpenTofu sur une flotte de VPS",[52,55,58,61,64,67,70],{"title":53,"body":54},"Installer OpenTofu en local","Rendez-vous sur \u003Ca href=\"https:\u002F\u002Fopentofu.org\u002Fdocs\u002Fintro\u002Finstall\u002F\">opentofu.org\u002Fdocs\u002Fintro\u002Finstall\u003C\u002Fa> pour les instructions selon votre OS. Sur macOS avec Homebrew : `brew install opentofu`. Sur Debian\u002FUbuntu : le dépôt officiel OpenTofu fournit le paquet `opentofu`. Vérifiez l'installation avec `tofu version` — la commande doit retourner la version installée.",{"title":56,"body":57},"Structurer votre projet Infrastructure as Code","Créez un répertoire dédié et quatre fichiers standards.\n\n```hcl\n# main.tf — ressources principales\n# variables.tf — déclarations de variables\n# outputs.tf — valeurs exposées après apply\n# terraform.tfvars — valeurs concrètes (gitignorer si secrets)\n```\n\nCette structure n'est pas obligatoire pour OpenTofu, mais elle est la convention largement adoptée : `main.tf` porte les ressources, `variables.tf` déclare les types et valeurs par défaut, `outputs.tf` expose ce qu'Ansible ou un autre outil doit lire après le provisionnement (IP du serveur, nom d'hôte…), et `terraform.tfvars` contient les valeurs concrètes que vous ne souhaitez pas coder en dur dans `main.tf`.",{"title":59,"body":60},"Déclarer le provider et générer une clé SSH","OpenTofu installe les providers nécessaires au `tofu init`. Le provider `hashicorp\u002Ftls` génère une paire de clés SSH en local, ce qui évite de gérer des clés manuellement.\n\n```hcl\nterraform {\n  required_providers {\n    tls = {\n      source  = \"hashicorp\u002Ftls\"\n      version = \"~> 4.0\"\n    }\n  }\n}\n\nresource \"tls_private_key\" \"vps_key\" {\n  algorithm = \"ED25519\"\n}\n\noutput \"private_key_pem\" {\n  value     = tls_private_key.vps_key.private_key_pem\n  sensitive = true\n}\n```\n\nLancez `tofu init` pour télécharger le provider, puis `tofu apply` pour générer la clé. Récupérez-la avec `tofu output -raw private_key_pem > ~\u002F.ssh\u002Fvps_key && chmod 600 ~\u002F.ssh\u002Fvps_key`.",{"title":62,"body":63},"Provisionner le VPS avec null et local-exec","Si votre fournisseur VPS n'a pas de provider OpenTofu officiel, le provider `hashicorp\u002Fnull` avec un `local-exec` permet d'exécuter une commande locale (un appel API curl, un script shell) et de modéliser la ressource dans le state.\n\n```hcl\nresource \"null_resource\" \"vps_provision\" {\n  triggers = {\n    server_name = var.server_name\n  }\n\n  provisioner \"local-exec\" {\n    command = \u003C\u003CEOT\n      curl -s -X POST https:\u002F\u002Fapi.votre-fournisseur.com\u002Fv1\u002Fservers \\\n        -H \"Authorization: Bearer ${var.api_token}\" \\\n        -d '{\"name\": \"${var.server_name}\", \"image\": \"ubuntu-22.04\"}'\n    EOT\n  }\n}\n```\n\nCe pattern est adapté à une phase transitoire. Si votre fournisseur expose une API REST, un script shell appelé en `local-exec` suffit pour créer le serveur et écrire son IP dans un fichier que `outputs.tf` exposera ensuite.",{"title":65,"body":66},"Piloter Docker sur le VPS avec le provider kreuzwerker","Une fois le VPS provisionné et Docker installé (par Ansible, typiquement), le provider `kreuzwerker\u002Fdocker` vous permet de déclarer des conteneurs, des réseaux et des volumes dans OpenTofu.\n\n```hcl\nterraform {\n  required_providers {\n    docker = {\n      source  = \"kreuzwerker\u002Fdocker\"\n      version = \"~> 3.0\"\n    }\n  }\n}\n\nprovider \"docker\" {\n  host = \"ssh:\u002F\u002Froot@${var.server_ip}:22\"\n}\n\nresource \"docker_container\" \"app\" {\n  name  = \"mon-app\"\n  image = docker_image.app.image_id\n}\n\nresource \"docker_image\" \"app\" {\n  name = \"nginx:alpine\"\n}\n```\n\nLe provider se connecte au daemon Docker du VPS via SSH — aucun port TCP supplémentaire à ouvrir. La version stable du provider est disponible sur le \u003Ca href=\"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fkreuzwerker\u002Fdocker\u002Flatest\u002Fdocs\">Terraform Registry\u003C\u002Fa>.",{"title":68,"body":69},"Versionner le state pour une équipe","En développement solo, le state local (`terraform.tfstate`) suffit. En équipe ou en CI\u002FCD, deux développeurs qui lancent `tofu apply` simultanément corrompent le state. La solution est un backend distant avec verrouillage.\n\nOpenTofu supporte nativement S3 (AWS, MinIO auto-hébergé) et le GitLab Managed Terraform State. Avec un bucket MinIO sur un VPS :\n\n```hcl\nterraform {\n  backend \"s3\" {\n    bucket                      = \"tofu-state\"\n    key                         = \"production\u002Fterraform.tfstate\"\n    region                      = \"eu-west-1\"\n    endpoint                    = \"https:\u002F\u002Fminio.votre-domaine.com\"\n    skip_credentials_validation = true\n    skip_metadata_api_check     = true\n    skip_region_validation      = true\n    force_path_style            = true\n  }\n}\n```\n\nLe verrouillage est automatique : si un `tofu apply` est en cours, un second est refusé jusqu'à la fin du premier.",{"title":71,"body":72},"Intégrer OpenTofu dans votre pipeline CI\u002FCD","Un pipeline Woodpecker CI ou Forgejo Actions typique exécute `tofu plan` sur chaque pull request (pour revue humaine du diff d'infrastructure) et `tofu apply` sur merge dans la branche principale.\n\n```yaml\nsteps:\n  - name: tofu-plan\n    image: ghcr.io\u002Fopentofu\u002Fopentofu:latest\n    commands:\n      - tofu init\n      - tofu plan -out=tfplan\n\n  - name: tofu-apply\n    image: ghcr.io\u002Fopentofu\u002Fopentofu:latest\n    commands:\n      - tofu apply tfplan\n    when:\n      branch: main\n      event: push\n```\n\nLe state distant (étape précédente) est indispensable ici : le runner CI n'a pas accès au state local de votre poste.",{"type":74,"title":75,"body":76},"tip","Séparez les workspaces par environnement","OpenTofu propose les `workspaces` pour isoler plusieurs états dans le même backend : `tofu workspace new staging` crée un espace isolé, `tofu workspace select production` bascule vers la production. C'est plus léger que de dupliquer les répertoires `.tf`. En pratique, un workspace par client ou par environnement (staging, prod) évite qu'un `tofu destroy` en staging touche la production. Nommez vos ressources avec `${terraform.workspace}` pour qu'elles restent distinctes dans le state.",{"type":31,"title":78,"body":79},"Ansible et OpenTofu : la frontière entre les deux","La question revient souvent : Ansible fait déjà le travail, pourquoi ajouter un outil ? La frontière est nette une fois qu'on la pose clairement.\n\nOpenTofu répond à « qu'est-ce qui existe ? » : il crée le serveur, lui assigne une IP, pose une clé SSH, enregistre son état. Si vous le supprimez de votre fichier `.tf` et lancez `tofu apply`, le serveur disparaît — OpenTofu tient le cycle de vie.\n\nAnsible répond à « dans quel état est ce qui existe ? » : il installe Docker, configure Nginx, dépose un fichier `.env`, redémarre un service. Si le serveur est déjà là, Ansible en fait ce que vous lui demandez — mais s'il n'est pas là, Ansible ne peut pas le créer.\n\nLe flux naturel pour une agence : OpenTofu provisionne le VPS et expose son IP en `output`, un playbook Ansible consomme cet `output` via un inventaire dynamique, configure le serveur et déploie les applications. L'article \u003Ca href=\"\u002Fblog\u002Fansible-automatiser-serveurs-vps\">Ansible : automatiser la configuration de vos serveurs VPS\u003C\u002Fa> couvre la partie configuration en détail.",{"type":31,"title":81,"body":82},"Dépannage : les erreurs fréquentes","Trois situations reviennent régulièrement quand on adopte OpenTofu sur une flotte existante.",{"type":35,"title":84,"items":85},"Erreurs courantes et leur correction",[86,87,88,89,90],"**`Error acquiring the state lock`** — un crash en cours d'`apply` laisse un fichier `.terraform.tfstate.lock.info` sur le backend. OpenTofu refuse de continuer tant que le verrou existe. Après avoir vérifié qu'aucun autre `apply` ne tourne, supprimez le verrou avec `tofu force-unlock \u003CLOCK_ID>` (l'ID apparaît dans le message d'erreur). Sur un backend S3\u002FMinIO, le fichier est visible dans le bucket.","**`tofu plan` affiche `destroy + create` inattendu** — certains attributs d'une ressource forcent une recréation (`force new resource`) quand ils changent : le nom du serveur, le type d'image OS, la région. Si vous modifiez l'un de ces attributs, OpenTofu ne peut pas faire une mise à jour en place — il détruit et recrée. Lisez le plan attentivement avant d'appliquer et utilisez `tofu plan -target=resource.name` pour limiter la portée.","**State perdu ou désynchronisé** — si le fichier state est perdu et que les serveurs existent encore, `tofu state list` liste ce qu'OpenTofu croit provisionné, et `tofu import \u003Cresource.type.name> \u003Cid-externe>` importe une ressource existante dans le state sans la recréer. C'est l'outil de récupération quand la réalité et le state ont divergé.","**Provider non trouvé après `tofu init`** — vérifiez que le `source` du provider est exact (ex. `kreuzwerker\u002Fdocker` et non `docker\u002Fdocker`) et que vous avez accès à internet depuis la machine qui lance `tofu init`. Dans un environnement air-gapped, pré-téléchargez les providers et utilisez `plugin_cache_dir`.","**`Error: No valid credential sources found`** — OpenTofu ne trouve pas les credentials pour le provider. Vérifiez les variables d'environnement attendues par le provider (souvent `TF_VAR_api_token` ou un fichier de credentials spécifique) et que `terraform.tfvars` est bien lu (il doit être dans le même répertoire que `main.tf`).",{"type":31,"title":92,"body":93},"Votre infrastructure devient du code versionné","OpenTofu ne remplace pas SSH, il rend SSH exceptionnel. Le flux quotidien devient : modifier un fichier `.tf`, lancer `tofu plan` pour lire le diff, valider, lancer `tofu apply`. Les serveurs que vous n'avez plus à gérer sont détruits par `tofu destroy` et disparaissent de la facturation.\n\nPour une agence qui dépasse la dizaine de clients, c'est le levier qui fait passer la gestion d'infrastructure d'un travail de mémoire à un travail de code. Un VPS Cloud ServOrbit avec accès root, IPv4 dédiée et choix d'OS est l'unité de base que vos fichiers `.tf` provisionnent et détruisent à la demande. Votre infrastructure devient du code versionné.","Un VPS Cloud prêt pour OpenTofu","Accès root, IPv4 dédiée et choix d'OS : un VPS Cloud ServOrbit est l'unité de base que vos fichiers `.tf` provisionnent et détruisent à la demande.","Démarrer mon VPS Cloud","\u002Fsolutions\u002Fdeveloppeurs",[99,114,132],{"id":100,"slug":101,"slugs":102,"title":105,"excerpt":106,"readTime":107,"views":108,"isPinned":16,"publishedAt":109,"category":110,"categories":111,"featuredImage":25,"bgImage":26,"posterImage":113,"relatedSolution":25},236,"ansible-automatiser-serveurs-vps",{"fr":101,"en":103,"ar":104},"automating-vps-server-management-with-ansible","أتمتة-إدارة-خوادم-vps-باستخدام-ansible","Automatiser la gestion de ses serveurs VPS avec Ansible","Automatisez la gestion d'une flotte de serveurs VPS avec Ansible : inventaire, playbooks, rôles et Vault pour une infrastructure reproductible.",11,1,"2026-08-08T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},[112],{"id":19,"name":20,"slug":21,"color":22,"icon":21},"\u002Fblog\u002Fcovers\u002Fansible-automatiser-serveurs-vps-poster.svg",{"id":115,"slug":116,"slugs":117,"title":120,"excerpt":121,"readTime":122,"views":15,"isPinned":16,"publishedAt":123,"category":124,"categories":129,"featuredImage":25,"bgImage":26,"posterImage":131,"relatedSolution":25},229,"docker-compose-production-checklist",{"fr":116,"en":118,"ar":119},"docker-compose-in-production-10-point-checklist","docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط","Docker Compose en production : checklist des 10 points","Checklist Docker Compose en production : 10 paramètres essentiels, gestion des secrets sans downtime, sauvegarde volumes sans corruption, CVE-2026-17106.",14,"2026-08-06T00:00:00+00:00",{"id":125,"name":126,"slug":127,"color":128,"icon":127},3,"Déploiement","deploiement","bg-success\u002F10 text-success",[130],{"id":125,"name":126,"slug":127,"color":128,"icon":127},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":133,"slug":134,"slugs":135,"title":138,"excerpt":139,"readTime":140,"views":108,"isPinned":16,"publishedAt":141,"category":142,"categories":143,"featuredImage":25,"bgImage":26,"posterImage":145,"relatedSolution":25},212,"woodpecker-ci-pipeline-vps-forgejo",{"fr":134,"en":136,"ar":137},"woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps","woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps","Woodpecker CI et Forgejo : pipeline CI\u002FCD sur VPS","Déployez Woodpecker CI avec Forgejo sur votre VPS pour un pipeline CI\u002FCD open source auto-hébergé, léger et souverain. Guide Docker pas à pas.",4,"2026-08-02T00:00:00+00:00",{"id":19,"name":20,"slug":21,"color":22,"icon":21},[144],{"id":19,"name":20,"slug":21,"color":22,"icon":21},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",1787580984292]