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.