[{"data":1,"prerenderedAt":227},["ShallowReactive",2],{"seo-verification":3,"blog-migrar-gitlab-a-gitea-en-un-vps-en-2026-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-migrar-gitlab-a-gitea-en-un-vps-en-2026-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":159,"ctaBody":160,"ctaButton":161,"ctaUrl":162,"relatedPosts":163},352,"migrar-gitlab-a-gitea-en-un-vps-en-2026",{"fr":12,"en":13,"ar":14,"es":10},"migrer-gitlab-vers-gitea-vps-2026","migrate-gitlab-to-gitea-vps-2026","الانتقال-من-gitlab-إلى-gitea-على-vps-في-2026","Migrar de GitLab a Gitea en un VPS en 2026","GitLab.com puso en modo solo lectura los namespaces con más de 5 miembros desde el 15 de agosto de 2026. Así se migra a Gitea autoalojado sin perder el historial.",10,0,false,"2026-09-16T00:00:00+00:00","2026-09-16T14:44:13+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"Desarrollo","developpement","bg-warning\u002F10 text-warning","dev",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fmigrer-gitlab-vers-gitea-vps-2026-poster.svg",{"categorySlug":34,"appSlug":35},"desarrollo","gitea","Desde el 15 de agosto de 2026, GitLab.com ha activado el modo de solo lectura en los namespaces con más de cinco miembros en los planes gratuitos. Para muchos equipos, esto es una migración forzada — y una oportunidad para recuperar el control. Gitea, en su versión 1.27.3 disponible como plantilla VPS en ServOrbit, ofrece una alternativa ligera, autoalojada y suficientemente completa para cubrir la gran mayoría de las necesidades de un equipo de desarrollo de tamaño medio. Esta guía cubre la exportación de GitLab, la importación en Gitea, la configuración de CI\u002FCD y la gestión de permisos, con comandos reales en cada paso.",[38,42,54,57,97,122,143,146,149,152,156],{"type":39,"title":40,"body":41},"h2","Por qué GitLab.com se volvió insostenible para equipos de 5 o más personas","El 15 de agosto de 2026, GitLab aplicó una nueva política en su nivel gratuito: cualquier namespace con más de cinco miembros pasa automáticamente a modo de solo lectura (fuente: support.gitlab.com\u002Fhc\u002Fen-us\u002Farticles\u002F28301407860508). En la práctica, los desarrolladores adicionales no pueden hacer push de código, abrir merge requests ni lanzar pipelines de CI\u002FCD. La única salida que propone GitLab es la suscripción de pago, cuyo coste por usuario se vuelve rápidamente significativo para una startup o agencia.\n\nEsta decisión se enmarca en una monetización acelerada de la plataforma SaaS. Afecta principalmente a los equipos de código abierto con presupuesto reducido, las agencias con varios proyectos y los desarrolladores independientes que comparten un namespace. No es la primera restricción de este tipo: GitLab ya eliminó los minutos de CI\u002FCD gratuitos para nuevos usuarios en 2021. La tendencia es estructural.\n\nFrente a esta restricción, autoalojar la forja Git en un VPS recupera todo su sentido. Controlas los accesos, los datos permanecen en tu infraestructura y el coste es fijo — el del servidor, no el de los puestos.",{"type":43,"title":44,"items":45},"ul","Lo que Gitea proporciona de forma nativa",[46,47,48,49,50,51,52,53],"**Forja Git completa** — repositorios, ramas, etiquetas, pull requests, revisión de código inline y gestión de conflictos desde la interfaz web.","**Gestión de organizaciones y equipos** — permisos granulares por repositorio (lectura, escritura, administración) sin límite de miembros.","**Gitea Actions** — motor CI\u002FCD compatible con la sintaxis YAML de GitHub Actions, lo que facilita la portabilidad de los flujos de trabajo existentes.","**Registro de paquetes integrado** — npm, PyPI, Maven, Docker, Helm: publica y consume artefactos sin dependencia externa.","**Webhooks y API REST** — superficie de API amplia para integrar herramientas de despliegue, notificaciones Slack o paneles internos.","**Autenticación SSO** — LDAP, OAuth2, SAML y OpenID Connect soportados de forma nativa para centralizar la gestión de identidades.","**Huella de memoria reducida** — 512 MB de RAM son suficientes para un equipo de diez personas; se recomienda 1 GB para runners concurrentes de Actions.","**Actualizaciones sencillas** — binario único o imagen Docker oficial, migraciones de base de datos automáticas en cada actualización de versión.",{"type":39,"title":55,"body":56},"Requisitos previos antes de empezar","En el lado del servidor, Gitea v1.27.3 funciona cómodamente con 512 MB de RAM para un uso mínimo; prevé 1 GB si activas Gitea Actions con runners concurrentes. La plantilla VPS de ServOrbit parte de una imagen Debian 12 con Docker preinstalado — es el modo de despliegue recomendado ya que aísla el proceso de Gitea y simplifica las actualizaciones.\n\nEn el lado de la red, apunta un subdominio a la IP de tu VPS antes de lanzar la instalación: Gitea genera las URLs de clonación SSH y HTTPS en el primer inicio, y corregirlas después resulta tedioso. Un registro A `git.your-domain.com` es suficiente. También necesitarás un certificado TLS — Caddy o Traefik pueden generarlo automáticamente vía Let's Encrypt como proxy frontal de Gitea.\n\nEn GitLab.com, comprueba que tienes derechos de Owner en los grupos o proyectos a migrar: la exportación requiere este nivel de acceso. Genera un token de API personal con los ámbitos `api` y `read_repository` — se usará durante la exportación vía API.",{"type":58,"title":59,"rows":60,"headers":93},"comparison","GitLab vs Gitea — criterios clave",[61,65,69,73,77,81,85,89],[62,63,64],"Límite de miembros (SaaS gratuito)","5 miembros (solo lectura más allá desde agosto 2026)","Ilimitado en autoalojado",[66,67,68],"Huella de memoria mínima","4 GB (GitLab CE autoalojado)","512 MB",[70,71,72],"CI\u002FCD integrada","GitLab CI (YAML)","Gitea Actions (sintaxis GitHub Actions)",[74,75,76],"Registro de contenedores","Sí (GitLab Container Registry)","Sí (Gitea Packages — Docker incluido)",[78,79,80],"Gestión de merge\u002Fpull requests","Merge Requests avanzadas","Pull Requests con revisión de código inline",[82,83,84],"Autenticación SSO","SAML, LDAP, OAuth2","LDAP, OAuth2, SAML, OIDC",[86,87,88],"Importación desde GitLab","No disponible","Importación nativa vía API o archivo .tar.gz",[90,91,92],"Coste de operación","29 $\u002Fusuario\u002Fmes (Premium)","Solo el coste del VPS (99 DH\u002Fmes\u002Fmes)",[94,95,96],"Criterio","GitLab.com Free","Gitea VPS",{"type":98,"title":99,"steps":100},"steps","Preparar la exportación de GitLab",[101,104,107,110,113,116,119],{"title":102,"body":103},"Inicia sesión en GitLab.com y navega al proyecto a","Inicia sesión en GitLab.com y navega al proyecto a exportar: **Settings > General > Advanced > Export project**. Haz clic en 'Export project' y espera el correo de confirmación (unos minutos para repositorios pequeños, hasta una hora para los grandes).",{"title":105,"body":106},"Para exportar vía API sin pasar por la interfaz, lanza la ex","Para exportar vía API sin pasar por la interfaz, lanza la exportación con: `curl --request POST --header \"PRIVATE-TOKEN: \u003Cyour-token>\" \"https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fprojects\u002F\u003Cproject-id>\u002Fexport\"`",{"title":108,"body":109},"Comprueba el estado de la exportación con:","Comprueba el estado de la exportación con: `curl --header \"PRIVATE-TOKEN: \u003Cyour-token>\" \"https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fprojects\u002F\u003Cproject-id>\u002Fexport\"` — espera el estado `finished`.",{"title":111,"body":112},"Descarga el archivo de exportación:","Descarga el archivo de exportación: `curl --location --header \"PRIVATE-TOKEN: \u003Cyour-token>\" \"https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fprojects\u002F\u003Cproject-id>\u002Fexport\u002Fdownload\" --output gitlab-export.tar.gz`",{"title":114,"body":115},"Para migrar también el historial Git completo, clona el repo","Para migrar también el historial Git completo, clona el repositorio con todas las referencias: `git clone --mirror git@gitlab.com:your-group\u002Fyour-project.git your-project.git`",{"title":117,"body":118},"Verifica la integridad del clon espejo antes de transferir:","Verifica la integridad del clon espejo antes de transferir: `git -C your-project.git fsck --no-progress` — no debe aparecer ningún error.",{"title":120,"body":121},"Transfiere el archivo y el repositorio espejo a tu VPS:","Transfiere el archivo y el repositorio espejo a tu VPS: `rsync -avz gitlab-export.tar.gz your-project.git user@your-vps:\u002Ftmp\u002Fmigration\u002F`",{"type":98,"title":123,"steps":124},"Importar en Gitea en el VPS",[125,128,131,134,137,140],{"title":126,"body":127},"En tu VPS, crea la organización destino en Gitea vía la inte","En tu VPS, crea la organización destino en Gitea vía la interfaz web o la API: `curl -X POST \"https:\u002F\u002Fgit.your-domain.com\u002Fapi\u002Fv1\u002Forgs\" -H \"Authorization: token \u003Cgitea-token>\" -H \"Content-Type: application\u002Fjson\" -d '{\"username\":\"my-organisation\",\"visibility\":\"private\"}'`",{"title":129,"body":130},"Crea el repositorio vacío en Gitea antes de la importación:","Crea el repositorio vacío en Gitea antes de la importación: `curl -X POST \"https:\u002F\u002Fgit.your-domain.com\u002Fapi\u002Fv1\u002Forgs\u002Fmy-organisation\u002Frepos\" -H \"Authorization: token \u003Cgitea-token>\" -H \"Content-Type: application\u002Fjson\" -d '{\"name\":\"my-project\",\"private\":true}'`",{"title":132,"body":133},"Empuja el historial Git desde el clon espejo:","Empuja el historial Git desde el clon espejo: `git -C your-project.git remote set-url origin https:\u002F\u002Fgit.your-domain.com\u002Fmy-organisation\u002Fmy-project.git` y luego `git -C your-project.git push --mirror`",{"title":135,"body":136},"Para importar issues y merge requests desde el archivo de Gi","Para importar issues y merge requests desde el archivo de GitLab, usa la herramienta `gitea-migrator` o la importación nativa de Gitea: en la interfaz, **+ New Migration > GitLab** y proporciona la URL del proyecto fuente con tu token de GitLab.",{"title":138,"body":139},"Verifica que todas las ramas y etiquetas están presentes:","Verifica que todas las ramas y etiquetas están presentes: `git ls-remote https:\u002F\u002Fgit.your-domain.com\u002Fmy-organisation\u002Fmy-project.git` debe listar las mismas referencias que el original.",{"title":141,"body":142},"Actualiza las URLs de clonación en la configuración local de","Actualiza las URLs de clonación en la configuración local de cada desarrollador: `git remote set-url origin https:\u002F\u002Fgit.your-domain.com\u002Fmy-organisation\u002Fmy-project.git`",{"type":39,"title":144,"body":145},"Configurar la CI\u002FCD en Gitea","Gitea v1.27.3 incluye Gitea Actions, un motor de CI\u002FCD cuya sintaxis YAML es intencionalmente compatible con GitHub Actions. Si tus pipelines existían en GitLab CI, es necesaria cierta adaptación — los `stages` y `script` de GitLab se traducen en `jobs` y `steps` de Gitea Actions — pero la lógica es la misma.\n\nPara activar los runners, instala `act_runner` en tu VPS o en una máquina dedicada: `act_runner register --no-interactive --instance https:\u002F\u002Fgit.your-domain.com --token \u003Crunner-token> --name my-runner --labels ubuntu-latest:docker:\u002F\u002Fnode:20-bullseye`. El token de registro se encuentra en **Site Administration > Runners**.\n\nSi prefieres un enfoque de CI\u002FCD más desacoplado, Woodpecker CI es una alternativa madura que se integra de forma nativa con Gitea vía OAuth2 y ofrece una interfaz de supervisión de builds. Su archivo de pipeline `.woodpecker.yml` también está próximo a la sintaxis de Drone CI, lo que simplifica las migraciones desde stacks más antiguos.",{"type":39,"title":147,"body":148},"Migrar los miembros del equipo y los permisos","Gitea organiza los accesos en tres niveles: organizaciones (equivalentes a los grupos de GitLab), equipos dentro de una organización y permisos por repositorio. Empieza creando todas las cuentas de usuario — ya sea manualmente, activando el autoregistro temporalmente, o vía LDAP\u002FSSO si ya está disponible.\n\nCrea después los equipos en tu organización: `Owners`, `Developers`, `Reporters` se corresponden con los roles Owner, Developer y Reporter de GitLab. Gitea permite refinar los permisos por repositorio dentro del mismo equipo — un subconjunto de miembros puede tener acceso de escritura solo a ciertos repos.\n\nPara migrar las membresías en lote, la API de Gitea acepta llamadas como: `curl -X PUT \"https:\u002F\u002Fgit.your-domain.com\u002Fapi\u002Fv1\u002Forgs\u002Fmy-organisation\u002Fteams\u002F\u003Cteam-id>\u002Fmembers\u002F\u003Cusername>\" -H \"Authorization: token \u003Cgitea-token>\"`. Un script shell que recorra tu lista de usuarios exportada de GitLab es suficiente para automatizar este paso en equipos de menos de cincuenta personas.",{"type":39,"title":150,"body":151},"Resolución de problemas — los 4 errores más frecuentes","**`remote: repository not found` durante el push espejo.** El repositorio destino aún no existe en Gitea, o el token usado no tiene derechos de escritura. Verifica que el repositorio se haya creado (paso 2 de la importación) y que tu token tenga el ámbito `write:repository`.\n\n**`error: src refspec refs\u002Fmerge-requests\u002F... does not match any`** durante `push --mirror`. Las referencias internas de GitLab (`refs\u002Fmerge-requests\u002F`) no son aceptadas por Gitea. Filtralas explícitamente antes de hacer push: elimina las refs parásitas localmente con `git -C your-project.git for-each-ref --format='%(refname)' refs\u002Fmerge-requests | xargs -I{} git update-ref -d {}`.\n\n**`Error 413: Request Entity Too Large`** al importar un archivo grande. El tamaño máximo de carga está configurado en `app.ini` de Gitea bajo la clave `MAX_UPLOAD_SIZE`. Auméntalo (`MAX_UPLOAD_SIZE = 2048` para 2 GB) y recarga el servicio: `docker compose restart gitea`.\n\n**Las issues importadas no muestran los autores correctos.** Gitea asocia las issues con las cuentas locales por nombre de usuario. Si el nombre de GitLab difiere del de Gitea, las issues se atribuyen al usuario que lanzó la importación. Crea todas las cuentas con los mismos nombres de usuario que en GitLab antes de ejecutar la migración de issues.",{"type":153,"title":154,"body":155},"tip","Consejo de seguridad post-migración","Una vez completada la migración, desactiva el autoregistro (`DISABLE_REGISTRATION = true` en `app.ini`) si no usas SSO, y activa la autenticación de dos factores obligatoria para todos los miembros Owner. Configura también copias de seguridad automáticas del volumen Docker que contiene `\u002Fdata\u002Fgitea`: un volcado diario a almacenamiento remoto (S3, Backblaze B2) te protege de pérdida de disco. Por último, verifica que el puerto SSH de Gitea (por defecto 2222 en Docker) no esté expuesto directamente en la IP pública si filtras por clave SSH — una regla de fail2ban o de UFW que limite las conexiones SSH por minuto reduce significativamente la superficie de ataque.",{"type":39,"title":157,"body":158},"Recupera el control de tu forja Git","La restricción de GitLab.com del 15 de agosto de 2026 aceleró una tendencia ya en marcha: los equipos que habían aceptado depender de una plataforma SaaS gratuita se encuentran ante una decisión de precio no anticipada. Gitea v1.27.3 responde a las necesidades esenciales de una forja Git de equipo — repositorios, pull requests, CI\u002FCD, registro de paquetes, SSO — en una huella que cabe en un VPS de entrada.\n\nLa migración no es instantánea, pero es secuencial y reversible en cada paso: el historial Git está completo tras el `push --mirror`, las issues y pull requests siguen a través de la importación nativa, y la CI\u002FCD se reconfigura en pocas horas si tus flujos de trabajo ya estaban en YAML. La plantilla VPS Gitea de ServOrbit te ahorra la fase de instalación y configuración inicial — Gitea está listo, Docker está en su lugar, solo queda vincular tu dominio y seguir los pasos descritos aquí.\n\nConsulta las guías complementarias sobre la stack IA self-hosted con Gitea y Ollama, la sustitución de GitHub Actions por Woodpecker CI y la instalación de GitLab CE en VPS si aún estás comparando ambas opciones.","Despliega tu forja Git en VPS de ServOrbit","Plantilla Gitea v1.27.3 lista para usar, acceso root, snapshots diarios. Tu forja privada en menos de diez minutos.","Ver VPS para desarrolladores","\u002Fsolutions\u002Fdeveloppeurs",[164,188,208],{"id":165,"slug":166,"slugs":167,"title":171,"excerpt":172,"readTime":173,"views":174,"isPinned":19,"publishedAt":175,"updatedAt":176,"category":177,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":185},335,"stack-de-ia-self-hosted-gitea-runners-y-ollama-en-un-vps",{"fr":168,"en":169,"ar":170,"es":166},"deployer-stack-ia-self-hosted-gitea-ollama-vps","self-hosted-ai-stack-gitea-runners-and-ollama-on-a-vps","مكدس-ذكاء-اصطناعي-ذاتي-gitea-وollama-على-خادم-vps","Stack de IA self-hosted: Gitea, runners y Ollama en un VPS","Despliega un pipeline de IA completo en tu VPS: forge Git con Gitea, runners de CI e inferencia LLM con Ollama. Ningún código ni prompt abandona tu servidor.",9,1,"2026-09-06T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":174,"name":178,"slug":179,"color":180,"icon":181},"Inteligencia Artificial","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[183],{"id":174,"name":178,"slug":179,"color":180,"icon":181},"\u002Fblog\u002Fcovers\u002Fdeployer-stack-ia-self-hosted-gitea-ollama-vps-poster.svg",{"categorySlug":186,"appSlug":187},"inteligencia-artificial","ollama",{"id":189,"slug":190,"slugs":191,"title":195,"excerpt":196,"readTime":197,"views":198,"isPinned":19,"publishedAt":199,"updatedAt":200,"category":201,"categories":205,"featuredImage":30,"bgImage":31,"posterImage":207,"relatedSolution":30},235,"instalar-gitlab-ce-en-un-vps-guia-completa",{"fr":192,"en":193,"ar":194,"es":190},"installer-gitlab-ce-vps","install-gitlab-ce-on-a-vps-complete-guide","تثبيت-gitlab-ce-على-vps-دليل-شامل","Instalar GitLab CE en un VPS: guía completa","Despliegue GitLab CE en un VPS con Docker Compose: forja git, CI\u002FCD integrada, registry Docker privado y gestión de proyectos self-hosted.",17,3,"2026-08-07T00:00:00+00:00","2026-09-11T11:34:12+00:00",{"id":198,"name":202,"slug":203,"color":204,"icon":203},"Despliegue","deploiement","bg-success\u002F10 text-success",[206],{"id":198,"name":202,"slug":203,"color":204,"icon":203},"\u002Fblog\u002Fcovers\u002Finstaller-gitlab-ce-vps-poster.svg",{"id":209,"slug":210,"slugs":211,"title":215,"excerpt":216,"readTime":217,"views":174,"isPinned":19,"publishedAt":218,"updatedAt":176,"category":219,"categories":224,"featuredImage":30,"bgImage":31,"posterImage":226,"relatedSolution":30},338,"reemplazar-github-actions-con-woodpecker-ci-en-vps",{"fr":212,"en":213,"ar":214,"es":210},"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,"2026-09-07T00:00:00+00:00",{"id":220,"name":221,"slug":222,"color":223,"icon":222},2,"Automatización","automatisation","bg-brand-action\u002F10 text-brand-action",[225],{"id":220,"name":221,"slug":222,"color":223,"icon":222},"\u002Fblog\u002Fcovers\u002Fremplacer-github-actions-woodpecker-ci-self-hosted-vps-poster.svg",1789665027204]