[{"data":1,"prerenderedAt":183},["ShallowReactive",2],{"seo-verification":3,"blog-autoalojar-jenkins-servidor-ci-cd-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-autoalojar-jenkins-servidor-ci-cd-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":120,"ctaBody":121,"ctaButton":122,"ctaUrl":123,"relatedPosts":124},515,"autoalojar-jenkins-servidor-ci-cd-vps",{"fr":12,"en":13,"ar":14,"es":10},"self-host-jenkins-vps","self-host-jenkins-ci-cd-server-vps","استضافة-jenkins-على-vps-خادم-ci-cd","Jenkins en un VPS: su servidor CI\u002FCD de código abierto con Docker","Instale Jenkins LTS en un VPS con Docker Compose: pipelines Jenkinsfile, webhooks Git, HTTPS tras nginx y agentes de build aislados del controlador.",7,0,false,"2026-10-28T00:00:00+00:00","2026-10-28T05:34:10+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[28],{"id":17,"name":23,"slug":24,"color":25,"icon":26},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-jenkins-vps-poster.svg",{"categorySlug":33,"appSlug":34},"desarrollo","jenkins","Los minutos de build que facturan los servicios de CI alojados acaban pesando, y sus secretos de despliegue viven en manos de un tercero. Jenkins, el servidor de automatización de código abierto con licencia MIT, hace el mismo trabajo en su propio servidor: recupera el código en cada push, ejecuta la compilación y las pruebas, y después despliega. Esta guía instala Jenkins LTS con Docker Compose en un VPS, lo publica en HTTPS tras nginx, escribe un primer pipeline y fija las reglas de seguridad que importan.",[37,41,51,82,85,101,105,108,111,114,117],{"type":38,"title":39,"body":40},"h2","Por qué alojar su CI\u002FCD con Jenkins","Una CI alojada es práctica hasta que los builds se multiplican: cada minuto por encima de la cuota se factura, los proyectos grandes esperan su turno y las claves de despliegue de sus servidores se guardan en el proveedor. Jenkins invierte este modelo. Funciona en su VPS, ejecuta tantos builds como permitan sus máquinas y guarda sus credenciales cifradas en casa.\n\nEs también la herramienta que la mayoría de los equipos ya conoce: un Jenkinsfile se lee sin formación, la documentación es abundante y casi todas las herramientas del mercado tienen su plugin de Jenkins.",{"type":42,"title":43,"items":44},"ul","Lo que aporta Jenkins",[45,46,47,48,49,50],"**Pipelines como código** — un Jenkinsfile versionado con el proyecto describe cada etapa, revisada en code review como el resto.","**Webhooks Git** — GitHub, GitLab, Gitea o Forgejo lanzan el build en cada push o pull request.","**Multibranch** — cada rama y cada pull request recibe su propio pipeline, creado automáticamente.","**Agentes de build** — los builds se ejecutan en máquinas dedicadas, conectadas por SSH.","**Más de 2.000 plugins** — Docker, Kubernetes, SonarQube, Slack, informes de pruebas JUnit.","**Credenciales cifradas** — claves SSH y tokens inyectados en el pipeline, enmascarados en los registros.",{"type":52,"title":53,"headers":54,"rows":58},"comparison","Jenkins frente a otras CI autoalojadas",[5,55,56,57],"Jenkins","Woodpecker CI","OneDev",[59,63,68,72,77],[60,61,62,61],"Licencia","MIT","Apache-2.0",[64,65,66,67],"Definición del pipeline","Jenkinsfile (Groovy)","YAML","YAML o editor visual",[69,70,70,71],"Forja Git integrada","No, se conecta a la suya","Sí",[73,74,75,76],"Ecosistema de plugins","Más de 2.000 plugins","Plugins como imágenes Docker","Funciones integradas",[78,79,80,81],"Ideal para","Pipelines complejos, equipos existentes","Pipelines sencillos en contenedores","Equipo pequeño que quiere todo en uno",{"type":38,"title":83,"body":84},"Requisitos previos","Un VPS Ubuntu 24.04 con 2 GB de RAM y 2 vCPU basta para el controlador; cuente 4 GB si sus builds se ejecutan en la misma máquina. Necesita Docker y el plugin Compose, un nombre de dominio (o un subdominio) que apunte al VPS, y nginx con un certificado TLS para publicarlo en HTTPS. Jenkins debe responder en una dirección HTTPS estable: es la que sus repositorios llaman para los webhooks.",{"type":86,"title":87,"steps":88},"steps","Instalar Jenkins con Docker Compose",[89,92,95,98],{"title":90,"body":91},"Crear el archivo Compose","Este `docker-compose.yml` arranca Jenkins LTS sobre Java 21. El puerto solo se publica en la interfaz de bucle local: solo nginx accede a él. Todos los datos (jobs, plugins, credenciales, historial) viven en el volumen `jenkins-home`. El puerto 50000 de los agentes entrantes no se publica: los agentes se conectan por SSH.\n```yaml\nservices:\n  jenkins:\n    image: jenkins\u002Fjenkins:2.580.1-lts-jdk21\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8104:8080\"\n    environment:\n      JAVA_OPTS: -Djava.awt.headless=true\n    volumes:\n      - jenkins-home:\u002Fvar\u002Fjenkins_home\n    healthcheck:\n      test: [\"CMD-SHELL\", \"curl -fsS -o \u002Fdev\u002Fnull http:\u002F\u002Flocalhost:8080\u002Flogin || exit 1\"]\n      interval: 15s\n      retries: 10\n      start_period: 60s\nvolumes:\n  jenkins-home: {}\n```",{"title":93,"body":94},"Arrancar el contenedor","Coloque el archivo en `\u002Fopt\u002Fjenkins` y arranque la stack. El primer arranque tarda unos treinta segundos; `docker compose ps` debe mostrar el estado `healthy`.\n```bash\nmkdir -p \u002Fopt\u002Fjenkins && cd \u002Fopt\u002Fjenkins\ndocker compose up -d\ndocker compose ps\n```",{"title":96,"body":97},"Publicar Jenkins en HTTPS tras nginx","En el bloque `server` de su dominio, transmita las cabeceras `X-Forwarded-*`: sin ellas, Jenkins genera enlaces en HTTP y señala un proxy inverso mal configurado.\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:8104;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_set_header X-Forwarded-Port 443;\n}\n```",{"title":99,"body":100},"Desbloquear Jenkins","Abra `https:\u002F\u002Fsu-dominio`. Jenkins pide la contraseña inicial escrita en su volumen de datos:\n```bash\ndocker compose exec jenkins cat \u002Fvar\u002Fjenkins_home\u002Fsecrets\u002FinitialAdminPassword\n```\nInstale después los plugins sugeridos, cree su cuenta de administrador y confirme la URL HTTPS de la instancia.",{"type":102,"title":103,"body":104},"tip","No ejecute builds en el controlador","El controlador de Jenkins guarda todas sus credenciales. Un build que se ejecute en él puede leerlas. En Administrar Jenkins, ponga a 0 el número de ejecutores del nodo integrado y conecte al menos un agente por SSH. Por la misma razón, no monte el socket Docker del VPS en el contenedor de Jenkins: daría a cualquier build acceso root al servidor.",{"type":38,"title":106,"body":107},"Escribir un primer pipeline","Cree un «Multibranch Pipeline» que apunte a su repositorio y añada un `Jenkinsfile` en la raíz. Este ejemplo construye y prueba cada rama, y solo despliega la rama `main`, en un agente con la etiqueta `linux`:\n```groovy\npipeline {\n    agent { label 'linux' }\n    stages {\n        stage('Build') { steps { sh 'make build' } }\n        stage('Test')  { steps { sh 'make test' } }\n        stage('Deploy') {\n            when { branch 'main' }\n            steps { sh '.\u002Fdeploy.sh' }\n        }\n    }\n}\n```\nAñada por último un webhook en su repositorio hacia `https:\u002F\u002Fsu-dominio\u002Fgithub-webhook\u002F` para GitHub, o hacia la URL que indique el plugin de su forja. Cada push lanza entonces un build.",{"type":38,"title":109,"body":110},"Credenciales y agentes de build","Las claves SSH, los tokens de API y las contraseñas de despliegue se guardan en Administrar Jenkins, Credentials. Jenkins las almacena cifradas en su volumen y solo las inyecta en un build cuando una etapa las pide, con `withCredentials` o la directiva `environment` de un Jenkinsfile; su valor se enmascara en los registros. Dé a cada credencial el alcance más estrecho posible: una clave de despliegue por servidor de destino, un token de solo lectura para clonar los repositorios.\n\nPara los agentes, lo más sencillo es un segundo VPS con Java y Docker instalados. En Administrar Jenkins, Nodes, añada un nodo permanente con el método de arranque «via SSH», la dirección del VPS y una clave SSH guardada como credencial. Póngale una etiqueta, por ejemplo `linux`, y apúntela en sus pipelines. El controlador ya solo orquesta, y un build comprometido nunca accede a sus otros secretos.",{"type":38,"title":112,"body":113},"Copias de seguridad y actualización de Jenkins","Todo el estado de Jenkins vive en el volumen `jenkins-home`: jobs, configuración, plugins, credenciales cifradas e historial de builds. Un archivo de este volumen basta para restaurarlo todo. Detenga Jenkins durante la copia para obtener un archivo coherente:\n```bash\ncd \u002Fopt\u002Fjenkins\ndocker compose stop jenkins\ndocker run --rm -v jenkins_jenkins-home:\u002Fdata -v \\\"$PWD\\\":\u002Fbackup alpine tar czf \u002Fbackup\u002Fjenkins-home.tar.gz -C \u002Fdata .\ndocker compose start jenkins\n```\nPara actualizar, siga la línea LTS, publicada aproximadamente cada doce semanas con correcciones intermedias: sustituya la etiqueta de la imagen en `docker-compose.yml` y ejecute `docker compose pull` y `docker compose up -d`. Actualice después los plugins desde Administrar Jenkins, Plugins, y lea los avisos de seguridad que publica el proyecto: la mayoría de las vulnerabilidades corregidas afectan a plugins, no al núcleo.",{"type":38,"title":115,"body":116},"Solución de problemas","**«It appears that your reverse proxy set up is broken»**: nginx no transmite `X-Forwarded-Proto` o la URL de Jenkins no está en HTTPS. Corrija el bloque `location` y después la URL en Administrar Jenkins, System.\n\n**El contenedor se reinicia en bucle**: lea los registros. La causa más frecuente es la falta de memoria; dé al VPS al menos 2 GB de RAM.\n```bash\ndocker compose logs --tail=100 jenkins\n```\n**Los webhooks no llegan**: revise en el repositorio el historial de entregas del webhook y compruebe que la dirección llamada es la URL HTTPS pública de Jenkins.",{"type":38,"title":118,"body":119},"Instalación en un clic desde el Marketplace de ServOrbit","En un VPS de ServOrbit, Jenkins se instala desde el Marketplace: elija la dirección, pulse Instalar y el script despliega Jenkins LTS en Docker, con su volumen de datos y el proxy inverso nginx en HTTPS. La contraseña inicial de administración aparece en su área de cliente. ¿Sin dominio? Basta el subdominio gratuito del VPS, HTTPS incluido.","Su servidor CI\u002FCD Jenkins, en su propio VPS","Un VPS de ServOrbit Ubuntu 24.04 con 2 GB de RAM basta para arrancar Jenkins. Instalación en un clic desde el Marketplace, HTTPS en su dominio o en el subdominio gratuito del VPS, sin cuota de minutos de build.","Instalar Jenkins","\u002Fmarketplace\u002Fdesarrollo\u002Fjenkins",[125,143,164],{"id":126,"slug":127,"slugs":128,"title":132,"excerpt":133,"readTime":134,"views":18,"isPinned":19,"publishedAt":135,"updatedAt":136,"category":137,"categories":138,"featuredImage":29,"bgImage":30,"posterImage":140,"relatedSolution":141},74,"alojar-gitea-en-un-vps",{"fr":129,"en":130,"ar":131,"es":127},"heberger-gitea","host-gitea-on-your-own-vps","استضافة-gitea-على-خادم-vps-الخاص-بك","Alojar Gitea en su propio VPS en 2026","Despliegue Gitea 1.25 en un VPS con Docker y SSL: Gitea Actions CI\u002FCD, comparativa vs Forgejo v16, administración y errores SSH y HTTPS.",13,"2026-04-07T00:00:00+00:00","2026-10-21T15:21:37+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},[139],{"id":17,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fheberger-gitea-poster.svg",{"categorySlug":33,"appSlug":142},"gitea",{"id":144,"slug":145,"slugs":146,"title":150,"excerpt":151,"readTime":152,"views":153,"isPinned":19,"publishedAt":154,"updatedAt":155,"category":156,"categories":161,"featuredImage":29,"bgImage":30,"posterImage":163,"relatedSolution":29},338,"reemplazar-github-actions-con-woodpecker-ci-en-vps",{"fr":147,"en":148,"ar":149,"es":145},"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,1,"2026-09-07T00:00:00+00:00","2026-10-20T23:18:05+00:00",{"id":157,"name":158,"slug":159,"color":160,"icon":159},2,"Automatización","automatisation","bg-brand-action\u002F10 text-brand-action",[162],{"id":157,"name":158,"slug":159,"color":160,"icon":159},"\u002Fblog\u002Fcovers\u002Fremplacer-github-actions-woodpecker-ci-self-hosted-vps-poster.svg",{"id":165,"slug":166,"slugs":167,"title":171,"excerpt":172,"readTime":173,"views":174,"isPinned":19,"publishedAt":175,"updatedAt":176,"category":177,"categories":178,"featuredImage":29,"bgImage":30,"posterImage":180,"relatedSolution":181},311,"onedev-en-vps-git-cicd-y-kanban-autoalojados",{"fr":168,"en":169,"ar":170,"es":166},"heberger-onedev-vps","self-host-onedev-git-cicd-and-kanban-in-one-container","onedev-على-vps-git-وcicd-وkanban-في-حاوية-واحدة","OneDev en VPS: Git, CI\u002FCD y Kanban autoalojados","Aloje OneDev en su VPS: forja Git privada, pipelines CI\u002FCD visuales y Kanban integrados. Un solo contenedor, sin suscripción por desarrollador.",6,3,"2026-08-28T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":17,"name":23,"slug":24,"color":25,"icon":26},[179],{"id":17,"name":23,"slug":24,"color":25,"icon":26},"\u002Fblog\u002Fcovers\u002Fheberger-onedev-vps-poster.svg",{"categorySlug":33,"appSlug":182},"onedev",1793166197400]