Integración de CI/CD y NAS con Docker, Portainer y GitLab

1. Preparación del entorno base

1.1 Requisitos del servidor

  • Arquitectura x86 (se recomienda mínimo 4 núcleos y 8 GB de RAM; el almacenamiento depande de la necesidad)
  • Sistema operativo: Ubuntu 22.04 LTS o CentOS Stream 9
  • Red: Se aconseja IP fija o nombre de dominio

1.2 Instalación de Docker y Docker Compose

# Ejemplo en Ubuntu
sudo apt update && sudo apt install -y docker.io docker-compose
sudo systemctl enable docker && systemctl start docker

# Agregar usuario al grupo docker (evitar sudo frecuente)
sudo usermod -aG docker $USER && newgrp docker

2. Despliegue de servicios pirncipales

2.1 Orquestación con Docker Compose

Cree el archivo docker-compose.yml con los siguientes servicios:

version: '3.8'

services:
  # Portainer - gestión de contenedores
  portainer:
    image: portainer/portainer-ce:latest
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    restart: unless-stopped

  # Base de datos PostgreSQL
  postgres:
    image: postgres:15
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: contraseña_segura_123
      POSTGRES_DB: db_principal
    volumes:
      - pg_data:/var/lib/postgresql/data
    restart: always

  # GitLab CE (repositorio + CI/CD integrado)
  gitlab:
    image: gitlab/gitlab-ce:latest
    ports:
      - "8081:80"
      - "2222:22"
    volumes:
      - gitlab_config:/etc/gitlab
      - gitlab_logs:/var/log/gitlab
      - gitlab_data:/var/opt/gitlab
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://mi-dominio.com:8081'
        gitlab_rails['db_adapter'] = 'postgresql'
        gitlab_rails['db_username'] = 'admin'
        gitlab_rails['db_password'] = 'contraseña_segura_123'
        gitlab_rails['db_host'] = 'postgres'
        gitlab_rails['db_database'] = 'db_principal'
    depends_on:
      - postgres
    restart: unless-stopped

  # Nextcloud - nube privada
  nextcloud:
    image: nextcloud:latest
    ports:
      - "8082:80"
    volumes:
      - nextcloud_data:/var/www/html
    environment:
      - POSTGRES_HOST=postgres
      - POSTGRES_DB=db_principal
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=contraseña_segura_123
    depends_on:
      - postgres
    restart: unless-stopped

  # Jellyfin - servidor multimedia
  jellyfin:
    image: jellyfin/jellyfin:latest
    ports:
      - "8096:8096"
    volumes:
      - /ruta/a/media:/media
      - jellyfin_config:/config
      - jellyfin_cache:/cache
    restart: unless-stopped

  # qBittorrent - cliente de descargas
  qbittorrent:
    image: linuxserver/qbittorrent:latest
    ports:
      - "8083:8080"
      - "6881:6881"
      - "6881:6881/udp"
    volumes:
      - /ruta/a/descargas:/downloads
      - qbittorrent_config:/config
    environment:
      - PUID=1000
      - PGID=1000
    restart: unless-stopped

volumes:
  portainer_data:
  pg_data:
  gitlab_config:
  gitlab_logs:
  gitlab_data:
  nextcloud_data:
  jellyfin_config:
  jellyfin_cache:
  qbittorrent_config:

2.2 Iniciar servicios

docker-compose up -d

3. Configuración del sistema NAS

3.1 Despliegue de NAS Tools (gestión de contenido multimedia)

docker run -d \
  --name nastools \
  -v /ruta/a/descargas:/media \
  -v /ruta/a/config:/config \
  -p 3000:3000 \
  --restart unless-stopped \
  nastool/nastool:latest

3.2 Puntos clave de configuración

  • Scraping de metadatos: Configure la API key de TMDB en NAS Tools. Sincronice las rutas de medios con Jellyfin.
  • Automatización: Defina reglas de suscripción RSS para descargas automáticas. Establezca reglas de renombrado (ej: /media/Movies/Nombre Película (2023)/Nombre Película (2023).mkv).

4. Integración del pipeline CI/CD

4.1 Ejemplo de GitLab CI (archivo .gitlab-ci.yml)

stages:
  - build
  - test
  - deploy

variables:
  DOCKER_HOST: tcp://docker:2375

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t mi-registro/app:${CI_COMMIT_SHORT_SHA} .
    - docker push mi-registro/app:${CI_COMMIT_SHORT_SHA}

deploy:
  stage: deploy
  image: alpine:3.15
  script:
    - apk add --no-cache openssh-client
    - ssh usuario@servidor-prod "docker pull mi-registro/app:${CI_COMMIT_SHORT_SHA}"
    - ssh usuario@servidor-prod "docker-compose -f /app/docker-compose.prod.yml up -d"
  only:
    - main

4.2 Integración con Jenkins (opcional)

Agregue el servicio Jenkins en el mismo docker-compose.yml:

jenkins:
  image: jenkins/jenkins:lts
  ports:
    - "8080:8080"
  volumes:
    - jenkins_data:/var/jenkins_home
    - /var/run/docker.sock:/var/run/docker.sock

Configure un pipeline de Jenkins que se active mediante webhook desde GitLab.

5. Seguridad y optimización

5.1 Medidas de seguridad

  • Aislamiento de red: Cree una red interna en Docker Compose: ``` networks: interna: driver: bridge internal: true

  • Proxy inverso (recomendado Traefik): ``` traefik: image: traefik:latest command: - "--providers.docker=true" - "--entrypoints.web.address=:80" ports: - "80:80" volumes: - /var/run/docker.sock:/var/run/docker.sock

    
    

5.2 Optimización de almacenamiento

  • Utilice sistemas de archivos como ZFS o Btrfs para crear pools de almacenamiento.
  • Configure SnapRAID para redundancia de datos.
  • Realice copias de seguridad periódicas de datos críticos en Nextcloud.

6. Resumen de accesos

Servicio URL Descripción
Portainer http://ip-servidor:9000 Gestión de contenedores
GitLab http://ip-servidor:8081 Repositorio y CI/CD
Nextcloud http://ip-servidor:8082 Nube privada
Jellyfin http://ip-servidor:8096 Servidor multimedia
qBittorrent http://ip-servidor:8083 Gestor de descargas
NAS Tools http://ip-servidor:3000 Automatización de contenido

Solución de problemas comunes

  • Permisos de Docker: ``` sudo chown -R 1000:1000 /ruta/a/media
  • Decodificación por hardware en Jellyfin: ```

    Agregar en docker-compose.yml

    devices: - /dev/dri:/dev/dri
  • Inicialización lenta de GitLab: ``` docker logs gitlab -f
    
    Ajuste la memoria del servidor (mínimo 4 GB RAM).
    
    

Esta configuración ofrece un ecosistema privado completo con gestión de código, compilación automatizada, almacenamiento NAS y servicios multimedia, todo administrable desde Portainer.

Etiquetas: Docker Portainer GitLab CI Nextcloud Jellyfin

Publicado el 7-15 06:34