Implementa tu propio servidor de CI/CD con Woodpecker y Traefik usando Docker Compose

✈️ Monta tu propio servidor de CI/CD con Woodpecker y Traefik con Docker Compose

¿Te gustaría tener tu propio sistema de integración continua (CI/CD) gratis, sin depender de servicios de terceros como GitHub Actions o GitLab CI? Hoy te traigo un proyecto de nivel intermedio-alto: un servidor de Woodpecker CI orquestado vía Traefik para gestión dinámica de dominios y HTTPS automático, todo preparado en un solo docker-compose.yml.

¿Qué es Woodpecker?

Woodpecker CI es una plataforma de integración y despliegue continuos ligera, open source y compatible con múltiples sistemas de control de versiones: Gitea, GitHub, GitLab, etc. Permite ejecutar pipelines remotos y automatizar toda la entrega de software, ¡en tus propios servidores!

¿Por qué usar Traefik con Woodpecker?

Traefik es un proxy inverso moderno que simplifica el enrutamiento de tráfico hacia tus contenedores. Se encarga del HTTPS automático con Let’s Encrypt, facilita el manejo de subdominios y equilibra la carga entre servicios. Ideal para exponer Woodpecker CI de forma segura y flexible en Internet.

Arquitectura del Compose

Este docker-compose.yml levanta:

  • traefik: Proxy inverso, router, gestiona certificados y enruta peticiones.
  • woodpecker-server: Nodo central de Woodpecker, encargado de la UI y la API.
  • woodpecker-agent: Ejecuta los jobs (pipelines) disparados por Woodpecker.

Todo ello orquestado en una red Docker interna, y expuesto bajo dominios y HTTPS gracias a Traefik.

Fichero docker-compose.yml completo

Rellena las variables donde corresponda: cambia tus.dominiocicd.com por tu dominio real y tus secretos.

version: '3.8'

services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: unless-stopped
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.letsencrypt.acme.email=[email protected]
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.letsencrypt.acme.tlschallenge=true
      - --api.dashboard=true
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080" # Dashboard de Traefik (opcional)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_letsencrypt:/letsencrypt
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`traefik.tus.dominiocicd.com`)"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
      - "traefik.http.routers.traefik.service=api@internal"

  woodpecker-server:
    image: woodpeckerci/woodpecker-server:latest
    container_name: woodpecker-server
    restart: unless-stopped
    environment:
      - WOODPECKER_OPEN=true
      - WOODPECKER_ADMIN=tu_usuario
      - WOODPECKER_HOST=https://cicd.tus.dominiocicd.com
      - WOODPECKER_GITEA=true
      - WOODPECKER_GITEA_URL=https://gitea.tus.dominiocicd.com
      - WOODPECKER_GITEA_CLIENT=client_id_de_gitea
      - WOODPECKER_GITEA_SECRET=client_secret_de_gitea
      - WOODPECKER_SERVER_PROTO=https
      - WOODPECKER_LOG_LEVEL=info
      - WOODPECKER_AGENT_SECRET=elige_un_password_muylargo
    depends_on:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.woodpecker.rule=Host(`cicd.tus.dominiocicd.com`)"
      - "traefik.http.routers.woodpecker.entrypoints=websecure"
      - "traefik.http.routers.woodpecker.tls.certresolver=letsencrypt"
    volumes:
      - woodpecker_data:/var/lib/woodpecker

  woodpecker-agent:
    image: woodpeckerci/woodpecker-agent:latest
    container_name: woodpecker-agent
    restart: unless-stopped
    environment:
      - WOODPECKER_SERVER=woodpecker-server:9000
      - WOODPECKER_AGENT_SECRET=elige_un_password_muylargo
    depends_on:
      - woodpecker-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

volumes:
  traefik_letsencrypt:
  woodpecker_data:

networks:
  default:
    name: cicd_net

Cómo desplegar tu CI/CD casero

  1. Personaliza el YAML: Cambia dominios, secretos y emails a los tuyos.
  2. Obtén tus client_id/client_secret: Desde tu proveedor de Git (p.e. Gitea). Necesitas registrar la OAuth App.
  3. Apunta los DNS: Los subdominios deben apuntar a la IP de tu VPS.
  4. Levanta el stack: Ejecuta docker compose up -d.
  5. Accede: Abre https://cicd.tus.dominiocicd.com y empieza a conectar repositorios.

Consejos rápidos y troubleshooting

  • El dashboard de Traefik estará visible solo vía https://traefik.tus.dominiocicd.com si has configurado el router/label.
  • El primer usuario en acceder a Woodpecker será el admin (ajusta con WOODPECKER_ADMIN).
  • Si tienes errores de HTTPS, revisa que los DNS apunten bien y ningún firewall bloquee puertos 80/443.
  • Woodpecker puede vincularse a GitHub o GitLab cambiando las variables de entorno. Consulta la documentación oficial.
  • Los logs de los servicios son muy útiles: docker logs woodpecker-server y docker logs traefik.

¿Te animas a tener todo el control de tu CI/CD y además aprender a orquestar servicios complejos? ¡Cuéntame en comentarios cómo fue tu experiencia!

Avatar

Por Mid