Añadir Nuevo Servicio Docker
Esta guía explica el proceso completo para añadir un nuevo servicio (aplicación) al servidor existente, configurarlo con su propio subdominio y asegurar que funcione correctamente con SSL.
Visión general del proceso
- Preparar la aplicación con Docker
- Configurar el registro DNS del subdominio
- Configurar Nginx como proxy inverso
- Obtener certificados SSL
- Probar y verificar el funcionamiento
1. Preparación de la aplicación con Docker
1.1 Crear el Dockerfile
Primero, asegúrate de que tu aplicación tenga un Dockerfile correctamente configurado:
# Ejemplo para una aplicación Node.jsFROM node:20-alpine AS build
WORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
FROM nginx:alpine AS productionCOPY --from=build /app/dist /usr/share/nginx/htmlCOPY nginx.conf /etc/nginx/conf.d/default.confEXPOSE 80CMD ["nginx", "-g", "daemon off;"]1.2 Elegir un puerto disponible
Cada contenedor debe utilizar un puerto único en el servidor. Verifica los puertos ya utilizados:
netstat -tuln | grep LISTENdocker psPara el nuevo servicio, selecciona un puerto no utilizado (ejemplo: 3001, 3002, etc.).
1.3 Clonar el repositorio en el servidor
# Acceder al directorio de repositoriosrepos
# Clonar el repositoriogit clone git@github.com:NeoDigital-MX/tu-nuevo-repositorio.gitcd tu-nuevo-repositorio/1.4 Construir y ejecutar el contenedor
# Construir la imagendocker build -t nombre-servicio:latest .
# Ejecutar el contenedor con el puerto seleccionadodocker run -d -p PUERTO_SELECCIONADO:80 --name nombre-servicio --restart always nombre-servicio:latest2. Configuración DNS
2.1 Acceder al panel de administración DNS
Inicia sesión en el panel de administración de DNS (Digital Ocean, Cloudflare, GoDaddy, etc.).
2.2 Crear un registro A para el subdominio
Añade un registro A que apunte al servidor:
| Tipo | Nombre | Valor | TTL |
|---|---|---|---|
| A | tuservicio | 164.92.117.29 | Automático |
Nota: Reemplaza “tuservicio” con el subdominio deseado y la IP con la de tu servidor.
2.3 Verificar la propagación DNS
Espera a que los cambios DNS se propaguen (puede tardar hasta 48 horas, aunque generalmente es más rápido):
nslookup tuservicio.neodigital.mx3. Configuración de Nginx
3.1 Crear archivo de configuración para el nuevo sitio
nano /etc/nginx/sites-available/tuservicio.neodigital.mxContenido inicial (sin SSL):
server { listen 80; server_name tuservicio.neodigital.mx;
location / { proxy_pass http://localhost:PUERTO_SELECCIONADO; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; }}3.2 Habilitar la configuración
ln -s /etc/nginx/sites-available/tuservicio.neodigital.mx /etc/nginx/sites-enabled/nginx -t # Verificar configuraciónsystemctl restart nginx4. Configuración SSL con Let’s Encrypt
4.1 Obtener certificado SSL
# Detener Nginx temporalmentesystemctl stop nginx
# Obtener el certificado en modo standalonecertbot certonly --standalone -d tuservicio.neodigital.mx
# Iniciar Nginx nuevamentesystemctl start nginx4.2 Actualizar configuración de Nginx para HTTPS
nano /etc/nginx/sites-available/tuservicio.neodigital.mxConfiguración actualizada:
server { listen 80; server_name tuservicio.neodigital.mx; return 301 https://$host$request_uri;}
server { listen 443 ssl; server_name tuservicio.neodigital.mx;
ssl_certificate /etc/letsencrypt/live/tuservicio.neodigital.mx/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tuservicio.neodigital.mx/privkey.pem;
# Configuración SSL optimizada ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
location / { proxy_pass http://localhost:PUERTO_SELECCIONADO; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; }}4.3 Aplicar la configuración actualizada
nginx -tsystemctl restart nginx5. Verificación y pruebas
5.1 Comprobar acceso HTTP/HTTPS
Abre un navegador y verifica:
5.2 Verificar redirección HTTP a HTTPS
Comprueba que http://tuservicio.neodigital.mx redirecciona a https://tuservicio.neodigital.mx
5.3 Verificar logs para detectar problemas
# Logs de Nginxtail -f /var/log/nginx/error.logtail -f /var/log/nginx/access.log
# Logs del contenedordocker logs nombre-servicio6. Configuración de CI/CD (opcional)
Para automatizar despliegues, actualiza o crea un nuevo workflow en .github/workflows/:
name: Deploy to Digital Ocean
on: push: branches: - main pull_request: types: - closed branches: - main
jobs: deploy: if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.merged == true) runs-on: ubuntu-latest
steps: - name: Deploy via SSH uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd ~/GitHub/repositories/tu-nuevo-repositorio git pull origin main docker build -t nombre-servicio:latest . docker stop nombre-servicio || true docker rm nombre-servicio || true docker run -d -p PUERTO_SELECCIONADO:80 --name nombre-servicio --restart always nombre-servicio:latest7. Solución de problemas comunes
7.1 Puerto ya en uso
# Verificar qué proceso está usando el puertolsof -i :PUERTO_SELECCIONADO# Onetstat -tulpn | grep PUERTO_SELECCIONADO
# Seleccionar un puerto diferente o detener el proceso que lo usa7.2 Problemas con certificados SSL
# Verificar certificadoscertbot certificates
# Renovar certificado específicocertbot certonly --force-renewal -d tuservicio.neodigital.mx7.3 Errores en Nginx
# Verificar sintaxis de configuraciónnginx -t
# Reiniciar Nginxsystemctl restart nginxConclusión
Siguiendo estos pasos, puedes añadir fácilmente nuevos servicios al servidor existente, cada uno con su propio subdominio y configuración aislada. Esta estructura modular permite escalar el servidor para alojar múltiples aplicaciones manteniendo cada servicio completamente independiente.