[{"data":1,"prerenderedAt":188},["ShallowReactive",2],{"seo-verification":3,"blog-reemplazar-github-actions-con-woodpecker-ci-en-vps-ma-es":6,"promo-bar-likely":187},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-reemplazar-github-actions-con-woodpecker-ci-en-vps-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"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,"reemplazar-github-actions-con-woodpecker-ci-en-vps",{"fr":12,"en":13,"ar":14,"es":10},"remplacer-github-actions-woodpecker-ci-self-hosted-vps","replace-github-actions-with-woodpecker-ci-on-a-vps","استبدال-github-actions-بـwoodpecker-ci-على-vps","Reemplazar GitHub Actions con Woodpecker CI en VPS","GitHub anunció y luego suspendió la facturación de runners self-hosted. Migra a Woodpecker CI: sintaxis limpia, menos de 50 MB RAM, coste fijo en VPS.",8,2,false,"2026-09-07T00:00:00+00:00","2026-10-20T23:18:05+00:00",{"id":18,"name":23,"slug":24,"color":25,"icon":24},"Automatización","automatisation","bg-brand-action\u002F10 text-brand-action",[27],{"id":18,"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 diciembre de 2025, GitHub anunció la facturación por minuto del uso de self-hosted runners en repositorios privados (discusión de la comunidad #182089, 72 votos). Ante una reacción masiva de la comunidad, la tarificación fue suspendida en menos de 48 horas — y a 1 de septiembre de 2026, los runners self-hosted siguen siendo gratuitos y la medida nunca llegó a aplicarse. La amenaza es real, sin embargo: nada impide que GitHub la reactive. Migrar a Woodpecker CI es protegerse del próximo anuncio — y ganar de paso la soberanía total sobre el CI\u002FCD. Woodpecker CI es una alternativa open source que funciona con menos de 50 MB de RAM, se conecta a Gitea o Forgejo mediante OAuth2 y no tiene contador de minutos.",[33,37,69,72,94,97,101,104],{"type":34,"title":35,"body":36},"h2","GitHub y la tarificación de runners: lo que ocurrió en 2025-2026","Hasta 2025, los repositorios privados tenían una cuota mensual de minutos incluidos. El 16 de diciembre de 2025, GitHub anunció precios por minuto para el uso de runners — incluidos los **self-hosted runners** que corren en tus propias máquinas. La discusión de GitHub #182089 (diciembre de 2025, 72 votos) resume la preocupación: los equipos habrían pagado a GitHub por orquestar un trabajo corriendo en su propia infraestructura, a 0,002 $ por minuto.\n\nAnte una reacción masiva de la comunidad, GitHub suspendió la tarificación en menos de 48 horas. A 1 de septiembre de 2026, los runners self-hosted en repos privados siguen siendo gratuitos — la medida nunca llegó a aplicarse. Pero el anuncio dejó al descubierto una dependencia estructural: GitHub puede cambiar sus condiciones en cualquier momento. Trasladar toda la cadena CI\u002FCD a una forja self-hosted es la manera de eliminar esa incertidumbre. Woodpecker CI está diseñado exactamente para esto: un motor de pipeline ligero, open source (Apache 2.0), que se instala junto a Gitea o Forgejo y no tiene contador de minutos.",{"type":38,"title":39,"headers":40,"rows":44},"comparison","GitHub Actions runners vs Woodpecker CI self-hosted",[41,42,43],"Criterio","GitHub Actions (runners cloud)","Woodpecker CI en VPS",[45,49,53,57,61,65],[46,47,48],"Coste","0,008 $ \u002F min (Linux) + 0,002 $ \u002F min orquestación en repos privados","Incluido en el coste fijo del VPS (desde 99 DH\u002Fmes)",[50,51,52],"RAM del motor CI","Runners GitHub-hosted: recursos compartidos, no controlados","Servidor + agente Woodpecker: menos de 50 MB RAM combinados",[54,55,56],"Soberanía","El código y los secretos pasan por la infraestructura de GitHub\u002FMicrosoft","Todo permanece en tu VPS — sin tránsito externo",[58,59,60],"Sintaxis de workflow","`.github\u002Fworkflows\u002F*.yml` — estándar muy extendido","`.woodpecker.yml` — sintaxis propia, más corta, no compatible con GitHub Actions",[62,63,64],"Forja requerida","Ninguna (GitHub aloja el repositorio)","Gitea o Forgejo self-hosted",[66,67,68],"Licencia","Propietaria","Apache 2.0",{"type":34,"title":70,"body":71},"Requisitos previos antes de la instalación","Para desplegar Woodpecker CI cómodamente, verifica los siguientes requisitos.\n\n**VPS**: 1 vCPU y 1 GB de RAM son suficientes para el servidor Woodpecker, un agente y una forja Gitea o Forgejo ligera. Cuenta con 2 GB si ejecutas varios builds en paralelo o tus jobs construyen imágenes Docker.\n\n**Software**: Docker y Docker Compose deben estar instalados. Si partes de un VPS limpio, la guía \u003Ca href=\"\u002Fblog\u002Fdemarrer-avec-docker-vps\">Empezar con Docker en VPS\u003C\u002Fa> cubre este paso.\n\n**Forja git**: Woodpecker CI utiliza OAuth2 para la autenticación. Necesitas una instancia de Gitea o Forgejo ya en marcha y accesible vía HTTPS. Las guías \u003Ca href=\"\u002Fblog\u002Fheberger-gitea\">Alojar Gitea\u003C\u002Fa> y \u003Ca href=\"\u002Fblog\u002Fheberger-forgejo\">Alojar Forgejo\u003C\u002Fa> detallan esta instalación.\n\n**Dominio**: prepara un subdominio dedicado para Woodpecker — por ejemplo `ci.tu-dominio.com` — apuntando a la IP de tu VPS con el puerto 443 abierto. Este subdominio sirve como `WOODPECKER_HOST` y como URL de redirección OAuth2.",{"type":73,"title":74,"steps":75},"steps","Instalar Woodpecker CI con Docker Compose",[76,79,82,85,88,91],{"title":77,"body":78},"Crear una aplicación OAuth2 en Gitea","En Gitea, ve a **Configuración → Aplicaciones → Gestionar aplicaciones OAuth2**. Da un nombre a la aplicación (por ejemplo `woodpecker`) e introduce la URL de redirección: `https:\u002F\u002Fci.tu-dominio.com\u002Fauthorize`. Anota el **Client ID** y el **Client Secret** generados — los necesitarás en el paso siguiente.\n\nSi usas Forgejo, el procedimiento es idéntico: **Configuración → Aplicaciones → OAuth2**.",{"title":80,"body":81},"Crear el archivo docker-compose.yml","Crea el directorio `\u002Fopt\u002Fwoodpecker` y coloca en él un archivo `docker-compose.yml` con los dos servicios — servidor y agente:\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.tu-dominio.com\n      - WOODPECKER_GITEA=true\n      - WOODPECKER_GITEA_URL=https:\u002F\u002Fgit.tu-dominio.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\nEl servidor escucha internamente en el puerto **8000** (interfaz web) y **9000** (gRPC, comunicación con el agente). No expongas estos puertos directamente: un proxy inverso gestiona el TLS.",{"title":83,"body":84},"Crear el archivo .env","En `\u002Fopt\u002Fwoodpecker`, crea un archivo `.env` con las tres variables sensibles:\n\n```\nWOODPECKER_GITEA_CLIENT=\u003Coauth2-client-id>\nWOODPECKER_GITEA_SECRET=\u003Coauth2-client-secret>\nWOODPECKER_AGENT_SECRET=\u003Ccadena-aleatoria-larga>\n```\n\nGenera `WOODPECKER_AGENT_SECRET` con `openssl rand -hex 32`. Esta cadena autentica al agente con el servidor — no la compartas.",{"title":86,"body":87},"Configurar el proxy inverso nginx","Coloca Woodpecker detrás de nginx con un certificado Let's Encrypt. Ejemplo de bloque `server` para `ci.tu-dominio.com`:\n\n```nginx\nserver {\n    listen 443 ssl;\n    server_name ci.tu-dominio.com;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fci.tu-dominio.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fci.tu-dominio.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\nObtén el certificado con `certbot certonly --nginx -d ci.tu-dominio.com` y recarga nginx con `systemctl reload nginx`.",{"title":89,"body":90},"Arrancar la stack","Desde `\u002Fopt\u002Fwoodpecker`, ejecuta:\n\n```bash\ndocker compose up -d\n```\n\nSigue los logs del servidor hasta ver la línea de listo:\n\n```bash\ndocker compose logs -f woodpecker-server\n```\n\nAbre `https:\u002F\u002Fci.tu-dominio.com` en tu navegador. La página de inicio de sesión muestra un botón **Iniciar sesión con Gitea**. Haz clic: Gitea solicita autorización OAuth2 y te redirige al dashboard de Woodpecker.",{"title":92,"body":93},"Activar un repositorio y lanzar el primer build","En el dashboard de Woodpecker, haz clic en **+ Añadir repositorio**. Aparece tu lista de repositorios Gitea. Selecciona un proyecto y actívalo. Woodpecker registra automáticamente un webhook en Gitea para lanzar builds en cada push.\n\nRealiza un primer commit en ese repositorio: si el archivo `.woodpecker.yml` está en la raíz, el pipeline se dispara inmediatamente en la interfaz.",{"type":34,"title":95,"body":96},"Migrar un workflow de GitHub Actions a .woodpecker.yml","Woodpecker CI tiene su propia sintaxis YAML — no es compatible con GitHub Actions. La buena noticia: es más corta. Aquí tienes la migración de un workflow clásico de Node.js.\n\n**Antes — `.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**Después — `.woodpecker.yml`:**\n\n```yaml\nsteps:\n  - name: test\n    image: node:20\n    commands:\n      - npm ci\n      - npm test\n```\n\nDiferencias clave: Woodpecker usa directamente una imagen Docker como entorno de ejecución (no necesita `setup-node`), y cada paso es un servicio de contenedor. La acción `checkout` es implícita — Woodpecker clona automáticamente el repositorio en el espacio de trabajo compartido entre los pasos.",{"type":98,"title":99,"body":100},"tip","Secretos de pipeline y la variable WOODPECKER_SECRET","Nunca pongas tokens, claves SSH ni contraseñas en tu `.woodpecker.yml` versionado. Woodpecker gestiona los secretos a nivel de repositorio u organización: en el dashboard, abre el repositorio → **Configuración → Secretos → Añadir secreto**. Cada secreto se inyecta como variable de entorno en tiempo de build.\n\nPara usar un secreto en el 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@tu-dominio.com .\u002Fdeploy.sh\n```\n\nLa sintaxis `from_secret` extrae el valor del almacén de Woodpecker sin escribirlo en los logs ni en el archivo YAML.",{"type":34,"title":102,"body":103},"Resolución de problemas habituales","**El agente no aparece en el dashboard.** Verifica que `WOODPECKER_AGENT_SECRET` sea idéntico en ambos servicios del `docker-compose.yml`. Si modificaste el `.env` después del primer arranque, reinicia con `docker compose down && docker compose up -d`.\n\n**El inicio de sesión OAuth2 falla.** La URL de redirección registrada en Gitea debe coincidir exactamente con `https:\u002F\u002Fci.tu-dominio.com\u002Fauthorize`. Una barra final, un error tipográfico o HTTP en lugar de HTTPS son suficientes para bloquear el flujo OAuth2. Comprueba también que `WOODPECKER_GITEA_URL` apunte a la URL **pública** de tu Gitea.\n\n**El webhook no se dispara.** Abre el repositorio en Gitea → **Configuración → Webhooks** y verifica que el webhook de Woodpecker esté presente y que las entregas recientes no tengan errores 4xx.\n\n**Los builds fallan por falta de memoria.** El servidor y el agente de Woodpecker consumen menos de 50 MB en reposo — pero cada paso de build lanza un contenedor Docker adicional. En un VPS de 1 GB, limita los builds concurrentes añadiendo `WOODPECKER_MAX_PROCS=2` al entorno del servicio `woodpecker-agent`.",{"type":34,"title":105,"body":106},"Para ir más lejos","Una vez que el pipeline base funciona, varias optimizaciones valen la pena.\n\n**Multi-runner.** Añade un segundo servicio `woodpecker-agent` a tu `docker-compose.yml` (misma imagen, mismo `WOODPECKER_AGENT_SECRET`) para paralelizar los builds.\n\n**Caché Docker entre builds.** Monta un volumen Docker en el agente y activa la caché de capas Docker para evitar volver a descargar las imágenes en cada build.\n\n**Notificaciones.** Woodpecker puede notificar un canal de mensajería en cada build — Matrix, Slack, Telegram y Mattermost.\n\n**Pipeline condicional.** La sintaxis de Woodpecker permite restringir un paso a una rama o evento concreto:\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\nPara profundizar en la configuración de pipelines, la guía \u003Ca href=\"\u002Fblog\u002Fwoodpecker-ci-pipeline-vps-forgejo\">Woodpecker CI y Forgejo: pipeline CI\u002FCD en VPS\u003C\u002Fa> detalla los pasos avanzados.","Un VPS ServOrbit para tu pipeline CI\u002FCD","El plan VPS Solo a 99 DH\u002Fmes — 2 vCPU, 4 GB RAM, IP fija — es suficiente para ejecutar Woodpecker CI, un agente y una forja Gitea en paralelo, sin contador de minutos.","Ver planes VPS Cloud","\u002Fvps-cloud",[112,128,148,170],{"id":113,"slug":114,"slugs":115,"title":119,"excerpt":120,"readTime":121,"views":18,"isPinned":19,"noindex":19,"publishedAt":122,"updatedAt":123,"category":124,"categories":125,"featuredImage":28,"bgImage":29,"posterImage":127,"relatedSolution":28},212,"woodpecker-ci-forgejo-pipeline-cicd-vps",{"fr":116,"en":117,"ar":118,"es":114},"woodpecker-ci-pipeline-vps-forgejo","woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps","woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps","Woodpecker CI y Forgejo: pipeline CI\u002FCD en un VPS","Despliega Woodpecker CI v3 con Forgejo en tu VPS: configuración Docker Compose, pipelines YAML, secretos, runners multi-arquitectura y depuración OAuth.",12,"2026-08-02T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":18,"name":23,"slug":24,"color":25,"icon":24},[126],{"id":18,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":129,"slug":130,"slugs":131,"title":135,"excerpt":136,"readTime":137,"views":138,"isPinned":19,"noindex":19,"publishedAt":139,"updatedAt":140,"category":141,"categories":142,"featuredImage":28,"bgImage":29,"posterImage":144,"relatedSolution":145},273,"migrar-cicd-a-gitea-o-forgejo-sin-github-actions",{"fr":132,"en":133,"ar":134,"es":130},"github-actions-payant-migrer-ci-cd-gitea-forgejo-vps","migrate-cicd-to-gitea-or-forgejo-leave-github-actions","gitea-وforgejo-بديل-github-actions-المدفوع-على-vps","Migrar su CI\u002FCD a Gitea o Forgejo: fuera de GitHub Actions","Desde marzo de 2026, GitHub cobra los minutos de CI en repositorios privados. Migre a Gitea Actions o Forgejo en un VPS: mismos archivos YAML, costo fijo.",11,1,"2026-08-16T00:00:00+00:00","2026-11-04T16:30:27+00:00",{"id":18,"name":23,"slug":24,"color":25,"icon":24},[143],{"id":18,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fgithub-actions-payant-migrer-ci-cd-gitea-forgejo-vps-poster.svg",{"categorySlug":146,"appSlug":147},"desarrollo","gitea",{"id":149,"slug":150,"slugs":151,"title":155,"excerpt":156,"readTime":157,"views":138,"isPinned":19,"noindex":19,"publishedAt":158,"updatedAt":159,"category":160,"categories":166,"featuredImage":28,"bgImage":29,"posterImage":168,"relatedSolution":169},74,"alojar-gitea-en-un-vps",{"fr":152,"en":153,"ar":154,"es":150},"heberger-gitea","host-gitea-on-your-own-vps","استضافة-gitea-على-خادم-vps-الخاص-بك","Alojar Gitea en su propio VPS en 2026","Despliegue Gitea 1.25 en un VPS con Docker y SSL: Gitea Actions CI\u002FCD, comparativa vs Forgejo v16, administración y errores SSH y HTTPS.",13,"2026-04-07T00:00:00+00:00","2026-11-08T16:32:50+00:00",{"id":161,"name":162,"slug":163,"color":164,"icon":165},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[167],{"id":161,"name":162,"slug":163,"color":164,"icon":165},"\u002Fblog\u002Fcovers\u002Fheberger-gitea-poster.svg",{"categorySlug":146,"appSlug":147},{"id":171,"slug":172,"slugs":173,"title":177,"excerpt":178,"readTime":179,"views":180,"isPinned":19,"noindex":19,"publishedAt":181,"updatedAt":182,"category":183,"categories":184,"featuredImage":28,"bgImage":29,"posterImage":186,"relatedSolution":28},75,"alojar-forgejo-en-un-vps",{"fr":174,"en":175,"ar":176,"es":172},"heberger-forgejo","host-forgejo-on-your-own-vps","استضافة-forgejo-على-خادم-vps-الخاص-بك","Alojar Forgejo en su VPS: guía completa 2025","Instale Forgejo en su VPS con Docker, SSL, runners Actions y seguridad reforzada. Guía paso a paso de 1900 palabras para una forja Git soberana.",10,9,"2026-04-06T00:00:00+00:00","2026-11-08T01:13:14+00:00",{"id":161,"name":162,"slug":163,"color":164,"icon":165},[185],{"id":161,"name":162,"slug":163,"color":164,"icon":165},"\u002Fblog\u002Fcovers\u002Fheberger-forgejo-poster.svg",true,1794270653700]