Guía de despliegue

Migrar su CI/CD a Gitea o Forgejo: fuera de GitHub Actions

Desplegar en un VPS Cloud →

Tutorial

Migrar su CI/CD a Gitea o Forgejo: fuera de GitHub Actions

Automatización11 min de lectura10 pasos

Desde el 1 de marzo de 2026, los minutos de CI en los repositorios privados de GitHub se facturan por consumo. Para los equipos que encadenan pipelines — tests, lint, build Docker, despliegue — la factura mensual puede superar rápidamente el presupuesto dedicado al propio alojamiento. Gitea y Forgejo permiten recuperar el control: misma sintaxis YAML, misma lógica de runner, cero costo por minuto. Esta guía compara ambas opciones y detalla la instalación paso a paso en un VPS.

Contenido· Lo que ha cambiado en los precios de GitHub Actions1/13
  1. 01Lo que ha cambiado en los precios de GitHub Actions
  2. 02Por qué migrar su CI/CD a una forja autoalojada
  3. 03Requisitos previos
  4. 04Gitea Actions vs Forgejo Actions vs Woodpecker CI
  5. 05Opción A: Gitea con act_runner
  6. 06Instalación de Gitea y del runner
  7. 07Opción B: Forgejo con act_runner
  8. 08Diferencias de instalación respecto a Gitea
  9. 09Compatibilidad YAML con GitHub Actions
  10. 10Ventajas comparativas de un runner self-hosted
  11. 11Endurecimiento de la instalación
  12. 12Resolución de problemas — errores frecuentes
  13. 13Recupere el control de su CI/CD

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.yml sigue 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_runner consume 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

CriterioGitea ActionsForgejo ActionsWoodpecker CI
OrigenFork de Gogs, ~47 000 estrellas en GitHub, licencia MITHard-fork de Gitea desde dic. 2022, impulsado por Codeberg, licencia AGPL-3.0CI externa, open source, funciona con Gitea/Forgejo/GitHub
Runneract_runner (el mismo binario)act_runner (el mismo binario, versión Forgejo)Agente Woodpecker dedicado (woodpecker-agent)
Sintaxis de workflowCompatible con `.github/workflows/*.yml`Compatible con `.github/workflows/*.yml`Sintaxis YAML propia, no compatible con GitHub Actions
Esfuerzo de migraciónMover el archivo YAML a `.gitea/workflows/`Mover el archivo YAML a `.gitea/workflows/`Reescribir los workflows en el formato Woodpecker
GobernanzaEmpresa 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 reposRequiere además una forja (Gitea/Forgejo)
ActualizacionesReleases frecuentes, canal estable disponibleReleases alineadas con Gitea + correcciones propiasCiclo de release independiente
Caso de uso principalForja ligera con CI integrada, migración desde GitHubForja ligera, CI integrada, preferencia por la gobernanza libreCI 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

  1. 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-stopped

    Active GITEA__actions__ENABLED=true desde el principio: sin esa variable, la pestaña Actions no aparece en la interfaz.

  2. Iniciar Gitea y completar la instalación inicial

    Inicie el contenedor y abra http://<su-ip>:3000 en 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.

  3. 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.com y recargue nginx.

  4. 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.

  5. Desplegar act_runner

    Añada el servicio act_runner a su docker-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:
          - gitea

    Vuelva 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.

  6. 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

  1. 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-stopped

    La variable de entorno pasa de GITEA__ a FORGEJO__ para los parámetros propios de Forgejo.

  2. 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-stopped
  3. Obtener 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.

  4. 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ón actions/checkout@v4 y 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/phpunit

Ese 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.

Despliegue su forja Git en un VPS

Gitea está disponible como plantilla VPS en ServOrbit. Su instancia queda operativa en unos minutos, con Docker, nginx y un certificado TLS preconfigurados. Añada `act_runner` y sus pipelines se ejecutan en su infraestructura desde la primera hora.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva