Paso a paso para desplegar OpusSuite en un servidor Ubuntu con MySQL, Nginx y PM2.
Verifica que tienes todo esto antes de ejecutar el instalador.
| Componente | Mínimo | Recomendado | Notas |
|---|---|---|---|
| SO | Ubuntu 22.04 | Ubuntu 24.04 | LTS obligatorio |
| RAM | 2 GB | 4 GB | Para compilar Next.js |
| CPU | 1 vCPU | 2 vCPU | PM2 cluster mode |
| Disco | 20 GB SSD | 40 GB SSD | Para fotos / uploads |
| MySQL | 8.0+ | 8.0+ | Ya instalado ✓ |
| Nginx | 1.18+ | 1.18+ | Ya instalado ✓ |
| Node.js | — | 20 LTS | El instalador lo instala |
| Redis | — | 7.0+ | El instalador lo instala |
El instalador configurará estos componentes. Los que ya tienes no se modifican.
Internet (usuario / navegador) ↓ HTTPS :443 Nginx (reverse proxy + SSL termination) ↙ ↘ Next.js :3000 NestJS :3001 (Frontend UI) (Backend API) ↓ MySQL :3306 Redis :6379 Los puertos 3000, 3001, 3306 y 6379 son internos al servidor — NO expuestos a internet.
Desde tu computadora local, sube el archivo opussuite.tar.gz al servidor.
# Subir el archivo scp opussuite.tar.gz root@IP_DE_TU_VPS:/var/www/ # Conectarse por SSH ssh root@IP_DE_TU_VPS
# Ir a /var/www cd /var/www # Descomprimir tar -xzf opussuite.tar.gz # Verificar la estructura ls -la opussuite/ # Debes ver: backend/ frontend/ nginx/ scripts/ README.md # Dar permisos de ejecución a los scripts chmod +x /var/www/opussuite/scripts/*.sh
Un solo comando instala todo. El script es interactivo y te pedirá la información necesaria.
sudo bash /var/www/opussuite/scripts/install.sh
Se creará un usuario MySQL dedicado para la app. Usa una contraseña fuerte y guárdala.
Ej: studio.tuempresa.com — debe estar ya apuntando a este VPS.
Let's Encrypt lo usará para notificarte antes de que expire el certificado (90 días).
⏱ Tiempo estimado: 10–20 minutos (dependiendo de la velocidad del VPS y la conexión a npm)
El instalador crea el archivo /var/www/opussuite/backend/.env con los valores base. Debes añadir las claves de los servicios externos.
nano /var/www/opussuite/backend/.env
# ── EMAIL (Resend — https://resend.com, plan gratuito 3000/mes) RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxx EMAIL_FROM=noreply@tudominio.com # ── STRIPE (https://stripe.com/es) STRIPE_SECRET_KEY=sk_live_xxxxxxxxxxxxxxxxxxxx STRIPE_PUBLISHABLE_KEY=pk_live_xxxxxxxxxxxxxxxxxxxx STRIPE_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxx # ── ALMACENAMIENTO (Cloudflare R2 — gratis hasta 10GB/mes) STORAGE_PROVIDER=r2 R2_ACCOUNT_ID=tu_account_id R2_ACCESS_KEY_ID=tu_access_key R2_SECRET_ACCESS_KEY=tu_secret R2_BUCKET_NAME=opussuite-assets R2_PUBLIC_URL=https://assets.tudominio.com # ── WEB PUSH (genera las claves en el siguiente paso) VAPID_PUBLIC_KEY=Bxxx... VAPID_PRIVATE_KEY=xxx...
npx web-push generate-vapid-keys # Copia las dos claves generadas en el .env
Si prefieres guardar las fotos en el propio VPS (más simple, pero sin CDN):
STORAGE_PROVIDER=local LOCAL_STORAGE_PATH=/var/www/opussuite/uploads LOCAL_STORAGE_URL=https://tudominio.com/uploads
# Guardar en nano: Ctrl+O, Enter, Ctrl+X # Reiniciar la aplicación para aplicar los cambios pm2 restart all # Verificar que todo arrancó bien pm2 status
Desde el panel de tu registrador de dominio (Namecheap, GoDaddy, Cloudflare, etc.):
| Tipo | Nombre | Valor | TTL |
|---|---|---|---|
| A | @ (raíz) | IP del VPS | 300 |
| A | www | IP del VPS | 300 |
| A | assets | IP del VPS o CF R2 | 300 |
# 1. Estado de los procesos PM2 pm2 status # Debes ver: opussuite-api (online) y opussuite-web (online) # 2. Verificar backend responde curl http://localhost:3001/api/v1/health # Respuesta esperada: {"status":"ok","timestamp":"..."} # 3. Verificar frontend responde curl -I http://localhost:3000 # Respuesta esperada: HTTP/1.1 200 OK # 4. Verificar MySQL mysql -u opussuite -p -e "SHOW TABLES;" opussuite_db # Debes ver 20+ tablas (User, Organization, Client, Project...) # 5. Verificar Redis redis-cli ping # Respuesta esperada: PONG # 6. Verificar Nginx nginx -t systemctl status nginx
# Ver estado en tiempo real pm2 monit # Ver logs en vivo (Ctrl+C para salir) pm2 logs opussuite-api # Backend pm2 logs opussuite-web # Frontend # Reiniciar sin downtime pm2 reload all # Reinicio completo pm2 restart all # Ver procesos pm2 list
# Hacer backup manual ahora bash /var/www/opussuite/scripts/backup.sh # Guarda en: /var/backups/opussuite/ # Configurar backup diario automático a las 2am crontab -e # Añadir esta línea: 0 2 * * * bash /var/www/opussuite/scripts/backup.sh
# Subir nueva versión del paquete, luego: bash /var/www/opussuite/scripts/update.sh # Hace backup automático antes de actualizar
El instalador configura la renovación automática. Para verificar que funciona:
certbot renew --dry-run # Sin errores = renovación automática funcionando certbot certificates # Ver fecha de expiración actual
pm2 logs opussuite-api --lines 50 # Lee el error específico. Causas comunes: # - Variables .env faltantes o incorrectas # - Puerto 3001 ocupado por otro proceso # - Error de conexión a MySQL o Redis
systemctl status mysql mysql -u opussuite -p opussuite_db # Si falla: verificar la contraseña en DATABASE_URL del .env
pm2 status # Verificar que los procesos están online pm2 restart all # Si están stopped/errored, reiniciar nginx -t # Verificar configuración Nginx tail -f /var/log/nginx/opussuite-error.log
# Crear swap si el VPS tiene poca RAM fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # Volver a compilar cd /var/www/opussuite/frontend && npm run build
# Verificar que el dominio resuelve a este servidor: dig +short tudominio.com # Debe mostrar la IP del VPS # Intentar manualmente: certbot --nginx -d tudominio.com -d www.tudominio.com
Estos servicios tienen plan gratuito suficiente para comenzar.
| Servicio | Para qué | Plan gratis | URL |
|---|---|---|---|
| Resend | Emails transaccionales | 3.000/mes | resend.com |
| Cloudflare R2 | Almacenamiento fotos | 10 GB/mes | cloudflare.com |
| Stripe | Pagos de clientes | 2.9% + 0.30€ por transacción | stripe.com/es |
| Let's Encrypt | SSL/HTTPS | 100% gratuito | Automático via Certbot |