- Add README.md with project overview, features, quick start guide, project structure, environment variables, and scripts - Add docs/API.md with complete API reference for all endpoints - Add docs/DEPLOYMENT.md with production deployment guide covering PM2, Nginx, SSL, and Docker options - Add docker-compose.yml for containerized deployment - Add Dockerfile with multi-stage build for optimized production image - Add .dockerignore for efficient Docker builds Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
12 KiB
Guia de Despliegue - Padel Pro
Esta guia cubre el proceso completo para desplegar Padel Pro en un entorno de produccion.
Tabla de Contenidos
- Requisitos Previos
- Configuracion del Entorno
- Configuracion de Base de Datos
- Despliegue con PM2
- Configuracion de Nginx
- SSL con Lets Encrypt
- Despliegue con Docker
- Monitoreo y Mantenimiento
Requisitos Previos
Software Requerido
| Software | Version | Proposito |
|---|---|---|
| Node.js | 20.x LTS | Runtime de JavaScript |
| PostgreSQL | 16.x | Base de datos |
| pnpm | 8.15.0+ | Gestor de paquetes |
| Git | 2.x | Control de versiones |
| Nginx | 1.24+ | Servidor web / Proxy inverso |
| PM2 | 5.x | Gestor de procesos (opcional) |
| Docker | 24.x | Contenedores (opcional) |
Recursos del Servidor
Minimos:
- CPU: 2 cores
- RAM: 4 GB
- Disco: 20 GB SSD
Recomendados:
- CPU: 4 cores
- RAM: 8 GB
- Disco: 50 GB SSD
Configuracion del Entorno
1. Instalar Node.js 20
# Usando nvm (recomendado)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20
nvm alias default 20
# Verificar instalacion
node --version # v20.x.x
2. Instalar pnpm
npm install -g pnpm
pnpm --version # 8.x.x
3. Clonar el Repositorio
cd /var/www
git clone https://github.com/tu-organizacion/padel-pro.git
cd padel-pro
4. Configurar Variables de Entorno
cp apps/web/.env.example apps/web/.env
Editar el archivo .env:
# Base de datos - Produccion
DATABASE_URL="postgresql://padel_user:PASSWORD_SEGURO@localhost:5432/padel_pro?schema=public"
# NextAuth - IMPORTANTE: Generar clave unica
NEXTAUTH_SECRET="$(openssl rand -base64 32)"
NEXTAUTH_URL="https://tudominio.com"
# Aplicacion
NEXT_PUBLIC_APP_URL="https://tudominio.com"
NODE_ENV="production"
IMPORTANTE: Nunca usar las credenciales de ejemplo en produccion. Generar una clave secreta unica con
openssl rand -base64 32.
5. Instalar Dependencias
pnpm install --frozen-lockfile
6. Construir la Aplicacion
pnpm build
Configuracion de Base de Datos
1. Instalar PostgreSQL 16
# Ubuntu/Debian
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install postgresql-16
# Iniciar servicio
sudo systemctl start postgresql
sudo systemctl enable postgresql
2. Crear Base de Datos y Usuario
sudo -u postgres psql
-- Crear usuario
CREATE USER padel_user WITH PASSWORD 'PASSWORD_SEGURO';
-- Crear base de datos
CREATE DATABASE padel_pro OWNER padel_user;
-- Otorgar permisos
GRANT ALL PRIVILEGES ON DATABASE padel_pro TO padel_user;
-- Salir
\q
3. Configurar Conexion Remota (si es necesario)
Editar /etc/postgresql/16/main/postgresql.conf:
listen_addresses = 'localhost' # o '*' para conexiones remotas
Editar /etc/postgresql/16/main/pg_hba.conf:
# Conexion local
local all padel_user md5
# Conexion remota (si es necesario)
host padel_pro padel_user 192.168.1.0/24 md5
Reiniciar PostgreSQL:
sudo systemctl restart postgresql
4. Ejecutar Migraciones
cd /var/www/padel-pro
pnpm db:generate
pnpm db:push
5. Sembrar Datos Iniciales (Opcional)
cd apps/web
pnpm db:seed
Despliegue con PM2
1. Instalar PM2
npm install -g pm2
2. Crear Archivo de Configuracion
Crear ecosystem.config.js en la raiz del proyecto:
module.exports = {
apps: [
{
name: 'padel-pro',
cwd: '/var/www/padel-pro/apps/web',
script: 'node_modules/next/dist/bin/next',
args: 'start',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
},
// Configuracion de logs
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
error_file: '/var/log/padel-pro/error.log',
out_file: '/var/log/padel-pro/out.log',
merge_logs: true,
// Reinicio automatico
max_memory_restart: '1G',
exp_backoff_restart_delay: 100
}
]
};
3. Crear Directorio de Logs
sudo mkdir -p /var/log/padel-pro
sudo chown $USER:$USER /var/log/padel-pro
4. Iniciar la Aplicacion
pm2 start ecosystem.config.js --env production
5. Configurar Inicio Automatico
pm2 startup
pm2 save
6. Comandos Utiles de PM2
# Ver estado
pm2 status
# Ver logs
pm2 logs padel-pro
# Reiniciar
pm2 restart padel-pro
# Recargar sin downtime
pm2 reload padel-pro
# Detener
pm2 stop padel-pro
# Monitoreo
pm2 monit
Configuracion de Nginx
1. Instalar Nginx
sudo apt install nginx
2. Crear Configuracion del Sitio
Crear /etc/nginx/sites-available/padel-pro:
# Redirigir HTTP a HTTPS
server {
listen 80;
listen [::]:80;
server_name tudominio.com www.tudominio.com;
location / {
return 301 https://$host$request_uri;
}
# Let's Encrypt challenge
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
# Configuracion HTTPS
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name tudominio.com www.tudominio.com;
# SSL (sera configurado por Certbot)
ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Configuracion SSL moderna
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
# Logs
access_log /var/log/nginx/padel-pro.access.log;
error_log /var/log/nginx/padel-pro.error.log;
# Tamano maximo de subida
client_max_body_size 10M;
# Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
# Proxy a Next.js
location / {
proxy_pass http://127.0.0.1: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;
proxy_read_timeout 86400;
}
# Cache para assets estaticos
location /_next/static {
proxy_pass http://127.0.0.1:3000;
proxy_cache_valid 60m;
add_header Cache-Control "public, immutable";
}
# Archivos estaticos
location /static {
alias /var/www/padel-pro/apps/web/public;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
3. Habilitar el Sitio
sudo ln -s /etc/nginx/sites-available/padel-pro /etc/nginx/sites-enabled/
# Verificar configuracion
sudo nginx -t
# Recargar Nginx
sudo systemctl reload nginx
SSL con Lets Encrypt
1. Instalar Certbot
sudo apt install certbot python3-certbot-nginx
2. Obtener Certificado
sudo certbot --nginx -d tudominio.com -d www.tudominio.com
3. Renovacion Automatica
Certbot configura automaticamente la renovacion. Verificar:
sudo certbot renew --dry-run
4. Configurar Cron (si es necesario)
sudo crontab -e
Agregar:
0 12 * * * /usr/bin/certbot renew --quiet
Despliegue con Docker
1. Archivo docker-compose.yml
El archivo docker-compose.yml ya esta incluido en el proyecto. Ubicado en /root/Padel/docker-compose.yml.
2. Configurar Variables
Crear .env en la raiz del proyecto:
POSTGRES_USER=padel_user
POSTGRES_PASSWORD=PASSWORD_SEGURO
POSTGRES_DB=padel_pro
DATABASE_URL=postgresql://padel_user:PASSWORD_SEGURO@db:5432/padel_pro?schema=public
NEXTAUTH_SECRET=tu-clave-secreta-generada
NEXTAUTH_URL=https://tudominio.com
NEXT_PUBLIC_APP_URL=https://tudominio.com
3. Construir e Iniciar
# Construir imagenes
docker compose build
# Iniciar servicios
docker compose up -d
# Ver logs
docker compose logs -f
# Ejecutar migraciones
docker compose exec web pnpm db:push
# Sembrar datos (opcional)
docker compose exec web pnpm db:seed
4. Comandos Utiles
# Detener servicios
docker compose down
# Reiniciar
docker compose restart
# Ver estado
docker compose ps
# Acceder al contenedor
docker compose exec web sh
# Backup de base de datos
docker compose exec db pg_dump -U padel_user padel_pro > backup.sql
Monitoreo y Mantenimiento
Monitoreo con PM2
# Dashboard en tiempo real
pm2 monit
# Metricas web (opcional)
pm2 install pm2-server-monit
Backup de Base de Datos
Crear script /opt/scripts/backup-padel.sh:
#!/bin/bash
BACKUP_DIR="/var/backups/padel-pro"
DATE=$(date +%Y%m%d_%H%M%S)
FILENAME="padel_pro_$DATE.sql.gz"
mkdir -p $BACKUP_DIR
# Crear backup
pg_dump -U padel_user padel_pro | gzip > "$BACKUP_DIR/$FILENAME"
# Eliminar backups antiguos (mantener 7 dias)
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Backup completado: $FILENAME"
Configurar cron:
chmod +x /opt/scripts/backup-padel.sh
crontab -e
0 2 * * * /opt/scripts/backup-padel.sh
Actualizaciones
cd /var/www/padel-pro
# Obtener cambios
git pull origin main
# Instalar dependencias
pnpm install --frozen-lockfile
# Construir
pnpm build
# Ejecutar migraciones (si hay)
pnpm db:push
# Reiniciar aplicacion
pm2 reload padel-pro
Logs
# Logs de la aplicacion
pm2 logs padel-pro --lines 100
# Logs de Nginx
tail -f /var/log/nginx/padel-pro.error.log
# Logs de PostgreSQL
tail -f /var/log/postgresql/postgresql-16-main.log
Health Check
Crear script /opt/scripts/health-check.sh:
#!/bin/bash
HEALTH_URL="https://tudominio.com/api/health"
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" $HEALTH_URL)
if [ $RESPONSE != "200" ]; then
echo "ERROR: Health check failed with status $RESPONSE"
# Enviar alerta (email, Slack, etc.)
pm2 restart padel-pro
fi
Seguridad
Firewall (UFW)
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
Fail2ban
sudo apt install fail2ban
sudo systemctl enable fail2ban
Headers de Seguridad
Agregar a la configuracion de Nginx:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Solucion de Problemas
La aplicacion no inicia
# Verificar logs
pm2 logs padel-pro --err
# Verificar puertos
netstat -tlnp | grep 3000
# Verificar conexion a DB
psql -U padel_user -h localhost padel_pro -c "SELECT 1"
Error de conexion a base de datos
# Verificar servicio
sudo systemctl status postgresql
# Verificar logs
tail -f /var/log/postgresql/postgresql-16-main.log
# Probar conexion
psql "postgresql://padel_user:PASSWORD@localhost:5432/padel_pro"
Nginx devuelve 502
# Verificar que la app este corriendo
pm2 status
# Verificar configuracion
sudo nginx -t
# Ver logs
tail -f /var/log/nginx/padel-pro.error.log
Checklist de Produccion
- Variables de entorno configuradas correctamente
- Base de datos con password seguro
- NEXTAUTH_SECRET generado de forma segura
- SSL/HTTPS configurado
- Firewall configurado
- Backups automaticos
- Monitoreo configurado
- Logs rotados
- Credenciales por defecto cambiadas
- Rate limiting configurado
- Health checks implementados