Saltearse al contenido

Despliegue de la Aplicación

En esta sección documentamos el proceso de despliegue del Wiki en el servidor de producción, utilizando Docker, Nginx y SSL.

Clonar el repositorio

Lo primero es obtener el código fuente en el servidor:

Ventana de terminal
# Ir al directorio de repositorios
repos
# Clonar el repositorio
git clone git@github.com:NeoDigital-MX/neodigital-wiki.git
cd neodigital-wiki/
# Cambiar a la rama DOCKER que contiene la configuración necesaria
git checkout DOCKER

Instalar dependencias del servidor

Necesitamos instalar Nginx para funcionar como proxy inverso y Certbot para obtener certificados SSL:

Ventana de terminal
# Instalar Nginx y Certbot
apt install -y nginx certbot python3-certbot-nginx

Configuración de Nginx

Configuración global

Modificamos la configuración principal de Nginx para optimizarla:

Ventana de terminal
# Hacer respaldo de la configuración original
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
# Editar la configuración
nano /etc/nginx/nginx.conf

Configuración optimizada:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
multi_accept on;
}
http {
##
# Configuraciones básicas
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
server_tokens off;
client_max_body_size 64M;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Configuraciones SSL
##
ssl_protocols TLSv1.2 TLSv1.3; # Eliminando protocolos inseguros
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
##
# Configuraciones de Logging
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Configuraciones Gzip
##
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Configuraciones de Virtual Host
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

Configuración específica del sitio

Creamos una configuración para nuestro subdominio:

Ventana de terminal
# Crear configuración para el sitio
nano /etc/nginx/sites-available/wiki.neodigital.mx

Contenido:

server {
listen 80;
server_name wiki.neodigital.mx;
location / {
proxy_pass http://localhost:3000;
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;
}
}

Activamos la configuración:

Ventana de terminal
ln -s /etc/nginx/sites-available/wiki.neodigital.mx /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default # Eliminar configuración predeterminada
nginx -t # Verificar configuración
systemctl restart nginx

Construcción y ejecución del contenedor Docker

Ahora construimos la imagen Docker y ejecutamos el contenedor:

Ventana de terminal
# Construir la imagen Docker
docker build -t neodigital-wiki:latest .
# Ejecutar el contenedor
# Mapeamos el puerto 3000 del host al 80 del contenedor
docker run -d -p 3000:80 --name wiki --restart always neodigital-wiki:latest

Configuración del DNS

Antes de continuar, verificamos que el DNS apunte correctamente al servidor:

Ventana de terminal
nslookup wiki.neodigital.mx

El resultado debe mostrar la IP de nuestro servidor (164.92.117.29).

Configuración de SSL con Let’s Encrypt

Configuración de firewall

Nos aseguramos que los puertos necesarios están abiertos:

Ventana de terminal
# Permitir tráfico HTTP y HTTPS
ufw allow 80/tcp
ufw allow 443/tcp

Obtención del certificado SSL

Obtenemos un certificado SSL gratuito con Let’s Encrypt:

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

Configuración de Nginx para HTTPS

Actualizamos la configuración de Nginx para habilitar HTTPS:

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

Configuración actualizada:

server {
listen 80;
server_name wiki.neodigital.mx;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name wiki.neodigital.mx;
ssl_certificate /etc/letsencrypt/live/wiki.neodigital.mx/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.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:3000;
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;
}
}

Reiniciamos Nginx:

Ventana de terminal
nginx -t
systemctl restart nginx

Verificación del despliegue

Después de estos pasos, nuestro Wiki debe estar accesible en:

Podemos verificar el estado del servicio con:

Ventana de terminal
# Verificar estado de Nginx
systemctl status nginx
# Verificar estado del contenedor
docker ps
docker logs wiki

Siguientes pasos

Con la aplicación desplegada y funcionando, configuramos la integración continua y el despliegue continuo para automatizar las actualizaciones.