Backend Deployment
Backend deployment
Section titled “Backend deployment”El backend vive en F:\HemiaAssistantGlobal\hemia-assistance-back-legacy. Es un proyecto Node/Express con Sequelize y MySQL.
Scripts reales
Section titled “Scripts reales”package.json declara:
| Script | Comando | Uso |
|---|---|---|
dev | npm run dev:d2 | Desarrollo/local default con D2 cookie auth HTTP. |
dev:d2 | node scripts/dev-auth-mode.js d2 | Desarrollo/local explicito con cookies D2. |
dev:legacy | node scripts/dev-auth-mode.js legacy | Regresion local opt-in con Authorization legacy. |
start | node src/index.js | Arranque sin nodemon. |
No hay script de lint, build ni migraciones en package.json.
Pasos de despliegue
Section titled “Pasos de despliegue”- Preparar host o contenedor con Node compatible y acceso a MySQL.
- Instalar dependencias con el metodo aprobado de release:
npm install- Crear archivo de entorno en el mecanismo de la plataforma. No copiar
.env.localni valores historicos. - Configurar DB, JWT, refresh, password reset, CSRF, CORS, cookies, SMTP y storage.
- Validar conectividad a DB con usuario de minimo privilegio.
- Revisar si hay SQL manual pendiente en
Scripts_; no hay comando automatico de migracion. - Levantar backend:
npm run start- Confirmar que startup no falla por
validateStartupConfig(). - Revisar logs iniciales sin exponer secretos.
- Ejecutar smoke tests de health/auth.
Validaciones de startup
Section titled “Validaciones de startup”El backend llama SecurityConfig.validateStartupConfig() en src/index.js. En production-like debe fallar si:
REQUIRE_ACTIVE_SESSIONno estrue.JWT_SECRETfalta, es default o debil.REFRESH_TOKEN_SECRETfalta o es debil.PASSWORD_RESET_CODE_SECRETfalta o es debil.REFRESH_TOKEN_ROTATION_ENABLED=false.- CORS permite wildcard en production-like.
CORS_CREDENTIALS=truese combina con wildcard.- La autenticacion por cookies no tiene
CSRF_ENABLED=true. - La autenticacion por cookies no tiene CORS credentials y allowlist exacta.
CSRF_TOKEN_SECRETfalta o es debil con CSRF activo.CSRF_ALLOWED_ORIGINSfalta en production-like con origin check activo.
Comando de arranque production-like
Section titled “Comando de arranque production-like”Ejemplo conceptual. Usa el secret manager de tu plataforma, no pegues secretos en consola compartida.
$env:NODE_ENV='production'$env:APP_ENV='production'$env:PORT='3009'$env:DB_HOST='<db-host>'$env:DB_PORT='3306'$env:DB_NAME='medsync_prod'$env:DB_USER='medsync_app'$env:DB_PASSWORD='<from-secret-manager>'$env:JWT_SECRET='<from-secret-manager>'$env:REFRESH_TOKEN_SECRET='<from-secret-manager>'$env:PASSWORD_RESET_CODE_SECRET='<from-secret-manager>'$env:CSRF_TOKEN_SECRET='<from-secret-manager>'$env:REQUIRE_ACTIVE_SESSION='true'$env:AUTH_COOKIE_MODE='d2'$env:BROWSER_AUTH_TRANSPORT='cookie'$env:AUTH_COOKIE_SECURE='true'$env:AUTH_COOKIE_SAMESITE='lax'$env:AUTH_COOKIE_DOMAIN=''$env:AUTH_COOKIE_MAX_AGE_MODE='session'$env:CSRF_ENABLED='true'$env:CORS_CREDENTIALS='true'$env:CORS_ALLOWED_ORIGINS='https://app.<dominio>'$env:CSRF_ALLOWED_ORIGINS='https://app.<dominio>'npm run startHealth check minimo
Section titled “Health check minimo”No se observo endpoint /health dedicado. Usa checks no destructivos:
| Check | Esperado |
|---|---|
GET /api/auth/session sin cookies | 200 con authenticated:false o contrato equivalente. |
GET /api/auth/csrf desde origen permitido | 200, cookie CSRF y payload con csrfToken, headerName, expiresAt. |
| Preflight CORS permitido | 204 con Access-Control-Allow-Origin exacto y credentials. |
| DB startup log | Conexion MySQL OK, sin imprimir password. |
Validar que el modo de cookies esta activo
Section titled “Validar que el modo de cookies esta activo”- Logs de seguridad deben mostrar
AUTH_COOKIE_MODE=d2. - Logs de seguridad deben mostrar
BROWSER_AUTH_TRANSPORT=cookie. - El resumen tecnico puede mostrar
D2_COOKIE_AUTH_ENABLED=true; ese nombre es un indicador interno del codigo. - Login exitoso debe setear cookies access/refresh
HttpOnly. - Respuesta JSON de login no debe incluir
tokennirefresh_token. GET /api/auth/sessiondebe devolver usuario/rol/permisos sin tokens.
Validar que legacy no es el contrato navegador
Section titled “Validar que legacy no es el contrato navegador”En navegador production-like:
- No debe existir header
Authorizationen requests de auth de usuario. - Frontend no debe tener access token ni refresh token en
localStorage. - Frontend no debe tener access token ni refresh token en
sessionStorage. document.cookieno debe mostrar access/refresh porque sonHttpOnly.- Solo la cookie CSRF puede ser visible a JavaScript.
Detener/reiniciar
Section titled “Detener/reiniciar”Depende del supervisor real. Si se usa systemd/PM2/container/orquestador, documentar aqui en la runbook interna:
stop: <comando-supervisor-stop>start: <comando-supervisor-start>restart: <comando-supervisor-restart>logs: <comando-supervisor-logs>No usar Stop-Process manual como procedimiento productivo salvo emergencia controlada.