[{"data":1,"prerenderedAt":159},["ShallowReactive",2],{"seo-verification":3,"blog-migrar-repositorios-github-a-gitea-en-un-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-migrar-repositorios-github-a-gitea-en-un-vps-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":99,"ctaBody":100,"ctaButton":101,"ctaUrl":102,"relatedPosts":103},279,"migrar-repositorios-github-a-gitea-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"migrer-depots-github-vers-gitea-vps","migrate-your-github-repos-to-self-hosted-gitea-on-a-vps","نقل-مستودعات-github-إلى-gitea-على-خادم-vps-خاص","Migrar sus repositorios de GitHub a Gitea en un VPS","Exporte sus repositorios, issues y labels con la API de GitHub, impórtelos en Gitea en menos de una hora y redirija sus remotes, sin perder historial.",8,0,false,"2026-08-18T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"Despliegue","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fmigrer-depots-github-vers-gitea-vps-poster.svg",{"categorySlug":33,"appSlug":34},"desarrollo","gitea","Las caídas repetidas de GitHub en agosto de 2026 y el aumento de los costes de GitHub Actions han empujado a miles de equipos a buscar una salida concreta. Gitea, instalado en un VPS con un único binario, ofrece una API compatible y un runner de CI nativo. Esta guía le lleva desde la exportación de GitHub hasta la primera actualización `git push` en su propia forja, en menos de una hora.",[37,41,51,54,76,79,82,85,96],{"type":38,"title":39,"body":40},"h2","Por qué dejar GitHub por una forja self-hosted","GitHub sigue siendo la referencia, pero en 2026 han convergido tres tendencias que convierten la salida en algo concreto y ya no teórico.\n\nPrimera tendencia: las caídas. Varios incidentes documentados en \u003Ca href=\"https:\u002F\u002Fwww.githubstatus.com\">githubstatus.com\u003C\u002Fa> afectaron a Git Operations y Actions en agosto de 2026 y bloquearon pipelines en producción en el peor momento. El hilo de Hacker News «Alternatives to GitHub» alcanzó 472 puntos y 299 comentarios el 2026-08-17: señal de que la cuestión ya no es académica.\n\nSegunda tendencia: el coste de los minutos de CI. GitHub Actions es gratuito hasta cierta cuota mensual en los repositorios públicos, pero todo equipo que supere esa cuota en repositorios privados paga por minuto, con un multiplicador según el OS del runner. Un runner Linux factura los minutos a la tarifa estándar; un runner macOS los factura a la tarifa más alta. Estos detalles pueden consultarse en \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpricing\">github.com\u002Fpricing\u003C\u002Fa>.\n\nTercera tendencia: la soberanía del código. Algunos equipos prefieren que el único acceso a su repositorio sea root en su propia VM, y no un token SaaS revocable de forma unilateral.",{"type":42,"title":43,"items":44},"ul","Lo que aporta Gitea self-hosted en concreto",[45,46,47,48,49,50],"**Historial completo preservado**: la importación mediante la API de Gitea consume un archivo tar.gz de GitHub — commits, ramas y tags intactos.","**Issues y labels migrados**: el endpoint `POST \u002Fapi\u002Fv1\u002Frepos\u002Fmigrate` transfiere issues, milestones y labels en una sola pasada.","**Runner de CI nativo**: gitea-runner (basado en act) entiende la sintaxis de los workflows de GitHub Actions — la mayoría de los pipelines funcionan sin reescritura.","**Coste previsible**: un VPS con 1 vCPU y 1 GB de RAM basta para un equipo pequeño; el software es open source, sin licencia ni cuota de minutos.","**Webhooks compatibles**: Gitea expone los mismos eventos (`push`, `pull_request`, `release`) que GitHub — las integraciones de terceros (Slack, Woodpecker CI) siguen conectadas sin modificación.","**Token de API local**: los accesos se gestionan en su propia interfaz, nunca en la de un tercero.",{"type":38,"title":52,"body":53},"Requisitos previos","Antes de empezar, reúna los elementos siguientes.\n\n**Del lado de GitHub**: un token de acceso personal (`Settings → Developer settings → Personal access tokens`) con los scopes `repo` y `read:org`. Téngalo a mano: lo usará en cada llamada `curl`.\n\n**Del lado de Gitea**: una instancia de Gitea ya instalada (véase nuestra guía «Alojar Gitea en su propio VPS») y un token de administrador (`gitea-admin → Settings → Applications → Generate Token`). Dirección base indicada como `https:\u002F\u002Fgit.votre-domaine.com`.\n\n**Del lado del equipo local**: `git` 2.x, `curl` y `jq` instalados. Cuente con **1 GB de RAM** como mínimo en el VPS para importar repositorios de tamaño habitual.",{"type":55,"title":56,"steps":57},"steps","Migración paso a paso",[58,61,64,67,70,73],{"title":59,"body":60},"Crear la organización Gitea de destino","En la interfaz de Gitea, vaya a **`+` → New Organization** y elija un nombre idéntico al de su organización GitHub (esto simplificará la actualización de los remotes).\n\nO mediante la API:\n```bash\ncurl -s -X POST https:\u002F\u002Fgit.votre-domaine.com\u002Fapi\u002Fv1\u002Forgs \\\n  -H \"Authorization: token VOTRE_TOKEN_GITEA\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"username\":\"mon-org\",\"visibility\":\"private\"}'\n```",{"title":62,"body":63},"Listar y exportar los repositorios de GitHub","Recupere la lista de sus repositorios (paginada a 100 por página):\n```bash\ncurl -s -H \"Authorization: token VOTRE_TOKEN_GITHUB\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Forgs\u002FMON_ORG\u002Frepos?per_page=100&page=1\" \\\n  | jq -r '.[].name' > repos.txt\n```\nEl endpoint de GitHub utilizado aquí es `GET \u002Frepos\u002F{owner}\u002F{repo}\u002Ftarball\u002F{ref}` para el archivo completo, y `GET \u002Forgs\u002F{org}\u002Frepos` para el inventario. Consulte la documentación oficial en \u003Ca href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frest\u002Frepos\u002Fcontents\">docs.github.com\u003C\u002Fa>.",{"title":65,"body":66},"Importar cada repositorio mediante la API de Gitea","El endpoint `POST \u002Fapi\u002Fv1\u002Frepos\u002Fmigrate` de la API de Gitea v1 acepta una URL de origen GitHub (documentación oficial: \u003Ca href=\"https:\u002F\u002Fgitea.io\u002Fapi\u002Fswagger\">gitea.io\u003C\u002Fa>). Para cada repositorio:\n```bash\nwhile IFS= read -r REPO; do\n  curl -s -X POST https:\u002F\u002Fgit.votre-domaine.com\u002Fapi\u002Fv1\u002Frepos\u002Fmigrate \\\n    -H \"Authorization: token VOTRE_TOKEN_GITEA\" \\\n    -H \"Content-Type: application\u002Fjson\" \\\n    -d \"{\\n      \\\\\\\"clone_addr\\\\\\\": \\\\\\\"https:\u002F\u002Fgithub.com\u002FMON_ORG\u002F$REPO\\\\\\\",\\n      \\\\\\\"auth_token\\\\\\\": \\\\\\\"VOTRE_TOKEN_GITHUB\\\\\\\",\\n      \\\\\\\"uid\\\\\\\": 2,\\n      \\\\\\\"repo_name\\\\\\\": \\\\\\\"$REPO\\\\\\\",\\n      \\\\\\\"issues\\\\\\\": true,\\n      \\\\\\\"labels\\\\\\\": true,\\n      \\\\\\\"milestones\\\\\\\": true,\\n      \\\\\\\"mirror\\\\\\\": false\\n    }\"\ndone \u003C repos.txt\n```\n`uid` es el identificador numérico de su organización Gitea (visible en la API `GET \u002Fapi\u002Fv1\u002Forgs\u002Fmon-org`). El campo `mirror: false` indica una importación puntual: póngalo en `true` si desea una sincronización continua durante la fase de transición.",{"title":68,"body":69},"Redirigir los remotes locales","Para cada repositorio clonado en su equipo:\n```bash\ngit remote set-url origin https:\u002F\u002Fgit.votre-domaine.com\u002Fmon-org\u002Fmon-repo.git\n```\nO por SSH si ha añadido su clave pública en Gitea (`Settings → SSH \u002F GPG Keys`):\n```bash\ngit remote set-url origin git@git.votre-domaine.com:mon-org\u002Fmon-repo.git\n```\nCompruébelo con `git remote -v` y después pruebe un `git fetch` para confirmar que el remote responde.",{"title":71,"body":72},"Actualizar los webhooks","En Gitea, para cada repositorio: **Settings → Webhooks → Add Webhook**. Pegue la URL de su CI o de su servicio de terceros (Slack, Woodpecker CI, etc.) sustituyendo `github.com` por `git.votre-domaine.com`.\n\nLos eventos disponibles (`push`, `pull_request`, `issues`, `release`) son idénticos a los de GitHub: los payloads tienen la misma estructura de base para la mayoría de las integraciones.",{"title":74,"body":75},"Migrar el pipeline de CI a gitea-runner","Instale el runner oficial en su VPS:\n```bash\nwget -O gitea-runner https:\u002F\u002Fdl.gitea.com\u002Fact_runner\u002Flatest\u002Fact_runner-latest-linux-amd64\nchmod +x gitea-runner\n.\u002Fgitea-runner register --no-interactive \\\n  --instance https:\u002F\u002Fgit.votre-domaine.com \\\n  --token VOTRE_TOKEN_RUNNER \\\n  --name vps-runner \\\n  --labels ubuntu-latest:docker:\u002F\u002Fnode:20-bullseye\n.\u002Fgitea-runner daemon &\n```\nEl token del runner se genera en Gitea: **Site Administration → Runners → Create new Runner Token**.\n\nSus archivos `.github\u002Fworkflows\u002F*.yml` existentes los entiende gitea-runner sin modificación para las acciones habituales (`actions\u002Fcheckout`, `actions\u002Fsetup-node`, etc.). Renombre la carpeta `.github\u002Fworkflows\u002F` como `.gitea\u002Fworkflows\u002F` para activar el runner de Gitea de forma limpia (ambas rutas están soportadas, pero `.gitea\u002F` es la ruta nativa).",{"type":38,"title":77,"body":78},"Verificaciones posteriores a la migración","Una vez terminada la migración, valide estos tres puntos antes de cortar el acceso a GitHub.\n\n**Clones SSH**: desde un equipo recién clonado, `git clone git@git.votre-domaine.com:mon-org\u002Fmon-repo.git` debe funcionar sin pedir contraseña si su clave pública está registrada en Gitea.\n\n**Webhooks activos**: en cada repositorio, abra **Settings → Webhooks** y haga clic en **Test Delivery**. Un código `200` en los logs de entrega confirma que su CI recibe los eventos.\n\n**Historial intacto**: `git log --oneline -10` en el repositorio migrado debe mostrar los mismos diez últimos commits que en GitHub y en el mismo orden.",{"type":80,"body":81},"tip","Si migra varias decenas de repositorios, lance las llamadas `curl` de migración en paralelo con `xargs -P 4` para dividir entre cuatro el tiempo de espera. Gitea gestiona las importaciones concurrentes sin pérdida: el único límite es el ancho de banda de salida de GitHub y el de entrada de su VPS.",{"type":38,"title":83,"body":84},"Resolución de problemas — errores habituales","Estas son las tres situaciones más frecuentes durante una migración.",{"type":55,"title":29,"steps":86},[87,90,93],{"title":88,"body":89},"SSH: `Permission denied (publickey)`","Síntoma: `git clone git@git.votre-domaine.com:…` falla con `Permission denied (publickey)`.\n\nComprobación: en Gitea, **Settings → SSH \u002F GPG Keys** — la clave pública que utiliza debe figurar ahí. Añádala si falta (`cat ~\u002F.ssh\u002Fid_ed25519.pub | pbcopy` o `xclip`).\n\nSi la clave está presente pero el error persiste, compruebe que el puerto SSH de Gitea es efectivamente el `22` (o el puerto configurado): `ssh -vT git@git.votre-domaine.com -p 22` mostrará la negociación y el mensaje de aceptación de Gitea si la clave se reconoce.",{"title":91,"body":92},"Remote: `fatal: repository not found`","Síntoma: `git fetch` devuelve `fatal: repository 'https:\u002F\u002Fgit.votre-domaine.com\u002F…' not found`.\n\nDiagnóstico: `git remote -v` — compruebe que la URL apunta realmente a su instancia de Gitea y no a `github.com`. Si la URL es correcta, conéctese a la interfaz de Gitea y confirme que el repositorio existe con el nombre de organización correcto. Un `POST \u002Fapi\u002Fv1\u002Frepos\u002Fmigrate` que ha fallado en silencio deja el repositorio ausente, sin mensaje de error en el remote local.",{"title":94,"body":95},"Webhooks silenciosos tras la migración","Síntoma: un `git push` no dispara ninguna build en su CI.\n\nDiagnóstico: en Gitea, **Site Administration → System Settings → Git Hooks** — active el registro de los hooks. Después, en el repositorio, **Settings → Webhooks → última entrega**: el campo «Response» muestra el código HTTP devuelto por su CI. Un `404` significa que la URL del webhook apunta a una ruta inexistente; un `401` significa un secreto HMAC mal configurado.\n\nActive el modo debug del runner: en el archivo de configuración de gitea-runner, ponga `log_level` en `debug` y reinicie el daemon. Los logs mostrarán la recepción de cada evento y el código de activación del job.",{"type":38,"title":97,"body":98},"Alojar Gitea en un VPS ServOrbit","Gitea funciona con holgura en un VPS con **1 vCPU y 1 GB de RAM** para un equipo pequeño. Para una organización de diez desarrolladores con una CI activa, 2 vCPU y 2 GB son un punto de partida razonable: el runner y Gitea pueden convivir en la misma VM con ese dimensionamiento.\n\nSi la administración del servidor no es su prioridad, la opción **administración VPS** de ServOrbit cubre exactamente este caso: actualizaciones de seguridad, supervisión e intervención en caso de incidente — usted conserva el acceso root y nosotros mantenemos la VM en buen estado. Su forja sigue siendo suya, sin compartir la infraestructura con otros equipos.\n\nDespliegue la plantilla Gitea desde el Marketplace, seleccione su OS (Ubuntu o Debian) y el tamaño de su VPS, y dispondrá de una instancia configurada en unos minutos. Planes VPS desde `{{vps.start.price}}`.","Su propia forja Git, en su VPS","Un VPS con acceso root, IPv4 dedicada y elección de OS (Ubuntu, Debian, AlmaLinux): la base para alojar Gitea sin depender de un SaaS. Plantilla Gitea disponible en el Marketplace.","Activar Gitea en un VPS","\u002Fmarketplace\u002Fdesarrollo\u002Fgitea",[104,125,144],{"id":105,"slug":106,"slugs":107,"title":111,"excerpt":112,"readTime":113,"views":114,"isPinned":19,"publishedAt":115,"updatedAt":21,"category":116,"categories":122,"featuredImage":29,"bgImage":30,"posterImage":124,"relatedSolution":29},75,"alojar-forgejo-en-un-vps",{"fr":108,"en":109,"ar":110,"es":106},"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.",9,2,"2026-04-06T00:00:00+00:00",{"id":117,"name":118,"slug":119,"color":120,"icon":121},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[123],{"id":117,"name":118,"slug":119,"color":120,"icon":121},"\u002Fblog\u002Fcovers\u002Fheberger-forgejo-poster.svg",{"id":126,"slug":127,"slugs":128,"title":132,"excerpt":133,"readTime":134,"views":135,"isPinned":19,"publishedAt":136,"updatedAt":21,"category":137,"categories":141,"featuredImage":29,"bgImage":30,"posterImage":143,"relatedSolution":29},212,"woodpecker-ci-forgejo-pipeline-cicd-vps",{"fr":129,"en":130,"ar":131,"es":127},"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.",11,1,"2026-08-02T00:00:00+00:00",{"id":114,"name":138,"slug":139,"color":140,"icon":139},"Automatización","automatisation","bg-brand-action\u002F10 text-brand-action",[142],{"id":114,"name":138,"slug":139,"color":140,"icon":139},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":145,"slug":146,"slugs":147,"title":151,"excerpt":152,"readTime":134,"views":18,"isPinned":19,"publishedAt":153,"updatedAt":21,"category":154,"categories":155,"featuredImage":29,"bgImage":30,"posterImage":157,"relatedSolution":158},273,"migrar-cicd-a-gitea-o-forgejo-sin-github-actions",{"fr":148,"en":149,"ar":150,"es":146},"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.","2026-08-16T00:00:00+00:00",{"id":114,"name":138,"slug":139,"color":140,"icon":139},[156],{"id":114,"name":138,"slug":139,"color":140,"icon":139},"\u002Fblog\u002Fcovers\u002Fgithub-actions-payant-migrer-ci-cd-gitea-forgejo-vps-poster.svg",{"categorySlug":33,"appSlug":34},1789665027474]