[{"data":1,"prerenderedAt":180},["ShallowReactive",2],{"seo-verification":3,"blog-remplacer-github-actions-woodpecker-ci-self-hosted-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-remplacer-github-actions-woodpecker-ci-self-hosted-vps-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"category":21,"categories":26,"featuredImage":28,"bgImage":29,"posterImage":30,"relatedSolution":28,"intro":31,"sections":32,"ctaTitle":107,"ctaBody":108,"ctaButton":109,"ctaUrl":110,"relatedPosts":111},338,"remplacer-github-actions-woodpecker-ci-self-hosted-vps",{"fr":10,"en":12,"ar":13,"es":14},"replace-github-actions-with-woodpecker-ci-on-a-vps","استبدال-github-actions-بـwoodpecker-ci-على-vps","reemplazar-github-actions-con-woodpecker-ci-en-vps","Remplacer GitHub Actions par Woodpecker CI sur VPS","GitHub a annoncé puis suspendu la facturation des runners self-hosted. Migrez vers Woodpecker CI : syntaxe propre, moins de 50 Mo RAM, coût fixe sur VPS.",8,1,false,"2026-09-07T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":24},2,"Automatisation","automatisation","bg-brand-action\u002F10 text-brand-action",[27],{"id":22,"name":23,"slug":24,"color":25,"icon":24},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fremplacer-github-actions-woodpecker-ci-self-hosted-vps-poster.svg","En décembre 2025, GitHub a annoncé la facturation à la minute des self-hosted runners sur les dépôts privés (discussion communautaire #182089, 72 upvotes). Face à une réaction communautaire massive, cette tarification a été suspendue dans les 48 heures — et au 1er septembre 2026, les runners self-hosted restent gratuits. La menace est pourtant réelle : rien n'empêche GitHub de la réactiver. Migrer vers Woodpecker CI, c'est se prémunir contre la prochaine annonce — et gagner au passage la souveraineté sur son CI\u002FCD. Woodpecker CI est une alternative open source qui tourne en moins de 50 Mo de RAM, fonctionne avec Gitea ou Forgejo via OAuth2, et reste gratuit tant que votre VPS tourne.",[33,37,69,72,94,97,101,104],{"type":34,"title":35,"body":36},"h2","GitHub et la tarification des runners : ce qui s'est passé en 2025-2026","Jusqu'en 2025, les dépôts privés bénéficiaient d'un quota mensuel de minutes incluses. Le 16 décembre 2025, GitHub a annoncé une tarification à la minute pour l'utilisation des runners — y compris les runners **auto-hébergés** sur vos propres machines. La discussion GitHub #182089 (ouverte ce même mois, 72 upvotes) résume l'inquiétude : les équipes auraient payé GitHub pour l'orchestration d'un job tournant sur leur propre infrastructure, à 0,002 $ la minute.\n\nFace à une réaction communautaire massive, GitHub a suspendu cette tarification dans les 48 heures. Au 1er septembre 2026, les runners self-hosted sur dépôts privés restent gratuits — la mesure n'a jamais été appliquée. Mais l'annonce a mis en évidence une dépendance structurelle : GitHub peut modifier ses conditions à tout moment. Migrer la chaîne CI\u002FCD vers une forge auto-hébergée, c'est s'affranchir de cette incertitude. Woodpecker CI est conçu précisément pour cet usage : un moteur de pipeline léger, open source (Apache 2.0), qui s'installe aux côtés de Gitea ou Forgejo et ne connaît pas de compteur de minutes.",{"type":38,"title":39,"headers":40,"rows":44},"comparison","GitHub Actions runners vs Woodpecker CI auto-hébergé",[41,42,43],"Critère","GitHub Actions (runners cloud)","Woodpecker CI sur VPS",[45,49,53,57,61,65],[46,47,48],"Coût","0,008 $ \u002F min (Linux) + 0,002 $ \u002F min orchestration sur dépôts privés","Inclus dans le coût fixe du VPS (à partir de `{{vps.start.price}}`)",[50,51,52],"RAM du moteur CI","Runners GitHub-hosted : ressources mutualisées, non maîtrisées","Serveur + agent Woodpecker : moins de 50 Mo RAM cumulés",[54,55,56],"Souveraineté","Code et secrets transitent par l'infrastructure GitHub\u002FMicrosoft","Tout reste sur votre VPS — aucun transit externe",[58,59,60],"Syntaxe workflow","`.github\u002Fworkflows\u002F*.yml` — standard très répandu","`.woodpecker.yml` — syntaxe propre, plus courte, non compatible GitHub Actions",[62,63,64],"Prérequis forge","Aucun (GitHub héberge le dépôt)","Gitea ou Forgejo auto-hébergé (ou GitHub en forge distante)",[66,67,68],"Licence","Propriétaire","Apache 2.0",{"type":34,"title":70,"body":71},"Prérequis avant l'installation","Pour déployer Woodpecker CI dans de bonnes conditions, vérifiez les points suivants.\n\n**VPS** : 1 vCPU et 1 Go de RAM suffisent pour le serveur Woodpecker, un agent et une forge Gitea ou Forgejo légère. Comptez 2 Go si vous lancez plusieurs builds en parallèle ou si vos jobs compilent des images Docker.\n\n**Logiciels** : Docker et Docker Compose doivent être installés. Si vous partez d'un VPS vierge, le guide \u003Ca href=\"\u002Fblog\u002Fdemarrer-avec-docker-vps\">Démarrer avec Docker sur VPS\u003C\u002Fa> couvre cette étape.\n\n**Forge git** : Woodpecker CI s'appuie sur OAuth2 pour l'authentification. Il vous faut une instance Gitea ou Forgejo déjà en place et accessible via HTTPS (par exemple sur `git.votre-domaine.com`). Les guides \u003Ca href=\"\u002Fblog\u002Fheberger-gitea\">Héberger Gitea\u003C\u002Fa> et \u003Ca href=\"\u002Fblog\u002Fheberger-forgejo\">Héberger Forgejo\u003C\u002Fa> détaillent cette installation.\n\n**Domaine** : prévoyez un sous-domaine dédié à Woodpecker — par exemple `ci.votre-domaine.com` — pointant vers l'IP de votre VPS, avec le port 443 ouvert. Ce sous-domaine sert de `WOODPECKER_HOST` et d'URL de redirection OAuth2.",{"type":73,"title":74,"steps":75},"steps","Installer Woodpecker CI avec Docker Compose",[76,79,82,85,88,91],{"title":77,"body":78},"Créer une application OAuth2 dans Gitea","Dans Gitea, allez dans **Paramètres → Applications → Gérer les applications OAuth2**. Donnez un nom à l'application (par exemple `woodpecker`) et renseignez l'URL de redirection : `https:\u002F\u002Fci.votre-domaine.com\u002Fauthorize`. Notez le **Client ID** et le **Client Secret** générés — vous en aurez besoin à l'étape suivante.\n\nSi vous utilisez Forgejo, la procédure est identique : **Paramètres → Applications → OAuth2**.",{"title":80,"body":81},"Créer le fichier docker-compose.yml","Créez le répertoire `\u002Fopt\u002Fwoodpecker` et placez-y un fichier `docker-compose.yml` avec les deux services — serveur et agent :\n\n```yaml\nservices:\n  woodpecker-server:\n    image: woodpeckerci\u002Fwoodpecker-server:v3\n    restart: always\n    ports:\n      - \"8000:8000\"\n    volumes:\n      - woodpecker-server-data:\u002Fvar\u002Flib\u002Fwoodpecker\u002F\n    environment:\n      - WOODPECKER_OPEN=false\n      - WOODPECKER_HOST=https:\u002F\u002Fci.votre-domaine.com\n      - WOODPECKER_GITEA=true\n      - WOODPECKER_GITEA_URL=https:\u002F\u002Fgit.votre-domaine.com\n      - WOODPECKER_GITEA_CLIENT=${WOODPECKER_GITEA_CLIENT}\n      - WOODPECKER_GITEA_SECRET=${WOODPECKER_GITEA_SECRET}\n      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}\n\n  woodpecker-agent:\n    image: woodpeckerci\u002Fwoodpecker-agent:v3\n    restart: always\n    command: agent\n    depends_on:\n      - woodpecker-server\n    volumes:\n      - woodpecker-agent-config:\u002Fetc\u002Fwoodpecker\n      - \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\n    environment:\n      - WOODPECKER_SERVER=woodpecker-server:9000\n      - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}\n\nvolumes:\n  woodpecker-server-data:\n  woodpecker-agent-config:\n```\n\nLe serveur écoute en interne sur le port **8000** (interface web) et **9000** (gRPC, communication avec l'agent). N'exposez pas ces ports directement : un reverse proxy se charge du TLS.",{"title":83,"body":84},"Créer le fichier .env","Dans `\u002Fopt\u002Fwoodpecker`, créez un fichier `.env` contenant les trois variables sensibles :\n\n```\nWOODPECKER_GITEA_CLIENT=\u003Cclient-id-oauth2>\nWOODPECKER_GITEA_SECRET=\u003Cclient-secret-oauth2>\nWOODPECKER_AGENT_SECRET=\u003Cchaine-aleatoire-longue>\n```\n\nGénérez `WOODPECKER_AGENT_SECRET` avec `openssl rand -hex 32`. Cette chaîne authentifie l'agent auprès du serveur — ne la partagez pas.",{"title":86,"body":87},"Configurer le reverse proxy nginx","Placez Woodpecker derrière nginx avec un certificat Let's Encrypt. Exemple de bloc `server` pour `ci.votre-domaine.com` :\n\n```nginx\nserver {\n    listen 443 ssl;\n    server_name ci.votre-domaine.com;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fci.votre-domaine.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fci.votre-domaine.com\u002Fprivkey.pem;\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:8000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-Proto https;\n    }\n}\n```\n\nObtenez le certificat avec `certbot certonly --nginx -d ci.votre-domaine.com` puis rechargez nginx avec `systemctl reload nginx`.",{"title":89,"body":90},"Démarrer la stack","Depuis `\u002Fopt\u002Fwoodpecker`, lancez :\n\n```bash\ndocker compose up -d\n```\n\nSuivez les logs du serveur jusqu'à voir la ligne indiquant que le serveur est prêt :\n\n```bash\ndocker compose logs -f woodpecker-server\n```\n\nOuvrez `https:\u002F\u002Fci.votre-domaine.com` dans votre navigateur. La page de connexion affiche un bouton **Se connecter via Gitea**. Cliquez dessus : Gitea demande l'autorisation OAuth2, puis vous redirige vers le dashboard Woodpecker.",{"title":92,"body":93},"Activer un dépôt et déclencher le premier build","Dans le dashboard Woodpecker, cliquez sur **+ Ajouter un dépôt**. La liste de vos dépôts Gitea s'affiche. Sélectionnez un projet et activez-le. Woodpecker enregistre automatiquement un webhook dans Gitea pour déclencher les builds à chaque push.\n\nPoussez un premier commit sur ce dépôt : si le fichier `.woodpecker.yml` est présent à la racine, le pipeline se déclenche immédiatement dans l'interface.",{"type":34,"title":95,"body":96},"Migration d'un workflow GitHub Actions vers .woodpecker.yml","Woodpecker CI a sa propre syntaxe YAML — elle n'est pas compatible GitHub Actions. La bonne nouvelle : elle est plus courte. Voici la migration d'un workflow Node.js classique.\n\n**Avant — `.github\u002Fworkflows\u002Fci.yml` :**\n\n```yaml\nname: CI\non: [push, pull_request]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '20'\n      - run: npm ci\n      - run: npm test\n```\n\n**Après — `.woodpecker.yml` :**\n\n```yaml\nsteps:\n  - name: test\n    image: node:20\n    commands:\n      - npm ci\n      - npm test\n```\n\nLes différences clés : Woodpecker utilise directement une image Docker comme environnement d'exécution (pas besoin de `setup-node`), et chaque étape est déclarée comme un service de conteneur. L'action `checkout` est implicite — Woodpecker clone automatiquement le dépôt dans le workspace partagé entre les étapes.",{"type":98,"title":99,"body":100},"tip","Secrets de pipeline et variable WOODPECKER_SECRET","Ne mettez jamais de tokens, clés SSH ou mots de passe dans votre `.woodpecker.yml` versionné. Woodpecker gère les secrets au niveau du dépôt ou de l'organisation : dans le dashboard, ouvrez le dépôt → **Paramètres → Secrets → Ajouter un secret**. Chaque secret est injecté comme variable d'environnement au moment du build.\n\nPour utiliser un secret dans le pipeline :\n\n```yaml\nsteps:\n  - name: deploy\n    image: alpine\n    environment:\n      SSH_DEPLOY_KEY:\n        from_secret: ssh_deploy_key\n    commands:\n      - echo \"$SSH_DEPLOY_KEY\" > \u002Ftmp\u002Fid_rsa\n      - chmod 600 \u002Ftmp\u002Fid_rsa\n      - ssh -i \u002Ftmp\u002Fid_rsa deploy@votre-domaine.com .\u002Fdeploy.sh\n```\n\nLa syntaxe `from_secret` extrait la valeur depuis le coffre Woodpecker sans l'écrire dans les logs ni dans le fichier YAML.",{"type":34,"title":102,"body":103},"Dépannage courant","**L'agent n'apparaît pas dans le dashboard.** Vérifiez que `WOODPECKER_AGENT_SECRET` est identique dans les deux services du `docker-compose.yml`. Si vous avez modifié le `.env` après le premier démarrage, relancez avec `docker compose down && docker compose up -d`.\n\n**La connexion OAuth2 échoue.** L'URL de redirection enregistrée dans Gitea doit correspondre exactement à `https:\u002F\u002Fci.votre-domaine.com\u002Fauthorize`. Une barre oblique finale, une faute d'orthographe ou un protocole HTTP au lieu de HTTPS suffisent à bloquer le flux OAuth2. Vérifiez également que `WOODPECKER_GITEA_URL` dans le `docker-compose.yml` pointe bien vers l'URL **publique** de votre Gitea — le conteneur Woodpecker doit pouvoir la résoudre depuis l'intérieur du réseau Docker.\n\n**Le webhook ne se déclenche pas.** Ouvrez le dépôt dans Gitea → **Paramètres → Webhooks** et vérifiez que le webhook Woodpecker est bien présent et que les livraisons récentes n'ont pas d'erreur 4xx. Si l'URL de webhook pointe sur `http:\u002F\u002F` au lieu de `https:\u002F\u002F`, Gitea peut refuser de l'appeler. Reconfigurez `WOODPECKER_HOST` avec l'URL complète en HTTPS et réactivez le dépôt dans Woodpecker pour forcer la mise à jour du webhook.\n\n**Les builds échouent par manque de mémoire.** Le serveur et l'agent Woodpecker consomment moins de 50 Mo au repos — mais chaque étape de build lance un conteneur Docker supplémentaire. Sur un VPS à 1 Go, limitez les builds concurrents à 1 ou 2 en ajoutant `WOODPECKER_MAX_PROCS=2` dans l'environnement du service `woodpecker-agent`.",{"type":34,"title":105,"body":106},"Pour aller plus loin","Une fois le pipeline de base fonctionnel, plusieurs optimisations valent le détour.\n\n**Multi-runner.** Ajoutez un second service `woodpecker-agent` dans votre `docker-compose.yml` (même image, même `WOODPECKER_AGENT_SECRET`) pour paralléliser les builds. Chaque agent est indépendant et peut tourner sur un VPS séparé si votre charge le justifie.\n\n**Cache Docker entre builds.** Montez un volume Docker dans l'agent et activez le cache des layers Docker pour éviter de retélécharger les images à chaque build. Woodpecker supporte le cache de pipeline natif via le plugin `woodpecker-ci\u002Fcache` — ajoutez-le comme étape dédiée dans votre `.woodpecker.yml`.\n\n**Notifications.** Woodpecker peut notifier un canal de messagerie à chaque build. Des plugins communautaires couvrent Matrix, Slack, Telegram et Mattermost — cherchez `woodpecker-ci\u002Fnotify-matrix` ou `appleboy\u002Fdrone-telegram` dans la documentation officielle.\n\n**Pipeline conditionnel.** La syntaxe Woodpecker permet de restreindre une étape à une branche ou à un événement précis :\n\n```yaml\nsteps:\n  - name: deploy\n    image: alpine\n    when:\n      branch: main\n      event: push\n    commands:\n      - .\u002Fdeploy.sh\n```\n\nPour approfondir la mise en place des pipelines, le guide \u003Ca href=\"\u002Fblog\u002Fwoodpecker-ci-pipeline-vps-forgejo\">Woodpecker CI et Forgejo : pipeline CI\u002FCD sur VPS\u003C\u002Fa> détaille les étapes avancées, notamment l'intégration Forgejo et les pipelines multi-étapes. Le guide \u003Ca href=\"\u002Fblog\u002Fdocker-compose-production-checklist\">Checklist Docker Compose en production\u003C\u002Fa> couvre les bonnes pratiques pour sécuriser vos stacks Docker en production.","Un VPS ServOrbit pour votre pipeline CI\u002FCD","Le plan `{{vps.start.name}}` à `{{vps.start.price}}` — 1 vCPU, 1 Go de RAM, IP fixe — suffit pour faire tourner Woodpecker CI, un agent et une forge Gitea en parallèle, sans compteur de minutes.","Voir les VPS Cloud","\u002Fvps-cloud",[112,127,145,165],{"id":113,"slug":114,"slugs":115,"title":119,"excerpt":120,"readTime":121,"views":18,"isPinned":19,"publishedAt":122,"category":123,"categories":124,"featuredImage":28,"bgImage":29,"posterImage":126,"relatedSolution":28},212,"woodpecker-ci-pipeline-vps-forgejo",{"fr":114,"en":116,"ar":117,"es":118},"woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps","woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps","woodpecker-ci-forgejo-pipeline-cicd-vps","Woodpecker CI et Forgejo : pipeline CI\u002FCD sur VPS","Déployez Woodpecker CI v3 avec Forgejo sur votre VPS : installation Docker Compose, pipeline YAML, secrets, runners multi-arch et dépannage OAuth.",11,"2026-08-02T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":24},[125],{"id":22,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":128,"slug":129,"slugs":130,"title":134,"excerpt":135,"readTime":121,"views":136,"isPinned":19,"publishedAt":137,"category":138,"categories":139,"featuredImage":28,"bgImage":29,"posterImage":141,"relatedSolution":142},273,"github-actions-payant-migrer-ci-cd-gitea-forgejo-vps",{"fr":129,"en":131,"ar":132,"es":133},"migrate-cicd-to-gitea-or-forgejo-leave-github-actions","gitea-وforgejo-بديل-github-actions-المدفوع-على-vps","migrar-cicd-a-gitea-o-forgejo-sin-github-actions","Migrer sa CI\u002FCD vers Gitea ou Forgejo : hors GitHub Actions","Depuis mars 2026, GitHub facture les minutes CI sur les dépôts privés. Migrez vers Gitea Actions ou Forgejo sur VPS : mêmes fichiers YAML, coût fixe.",0,"2026-08-16T00:00:00+00:00",{"id":22,"name":23,"slug":24,"color":25,"icon":24},[140],{"id":22,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fgithub-actions-payant-migrer-ci-cd-gitea-forgejo-vps-poster.svg",{"categorySlug":143,"appSlug":144},"developpement","gitea",{"id":146,"slug":147,"slugs":148,"title":152,"excerpt":153,"readTime":17,"views":136,"isPinned":19,"publishedAt":154,"category":155,"categories":161,"featuredImage":28,"bgImage":29,"posterImage":163,"relatedSolution":164},74,"heberger-gitea",{"fr":147,"en":149,"ar":150,"es":151},"host-gitea-on-your-own-vps","استضافة-gitea-على-خادم-vps-الخاص-بك","alojar-gitea-en-un-vps","Héberger Gitea sur votre propre VPS en 2026","Déployez Gitea sur un VPS avec Docker et SSL. Guide complet : installation, migration vers Forgejo v16 et comparatif gouvernance.","2026-04-07T00:00:00+00:00",{"id":156,"name":157,"slug":158,"color":159,"icon":160},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[162],{"id":156,"name":157,"slug":158,"color":159,"icon":160},"\u002Fblog\u002Fcovers\u002Fheberger-gitea-poster.svg",{"categorySlug":143,"appSlug":144},{"id":166,"slug":167,"slugs":168,"title":172,"excerpt":173,"readTime":174,"views":22,"isPinned":19,"publishedAt":175,"category":176,"categories":177,"featuredImage":28,"bgImage":29,"posterImage":179,"relatedSolution":28},75,"heberger-forgejo",{"fr":167,"en":169,"ar":170,"es":171},"host-forgejo-on-your-own-vps","استضافة-forgejo-على-خادم-vps-الخاص-بك","alojar-forgejo-en-un-vps","Héberger Forgejo sur votre VPS : guide complet 2025","Installez Forgejo sur votre VPS avec Docker, SSL, runners Actions et sécurité renforcée. Guide pas-à-pas de 1900 mots pour une forge Git souveraine.",9,"2026-04-06T00:00:00+00:00",{"id":156,"name":157,"slug":158,"color":159,"icon":160},[178],{"id":156,"name":157,"slug":158,"color":159,"icon":160},"\u002Fblog\u002Fcovers\u002Fheberger-forgejo-poster.svg",1789046135588]