[{"data":1,"prerenderedAt":202},["ShallowReactive",2],{"seo-verification":3,"blog-instalar-gitlab-ce-en-un-vps-guia-completa-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-instalar-gitlab-ce-en-un-vps-guia-completa-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":26,"featuredImage":28,"bgImage":29,"posterImage":30,"relatedSolution":28,"intro":31,"sections":32,"ctaTitle":145,"ctaBody":146,"ctaButton":147,"ctaUrl":148,"relatedPosts":149},235,"instalar-gitlab-ce-en-un-vps-guia-completa",{"fr":12,"en":13,"ar":14,"es":10},"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,false,"2026-08-07T00:00:00+00:00","2026-09-11T11:34:12+00:00",{"id":18,"name":23,"slug":24,"color":25,"icon":24},"Despliegue","deploiement","bg-success\u002F10 text-success",[27],{"id":18,"name":23,"slug":24,"color":25,"icon":24},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Finstaller-gitlab-ce-vps-poster.svg","GitHub y Bitbucket alojan sus repositorios, pero imponen sus reglas: minutos de CI racionados, propiedad del código incierta, precios que suben con el tamaño del equipo. GitLab CE (Community Edition, licencia MIT\u002FEE Core) reúne en un solo servidor una forja git completa, un motor de CI\u002FCD sin límite de minutos, un registry Docker privado y wikis — sin suscripción SaaS. Esta guía le muestra cómo instalarlo en menos de treinta minutos en un VPS con Docker Compose, configurar el SMTP, conectar un runner y evitar los errores clásicos: GITLAB_OMNIBUS_CONFIG mal configurado, SSL que caduca por no haber activado ACME, runner sin registrar.",[33,37,49,52,83,86,89,92,95,98,101,104,142],{"type":34,"title":35,"body":36},"h2","Por qué GitLab CE en lugar de GitHub o Bitbucket","GitHub y Bitbucket son servicios gestionados: prácticos al principio, pero su modelo de precios evoluciona con el tamaño del equipo, los minutos de CI están contados en los planes gratuitos y su código se aloja en una infraestructura de terceros. GitLab CE invierte esa ecuación: usted despliega la forja en su VPS, conserva el control total del código y de los datos, y la CI\u002FCD va incluida sin cuota de minutos impuesta por un tercero. Para una agencia o un equipo de desarrolladores que factura a clientes o trata datos sensibles, ese control suele ser innegociable. GitLab CE es hoy una de las forjas git más desplegadas en self-hosted: su base de código es pública, su núcleo es libre y sus diez años de existencia le han dado una comunidad de colaboradores activa.",{"type":38,"title":39,"items":40},"ul","Lo que GitLab CE incluye de entrada",[41,42,43,44,45,46,47,48],"**Forja git completa**: repositorios privados y públicos, merge requests, revisión de código, protección de ramas y CODEOWNERS.","**CI\u002FCD integrada** sin límite de minutos impuesto: pipelines YAML (`.gitlab-ci.yml`), environments, deploy tokens y artifacts.","**Registry Docker privado** alojado en su dominio: `docker pull git.yourdomain.com\u002Fgroup\u002Fimage:tag` sin cuenta de Docker Hub.","**Wikis y páginas** por proyecto y por grupo, con renderizado Markdown completo.","**Gestión de issues y milestones**: tablero kanban, etiquetas, iteraciones y burndown chart incluidos.","**Runners en paralelo**: registre tantos runners como quiera en su infraestructura o en sus CI workers.","**Webhooks** para avisar a una herramienta externa (Slack, PagerDuty, su servidor de despliegue) en cada push o merge.","**RBAC granular** con cinco niveles de acceso (Guest, Reporter, Developer, Maintainer, Owner) y soporte opcional de LDAP\u002FSAML.",{"type":34,"title":50,"body":51},"Requisitos previos: lo que hace falta antes de empezar","GitLab CE consume mucha memoria — es uno de sus inconvenientes más citados frente a Forgejo o Gitea. Prevea **4 GB de RAM como mínimo** para un uso ligero (menos de diez usuarios activos); **se recomiendan 8 GB** en cuanto añada runners en la misma máquina o active el registry Docker. Por debajo de 4 GB, Puma y Sidekiq compiten por la memoria y GitLab responde con 502 bajo carga. En disco, cuente al menos 20 GB para la instalación y los repositorios iniciales — prevea 50 GB si piensa guardar imágenes Docker en el registry. También necesita: un nombre de dominio apuntando a la IP del VPS, los puertos 80, 443 y 22 abiertos en su cortafuegos, y Docker Engine con el plugin Compose v2 instalados.",{"type":53,"title":54,"steps":55},"steps","De la instalación a su primer proyecto",[56,59,62,65,68,71,74,77,80],{"title":57,"body":58},"Crear el árbol de carpetas","Cree una carpeta dedicada y los tres volúmenes persistentes que utiliza GitLab: `mkdir -p \u002Fopt\u002Fgitlab\u002F{config,logs,data}`. Sin ellas, la configuración y los repositorios desaparecen en cada `docker compose down`.",{"title":60,"body":61},"Escribir el fichero docker-compose.yml","Cree `\u002Fopt\u002Fgitlab\u002Fdocker-compose.yml`. La clave `GITLAB_OMNIBUS_CONFIG` concentra toda la configuración específica de su instancia — sustituya `git.yourdomain.com` por su dominio real. Defina el servicio gitlab con la imagen `gitlab\u002Fgitlab-ce:17.2.1-ce.0`, `restart: unless-stopped`, puertos 80, 443 y 22, volúmenes, `shm_size: 256m` y `env_file: .env`.",{"title":63,"body":64},"Rellenar GITLAB_OMNIBUS_CONFIG","En `GITLAB_OMNIBUS_CONFIG`, defina como mínimo: `external_url 'https:\u002F\u002Fgit.yourdomain.com'`; `letsencrypt['enable'] = true`; parámetros SMTP — `gitlab_rails['smtp_enable'] = true`, dirección, puerto 587, usuario, contraseña desde ENV, autenticación `login`, `smtp_enable_starttls_auto = true`. Todas las líneas deben estar **dentro** del bloque `GITLAB_OMNIBUS_CONFIG`.",{"title":66,"body":67},"Crear el fichero .env para los secretos","Cree `\u002Fopt\u002Fgitlab\u002F.env` y restrinja sus permisos: `touch \u002Fopt\u002Fgitlab\u002F.env && chmod 600 \u002Fopt\u002Fgitlab\u002F.env`. Añada `GITLAB_SMTP_PASSWORD=su_contraseña_smtp`. Añada `.env` a su `.gitignore`.",{"title":69,"body":70},"Arrancar GitLab y esperar a la inicialización","Lance la stack: `docker compose -f \u002Fopt\u002Fgitlab\u002Fdocker-compose.yml up -d`. **Espere unos 5 minutos** antes de acceder a la interfaz web. Siga el avance con `docker compose -f \u002Fopt\u002Fgitlab\u002Fdocker-compose.yml logs -f gitlab` y espere el mensaje `gitlab Reconfigured!`.",{"title":72,"body":73},"Recuperar la contraseña root inicial","Recupérela con: `docker exec -it gitlab-gitlab-1 grep 'Password:' \u002Fetc\u002Fgitlab\u002Finitial_root_password`. Este fichero se **elimina automáticamente 24 horas después** — anote la contraseña de inmediato.",{"title":75,"body":76},"Conectarse, cambiar la contraseña y desactivar el registro abierto","Abra `https:\u002F\u002Fgit.yourdomain.com`. Conéctese con `root`. Cambie la contraseña en **User Settings → Password**. Desactive el registro público en **Admin Area → Settings → General → Sign-up restrictions**.",{"title":78,"body":79},"Registrar un GitLab Runner","Instale `gitlab-runner` y recupere el token de registro en **Admin Area → Runners**. Registre: `gitlab-runner register --url https:\u002F\u002Fgit.yourdomain.com --registration-token VOTRE_TOKEN --executor docker --docker-image alpine:latest`.",{"title":81,"body":82},"Comprobar el envío de correos","Pruebe desde la consola Rails: `docker exec -it gitlab-gitlab-1 gitlab-rails console` y luego `Notify.test_email('votre@email.com', 'Test GitLab', 'Bonjour').deliver_now`.",{"type":84,"body":85},"tip","**Copias de seguridad automáticas.** GitLab incluye un comando de copia de seguridad completa: `docker exec -t gitlab-gitlab-1 gitlab-backup create`. Prográmelo en `crontab -e` con `0 3 * * * docker exec -t gitlab-gitlab-1 gitlab-backup create CRON=1`. Sincronice la carpeta de archivos con un almacenamiento externo (S3, rclone) — una copia local no es una copia de seguridad.",{"type":34,"title":87,"body":88},"Configurar el runner Docker y escribir su primer pipeline CI\u002FCD","El executor Docker es el más recomendado: cada job corre en un contenedor aislado. Tras registrar el runner, su fichero `\u002Fetc\u002Fgitlab-runner\u002Fconfig.toml` contiene un bloque `[runners.docker]`. Añada `volumes = [\"\u002Fcache\"]` y `pull_policy = [\"if-not-present\"]` para acelerar los builds.\n\nEjemplo de pipeline básico en `.gitlab-ci.yml`:\n\n```yaml\nstages:\n  - test\n  - build\n  - deploy\n\nvariables:\n  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA\n\ntest:unit:\n  stage: test\n  image: node:20-alpine\n  cache:\n    key: $CI_COMMIT_REF_SLUG\n    paths:\n      - node_modules\u002F\n  script:\n    - npm ci\n    - npm test\n  only:\n    - merge_requests\n    - main\n\nbuild:image:\n  stage: build\n  image: docker:26\n  services:\n    - docker:26-dind\n  before_script:\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n  script:\n    - docker build -t $DOCKER_IMAGE .\n    - docker push $DOCKER_IMAGE\n  only:\n    - main\n\ndeploy:prod:\n  stage: deploy\n  image: alpine:latest\n  before_script:\n    - apk add --no-cache openssh-client\n    - eval $(ssh-agent -s)\n    - echo \"$SSH_PRIVATE_KEY\" | ssh-add -\n  script:\n    - ssh -o StrictHostKeyChecking=no user@yourserver.com \"docker pull $DOCKER_IMAGE && docker compose up -d\"\n  only:\n    - main\n  when: manual\n```\n\nLas variables `CI_REGISTRY_USER`, `CI_REGISTRY_PASSWORD` y `CI_REGISTRY` se inyectan **automáticamente** por GitLab CE. La variable `SSH_PRIVATE_KEY` se define en **Settings → CI\u002FCD → Variables** marcada como **Masked**. El job `deploy:prod` tiene `when: manual` — no se dispara automáticamente.",{"type":34,"title":90,"body":91},"Configuración detallada del SMTP","GitLab envía correos en cada merge request, mención, pipeline completado o alerta de seguridad. Una configuración SMTP ausente o errónea corta silenciosamente esas notificaciones.\n\nBloque completo en `GITLAB_OMNIBUS_CONFIG` para un relay SMTP autenticado (STARTTLS, puerto 587):\n\n```ruby\ngitlab_rails['smtp_enable'] = true\ngitlab_rails['smtp_address'] = 'smtp.yourdomain.com'\ngitlab_rails['smtp_port'] = 587\ngitlab_rails['smtp_user_name'] = 'gitlab@yourdomain.com'\ngitlab_rails['smtp_password'] = ENV['GITLAB_SMTP_PASSWORD']\ngitlab_rails['smtp_authentication'] = 'login'\ngitlab_rails['smtp_enable_starttls_auto'] = true\ngitlab_rails['gitlab_email_from'] = 'gitlab@yourdomain.com'\ngitlab_rails['gitlab_email_reply_to'] = 'noreply@yourdomain.com'\n```\n\nPara TLS directo (puerto 465), sustituya `smtp_enable_starttls_auto = true` por `smtp_tls = true`. Las claves fuera del bloque omnibus se ignoran en silencio — pruebe siempre con `Notify.test_email(…).deliver_now` desde la consola Rails.",{"type":34,"title":93,"body":94},"Copia de seguridad y restauración de GitLab","El comando `docker exec -t gitlab-gitlab-1 gitlab-backup create` genera un tar completo con repositorios, base de datos PostgreSQL y artifacts. **Importante**: no incluye `\u002Fetc\u002Fgitlab\u002Fgitlab.rb` ni `\u002Fetc\u002Fgitlab\u002Fgitlab-secrets.json` — guárdelos por separado:\n\n```bash\ntar czf \u002Fopt\u002Fgitlab\u002Fconfig-secrets-$(date +%Y%m%d).tar.gz \\\n  \u002Fopt\u002Fgitlab\u002Fconfig\u002Fgitlab.rb \\\n  \u002Fopt\u002Fgitlab\u002Fconfig\u002Fgitlab-secrets.json\n```\n\n**Restauración** en tres pasos: instale la misma versión menor que produjo la copia; copie el tar en `\u002Fopt\u002Fgitlab\u002Fdata\u002Fbackups\u002F`; luego:\n\n```bash\ndocker exec -it gitlab-gitlab-1 gitlab-ctl stop puma\ndocker exec -it gitlab-gitlab-1 gitlab-ctl stop sidekiq\ndocker exec -it gitlab-gitlab-1 gitlab-backup restore BACKUP=\u003Ctimestamp>_\u003Cversion>\ndocker exec -it gitlab-gitlab-1 gitlab-ctl restart\ndocker exec -it gitlab-gitlab-1 gitlab-rake gitlab:check SANITIZE=true\n```\n\nPlanifique la copia a las 3 de la madrugada y sincronice a almacenamiento externo.",{"type":34,"title":96,"body":97},"Resolución de problemas: las tres averías más frecuentes","**502 Bad Gateway al arrancar.** GitLab tarda unos 5 minutos en estar plenamente operativo. Si el 502 persiste, compruebe que Puma ha arrancado: `docker exec gitlab-gitlab-1 gitlab-ctl status puma`. La falta de RAM es la causa más frecuente. **El SMTP no funciona.** Verifique que el bloque `gitlab_rails['smtp_*']` esté dentro de `GITLAB_OMNIBUS_CONFIG` — una clave fuera del bloque es un fallo silencioso. **Runner no conectado.** Compruebe con `gitlab-runner verify --url https:\u002F\u002Fgit.yourdomain.com`. Un certificado TLS autofirmado o un DNS no resoluble desde la máquina del runner son las causas habituales.",{"type":34,"title":99,"body":100},"Diagnóstico avanzado: Sidekiq bloqueado, timeout de Puma y OOM en Gitaly","**Sidekiq queue stuck.** Compruebe el estado:\n\n```bash\ndocker exec gitlab-gitlab-1 gitlab-ctl status sidekiq\ndocker exec gitlab-gitlab-1 gitlab-rake gitlab:sidekiq:check\n```\n\nPara vaciar una cola sin reiniciar: `docker exec -it gitlab-gitlab-1 gitlab-rails console -e production` luego `Sidekiq::Queue.new('mailers').clear`. Para reiniciarlo sin perder jobs pendientes: `docker exec gitlab-gitlab-1 gitlab-ctl restart sidekiq`.\n\n**Timeout de Puma.** Añada en `GITLAB_OMNIBUS_CONFIG`: `puma['worker_timeout'] = 90` (predeterminado 60 s). Si persisten los timeouts, la causa casi siempre es falta de RAM o un número de workers inadecuado.\n\n**OOM en Gitaly.** Verifique con `dmesg | grep -i kill`. Reduzca la caché: `gitaly['configuration']['git']['catfile_cache_size'] = 5` (predeterminado 100).\n\n**Contenedor que sale al arrancar.** Revise los logs: `docker compose logs gitlab | tail -50`. Causas frecuentes: conflicto en el puerto 22, volumen no escribible o sintaxis Ruby inválida en `GITLAB_OMNIBUS_CONFIG`.",{"type":34,"title":102,"body":103},"Optimizar la RAM: swap y workers de Puma","**Reducir workers de Puma.** En `GITLAB_OMNIBUS_CONFIG`:\n\n```ruby\npuma['worker_processes'] = 2\npuma['min_threads'] = 1\npuma['max_threads'] = 4\n```\n\nCada worker Puma consume entre 200 y 300 MB. Dos workers son suficientes para menos de quince usuarios activos simultáneos.\n\n**Añadir swap.** En un VPS sin swap preconfigurado:\n\n```bash\nfallocate -l 4G \u002Fswapfile\nchmod 600 \u002Fswapfile\nmkswap \u002Fswapfile\nswapon \u002Fswapfile\necho '\u002Fswapfile none swap sw 0 0' >> \u002Fetc\u002Ffstab\n```\n\n**Recomendaciones de RAM y CPU por tamaño de equipo**\n\n| Tamaño del equipo | RAM recomendada | vCPU | Notas |\n|---|---|---|---|\n| 1–5 desarrolladores | 4 GB | 2 | Runners en la misma máquina posibles con swap |\n| 5–15 desarrolladores | 8 GB | 4 | Runner dedicado aconsejable a partir de 8+ pipelines\u002Fdía |\n| 15–30 desarrolladores | 16 GB | 8 | Registry Docker activo, Gitaly bajo carga |\n| 30+ desarrolladores | 32 GB+ | 16+ | Separar Gitaly y Sidekiq en máquinas dedicadas |",{"type":105,"title":106,"headers":107,"rows":111},"comparison","GitLab CE, Forgejo o Gitea: cómo elegir",[108,109,110],"Criterio","GitLab CE","Forgejo \u002F Gitea",[112,116,120,124,128,130,134,138],[113,114,115],"Licencia","MIT \u002F EE Core","MIT",[117,118,119],"RAM en reposo","300–600 MB (Puma + Sidekiq)","30–50 MB",[121,122,123],"CI\u002FCD nativa","Sí (`.gitlab-ci.yml`, runners)","Forgejo: sí mediante Woodpecker CI; Gitea: no nativa",[125,126,127],"Registry Docker integrado","Sí","Forgejo: sí; Gitea: no nativo",[129,126,126],"Wikis por proyecto",[131,132,133],"LDAP \u002F SAML","Sí (CE)","Forgejo: sí; Gitea: LDAP sí, SAML no",[135,136,137],"Curva de aprendizaje","Alta (interfaz rica)","De baja a media",[139,140,141],"Ideal para","Equipos de 5+ con CI, registry y RBAC","Equipos ligeros, forja simple, poca huella de RAM",{"type":34,"title":143,"body":144},"Cuándo elegir GitLab CE y cuándo elegir Forgejo","GitLab CE es la elección correcta si su equipo necesita una CI\u002FCD robusta directamente integrada en la forja, un registry Docker privado en su dominio, pipelines de despliegue con environments y deploy tokens, o una gestión de proyecto con issues, milestones y kanban sin herramienta externa. Su huella de memoria (4–8 GB) es el precio de esa riqueza funcional. Forgejo o Gitea se imponen cuando la memoria es la restricción principal, cuando la forja es la única necesidad (sin CI integrada). En un VPS de 2 GB, GitLab CE no es viable; Forgejo funciona con 256 MB. En un VPS de 8 GB dedicado a un equipo de desarrolladores, GitLab CE ofrece un entorno completo equivalente al que GitHub pone en su plataforma SaaS — bajo su control y sin suscripción mensual por usuario.","Un VPS listo para GitLab CE","GitLab CE necesita un VPS de 4 a 8 GB de RAM, un disco generoso y una IP dedicada. Nuestros VPS ServOrbit se entregan con el sistema que elija entre Ubuntu 24.04 LTS, Ubuntu 22.04 LTS, Debian 12 y AlmaLinux 9 y acceso root inmediato — suficiente para tener su forja en línea en treinta minutos.","Ver los VPS de ServOrbit","\u002Fsolutions\u002Fdeveloppeurs",[150,171,187],{"id":151,"slug":152,"slugs":153,"title":157,"excerpt":158,"readTime":159,"views":160,"isPinned":19,"publishedAt":161,"updatedAt":162,"category":163,"categories":168,"featuredImage":28,"bgImage":29,"posterImage":170,"relatedSolution":28},212,"woodpecker-ci-forgejo-pipeline-cicd-vps",{"fr":154,"en":155,"ar":156,"es":152},"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","2026-09-07T11:26:10+00:00",{"id":164,"name":165,"slug":166,"color":167,"icon":166},2,"Automatización","automatisation","bg-brand-action\u002F10 text-brand-action",[169],{"id":164,"name":165,"slug":166,"color":167,"icon":166},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":172,"slug":173,"slugs":174,"title":178,"excerpt":179,"readTime":180,"views":181,"isPinned":19,"publishedAt":182,"updatedAt":162,"category":183,"categories":184,"featuredImage":28,"bgImage":29,"posterImage":186,"relatedSolution":28},229,"checklist-docker-compose-en-produccion",{"fr":175,"en":176,"ar":177,"es":173},"docker-compose-production-checklist","docker-compose-in-production-10-point-checklist","docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط","Docker Compose en producción: checklist de 10 puntos","Checklist de Docker Compose en producción: 10 ajustes esenciales, gestión de secretos sin downtime, copias de volúmenes sin corrupción, CVE-2026-17106.",8,0,"2026-08-06T00:00:00+00:00",{"id":18,"name":23,"slug":24,"color":25,"icon":24},[185],{"id":18,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":188,"slug":189,"slugs":190,"title":194,"excerpt":195,"readTime":196,"views":160,"isPinned":19,"publishedAt":197,"updatedAt":162,"category":198,"categories":199,"featuredImage":28,"bgImage":29,"posterImage":201,"relatedSolution":28},207,"k3s-kubernetes-ligero-en-un-vps",{"fr":191,"en":192,"ar":193,"es":189},"k3s-kubernetes-leger-vps","k3s-lightweight-kubernetes-on-your-vps","k3s-كوبيرنيتيس-خفيف-على-vps-الخاص-بك","K3s: Kubernetes ligero en su VPS","Despliegue un clúster Kubernetes certificado por la CNCF en un VPS modesto con K3s, la distribución Rancher\u002FSUSE que cabe en 60 MB.",4,"2026-08-01T00:00:00+00:00",{"id":18,"name":23,"slug":24,"color":25,"icon":24},[200],{"id":18,"name":23,"slug":24,"color":25,"icon":24},"\u002Fblog\u002Fcovers\u002Fk3s-kubernetes-leger-vps-poster.svg",1789665022370]