[{"data":1,"prerenderedAt":204},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-forgejo-en-un-vps-ma-es":6,"promo-bar-likely":203},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-forgejo-en-un-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":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":30,"intro":33,"sections":34,"ctaTitle":143,"ctaBody":144,"ctaButton":145,"ctaUrl":146,"relatedPosts":147},75,"alojar-forgejo-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"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,false,"2026-04-06T00:00:00+00:00","2026-11-08T01:13:14+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-forgejo-poster.svg","Forgejo es la forja Git libre y autoalojable que surgió como alternativa comunitaria a Gitea. Ligera, compatible con GitHub Actions y respetuosa con sus datos, se instala en menos de una hora en un VPS. Esta guía recorre todo el camino: dimensionamiento del servidor, despliegue con Docker, configuración SSL, runners CI\u002FCD, endurecimiento posterior a la instalación y actualización sin cortes.",[35,39,51,54,76,79,82,85,89,92,95],{"type":36,"title":37,"body":38},"h2","Por qué elegir Forgejo para su forja Git autoalojada","Forgejo nació en 2022 de un fork de Gitea, motivado por las inquietudes sobre la gobernanza del proyecto. Su desarrollo es enteramente comunitario, bajo licencia GPLv3+ desde la v9.0 (agosto de 2024; antes MIT), sin dependencia de ninguna empresa comercial. Para los equipos que quieren controlar su código fuente, su pipeline CI\u002FCD y sus artefactos sin pasar por GitHub, GitLab o Bitbucket, Forgejo es una de las soluciones más ligeras. La interfaz resulta familiar para cualquier desarrollador que haya usado GitHub, la migración desde Gitea es transparente y la compatibilidad con las GitHub Actions simplifica la adopción.",{"type":40,"title":41,"items":42},"ul","Beneficios concretos de un Forgejo autoalojado",[43,44,45,46,47,48,49,50],"Soberanía total: su código nunca sale de su infraestructura","Compatible con GitHub Actions vía Forgejo Actions — reutilice sus workflows existentes","Huella de memoria baja: un VPS pequeño basta para un equipo pequeño","Registro de paquetes integrado: npm, PyPI, Maven, Helm, contenedor OCI","Sin límite en el número de repositorios privados ni de colaboradores","Federación ActivityPub en proceso de estandarización — interoperabilidad futura con otras forjas","Licencia OSS, auditable, sin sorpresas en la tarificación","Actualizaciones controladas: usted decide cuándo migrar",{"type":36,"title":52,"body":53},"Requisitos de hardware y software, con cifras","Antes de lanzar Forgejo, dimensione su VPS según el tamaño real de su equipo. Para 1 a 5 desarrolladores con algunas decenas de repositorios, 1 vCPU y 1 GB de RAM bastan. Para 5 a 20 desarrolladores con CI\u002FCD activa, prevea 2 vCPU y 2 GB de RAM. Por encima de 20 desarrolladores o para repositorios de gran tamaño (monorepos, binarios), 4 vCPU y 4 GB de RAM garantizan una experiencia fluida. En cuanto al almacenamiento, cuente el volumen de sus repositorios Git más un 20 % de margen para los artefactos y las copias de seguridad.\n\nEn el plano de red, deben abrirse tres puertos en su cortafuegos: el puerto 80 (HTTP, para la validación de Let's Encrypt), el puerto 443 (HTTPS, tráfico web) y el puerto 2222 (SSH Git, para evitar el conflicto con el SSH de administración en el 22). En cuanto al software, necesita Docker Engine ≥ 24, Docker Compose v2 y un nombre de dominio que apunte a su VPS.",{"type":55,"title":56,"steps":57},"steps","Desplegar Forgejo con Docker y SSL",[58,61,64,67,70,73],{"title":59,"body":60},"Preparar el entorno","Cree los directorios que persistirán los datos fuera del contenedor:\n\n```bash\nmkdir -p \u002Fopt\u002Fforgejo\u002F{data,config,db}\nchown -R 1000:1000 \u002Fopt\u002Fforgejo\n```\n\nCree el archivo `\u002Fopt\u002Fforgejo\u002F.env` con sus valores:\n\n```env\nFORGEJO_DOMAIN=git.mondomaine.com\nFORGEJO_SSH_PORT=2222\n```\n\nAñada una contraseña de base de datos generada, nunca una contraseña de ejemplo, y proteja el archivo:\n\n```bash\necho \"POSTGRES_PASSWORD=$(openssl rand -hex 32)\" >> \u002Fopt\u002Fforgejo\u002F.env\nchmod 600 \u002Fopt\u002Fforgejo\u002F.env\n```",{"title":62,"body":63},"Crear el docker-compose.yml","```yaml\nservices:\n  forgejo:\n    image: codeberg.org\u002Fforgejo\u002Fforgejo:17\n    restart: unless-stopped\n    environment:\n      - USER_UID=1000\n      - USER_GID=1000\n      - FORGEJO__database__DB_TYPE=postgres\n      - FORGEJO__database__HOST=db:5432\n      - FORGEJO__database__NAME=forgejo\n      - FORGEJO__database__USER=forgejo\n      - FORGEJO__database__PASSWD=${POSTGRES_PASSWORD}\n    volumes:\n      - \u002Fopt\u002Fforgejo\u002Fdata:\u002Fdata\n    ports:\n      - \"127.0.0.1:3000:3000\"\n      - \"${FORGEJO_SSH_PORT:-2222}:22\"\n    depends_on:\n      - db\n\n  db:\n    image: postgres:16-alpine\n    restart: unless-stopped\n    environment:\n      - POSTGRES_DB=forgejo\n      - POSTGRES_USER=forgejo\n      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n    volumes:\n      - \u002Fopt\u002Fforgejo\u002Fdb:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n```",{"title":65,"body":66},"Iniciar los servicios","```bash\ncd \u002Fopt\u002Fforgejo\ndocker compose up -d\ndocker compose logs -f forgejo\n```\n\nEspere a que los logs indiquen que el servidor web escucha en el puerto 3000. Forgejo ejecuta sus migraciones de esquema automáticamente en el primer arranque.",{"title":68,"body":69},"Configurar el reverse proxy y SSL con Caddy","Caddy es la opción más sencilla para obtener un certificado Let's Encrypt automático. Instálelo y después cree `\u002Fetc\u002Fcaddy\u002FCaddyfile`:\n\n```\ngit.mondomaine.com {\n  reverse_proxy localhost:3000\n}\n```\n\nInicie Caddy: `systemctl enable --now caddy`. El certificado TLS se emite y se renueva automáticamente. Si prefiere nginx, configure un bloque `proxy_pass http:\u002F\u002F127.0.0.1:3000;` clásico con Certbot.",{"title":71,"body":72},"Finalizar la configuración de la instancia","Abra `https:\u002F\u002Fgit.mondomaine.com` en su navegador. El asistente de configuración aparece una sola vez. Indique el dominio, la URL SSH (`ssh:\u002F\u002Fgit.mondomaine.com:2222`), la dirección de correo del administrador y desactive el registro público ya en esa pantalla si su forja es de uso privado. Una vez validado el asistente, la configuración queda bloqueada en `\u002Fopt\u002Fforgejo\u002Fdata\u002Fgitea\u002Fconf\u002Fapp.ini`.",{"title":74,"body":75},"Instalar un runner de Forgejo Actions","El runner ejecuta el código de sus workflows: instálelo preferentemente en una máquina dedicada. En *Administración del sitio → Actions → Runners* (`\u002Fadmin\u002Factions\u002Frunners`), haga clic en *Crear un nuevo runner*: Forgejo muestra un UUID y un token. Genere el archivo de configuración (`docker run --rm data.forgejo.org\u002Fforgejo\u002Frunner:13 forgejo-runner generate-config > data\u002Frunner-config.yml`), copie la URL de la instancia, el UUID y el token en la sección `server.connections`, y declare sus etiquetas (por ejemplo `ubuntu-latest:docker:\u002F\u002Fnode:20`) en la sección `runner`. Después despliegue el runner con un demonio Docker propio (docker-in-docker) en lugar de montar el `\u002Fvar\u002Frun\u002Fdocker.sock` del anfitrión, que daría a cada job acceso root al servidor:\n\n```yaml\nservices:\n  docker-in-docker:\n    image: docker:dind\n    privileged: true\n    command: [\"dockerd\", \"-H\", \"tcp:\u002F\u002F0.0.0.0:2375\", \"--tls=false\"]\n    restart: unless-stopped\n\n  runner:\n    image: data.forgejo.org\u002Fforgejo\u002Frunner:13\n    depends_on:\n      - docker-in-docker\n    environment:\n      DOCKER_HOST: tcp:\u002F\u002Fdocker-in-docker:2375\n    user: \"1001:1001\"\n    volumes:\n      - .\u002Fdata:\u002Fdata\n    command: forgejo-runner daemon --config runner-config.yml\n    restart: unless-stopped\n```\n\nEl puerto 2375 del demonio docker-in-docker se queda en la red interna de Compose: no lo publique nunca. El runner aparece en la interfaz en cuanto se conecta. Cada etiqueta elige el modo de ejecución: **docker:\u002F\u002F** (contenedor, recomendado), **lxc:\u002F\u002F** (contenedor LXC) o **host** (directamente en la máquina, sin ningún aislamiento: resérvelo para tareas de confianza).",{"type":36,"title":77,"body":78},"Escribir sus primeros workflows de Forgejo Actions","La compatibilidad con la sintaxis de GitHub Actions es muy amplia. Cree el archivo `.forgejo\u002Fworkflows\u002Fci.yml` en la raíz de su repositorio:\n\n```yaml\non:\n  push:\n    branches: [main]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - name: Run tests\n        run: |\n          npm ci\n          npm test\n```\n\nLas etiquetas `runs-on` corresponden a las etiquetas declaradas al registrar el runner. Puede definir varios runners con etiquetas diferentes (p. ej. `arm64`, `gpu`, `high-memory`) y apuntar al entorno adecuado en cada job. Los artefactos y la caché funcionan con las mismas actions oficiales que en GitHub.",{"type":36,"title":80,"body":81},"Seguridad posterior a la instalación: los ajustes esenciales","Un Forgejo recién instalado es funcional, pero no está endurecido. Estos son los seis puntos que hay que tratar sin falta antes de abrir la forja a su equipo.\n\n**Desactivar el registro público.** Si no lo hizo en el asistente, añada `FORGEJO__service__DISABLE_REGISTRATION=true` a las variables de entorno del contenedor (o `DISABLE_REGISTRATION = true` en la sección `[service]` de `app.ini`): solo un administrador podrá entonces crear cuentas. En una forja interna, nadie debe poder crear una cuenta sin invitación.\n\n**Activar la 2FA para los administradores.** Cada cuenta de administrador debe activar la autenticación de doble factor en *Configuración → Seguridad*. Para imponerla, configure `GLOBAL_TWO_FACTOR_REQUIREMENT` en la sección `[security]` de `app.ini` (`admin` para los administradores, `all` para todos los usuarios). El parámetro `REQUIRE_SIGNIN_VIEW` solo obliga a iniciar sesión para consultar la forja.\n\n**SSH solo por clave.** Desactive la autenticación por contraseña en el `\u002Fetc\u002Fssh\u002Fsshd_config` del servidor anfitrión (`PasswordAuthentication no`). Para el SSH Git (puerto 2222), Forgejo solo acepta las claves públicas registradas en los perfiles de usuario: es su comportamiento por defecto.\n\n**Secretos de los webhooks.** Al crear cada webhook (hacia su CI externa, Slack, etc.), rellene siempre el campo *Secret*. Forgejo firma la carga útil con HMAC-SHA256; su receptor debe verificar esa firma antes de procesar el evento.\n\n**Paquetes privados.** Si utiliza el registro de paquetes integrado, recuerde que un paquete hereda la visibilidad de su propietario: publíquelo bajo una organización o una cuenta privada para reservarlo a sus miembros. Los tokens de acceso para publicar deben tener un alcance mínimo (`write:package` únicamente, nunca un token de administrador global).\n\n**Cortafuegos.** Cierre todos los puertos salvo el 80, el 443 y el 2222. El puerto 3000 (Forgejo interno) nunca debe exponerse directamente; solo lo consume el reverse proxy en loopback, por eso el compose lo publica en `127.0.0.1:3000`. Un puerto publicado por Docker elude las reglas de ufw: solo esta vinculación a 127.0.0.1 lo mantiene fuera de Internet.",{"type":36,"title":83,"body":84},"Actualizar Forgejo sin interrupción","El procedimiento de actualización con Docker es sencillo y solo exige unos segundos de indisponibilidad.\n\n```bash\ncd \u002Fopt\u002Fforgejo\n# 1. Tirer la nouvelle image\ndocker compose pull forgejo\n\n# 2. Sauvegarder la base avant toute migration\ndocker compose exec db pg_dump -U forgejo forgejo > backup-$(date +%Y%m%d).sql\n\n# 3. Redémarrer le service\ndocker compose up -d forgejo\n\n# 4. Vérifier les migrations de schéma\ndocker compose logs forgejo | grep -i migrat\n```\n\nForgejo ejecuta sus migraciones automáticamente al arrancar. Compruebe que los logs no señalan ningún error de migración. Si se produce un error de migración, restaure la copia de seguridad SQL y comunique el problema en el tracker de Forgejo. La etiqueta `17` solo sigue las versiones 17.x: para pasar a la siguiente versión mayor, cambie la etiqueta en el compose tras una copia de seguridad completa, y consulte las notas de versión antes de cada salto de versión mayor. Forgejo se niega a arrancar sobre una base más reciente que él: la vuelta atrás pasa por restaurar la copia de seguridad.",{"type":86,"title":87,"body":88},"tip","Migrar desde Gitea en cinco minutos","Forgejo es un fork directo de Gitea: la actualización desde Gitea está soportada hasta la versión 1.22 incluida, pasando primero por Forgejo v10.0.x. Para migrar, detenga Gitea, copie su directorio de datos (`\u002Fdata` o `\u002Fopt\u002Fgitea`) a `\u002Fopt\u002Fforgejo\u002Fdata`, sustituya la imagen por `codeberg.org\u002Fforgejo\u002Fforgejo:10` en su docker-compose, reinicie y suba después a la versión actual. Forgejo detecta automáticamente el esquema de Gitea y aplica sus propias migraciones. Sus repositorios, usuarios, claves SSH, webhooks e issues se conservan íntegramente. Las versiones de Gitea posteriores a la 1.22 no están cubiertas por la guía oficial de actualización de Forgejo: no intente el cambio directo.",{"type":36,"title":90,"body":91},"Resolución de problemas: los errores más frecuentes","**Conexión SSH rechazada en el puerto 2222.** Compruebe primero que Docker publica efectivamente el puerto (`docker compose ps` → columna Ports). Después, pruebe desde el cliente: `ssh -p 2222 git@git.mondomaine.com`. Si la respuesta es `PTY allocation request failed`, la conexión funciona: Forgejo responde `Hi \u003Cutilisateur>! You've successfully authenticated`. Si obtiene `Connection refused`, el cortafuegos bloquea el puerto: `ufw allow 2222\u002Ftcp`.\n\n**Runner mostrado como offline en la interfaz.** El runner contacta con Forgejo por HTTPS saliente. Compruebe que el contenedor del runner puede resolver y alcanzar `git.mondomaine.com`. Un certificado autofirmado exige montar su CA dentro del contenedor. Reinicie el runner después de corregir la conectividad: `docker compose restart runner`.\n\n**Push rechazado por un hook pre-receive.** Forgejo puede rechazar un push si hay activo un hook de protección de rama (revisión de código obligatoria, tests de CI obligatorios) o si se supera una regla de tamaño de archivo. El mensaje de error de git contiene el detalle. Para los binarios grandes (> 100 MB), utilice Git LFS: Forgejo admite el protocolo LFS de forma nativa.\n\n**Interfaz lenta al cabo de varios meses.** Lance el recolector de basura de Git sobre los repositorios activos desde la administración: *Administración del sitio → Panel → Operaciones de mantenimiento*, tarea de recolección de basura de los repositorios. Para automatizarlo, active la tarea programada `[cron.git_gc_repos]` en `app.ini` (`ENABLED = true`; se ejecuta cada 72 h por defecto).",{"type":86,"title":93,"body":94},"Federación ActivityPub: lo que Forgejo prepara","Forgejo desarrolla la federación entre forjas con ForgeFed, una extensión del protocolo ActivityPub (el mismo que Mastodon). Sigue siendo experimental y está desactivada por defecto (`[federation] ENABLED = false`): la moderación y el control de acceso aún no están desarrollados, y el proyecto advierte que un cambio incompatible puede «quemar» el dominio de la instancia para cualquier federación futura. No la active en una forja de producción. La federación completa — fork entre instancias, pull request entre forjas — está en proceso de estandarización dentro del grupo ForgeFed. Si sus colaboradores están en forjas diferentes, esta evolución permitirá con el tiempo contribuir sin crear una cuenta en cada instancia.",{"type":96,"title":97,"headers":98,"rows":103},"comparison","Forgejo vs Gitea vs GitLab CE: elegir su forja",[99,100,101,102],"Criterio","Forgejo","Gitea","GitLab CE",[104,109,113,118,122,126,129,133,138],[105,106,107,108],"Gobernanza","Comunidad (Codeberg e.V.)","Empresa comercial (CommitGo)","Empresa comercial (GitLab Inc)",[110,111,111,112],"RAM mínima","Baja (VPS pequeño)","8 GB (16 GB recomendados)",[114,115,116,117],"Compatibilidad con GitHub Actions","Sí (Forgejo Actions)","Sí (Gitea Actions)","No (GitLab CI, sintaxis propia)",[119,120,121,121],"Registro de paquetes","Sí (multiformato)","Sí",[123,124,125,125],"Federación ActivityPub","En curso (ForgeFed)","No",[127,128,121,121],"Migración desde GitHub","Sí (espejo + importación)",[130,131,131,132],"Interfaz de administración","Simple, integrada","Completa pero pesada",[134,135,136,137],"Licencia","GPLv3+ (desde v9.0)","MIT","MIT (CE) \u002F EE (de pago)",[139,140,141,142],"Frecuencia de releases","Trimestral (+ LTS)","Varias al año","Mensual","Su forja Git soberana en un VPS ServOrbit","Con un VPS Cloud equipado con Debian y Docker, despliegue Forgejo, su servicio Actions y su registro de paquetes en unos minutos. Recursos dedicados, IPv4 incluida, sin recursos compartidos.","Ver los planes VPS Cloud","\u002Fvps-cloud",[148,164,185],{"id":149,"slug":150,"slugs":151,"title":155,"excerpt":156,"readTime":18,"views":157,"isPinned":19,"noindex":19,"publishedAt":158,"updatedAt":159,"category":160,"categories":161,"featuredImage":30,"bgImage":31,"posterImage":163,"relatedSolution":30},261,"migrar-de-saas-al-self-hosting-por-la-ia",{"fr":152,"en":153,"ar":154,"es":150},"migrer-saas-self-hosting-bundling-ia","when-saas-vendors-bundle-ai-migrating-to-self-hosting","ارتفاع-تكاليف-saas-46-متى-تستضيف-بنفسك","Cuando el SaaS cobra la IA: migrar al self-hosting","PricePulse H1 2026: +46 % de costos SaaS para 50 personas. Mattermost, Nextcloud, Plane y Forgejo se autoalojan en un VPS. Guía de migración.",0,"2026-08-14T00:00:00+00:00","2026-10-20T23:18:07+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[162],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fmigrer-saas-self-hosting-bundling-ia-poster.svg",{"id":165,"slug":166,"slugs":167,"title":171,"excerpt":172,"readTime":173,"views":174,"isPinned":19,"noindex":19,"publishedAt":175,"updatedAt":176,"category":177,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":30},229,"checklist-docker-compose-en-produccion",{"fr":168,"en":169,"ar":170,"es":166},"docker-compose-production-checklist","docker-compose-in-production-10-point-checklist","docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط","Docker Compose en producción: checklist de 10 puntos","Docker Compose en producción: 10 ajustes, health checks, secretos, rollback, solución de errores y paso de docker-compose v1 a docker compose en Ubuntu 26.04.",12,1,"2026-08-06T00:00:00+00:00","2026-10-23T13:27:09+00:00",{"id":178,"name":179,"slug":180,"color":181,"icon":180},3,"Despliegue","deploiement","bg-success\u002F10 text-success",[183],{"id":178,"name":179,"slug":180,"color":181,"icon":180},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":186,"slug":187,"slugs":188,"title":192,"excerpt":193,"readTime":194,"views":174,"isPinned":19,"noindex":19,"publishedAt":175,"updatedAt":159,"category":195,"categories":200,"featuredImage":30,"bgImage":31,"posterImage":202,"relatedSolution":30},228,"hardening-inicial-servidor-linux",{"fr":189,"en":190,"ar":191,"es":187},"durcissement-serveur-linux-initial","initial-linux-server-hardening","تصليب-الخادم-linux-الأولي","Endurecimiento (hardening) inicial de un servidor Linux","Cree un usuario sudo, configure SSH con claves y active UFW y fail2ban en Ubuntu o Debian en menos de una hora.",8,{"id":194,"name":196,"slug":197,"color":198,"icon":199},"Seguridad y monitorización","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[201],{"id":194,"name":196,"slug":197,"color":198,"icon":199},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",true,1794270524302]