diff --git a/AGENTS.md b/AGENTS.md index 55d6bdb..56a22a2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -133,7 +133,8 @@ Adaptación web (no es una app empaquetada, corre en pestaña de navegador): ## Entorno operativo - Desarrollo: `npm run dev` en `backend/` (puerto 4019) y `frontend/` (puerto 5196, proxy `/api`). -- Producción: pendiente (deploy explícito posterior, ver PRODUCCION.md cuando se cree). +- Producción: operativo en `https://project.linkedcorp.net` (servidor `192.168.222.3`, arquetipo B, + ver `PRODUCCION.md` y `DEPLOY_WEB.md`). - Docker por defecto: no. ## Regla de versionado @@ -145,6 +146,7 @@ Adaptación web (no es una app empaquetada, corre en pestaña de navegador): ## Documentacion relacionada - `README.md`, `SPEC.md`, `BASE_DE_DATOS.md`, `CONFIGURACION.md`, `API.md`, `VERSIONADO.md` +- `PRODUCCION.md`, `DEPLOY_WEB.md` (topología y flujo de deploy — arquetipo B, en producción) - `docs/UI-UX-WINDOWS.md`, `docs/SEGURIDAD-Y-CALIDAD.md` - `ESTADO.md` (handoff — leer siempre al retomar el proyecto) @@ -153,5 +155,5 @@ Adaptación web (no es una app empaquetada, corre en pestaña de navegador): - Fase 2: riesgos/incidencias como módulos propios, solicitudes formales, recursos/proveedores, presupuesto y costos, registro de horas detallado, reportes exportables (PDF/Excel/CSV), permisos configurables por módulo×acción, notificaciones por email. -- Deploy a producción (servidor .3, BD .32, systemd, NPM) — confirmar con el usuario cuando el MVP - esté validado en local. +- Limpiar `.md` del source en producción (`find ... -iname '*.md' -delete`) — pendiente, ver + `ESTADO.md`. diff --git a/CHANGELOG.md b/CHANGELOG.md index 6295758..4b34939 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog - project.linkedcorp.net +## [1.0.0] - 2026-09-06 +### Added +- Primer despliegue a producción: `https://project.linkedcorp.net` (arquetipo B, dos servicios). +- `create-admin.js`: bootstrap del usuario Administrador de producción con clave fuerte generada. +### Changed +- `seed-db.js` separa catálogos (universal) de datos de ejemplo (solo entornos no productivos). +- Logo real de LinkedCorp (sidebar, login) en vez del placeholder "LC"; tamaño duplicado. +- `ComboBox`/`Flyout` se posicionan con portal a `document.body` (ya no se recortan dentro de un + `Expander` o `DetailPopup`). +- Master-detail de listados unificado en `DetailPopup` (popup de tamaño fijo, no se cierra con + clic afuera) en Proyectos, Actividades, Departamentos, Usuarios, Miembros y Catálogos. +- "Miembros" del proyecto pasa a ser su propia pestaña (antes vivía dentro de "Info"). + ## [0.1.0] - 2026-09-03 ### Added - Estructura inicial del proyecto (backend Express + frontend React/Vite + MariaDB). diff --git a/DEPLOY_WEB.md b/DEPLOY_WEB.md new file mode 100644 index 0000000..19b2541 --- /dev/null +++ b/DEPLOY_WEB.md @@ -0,0 +1,244 @@ +# Deploy Web - project.linkedcorp.net + +Arquetipo B (dos servicios separados). Primer deploy realizado el 2026-09-06. + +--- + +## Primer despliegue en producción (ya ejecutado — referencia) + +### 1. Entrar al servidor + +```bash +ssh deploy@192.168.222.3 -p 2203 +``` + +### 2. Crear estructura de directorios + +```bash +sudo mkdir -p /opt/apps/project.linkedcorp.net/{source,backend,frontend,storage,logs} +sudo chown -R deploy:deploy /opt/apps/project.linkedcorp.net +``` + +### 3. Clonar el repositorio + +```bash +cd /opt/apps/project.linkedcorp.net/source +git clone http://[gitea_user]:[token]@gitea.linkedcorp.net/mgonzalez/project.linkedcorp.net.git . +git remote set-url origin http://gitea.linkedcorp.net/mgonzalez/project.linkedcorp.net.git # sin token en claro +``` + +### 4. Crear el `.env` de producción + +```bash +nano /opt/apps/project.linkedcorp.net/backend/.env +``` + +Variables reales (valores sensibles solo en el archivo del servidor, nunca en git): + +```env +PORT=4019 +NODE_ENV=production +DB_HOST=192.168.222.32 +DB_PORT=3306 +DB_NAME=project_linkedcorp +DB_USER=project_linkedcorp +DB_PASSWORD=[generada por crear-db-prod.sh] +JWT_SECRET=[openssl rand -hex 32] +JWT_EXPIRES=8h +CORS_ORIGIN=https://project.linkedcorp.net +STORAGE_ROOT=/opt/apps/project.linkedcorp.net/storage +``` + +**Nunca copiar el `.env` de desarrollo.** + +### 5. Instalar dependencias del backend + +```bash +cd /opt/apps/project.linkedcorp.net/source/backend +npm install --omit=dev +cp -r node_modules /opt/apps/project.linkedcorp.net/backend/ +``` + +### 6. Compilar el frontend y publicar el runtime + +El frontend es un proceso separado (`serve` sirviendo el build). Runtime propio en `frontend/` +con un `package.json` minimo (solo depende de `serve`) — evita copiar todo `node_modules` de Vite: + +```bash +cd /opt/apps/project.linkedcorp.net/source/frontend +npm install +npm run build +cp -r dist /opt/apps/project.linkedcorp.net/frontend/dist + +cat > /opt/apps/project.linkedcorp.net/frontend/package.json <<'EOF' +{ "name": "project-linkedcorp-frontend-runtime", "private": true, "version": "1.0.0", + "dependencies": { "serve": "^14.2.6" } } +EOF +cd /opt/apps/project.linkedcorp.net/frontend && npm install --omit=dev +``` + +> En un redeploy solo hace falta reemplazar `frontend/dist` (borrar y volver a copiar) — el +> `node_modules` del runtime frontend no cambia salvo que cambie la version de `serve`. + +### 7. Ejecutar migración de base de datos + +```bash +cd /opt/apps/project.linkedcorp.net/source/backend +set -a && source /opt/apps/project.linkedcorp.net/backend/.env && set +a +node src/scripts/migrate-db.js +``` + +### 8. Inicializar datos + +```bash +# Catalogos base (roles, prioridades, estados, tipos de proyecto) — sin datos de ejemplo en produccion: +node src/scripts/seed-db.js + +# Usuario Administrador inicial (clave fuerte generada, se muestra UNA sola vez): +node src/scripts/create-admin.js "Nombre Apellido" correo@linkedcorp.net +``` + +### 9. Crear el servicio systemd del backend + +```ini +# /etc/systemd/system/project-linkedcorp-backend.service +[Unit] +Description=project.linkedcorp.net backend +After=network.target + +[Service] +Type=simple +User=deploy +WorkingDirectory=/opt/apps/project.linkedcorp.net/source/backend +ExecStart=/usr/bin/node src/server.js +EnvironmentFile=/opt/apps/project.linkedcorp.net/backend/.env +Restart=on-failure +RestartSec=5 +StandardOutput=append:/opt/apps/project.linkedcorp.net/logs/backend.log +StandardError=append:/opt/apps/project.linkedcorp.net/logs/backend-error.log + +[Install] +WantedBy=multi-user.target +``` + +### 10. Crear el servicio systemd del frontend + +```ini +# /etc/systemd/system/project-linkedcorp-frontend.service +[Unit] +Description=project.linkedcorp.net frontend +After=network.target + +[Service] +Type=simple +User=deploy +WorkingDirectory=/opt/apps/project.linkedcorp.net/frontend +ExecStart=/usr/bin/node node_modules/.bin/serve -s dist -l 5196 +Restart=on-failure +RestartSec=5 +StandardOutput=append:/opt/apps/project.linkedcorp.net/logs/frontend.log +StandardError=append:/opt/apps/project.linkedcorp.net/logs/frontend-error.log + +[Install] +WantedBy=multi-user.target +``` + +```bash +sudo systemctl daemon-reload +sudo systemctl enable project-linkedcorp-backend project-linkedcorp-frontend +sudo systemctl start project-linkedcorp-backend project-linkedcorp-frontend +sudo systemctl status project-linkedcorp-backend project-linkedcorp-frontend +``` + +### 11. Configurar Nginx Proxy Manager + +Proxy Host: + +| Campo | Valor | +|-------|-------| +| Domain | `project.linkedcorp.net` | +| Forward Hostname/IP | `192.168.222.3` | +| Forward Port | `5196` (frontend) | +| Scheme | `http` | +| SSL | Let's Encrypt, Force SSL | + +Custom Location: + +| Campo | Valor | +|-------|-------| +| Location | `/api` | +| Forward Hostname/IP | `192.168.222.3` | +| Forward Port | `4019` (backend) | +| Scheme | `http` | + +### 12. Verificar + +```bash +curl http://127.0.0.1:4019/health +curl -o /dev/null -w "%{http_code}\n" http://127.0.0.1:5196/ +curl https://project.linkedcorp.net/api/auth/login -X POST -H 'Content-Type: application/json' -d '{...}' +``` + +### 13. Limpiar archivos `.md` del source + +```bash +find /opt/apps/project.linkedcorp.net/source -type f -iname '*.md' -delete +``` + +> Pendiente al 2026-09-06: no ejecutado en el primer deploy (bloqueado por el entorno del agente +> que hizo el despliegue). Ejecutar manualmente o en el proximo deploy. + +--- + +## Actualizaciones (deploys posteriores) + +1. Cambios en desarrollo, `npm run build` local OK. +2. Si corresponde, subir version (`VERSIONADO.md`): actualizar `VERSION` y `CHANGELOG.md`. +3. `git add . && git commit -m "..." && git push origin main`. +4. `ssh deploy@192.168.222.3 -p 2203` +5. `cd /opt/apps/project.linkedcorp.net/source && git fetch origin main && git reset --hard origin/main` +6. Si cambio el backend: + ```bash + cd backend && npm install --omit=dev + cp -r node_modules /opt/apps/project.linkedcorp.net/backend/ + ``` +7. Si cambio el frontend: + ```bash + cd ../frontend && npm install && npm run build + rm -rf /opt/apps/project.linkedcorp.net/frontend/dist + cp -r dist /opt/apps/project.linkedcorp.net/frontend/dist + ``` +8. Si cambio el schema de BD: + ```bash + cd ../backend + set -a && source /opt/apps/project.linkedcorp.net/backend/.env && set +a + node src/scripts/migrate-db.js + ``` +9. Confirmar `DB_HOST=192.168.222.32` en el `.env` de produccion antes de reiniciar. +10. Reiniciar servicios: + ```bash + sudo systemctl restart project-linkedcorp-backend + sudo systemctl restart project-linkedcorp-frontend + ``` +11. **Confirmar cambio de PID** (si cambio el backend): + ```bash + ps -ef | grep 'node src/server.js' | grep -v grep + ``` +12. Verificar: `curl http://127.0.0.1:4019/health`. +13. Limpiar `.md`: `find /opt/apps/project.linkedcorp.net/source -type f -iname '*.md' -delete`. + +--- + +## No tocar durante deploy + +- `/opt/apps/project.linkedcorp.net/backend/.env` +- `/opt/apps/project.linkedcorp.net/storage/` +- `/opt/apps/project.linkedcorp.net/logs/` + +## Notas + +- `.env` de produccion nunca se versiona ni se copia desde desarrollo. +- BD de produccion siempre `192.168.222.32`; desarrollo siempre `192.168.222.20`. Confirmar antes + de cada deploy. +- `create-admin.js` es idempotente por email (`ON DUPLICATE KEY UPDATE`) — reutilizable para + resetear la clave del admin si hace falta (genera una nueva clave fuerte cada vez que se corre). diff --git a/ESTADO.md b/ESTADO.md index 87e950f..c7023b7 100644 --- a/ESTADO.md +++ b/ESTADO.md @@ -1,50 +1,67 @@ # ESTADO — project.linkedcorp.net -Ultima actualizacion: 2026-09-03 -Fase actual: MVP funcional en desarrollo local (fase 1 completa, sin deploy a produccion). +Ultima actualizacion: 2026-09-06 +Fase actual: **En produccion** (`https://project.linkedcorp.net`, v1.0.0). MVP fase 1 operativo. ## Como retomar 1. Leer primero el orquestador: `/home/mgonzalez/desarrollo/project-md-templates/leeme_primero.txt`. -2. Leer `AGENTS.md`, `SPEC.md` y este archivo. -3. Backend: `cd backend && npm install && npm run dev` (puerto 4019). Requiere `backend/.env` - (no versionado — si falta, copiar `backend/.env.example` y completar con las credenciales de - la BD dev `project_linkedcorp` en `192.168.222.20`, usuario `project_linkedcorp`; la clave - generada la tiene el usuario, no esta en este archivo). -4. Frontend: `cd frontend && npm install && npm run dev` (puerto 5196, con proxy `/api` al backend). -5. Login de prueba (dev): `mgonzalez@linkedcorp.net` / clave `mgonzalez` (rol Administrador). -6. Migraciones/seed ya aplicados en la BD dev. Si se recrea la BD: `npm run migrate && npm run seed` - dentro de `backend/`. +2. Leer `AGENTS.md`, `SPEC.md`, `PRODUCCION.md` y este archivo. +3. Backend dev: `cd backend && npm install && npm run dev` (puerto 4019). Requiere `backend/.env` + (no versionado — completar con las credenciales de la BD dev `project_linkedcorp` en + `192.168.222.20`; la clave la tiene el usuario). +4. Frontend dev: `cd frontend && npm install && npm run dev` (puerto 5196, proxy `/api` al backend). +5. Login dev: `mgonzalez@linkedcorp.net` / clave `mgonzalez` (rol Administrador). Login de + **producción**: mismo email, clave fuerte generada por `create-admin.js` (no está en este repo, + se entregó al usuario al desplegar). +6. Produccion: ver `PRODUCCION.md` y `DEPLOY_WEB.md` para topología, comandos y el flujo de deploy + de actualizaciones (arquetipo B, dos servicios systemd en `192.168.222.3`). -## Hecho y verificado (2026-09-03) +## Hecho y verificado -- Repo/estructura inicial: `backend/` (Express + mysql2, arquitectura routes→controller→service→ - repository), `frontend/` (React + Vite, identidad Fluent/Windows), `docs/` (UI-UX-WINDOWS, - SEGURIDAD-Y-CALIDAD adaptada). -- Puertos reservados en `PORTS_INVENTORY.md` del grupo: frontend `5196`, backend `4019`. -- BD dev `project_linkedcorp` creada en `192.168.222.20` con `crear-db-dev.sh`; esquema aplicado - (`backend/database/migrations/001_initial.sql`) y seed cargado (roles, catalogos, departamentos - TI/Finanzas/RRHH/Comercial + sub-areas de TI, usuario admin de dev). -- Backend: modulos completos — auth (JWT + rate limit en login), users, departments, catalogs - (priorities/project-statuses/activity-statuses/project-types), projects (+ members), activities - (+ dependencies), subtasks, comments, attachments (multer, MIME whitelist), notifications, - dashboard (summary/calendar/gantt), audit. Recalculo automatico de `progress_pct` (actividad - desde subtareas, proyecto desde el promedio de sus actividades) verificado con pruebas manuales - via curl (login → crear proyecto → actividad → subtareas → avances correctos: 50%/50%). -- Frontend: identidad Fluent/Windows adaptada a web (sin barra de titulo falsa) — NavigationView, - ContentDialog, InfoBar, Toast, Flyout (menu contextual), ListView con orden/buscador, ComboBox - con buscador, Treeview, Tabs reales, Expander. Paginas: Login, Dashboard (KPIs + actividades - propias + proyectos por estado), Proyectos (listado + detalle con tabs Info/Actividades/Gantt/ - Calendario/Comentarios/Documentos, master-detail de actividades con subtareas/dependencias/ - comentarios/adjuntos), Organizacion (Departamentos en arbol + Usuarios), Configuracion - (apariencia + editor de los 4 catalogos). i18n es-EC/en-US, tema claro/oscuro y modo de botones - persistidos y funcionando. -- Verificacion end-to-end con Playwright (headless, instalado solo en el entorno de trabajo, no en - el proyecto): login, dashboard, listado y detalle de proyecto con las 6 pestañas, detalle de - actividad con subtareas, organizacion (arbol + usuarios), configuracion, cambio a tema claro, - creacion de un proyecto nuevo de punta a punta, y el ContentDialog de confirmacion de borrado — - todo sin errores de consola. Capturas no se conservaron en el repo (solo en el entorno temporal - de la sesion). +### Fase 1 — MVP en desarrollo (2026-09-03) + +- Backend completo: auth (JWT + rate limit), users, departments, catalogs, projects (+members), + activities (+dependencies), subtasks, comments, attachments, notifications, dashboard, audit. + Recalculo automatico de `progress_pct` verificado. +- Frontend completo: identidad Fluent/Windows adaptada a web — NavigationView, ContentDialog, + InfoBar, Toast, Flyout, ListView, ComboBox, Treeview, Tabs, Expander. Paginas: Login, Dashboard, + Proyectos (listado + detalle), Organizacion, Configuracion. i18n es-EC/en-US, tema claro/oscuro. +- Verificacion end-to-end con Playwright sin errores de consola. + +### Iteraciones de UI/UX (2026-09-03 al 2026-09-05) + +- `DetailPopup`: reemplaza el antipatron "formulario apilado debajo/al costado del listado" en + TODOS los listados de gestion (Proyectos, Actividades, Departamentos, Usuarios, Miembros, + Catalogos) — popup de tamaño fijo por instancia, listado inactivo detras, nunca se cierra con + clic afuera. Regla documentada en `project-md-templates/UI-UX-WINDOWS.md`. +- Bug de stacking corregido: `ContentDialog` ahora usa portal a `document.body` (antes quedaba + tapado detras de un `DetailPopup` abierto). Jerarquia de z-index: Flyout(100) < DetailPopup(200) + < ContentDialog(250) < Toast(300). +- Bug de remount corregido: las guardas `if (loading || !data) return ` desmontaban + TODA la pantalla (y el popup abierto dentro) en cada recarga en segundo plano. Cambiadas a + `if (!data)` — solo bloquean la carga inicial. +- Bug de clipping corregido: `ComboBox` (y `Flyout`) se posicionan con portal + `position:fixed` + calculado desde el trigger — antes un ancestro con `overflow:hidden` (Expander, DetailPopup) los + recortaba. Regla documentada en `UI-UX-WINDOWS.md`. +- "Miembros" del proyecto es su propia pestaña (antes vivia dentro de "Info"). +- Logo real de LinkedCorp (`/desarrollo/imgLinkedCorp/logoLinkedCorpTxt(Black).png`) en sidebar y + login, theme-aware, tamaño duplicado respecto a la primera version. + +### Deploy a produccion (2026-09-06) + +- BD `project_linkedcorp` creada en `192.168.222.32` (prod) con `crear-db-prod.sh`. +- Servidor `192.168.222.3`: `/opt/apps/project.linkedcorp.net/{source,backend,frontend,storage,logs}`. +- Migraciones aplicadas; catalogos sembrados (`seed-db.js`, sin datos de ejemplo en produccion — + ver decision abajo); usuario Administrador inicial creado con `create-admin.js`. +- Servicios systemd `project-linkedcorp-backend` (4019) y `project-linkedcorp-frontend` (5196, + `serve -s dist`), ambos `enabled` + `active`. +- NPM: Proxy Host id 77 → frontend, Custom Location `/api` → backend, SSL Let's Encrypt forzado. +- Verificado end-to-end via curl contra `https://project.linkedcorp.net`: health check, login, + token valido. Detalle completo en `PRODUCCION.md`. +- **Pendiente no bloqueante**: limpiar `.md` de `/opt/apps/project.linkedcorp.net/source` (paso de + higiene de `DEPLOY_WEB.md`) — bloqueado por el clasificador de auto-mode del agente durante el + deploy; requiere ejecutarlo a mano o con autorizacion explicita la proxima vez. ## Pendiente (fase 2, sin comprometer lo ya construido) @@ -53,32 +70,31 @@ Fase actual: MVP funcional en desarrollo local (fase 1 completa, sin deploy a pr - Recursos (servidores/licencias/software), Proveedores, Presupuesto y costos. - Registro de horas trabajadas detallado (bitacora diaria). - Reportes exportables (PDF/Excel/CSV) y vista ejecutiva separada. -- Permisos configurables por modulo × accion desde la UI (hoy: roles fijos codificados en - `backend/src/middleware/auth.js` y en cada `service.js`). +- Permisos configurables por modulo × accion desde la UI (hoy: roles fijos codificados). - Notificaciones por email/WhatsApp (hoy: solo in-app). -- Job programado para detectar actividades vencidas/por vencer y generar notificaciones - automaticas (hoy: la notificacion solo se dispara al asignar/reasignar una actividad). -- DatePicker/ComboBox: se uso `` nativo en vez de un flyout de calendario - propio (simplificacion deliberada para el MVP; UI-UX-WINDOWS.md recomienda uno propio). - -## Deploy a produccion — NO ejecutado - -Pendiente de que el usuario valide el MVP en local. Cuando se confirme, seguir -`BASE_DE_DATOS.md` (seccion produccion) y crear `PRODUCCION.md`/`DEPLOY_WEB.md` del proyecto -siguiendo el arquetipo B (dos servicios) descrito en el orquestador. +- Job programado para detectar actividades vencidas/por vencer (hoy: solo se notifica al asignar). +- DatePicker: sigue usando `` nativo (simplificacion deliberada del MVP). +- En producción, crear los departamentos/usuarios reales de la empresa desde la UI (arranca limpia + a proposito, ver decision abajo). ## Decisiones clave -- MVP simplificado respecto al listado original de 30 areas del usuario — detalle completo y - justificacion de cada simplificacion en `SPEC.md` (seccion "Fuera de alcance por ahora") y en el - plan de esta sesion. -- Identidad UI/UX: `UI-UX-WINDOWS.md` (Fluent/Windows 11) en vez de `UI-UX-LINKEDCORP.md` — - decision explicita del usuario. Adaptacion documentada en `AGENTS.md`. -- Empresa unica (single-company): no existe tabla `companies` en el MVP. -- Arquetipo de despliegue B (dos servicios separados) — decision explicita del usuario. +- MVP simplificado respecto al listado original de 30 areas — detalle en `SPEC.md`. +- Identidad UI/UX: `UI-UX-WINDOWS.md` (Fluent/Windows 11), no la identidad web estandar del grupo. +- Empresa unica (single-company): no existe tabla `companies`. +- Arquetipo de despliegue B (dos servicios separados). +- Produccion arranca sin datos de ejemplo: `seed-db.js` solo carga catalogos universales + (roles/prioridades/estados/tipos) cuando `NODE_ENV=production`; los departamentos y usuarios de + ejemplo (TI/Finanzas/RRHH/Comercial, admin con clave=usuario) son SOLO de dev. El admin real de + produccion se crea con `create-admin.js` (clave fuerte generada, nunca clave=usuario). ## Deuda tecnica -- `npm audit` en backend: 3 vulnerabilidades moderadas en `qs`/`body-parser`, transitivas de - Express 4.x (sin fix no-breaking disponible al 2026-09-03). No critico para uso interno; revisar - cuando Express publique el fix o evaluar migrar a Express 5 en fase 2. +- `npm audit`: 3 vulnerabilidades moderadas en `qs`/`body-parser`, transitivas de Express 4.x (sin + fix no-breaking disponible al 2026-09-06). No critico; revisar cuando Express publique el fix. +- Ruteo backend: `app.use('/api', subtasksRoutes)` actua como catch-all de cualquier `/api/*` no + matcheado por un mount mas especifico registrado antes; una request SIN token a una ruta + inexistente bajo `/api` devuelve 401 "No autenticado" en vez de 404. No afecta ninguna ruta real + de la app (todas requieren auth de todos modos) — deteccion: `curl .../api/health` (esa ruta no + existe bajo `/api`, solo en la raiz `/health`). Prolijidad pendiente para fase 2: montar + `subtasksRoutes` bajo un prefijo mas especifico. diff --git a/PRODUCCION.md b/PRODUCCION.md new file mode 100644 index 0000000..9c2d195 --- /dev/null +++ b/PRODUCCION.md @@ -0,0 +1,80 @@ +# Produccion - project.linkedcorp.net + +## Estado actual + +- Version actual: `1.0.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). + +## Comandos utiles + +```bash +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`. diff --git a/README.md b/README.md index ad3150c..f66f78e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # project.linkedcorp.net +**En producción:** https://project.linkedcorp.net + Gestión y seguimiento de proyectos y actividades de TI para una empresa de tamaño medio. MVP simple por diseño (menos campos, menos módulos separados) con el modelo de datos preparado para crecer hacia el resto del alcance funcional (riesgos, incidencias, recursos, proveedores, presupuesto, diff --git a/VERSION b/VERSION index 6e8bf73..3eefcb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0 +1.0.0 diff --git a/backend/package.json b/backend/package.json index f88bb50..47364c3 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "project-linkedcorp-backend", - "version": "0.1.0", + "version": "1.0.0", "private": true, "type": "module", "main": "src/server.js", diff --git a/frontend/package.json b/frontend/package.json index d2387e9..ca03bfb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "project-linkedcorp-frontend", "private": true, - "version": "0.1.0", + "version": "1.0.0", "type": "module", "scripts": { "dev": "vite",