Lo que ha cambiado en los precios de GitHub Actions
Hasta principios de 2026, los repositorios privados en GitHub disponían de una cuota mensual de minutos incluidos, según el plan contratado. Ese modelo ha cambiado: desde el 1 de marzo de 2026, GitHub ha reducido los umbrales incluidos y ha generalizado la facturación por minuto para los runners Linux alojados por GitHub en los planes inferiores a GitHub Team y GitHub Enterprise.
Los runners autoalojados (self-hosted), en cambio, nunca han sido facturados por GitHub: consumen sus propios recursos. Ese es precisamente el margen que aprovechan Gitea Actions y Forgejo Actions: al alojar su forja en un VPS, lleva sus pipelines a un runner que usted controla, sin contador de GitHub.
El argumento no es solo económico. Los datos de sus repositorios privados dejan de pasar por la infraestructura de GitHub. Los pipelines se ejecutan en el entorno de red que usted elija, algo útil si su despliegue apunta a una red privada o a un clúster interno. Y la forja sigue accesible incluso ante una caída o una restricción externa.
Por qué migrar su CI/CD a una forja autoalojada
- Costo variable eliminado — el runner se ejecuta en su VPS: cada minuto de CI es un recurso ya pagado, no una línea de facturación adicional.
- Confidencialidad de los pipelines — el código fuente, los secretos de entorno y los artefactos de compilación no salen de su infraestructura.
- Compatibilidad YAML —
.gitea/workflows/ci.ymlsigue la misma sintaxis que.github/workflows/ci.yml; migrar un pipeline existente casi siempre se reduce a mover un archivo. - Control total de las imágenes de runner — usted elige las versiones de PHP, Node, Python o Docker sin depender del catálogo de GitHub.
- Forja ligera — Gitea funciona con 200 a 300 MB de RAM para los repositorios y
act_runnerconsume unos 50 MB por job; un VPS con 1 GB de RAM basta para un equipo pequeño. - Independencia de servicio — sus pipelines siguen ejecutándose sea cual sea la disponibilidad o la política de precios de la plataforma upstream.
- Gestión unificada de los accesos — los permisos, los equipos y los webhooks viven en su instancia, sin delegar el acceso a un tercero.
- Almacenamiento de artefactos bajo su control — los binarios, las imágenes Docker y los informes de cobertura se guardan donde usted decida.
Requisitos previos
Antes de instalar Gitea o Forgejo, compruebe que su VPS cumple los siguientes criterios.
RAM: 1 GB como mínimo para una forja pequeña (hasta 5 desarrolladores, pipelines simples). Cuente 2 GB si activa varios runners en paralelo o si sus jobs compilan imágenes Docker.
CPU: 1 vCPU basta para la forja en sí; los jobs de CI consumen lo que usted les asigne mediante la configuración del runner.
Almacenamiento: 20 GB para empezar — los repositorios Git y los artefactos de pipeline crecen rápido según su actividad.
Puerto público: el puerto 22 (SSH Git) o un puerto alternativo, y el puerto 443 (HTTPS). El puerto 3000 lo usa Gitea/Forgejo internamente; no debe exponerse directamente.
Dominio: es muy recomendable un subdominio dedicado (git.sudominio.com) — los webhooks GitHub→Gitea, las claves SSH y las URL de clonado se apoyan en un nombre estable.
Docker: Gitea y Forgejo se despliegan limpiamente con Docker Compose, que simplifica las actualizaciones y el aislamiento de los procesos.
Gitea Actions vs Forgejo Actions vs Woodpecker CI
Desplace la tabla
| Criterio | Gitea Actions | Forgejo Actions | Woodpecker CI |
|---|---|---|---|
| Origen | Fork de Gogs, ~47 000 estrellas en GitHub, licencia MIT | Hard-fork de Gitea desde dic. 2022, impulsado por Codeberg, licencia AGPL-3.0 | CI externa, open source, funciona con Gitea/Forgejo/GitHub |
| Runner | act_runner (el mismo binario) | act_runner (el mismo binario, versión Forgejo) | Agente Woodpecker dedicado (woodpecker-agent) |
| Sintaxis de workflow | Compatible con `.github/workflows/*.yml` | Compatible con `.github/workflows/*.yml` | Sintaxis YAML propia, no compatible con GitHub Actions |
| Esfuerzo de migración | Mover el archivo YAML a `.gitea/workflows/` | Mover el archivo YAML a `.gitea/workflows/` | Reescribir los workflows en el formato Woodpecker |
| Gobernanza | Empresa comercial (Gitea Ltd) | Colectivo de colaboradores independientes (Codeberg e.V.) | Comunidad, sin entidad comercial detrás |
| Consumo de memoria de la forja | ~200-300 MB de RAM para repos | ~200-300 MB de RAM para repos | Requiere además una forja (Gitea/Forgejo) |
| Actualizaciones | Releases frecuentes, canal estable disponible | Releases alineadas con Gitea + correcciones propias | Ciclo de release independiente |
| Caso de uso principal | Forja ligera con CI integrada, migración desde GitHub | Forja ligera, CI integrada, preferencia por la gobernanza libre | CI autónoma avanzada, pipelines multietapa complejos |
Opción A: Gitea con act_runner
Gitea es un fork de Gogs mantenido activamente desde 2016, hoy con unas 47 000 estrellas en GitHub y licencia MIT. Desde la versión 1.19 incluye un motor de Actions compatible con la sintaxis de GitHub Actions, impulsado por act_runner.
Instalación de Gitea y del runner
Crear el archivo Docker Compose
Cree un directorio de trabajo y un archivo
docker-compose.yml:services: gitea: image: gitea/gitea:latest container_name: gitea environment: - USER_UID=1000 - USER_GID=1000 - GITEA__actions__ENABLED=true volumes: - ./gitea-data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "3000:3000" - "222:22" restart: unless-stoppedActive
GITEA__actions__ENABLED=truedesde el principio: sin esa variable, la pestaña Actions no aparece en la interfaz.Iniciar Gitea y completar la instalación inicial
Inicie el contenedor y abra
http://<su-ip>:3000en un navegador. El asistente de instalación le pide el tipo de base de datos (SQLite basta para una forja pequeña), el nombre del servidor y la URL externa. Introduzca la URL HTTPS que va a configurar (https://git.sudominio.com) — queda escrita en la configuración y sirve de base para las URL de clonado y los webhooks.Cree la cuenta de administrador desde ese asistente.
Configurar el reverse proxy y el TLS
Coloque Gitea detrás de nginx con un certificado Let's Encrypt. Ejemplo de bloque
server:server { listen 443 ssl; server_name git.sudominio.com; ssl_certificate /etc/letsencrypt/live/git.sudominio.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/git.sudominio.com/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }Obtenga el certificado con
certbot certonly --nginx -d git.sudominio.comy recargue nginx.Crear un token de runner en Gitea
Inicie sesión en su instancia Gitea como administrador. Vaya a Administración del sitio → Runners → Crear un runner. Copie el token mostrado — se usará en el paso siguiente para registrar
act_runner.Desplegar act_runner
Añada el servicio
act_runnera sudocker-compose.yml:act_runner: image: gitea/act_runner:latest container_name: act_runner environment: - GITEA_INSTANCE_URL=https://git.sudominio.com - GITEA_RUNNER_REGISTRATION_TOKEN=<su-token> - GITEA_RUNNER_NAME=vps-runner volumes: - /var/run/docker.sock:/var/run/docker.sock - ./runner-data:/data restart: unless-stopped depends_on: - giteaVuelva a lanzar con
docker compose up -d. El runner aparece en la interfaz de Gitea en Administración del sitio → Runners con el estado Idle.Enviar un workflow de prueba
En uno de sus repositorios Gitea, cree el archivo
.gitea/workflows/ci.yml:name: CI on: [push] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Verificación run: echo "Pipeline activo en Gitea Actions"Haga push de un commit. El job aparece en la pestaña Actions del repositorio y se ejecuta en su runner VPS.
Opción B: Forgejo con act_runner
Forgejo es un hard-fork de Gitea iniciado en diciembre de 2022 por la comunidad Codeberg y distribuido bajo licencia AGPL-3.0. Comparte la misma sintaxis de workflow y el mismo binario act_runner, con una gobernanza comunitaria y un ciclo de correcciones independiente. Para los equipos sensibles a las cuestiones de gobernanza o de licencia, Forgejo es la alternativa directa a Gitea — la experiencia de usuario y la compatibilidad YAML son idénticas.
Diferencias de instalación respecto a Gitea
Sustituir la imagen Docker
En su
docker-compose.yml, sustituya la imagen de Gitea por la imagen oficial de Forgejo:services: forgejo: image: codeberg.org/forgejo/forgejo:latest container_name: forgejo environment: - USER_UID=1000 - USER_GID=1000 - FORGEJO__actions__ENABLED=true volumes: - ./forgejo-data:/data ports: - "3000:3000" - "222:22" restart: unless-stoppedLa variable de entorno pasa de
GITEA__aFORGEJO__para los parámetros propios de Forgejo.Usar el runner de Forgejo
Forgejo mantiene su propia versión de
act_runner. Use la imagen publicada en el registro de Codeberg:act_runner: image: code.forgejo.org/forgejo/runner:latest container_name: forgejo_runner environment: - FORGEJO_INSTANCE_URL=https://git.sudominio.com - FORGEJO_RUNNER_REGISTRATION_TOKEN=<su-token> - FORGEJO_RUNNER_NAME=vps-runner volumes: - /var/run/docker.sock:/var/run/docker.sock - ./runner-data:/data restart: unless-stoppedObtener el token de runner en Forgejo
El procedimiento es idéntico al de Gitea: Administración del sitio → Runners → Crear un runner. El token es de un solo uso — anótelo antes de cerrar la página.
Colocar sus workflows en `.gitea/workflows/`
Forgejo lee los archivos de workflow en el mismo directorio que Gitea:
.gitea/workflows/. Un workflow escrito para GitHub Actions o Gitea Actions funciona sin modificaciones. La única restricción: la acciónactions/checkout@v4y sus equivalentes se resuelven mediante la caché de acciones de su instancia — la primera ejecución las descarga y las siguientes las reutilizan.
Compatibilidad YAML con GitHub Actions
El punto de compatibilidad más subestimado: .gitea/workflows/ci.yml y .github/workflows/ci.yml comparten la misma gramática. Los eventos disparadores (push, pull_request, schedule), los jobs, los steps, las matrices y las condiciones if: funcionan de la misma manera.
Un workflow típico de GitHub:
name: Tests
on:
push:
branches: [main, dev]
pull_request:
jobs:
phpunit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.4'
- run: composer install --no-interaction
- run: vendor/bin/phpunitEse archivo, copiado en .gitea/workflows/ci.yml, se ejecuta tal cual en Gitea Actions o Forgejo Actions. Las acciones del marketplace de GitHub (actions/checkout, shivammathur/setup-php, etc.) se descargan desde GitHub en la primera ejecución y se guardan en caché localmente.
Un límite que conviene conocer: algunas acciones propietarias o específicas de GitHub (OIDC, CodeQL, Dependabot) no tienen equivalente directo y deben sustituirse por alternativas open source o por scripts de shell.
Ventajas comparativas de un runner self-hosted
- Costo fijo y previsible — solo paga el VPS, sea cual sea la frecuencia de sus pipelines.
- Confidencialidad — el código fuente, las variables de entorno y los artefactos de compilación no pasan por un servicio de terceros.
- Personalización del runner — instale las dependencias del sistema, las herramientas propias de su stack o las imágenes Docker privadas directamente en el runner.
- Red interna accesible — un job puede alcanzar una base de datos de staging o un registry Docker privado en su red sin exposición pública.
- Despliegues sin tránsito de red — el runner se ejecuta en el mismo centro de datos que su servidor de destino; los artefactos de compilación se copian localmente, sin pasar por los servidores de GitHub.
- Archivado bajo su control — los logs de pipeline y los artefactos se conservan tanto tiempo como usted decida, sin límite impuesto por la plataforma.
Endurecimiento de la instalación
Un runner autoalojado expone su infraestructura si su configuración es laxa. Tres puntos que conviene revisar antes de poner su instancia en producción.
Primer punto: no exponga la interfaz de administración de Gitea/Forgejo en Internet. Colóquela detrás del reverse proxy con la autenticación de dos factores activada y, si es posible, una restricción por IP o una VPN para el acceso de administrador.
Segundo punto: el token del runner es de un solo uso y debe permanecer secreto. Una vez registrado el runner, el token ya no tiene valor — pero si se filtra antes del registro, un tercero puede crear un runner malicioso en su instancia.
Tercer punto: aísle el runner en una red Docker dedicada, separada de la forja. Un job comprometido no debe poder alcanzar el contenedor de Gitea/Forgejo por la red interna de Docker. Declare dos redes en su docker-compose.yml y conceda al runner solo el acceso a Internet y a lo que necesiten sus pipelines.
Resolución de problemas — errores frecuentes
El runner permanece en estado «Offline» tras el arranque. Compruebe que GITEA_INSTANCE_URL (o FORGEJO_INSTANCE_URL) apunta a la URL HTTPS pública de su forja, no a localhost ni a la IP interna. El runner se conecta desde fuera del contenedor.
La pestaña Actions no aparece en la interfaz. La variable GITEA__actions__ENABLED=true (o FORGEJO__actions__ENABLED=true) debe estar presente al arrancar el contenedor. Un simple reinicio sin esa variable no basta: detenga el contenedor, añada la variable y vuelva a lanzarlo con docker compose up -d.
La acción actions/checkout@v4 falla con un error de resolución. Gitea y Forgejo intentan descargar las acciones desde GitHub en la primera ejecución. Si su VPS no puede alcanzar github.com, configure un espejo local de acciones en la sección [actions] de app.ini con la clave DEFAULT_ACTIONS_URL.
El job arranca y se detiene de inmediato con «exit code 137». Es una señal OOM (Out Of Memory) del kernel. La imagen de runner (ubuntu-latest) carga varias herramientas en memoria. Aumente la RAM disponible en su VPS o reduzca el paralelismo (max_parallel_jobs en la configuración del runner) para evitar varios jobs simultáneos en un host infradimensionado.
Recupere el control de su CI/CD
Gitea y Forgejo ofrecen el mismo nivel de compatibilidad con sus workflows de GitHub Actions existentes, con perfiles de gobernanza distintos — MIT para Gitea, AGPL-3.0 y colectivo independiente para Forgejo. En ambos casos, act_runner se instala en unos minutos en un VPS estándar y sus pipelines migran sin reescritura.
Si ya utiliza una plantilla VPS Gitea en ServOrbit, el runner puede ejecutarse en la misma instancia o en un VPS dedicado según la carga de sus pipelines. La guía detallada de instalación de Gitea está disponible a continuación — cubre las opciones de almacenamiento, la configuración SMTP y la copia de seguridad automatizada.
Para desplegar Gitea en un VPS en unos minutos, consulte nuestra guía: Alojar Gitea en un VPS.