Files
project.linkedcorp.net/PRODUCCION.md
T
2026-09-06 12:36:56 -05:00

5.0 KiB

Produccion - project.linkedcorp.net

Estado actual

  • Version actual: 1.2.0
  • Estado: operativo
  • Ultima validacion: 2026-09-06

Servidor

  • Host: 192.168.222.3
  • SSH: deploy@192.168.222.3 -p 2203 (llave ~/.ssh/id_ed25519, sudo NOPASSWD)
  • Ruta base: /opt/apps/project.linkedcorp.net/

Runtime

  • Frontend: /opt/apps/project.linkedcorp.net/frontend/ (dist/ + node_modules propio con serve)
  • Backend: /opt/apps/project.linkedcorp.net/backend/ (node_modules + .env de produccion)
  • Source (checkout de Gitea, WorkingDirectory de ambos servicios): /opt/apps/project.linkedcorp.net/source/
  • Storage: /opt/apps/project.linkedcorp.net/storage/ (adjuntos — STORAGE_ROOT en .env)
  • Logs: /opt/apps/project.linkedcorp.net/logs/
  • APKs Android publicados: no aplica

Servicios

  • Frontend: project-linkedcorp-frontend (node node_modules/.bin/serve -s dist -l 5196, WorkingDirectory source/frontend... revisar nota abajo)
  • Backend: project-linkedcorp-backend (node src/server.js, WorkingDirectory source/backend, EnvironmentFile=backend/.env)

Nota real: el servicio frontend corre con WorkingDirectory=/opt/apps/project.linkedcorp.net/frontend (no source/frontend) sirviendo frontend/dist/ con el serve instalado ahi mismo (node_modules minimo, solo el paquete serve). El dist/ se copia desde source/frontend/dist en cada deploy.

Puertos internos

  • Frontend: 127.0.0.1:5196
  • Backend: 127.0.0.1:4019

Base de datos

  • Host pruebas/desarrollo: 192.168.222.20
  • Host produccion real: 192.168.222.32
  • Base: project_linkedcorp
  • Usuario app: project_linkedcorp (permitido solo desde 192.168.222.3)
  • Regla dura: produccion web siempre usa 192.168.222.32
  • Regla dura: pruebas y desarrollo siempre usan 192.168.222.20
  • Antes de cada deploy, validar el DB_HOST activo en runtime (backend/.env de produccion)

NPM (Nginx Proxy Manager)

  • Dominio: project.linkedcorp.net, SSL Let's Encrypt (auto-renovacion), Force SSL activo.
  • Proxy Host (id 77) -> 192.168.222.3:5196 (frontend).
  • Custom Location /api -> 192.168.222.3:4019 (backend).

Estado confirmado (2026-09-06)

  • Migraciones aplicadas (001_initial.sql) sobre project_linkedcorp en .32.
  • Catalogos base sembrados (roles, prioridades, estados de proyecto/actividad, tipos de proyecto). Sin datos de ejemplo (departamentos/usuario dev) — produccion arranca limpia.
  • Usuario Administrador inicial creado con create-admin.js (clave fuerte generada, entregada una sola vez fuera de este repo). El admin debe crear ahi mismo los demas usuarios/departamentos.
  • Login, dashboard y flujo proyecto->actividad verificados via curl contra https://project.linkedcorp.net (backend + frontend + SSL + BD produccion, todo real).
  • Pendiente (no bloqueante): limpiar archivos .md de /opt/apps/project.linkedcorp.net/source (paso de higiene del checklist de DEPLOY_WEB.md, no se ejecuto por restriccion del entorno del agente — pendiente de accion manual o autorizacion explicita).

Actualizacion v1.1.0 (2026-09-06) — autorregistro/aprobacion/superadmin/SMTP

  • Migracion 002_registration_and_smtp.sql aplicada sobre .32: rol superadmin, columnas de ciclo de vida en users, tabla system_settings. mgonzalez@linkedcorp.net (id=1) quedo promovido a superadmin automaticamente.
  • ENCRYPTION_KEY generado y agregado al .env de produccion (cifra la clave SMTP en BD).
  • Ambos servicios reconstruidos (backend con nodemailer nuevo, frontend recompilado) y reiniciados; PID confirmado distinto en los dos.
  • Verificado end-to-end contra https://project.linkedcorp.net: login reporta roleCode: superadmin, GET /api/settings/smtp responde configured:false (sin SMTP real todavia).
  • Pendiente: el superadmin debe cargar el SMTP real desde Configuracion → Correo (SMTP) cuando lo tenga. Hasta entonces, un registro/recuperacion de clave real en produccion queda logueado en journalctl -u project-linkedcorp-backend en vez de enviarse por correo — nadie externo puede completar el autorregistro sin que un admin le pase el enlace manualmente desde el log.

Actualizacion v1.2.0 (2026-09-06) — cambiar clave desde la app

  • PUT /api/auth/change-password (exige clave actual) + opcion "Cambiar clave" en el menu de usuario. Redeploy sin cambios de dependencias ni de esquema; PID confirmado en ambos servicios.
  • Verificado en produccion via curl (rechaza clave actual incorrecta con 400; no se cambio la clave real del superadmin durante la prueba).

Comandos utiles

sudo systemctl status project-linkedcorp-backend
sudo systemctl status project-linkedcorp-frontend
sudo journalctl -u project-linkedcorp-backend -n 100 --no-pager
sudo journalctl -u project-linkedcorp-frontend -n 100 --no-pager

Notas

  • No dejar secretos en el repo (.env de produccion vive solo en backend/.env del servidor).
  • No reemplazar storage/ ni logs/ durante un deploy.
  • Documentar cambios de version y estado real en este archivo y en CHANGELOG.md.