Complete rename across all layers: UI branding, package names (@smashpoint/web, @smashpoint/shared), infrastructure (Docker, DB config), seed data, documentation, and logo/favicon. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
12 KiB
Guia de Despliegue - SmashPoint
Esta guia cubre el proceso completo para desplegar SmashPoint 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/smashpoint.git
cd smashpoint
4. Configurar Variables de Entorno
cp apps/web/.env.example apps/web/.env
Editar el archivo .env:
# Base de datos - Produccion
DATABASE_URL="postgresql://smashpoint_user:PASSWORD_SEGURO@localhost:5432/smashpoint_db?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 smashpoint_user WITH PASSWORD 'PASSWORD_SEGURO';
-- Crear base de datos
CREATE DATABASE smashpoint_db OWNER smashpoint_user;
-- Otorgar permisos
GRANT ALL PRIVILEGES ON DATABASE smashpoint_db TO smashpoint_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 smashpoint_user md5
# Conexion remota (si es necesario)
host smashpoint_db smashpoint_user 192.168.1.0/24 md5
Reiniciar PostgreSQL:
sudo systemctl restart postgresql
4. Ejecutar Migraciones
cd /var/www/smashpoint
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: 'smashpoint',
cwd: '/var/www/smashpoint/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/smashpoint/error.log',
out_file: '/var/log/smashpoint/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/smashpoint
sudo chown $USER:$USER /var/log/smashpoint
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 smashpoint
# Reiniciar
pm2 restart smashpoint
# Recargar sin downtime
pm2 reload smashpoint
# Detener
pm2 stop smashpoint
# Monitoreo
pm2 monit
Configuracion de Nginx
1. Instalar Nginx
sudo apt install nginx
2. Crear Configuracion del Sitio
Crear /etc/nginx/sites-available/smashpoint:
# 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/smashpoint.access.log;
error_log /var/log/nginx/smashpoint.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/smashpoint/apps/web/public;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
3. Habilitar el Sitio
sudo ln -s /etc/nginx/sites-available/smashpoint /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=smashpoint_user
POSTGRES_PASSWORD=PASSWORD_SEGURO
POSTGRES_DB=smashpoint_db
DATABASE_URL=postgresql://smashpoint_user:PASSWORD_SEGURO@db:5432/smashpoint_db?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 smashpoint_user smashpoint_db > 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/smashpoint"
DATE=$(date +%Y%m%d_%H%M%S)
FILENAME="smashpoint_db_$DATE.sql.gz"
mkdir -p $BACKUP_DIR
# Crear backup
pg_dump -U smashpoint_user smashpoint_db | 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/smashpoint
# 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 smashpoint
Logs
# Logs de la aplicacion
pm2 logs smashpoint --lines 100
# Logs de Nginx
tail -f /var/log/nginx/smashpoint.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 smashpoint
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 smashpoint --err
# Verificar puertos
netstat -tlnp | grep 3000
# Verificar conexion a DB
psql -U smashpoint_user -h localhost smashpoint_db -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://smashpoint_user:PASSWORD@localhost:5432/smashpoint_db"
Nginx devuelve 502
# Verificar que la app este corriendo
pm2 status
# Verificar configuracion
sudo nginx -t
# Ver logs
tail -f /var/log/nginx/smashpoint.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