Saltar al contenido principal

Despliegue

FlowFit se entrega como aplicación de escritorio. Esta página cubre el entorno de desarrollo y la generación del instalador .exe.

Requisitos

  • Node 26 (la misma versión que se empaqueta como runtime del sidecar).
  • npm (incluido con Node).
  • Para construir el instalador de escritorio: Rust + toolchain MSVC, Build Tools de Visual Studio (C++) y WebView2 Runtime en Windows.

Variables de entorno

Copia .env.example a .env y ajusta lo necesario:

VariablePropósito
DATABASE_URLRuta del archivo SQLite (file:./dev.db en dev).
SERVER_PORTPuerto del sidecar Fastify (por defecto 3001).
JWT_SECRETClave de firma de los JWT. En producción se autogenera.
JWT_ISSUER / JWT_TTL_DAYSEmisor y vigencia del token (30 días).
WA_TOKEN_KEYClave para cifrar secretos en DB (token de Twilio).
TWILIO_WEBHOOK_URLURL pública del webhook de Twilio (opcional).
BACKUP_DIRCarpeta de respaldo (la que sincroniza Nextcloud).
BACKUP_DEBOUNCE_MS / BACKUP_MAX_INTERVAL_MS / BACKUP_STALE_AFTER_MSAfinado del respaldo.

En la app empaquetada, JWT_SECRET y WA_TOKEN_KEY se generan y persisten en secrets.json (permisos 600) junto a la base de datos si faltan. La carpeta de respaldo se configura desde Configuración → Respaldo en la UI y vive en AppSettings.

Entorno de desarrollo

npm install # instala dependencias
npm run db:migrate # aplica migraciones (prisma migrate dev)
npm run db:generate # genera el cliente Prisma
npm run db:seed # (opcional) datos de demostración
npm run server:dev # sidecar Fastify con recarga (tsx watch)
npm run dev # frontend Vite

:::tip Cliente Prisma tras migrar prisma migrate dev no regenera el cliente automáticamente. Si ves errores 500 en tiempo de ejecución después de migrar, corre npm run db:generate. :::

Modo escritorio en desarrollo

npm run tauri dev # levanta el front + sidecar dentro de la ventana Tauri

Generar el instalador .exe (Windows)

El empaquetado está implementado y verificado en Linux (.deb/.rpm); el instalador NSIS de Windows debe construirse en una máquina Windows porque los native addons (better-sqlite3, argon2) traen prebuilds por plataforma.

git pull
npm ci
npm run tauri build
# Instalador NSIS en:
# src-tauri\target\release\bundle\nsis\FlowFit_<versión>_x64-setup.exe

beforeBuildCommand encadena tres pasos:

  1. build:sidecar — empaqueta server/server.ts con esbuild a src-tauri/sidecar/server.mjs, deja los addons nativos y Prisma como node_modules externos, y copia las migraciones.
  2. build:node — copia el binario de Node como externalBin para que el cliente no necesite Node instalado.
  3. build — compila el frontend con Vite (usa .env.production, VITE_API_BASE=http://127.0.0.1:3001).

Qué pasa al arrancar la app instalada

  1. Tauri (src-tauri/src/lib.rs) resuelve el app-data, arma DATABASE_URL=file:<appdata>/flowfit.db y lanza el sidecar node.
  2. El sidecar: bootEnv (secretos) → restoreBoot (restauración staged) → migrateBoot (migraciones .sql sin el CLI de Prisma) → abre Prisma → ensureDefaults → escucha en 127.0.0.1:3001.
  3. Un health-gate espera a que /health responda 200 y entonces muestra la ventana. Al cerrar, Tauri mata el sidecar (no deja node.exe huérfano).

El instalador va sin firmar (alcance de cliente único): Windows SmartScreen mostrará un aviso la primera vez. Detalle completo en docs/EMPAQUETADO-TAURI.md.

Primer arranque y datos iniciales

Una instalación nueva arranca con la base migrada pero vacía (sin usuarios). El flujo de setup (/api/setup) permite crear el primer gerente desde un asistente en la app cuando no hay usuarios. Ver docs/ENTREGA.md para el checklist de entrega (cambiar contraseña, datos del gym, planes reales, configurar Twilio, primer respaldo verificado).

Respaldo y restauración

  • Respaldo: snapshot consistente (VACUUM INTO + rename atómico) a BACKUP_DIR; se dispara debounced tras cada movimiento de dinero, al arrancar, al cerrar y con el botón "Respaldar ahora".
  • Off-site: Nextcloud sincroniza la carpeta a cloud.polarzero.dev; su versionado guarda el historial y PBS añade una tercera copia.
  • Restauración: POST /api/backup/restore deja la restauración staged; se aplica al reiniciar la app (la DB viva queda intacta hasta entonces).

Auto-actualización

Tauri usa el plugin updater apuntando a github.com/PolarZer0-dev/flowfit-app/releases/latest/download/latest.json. El script scripts/make-latest-json.mjs genera ese manifiesto al publicar una nueva versión.