Saltearse al contenido

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

  1. Preparar la aplicación con Docker
  2. Configurar el registro DNS del subdominio
  3. Configurar Nginx como proxy inverso
  4. Obtener certificados SSL
  5. 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.js
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine AS production
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["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:

Ventana de terminal
netstat -tuln | grep LISTEN
docker ps

Para el nuevo servicio, selecciona un puerto no utilizado (ejemplo: 3001, 3002, etc.).

1.3 Clonar el repositorio en el servidor

Ventana de terminal
# Acceder al directorio de repositorios
repos
# Clonar el repositorio
git clone git@github.com:NeoDigital-MX/tu-nuevo-repositorio.git
cd tu-nuevo-repositorio/

1.4 Construir y ejecutar el contenedor

Ventana de terminal
# Construir la imagen
docker build -t nombre-servicio:latest .
# Ejecutar el contenedor con el puerto seleccionado
docker run -d -p PUERTO_SELECCIONADO:80 --name nombre-servicio --restart always nombre-servicio:latest

2. 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:

TipoNombreValorTTL
Atuservicio164.92.117.29Automá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):

Ventana de terminal
nslookup tuservicio.neodigital.mx

3. Configuración de Nginx

3.1 Crear archivo de configuración para el nuevo sitio

Ventana de terminal
nano /etc/nginx/sites-available/tuservicio.neodigital.mx

Contenido 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

Ventana de terminal
ln -s /etc/nginx/sites-available/tuservicio.neodigital.mx /etc/nginx/sites-enabled/
nginx -t # Verificar configuración
systemctl restart nginx

4. Configuración SSL con Let’s Encrypt

4.1 Obtener certificado SSL

Ventana de terminal
# Detener Nginx temporalmente
systemctl stop nginx
# Obtener el certificado en modo standalone
certbot certonly --standalone -d tuservicio.neodigital.mx
# Iniciar Nginx nuevamente
systemctl start nginx

4.2 Actualizar configuración de Nginx para HTTPS

Ventana de terminal
nano /etc/nginx/sites-available/tuservicio.neodigital.mx

Configuració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

Ventana de terminal
nginx -t
systemctl restart nginx

5. 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

Ventana de terminal
# Logs de Nginx
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
# Logs del contenedor
docker logs nombre-servicio

6. 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:latest

7. Solución de problemas comunes

7.1 Puerto ya en uso

Ventana de terminal
# Verificar qué proceso está usando el puerto
lsof -i :PUERTO_SELECCIONADO
# O
netstat -tulpn | grep PUERTO_SELECCIONADO
# Seleccionar un puerto diferente o detener el proceso que lo usa

7.2 Problemas con certificados SSL

Ventana de terminal
# Verificar certificados
certbot certificates
# Renovar certificado específico
certbot certonly --force-renewal -d tuservicio.neodigital.mx

7.3 Errores en Nginx

Ventana de terminal
# Verificar sintaxis de configuración
nginx -t
# Reiniciar Nginx
systemctl restart nginx

Conclusió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.