Guía de Despliegue - Fyso
Esta guía explica cómo desplegar diferentes instancias (MVPs) del proyecto Fyso en el servidor de producción.
Arquitectura de Despliegue
Cada MVP se despliega en una carpeta independiente en el home del usuario fyso y corre como un conjunto de procesos PM2 separados.
| Componente | Descripción |
|---|---|
| Nginx | Actúa como Reverse Proxy, manejando SSL (Certbot) y redirigiendo el tráfico al puerto del MVP correspondiente. |
| PM2 | Gestor de procesos para el API (Bun) y la Web (Next.js). |
| Bun | Runtime utilizado para la ejecución y construcción. |
Script de Despliegue Genérico
Se ha implementado un script centralizado deploy-generic.sh que automatiza todo el proceso.
Uso del Script Genérico
El script acepta 4 parámetros:
MVP_NAME: Nombre de la instancia (ej:mvp2,mvp3).BRANCH: Rama de Git a desplegar.API_PORT: Puerto donde correrá el API.WEB_PORT: Puerto donde correrá la Web (Next.js).
./deploy-generic.sh "nombre" "rama" "puerto_api" "puerto_web"
Ejemplo: Crear un nuevo MVP (MVP3)
- Crea un archivo
deploy-mvp3-git.sh:#!/bin/bash
./deploy-generic.sh "mvp3" "feat/mvp3-branch" "3005" "3004" - Dale permisos de ejecución:
chmod +x deploy-mvp3-git.sh - Ejecútalo:
./deploy-mvp3-git.sh
Configuración de Nginx
Cuando subas un nuevo MVP (ej. MVP3), debes configurar Nginx en el servidor:
- SSH al servidor:
ssh fyso@212.47.245.39 - Crear configuración en
/etc/nginx/sites-available/mvp3.fyso.dev:server {
server_name mvp3.fyso.dev;
location / {
proxy_pass http://localhost:3004; # Puerto WEB del MVP
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
listen 80;
} - Habilitar y pedir certificado SSL:
sudo ln -s /etc/nginx/sites-available/mvp3.fyso.dev /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d mvp3.fyso.dev
Variables de Entorno (.env)
El script genera automáticamente el archivo .env básico.
Nota Importante: El script preserva la OPENAI_API_KEY si ya existe en el servidor. Si es un despliegue nuevo, deberás editar el .env manualmente la primera vez o actualizar el script base.
Variables MCP (MVP-5)
Para el MCP público (ej: mvp5.fyso.dev) se deben configurar estas variables:
MCP_SERVER_URL: URL pública del MCP (ej:https://mvp5.fyso.dev/mcp). Se usa para generar la configuración de Claude Desktop.MCP_SERVER_PORT: Puerto del MCP server (ej:3006).MCP_SERVER_PATH: Path del MCP server (default/mcp).
El MCP server corre como proceso separado (Bun) y necesita:
FYSO_API_URL: URL del API (ej:http://localhost:3005/api).FYSO_API_KEY: No se configura a nivel servidor para multi-tenant; el cliente la envía via headerX-API-Key.
Troubleshooting MCP (MVP-6)
Sintomas vistos (30 Jan 2026):
406 Not Acceptable: Client must accept both application/json and text/event-streamStreamable HTTP error: Bad Request: No valid session- Tool calls fallan con:
API response was not JSON (404) ... nginx
Resolucion aplicada:
- Aceptar headers correctos en el server MCP
- El cliente HTTP debe enviar
Accept: application/json, text/event-stream. - Se agrego un merge de
Acceptenpackages/mcp-server/src/http-server.tspara evitar el 406.
- El cliente HTTP debe enviar
- Usar el endpoint correcto
- HTTP:
https://mvp6.fyso.dev/mcp - SSE:
https://mvp6.fyso.dev/mcp/sse
- HTTP:
- Autenticacion
- Preferir
Authorization: Bearer <API_KEY>(tambien se aceptaX-API-Key).
- Preferir
- FYSO_API_URL mal formado
- Se detecto
FYSO_API_URL=http://localhost:\3012/api(backslash) en.env. - Corregir a
http://localhost:3012/apipara evitar 404 HTML de nginx en tool calls.
- Se detecto
Comandos recomendados (Claude Code CLI):
claude mcp add --transport http mvp6 https://mvp6.fyso.dev/mcp \
--header "Authorization: Bearer <TU_API_KEY>"
Lecciones Aprendidas (MVP-4 Deployment)
Durante el despliegue del MVP-4 se identificaron puntos críticos que deben considerarse para futuros lanzamientos:
-
Dependencia de Runtime (Bun vs Node):
- Problema: Comandos como
turbointentan invocarnodepor defecto. Si el servidor solo tienebun, estos comandos fallarán. - Solución: Ejecutar los scripts de base de datos directamente con Bun (
bun run src/migrate.ts) en lugar de usar el wrapper de Turbo o scripts de npm que dependan de Node.
- Problema: Comandos como
-
Migraciones y Seed:
- Problema: Al introducir cambios estructurales (como el sistema multi-tenant), el despliegue de código no es suficiente; la base de datos debe actualizarse.
- Solución: Asegurar que el script de despliegue ejecute
db:migrateydb:seed. Es recomendable usar rutas absolutas para el binario de Bun ($HOME/.bun/bin/bun).
-
Configuración de Nginx (Automatización):
- Problema: El nuevo subdominio no funciona hasta que Nginx lo reconoce.
- Solución: Cada nuevo MVP requiere su archivo en
/etc/nginx/sites-available/. - Tip de Bash: Al crear archivos de configuración vía SSH con
cat << "EOF", usa comillas en elEOFpara evitar que las variables de Nginx (como$http_upgrade) se expandan localmente en tu terminal antes de enviarse al servidor.
-
Verificación de Rama:
- Problema: Desplegar la rama incorrecta (ej.
mainen lugar de la rama de la fase). - Solución: Verificar siempre
git branch --show-currentantes de ejecutar el script de despliegue.
- Problema: Desplegar la rama incorrecta (ej.
Checklist para un Nuevo MVP
- Crear script
deploy-mvpX.shcon la rama y puertos correctos. - Verificar que los puertos API y WEB no colisionen con otros MVPs (
pm2 list). - Definir puerto MCP si aplica (MVP-5+) y agregarlo a PM2.
- Configurar
MCP_SERVER_URLen.envpara el subdominio correcto. - Ejecutar migraciones de DB en el servidor.
- Crear y habilitar sitio en Nginx.
- Ejecutar
certbotpara el nuevo subdominio. - Verificar logs de PM2 (
pm2 logs nombre-app).