chore(release): v1.0.0 — primer despliegue a producción

project.linkedcorp.net operativo en https://project.linkedcorp.net (servidor
192.168.222.3, BD 192.168.222.32, NPM con SSL forzado). Documenta la
topología real y el flujo de deploy en PRODUCCION.md/DEPLOY_WEB.md, y
actualiza AGENTS.md/ESTADO.md/README.md con el estado actual.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-09-05 22:47:43 -05:00
parent c7b270e6ea
commit 556bbc7314
9 changed files with 424 additions and 67 deletions
+5 -3
View File
@@ -133,7 +133,8 @@ Adaptación web (no es una app empaquetada, corre en pestaña de navegador):
## Entorno operativo ## Entorno operativo
- Desarrollo: `npm run dev` en `backend/` (puerto 4019) y `frontend/` (puerto 5196, proxy `/api`). - 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. - Docker por defecto: no.
## Regla de versionado ## Regla de versionado
@@ -145,6 +146,7 @@ Adaptación web (no es una app empaquetada, corre en pestaña de navegador):
## Documentacion relacionada ## Documentacion relacionada
- `README.md`, `SPEC.md`, `BASE_DE_DATOS.md`, `CONFIGURACION.md`, `API.md`, `VERSIONADO.md` - `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` - `docs/UI-UX-WINDOWS.md`, `docs/SEGURIDAD-Y-CALIDAD.md`
- `ESTADO.md` (handoff — leer siempre al retomar el proyecto) - `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, - Fase 2: riesgos/incidencias como módulos propios, solicitudes formales, recursos/proveedores,
presupuesto y costos, registro de horas detallado, reportes exportables (PDF/Excel/CSV), presupuesto y costos, registro de horas detallado, reportes exportables (PDF/Excel/CSV),
permisos configurables por módulo×acción, notificaciones por email. 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 - Limpiar `.md` del source en producción (`find ... -iname '*.md' -delete`) — pendiente, ver
esté validado en local. `ESTADO.md`.
+13
View File
@@ -1,5 +1,18 @@
# Changelog - project.linkedcorp.net # 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 ## [0.1.0] - 2026-09-03
### Added ### Added
- Estructura inicial del proyecto (backend Express + frontend React/Vite + MariaDB). - Estructura inicial del proyecto (backend Express + frontend React/Vite + MariaDB).
+244
View File
@@ -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).
+77 -61
View File
@@ -1,50 +1,67 @@
# ESTADO — project.linkedcorp.net # ESTADO — project.linkedcorp.net
Ultima actualizacion: 2026-09-03 Ultima actualizacion: 2026-09-06
Fase actual: MVP funcional en desarrollo local (fase 1 completa, sin deploy a produccion). Fase actual: **En produccion** (`https://project.linkedcorp.net`, v1.0.0). MVP fase 1 operativo.
## Como retomar ## Como retomar
1. Leer primero el orquestador: `/home/mgonzalez/desarrollo/project-md-templates/leeme_primero.txt`. 1. Leer primero el orquestador: `/home/mgonzalez/desarrollo/project-md-templates/leeme_primero.txt`.
2. Leer `AGENTS.md`, `SPEC.md` y este archivo. 2. Leer `AGENTS.md`, `SPEC.md`, `PRODUCCION.md` y este archivo.
3. Backend: `cd backend && npm install && npm run dev` (puerto 4019). Requiere `backend/.env` 3. Backend dev: `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 (no versionado — completar con las credenciales de la BD dev `project_linkedcorp` en
la BD dev `project_linkedcorp` en `192.168.222.20`, usuario `project_linkedcorp`; la clave `192.168.222.20`; la clave la tiene el usuario).
generada la tiene el usuario, no esta en este archivo). 4. Frontend dev: `cd frontend && npm install && npm run dev` (puerto 5196, proxy `/api` al backend).
4. Frontend: `cd frontend && npm install && npm run dev` (puerto 5196, con proxy `/api` al backend). 5. Login dev: `mgonzalez@linkedcorp.net` / clave `mgonzalez` (rol Administrador). Login de
5. Login de prueba (dev): `mgonzalez@linkedcorp.net` / clave `mgonzalez` (rol Administrador). **producción**: mismo email, clave fuerte generada por `create-admin.js` (no está en este repo,
6. Migraciones/seed ya aplicados en la BD dev. Si se recrea la BD: `npm run migrate && npm run seed` se entregó al usuario al desplegar).
dentro de `backend/`. 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→ ### Fase 1 — MVP en desarrollo (2026-09-03)
repository), `frontend/` (React + Vite, identidad Fluent/Windows), `docs/` (UI-UX-WINDOWS,
SEGURIDAD-Y-CALIDAD adaptada). - Backend completo: auth (JWT + rate limit), users, departments, catalogs, projects (+members),
- Puertos reservados en `PORTS_INVENTORY.md` del grupo: frontend `5196`, backend `4019`. activities (+dependencies), subtasks, comments, attachments, notifications, dashboard, audit.
- BD dev `project_linkedcorp` creada en `192.168.222.20` con `crear-db-dev.sh`; esquema aplicado Recalculo automatico de `progress_pct` verificado.
(`backend/database/migrations/001_initial.sql`) y seed cargado (roles, catalogos, departamentos - Frontend completo: identidad Fluent/Windows adaptada a web — NavigationView, ContentDialog,
TI/Finanzas/RRHH/Comercial + sub-areas de TI, usuario admin de dev). InfoBar, Toast, Flyout, ListView, ComboBox, Treeview, Tabs, Expander. Paginas: Login, Dashboard,
- Backend: modulos completos — auth (JWT + rate limit en login), users, departments, catalogs Proyectos (listado + detalle), Organizacion, Configuracion. i18n es-EC/en-US, tema claro/oscuro.
(priorities/project-statuses/activity-statuses/project-types), projects (+ members), activities - Verificacion end-to-end con Playwright sin errores de consola.
(+ dependencies), subtasks, comments, attachments (multer, MIME whitelist), notifications,
dashboard (summary/calendar/gantt), audit. Recalculo automatico de `progress_pct` (actividad ### Iteraciones de UI/UX (2026-09-03 al 2026-09-05)
desde subtareas, proyecto desde el promedio de sus actividades) verificado con pruebas manuales
via curl (login → crear proyecto → actividad → subtareas → avances correctos: 50%/50%). - `DetailPopup`: reemplaza el antipatron "formulario apilado debajo/al costado del listado" en
- Frontend: identidad Fluent/Windows adaptada a web (sin barra de titulo falsa) — NavigationView, TODOS los listados de gestion (Proyectos, Actividades, Departamentos, Usuarios, Miembros,
ContentDialog, InfoBar, Toast, Flyout (menu contextual), ListView con orden/buscador, ComboBox Catalogos) — popup de tamaño fijo por instancia, listado inactivo detras, nunca se cierra con
con buscador, Treeview, Tabs reales, Expander. Paginas: Login, Dashboard (KPIs + actividades clic afuera. Regla documentada en `project-md-templates/UI-UX-WINDOWS.md`.
propias + proyectos por estado), Proyectos (listado + detalle con tabs Info/Actividades/Gantt/ - Bug de stacking corregido: `ContentDialog` ahora usa portal a `document.body` (antes quedaba
Calendario/Comentarios/Documentos, master-detail de actividades con subtareas/dependencias/ tapado detras de un `DetailPopup` abierto). Jerarquia de z-index: Flyout(100) < DetailPopup(200)
comentarios/adjuntos), Organizacion (Departamentos en arbol + Usuarios), Configuracion < ContentDialog(250) < Toast(300).
(apariencia + editor de los 4 catalogos). i18n es-EC/en-US, tema claro/oscuro y modo de botones - Bug de remount corregido: las guardas `if (loading || !data) return <Cargando/>` desmontaban
persistidos y funcionando. TODA la pantalla (y el popup abierto dentro) en cada recarga en segundo plano. Cambiadas a
- Verificacion end-to-end con Playwright (headless, instalado solo en el entorno de trabajo, no en `if (!data)` — solo bloquean la carga inicial.
el proyecto): login, dashboard, listado y detalle de proyecto con las 6 pestañas, detalle de - Bug de clipping corregido: `ComboBox` (y `Flyout`) se posicionan con portal + `position:fixed`
actividad con subtareas, organizacion (arbol + usuarios), configuracion, cambio a tema claro, calculado desde el trigger — antes un ancestro con `overflow:hidden` (Expander, DetailPopup) los
creacion de un proyecto nuevo de punta a punta, y el ContentDialog de confirmacion de borrado — recortaba. Regla documentada en `UI-UX-WINDOWS.md`.
todo sin errores de consola. Capturas no se conservaron en el repo (solo en el entorno temporal - "Miembros" del proyecto es su propia pestaña (antes vivia dentro de "Info").
de la sesion). - 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) ## 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. - Recursos (servidores/licencias/software), Proveedores, Presupuesto y costos.
- Registro de horas trabajadas detallado (bitacora diaria). - Registro de horas trabajadas detallado (bitacora diaria).
- Reportes exportables (PDF/Excel/CSV) y vista ejecutiva separada. - Reportes exportables (PDF/Excel/CSV) y vista ejecutiva separada.
- Permisos configurables por modulo × accion desde la UI (hoy: roles fijos codificados en - Permisos configurables por modulo × accion desde la UI (hoy: roles fijos codificados).
`backend/src/middleware/auth.js` y en cada `service.js`).
- Notificaciones por email/WhatsApp (hoy: solo in-app). - Notificaciones por email/WhatsApp (hoy: solo in-app).
- Job programado para detectar actividades vencidas/por vencer y generar notificaciones - Job programado para detectar actividades vencidas/por vencer (hoy: solo se notifica al asignar).
automaticas (hoy: la notificacion solo se dispara al asignar/reasignar una actividad). - DatePicker: sigue usando `<input type="date">` nativo (simplificacion deliberada del MVP).
- DatePicker/ComboBox: se uso `<input type="date">` nativo en vez de un flyout de calendario - En producción, crear los departamentos/usuarios reales de la empresa desde la UI (arranca limpia
propio (simplificacion deliberada para el MVP; UI-UX-WINDOWS.md recomienda uno propio). a proposito, ver decision abajo).
## 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.
## Decisiones clave ## Decisiones clave
- MVP simplificado respecto al listado original de 30 areas del usuario — detalle completo y - MVP simplificado respecto al listado original de 30 areas — detalle en `SPEC.md`.
justificacion de cada simplificacion en `SPEC.md` (seccion "Fuera de alcance por ahora") y en el - Identidad UI/UX: `UI-UX-WINDOWS.md` (Fluent/Windows 11), no la identidad web estandar del grupo.
plan de esta sesion. - Empresa unica (single-company): no existe tabla `companies`.
- Identidad UI/UX: `UI-UX-WINDOWS.md` (Fluent/Windows 11) en vez de `UI-UX-LINKEDCORP.md` — - Arquetipo de despliegue B (dos servicios separados).
decision explicita del usuario. Adaptacion documentada en `AGENTS.md`. - Produccion arranca sin datos de ejemplo: `seed-db.js` solo carga catalogos universales
- Empresa unica (single-company): no existe tabla `companies` en el MVP. (roles/prioridades/estados/tipos) cuando `NODE_ENV=production`; los departamentos y usuarios de
- Arquetipo de despliegue B (dos servicios separados) — decision explicita del usuario. 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 ## Deuda tecnica
- `npm audit` en backend: 3 vulnerabilidades moderadas en `qs`/`body-parser`, transitivas de - `npm audit`: 3 vulnerabilidades moderadas en `qs`/`body-parser`, transitivas de Express 4.x (sin
Express 4.x (sin fix no-breaking disponible al 2026-09-03). No critico para uso interno; revisar fix no-breaking disponible al 2026-09-06). No critico; revisar cuando Express publique el fix.
cuando Express publique el fix o evaluar migrar a Express 5 en fase 2. - 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.
+80
View File
@@ -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`.
+2
View File
@@ -1,5 +1,7 @@
# project.linkedcorp.net # 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 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 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, hacia el resto del alcance funcional (riesgos, incidencias, recursos, proveedores, presupuesto,
+1 -1
View File
@@ -1 +1 @@
0.1.0 1.0.0
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "project-linkedcorp-backend", "name": "project-linkedcorp-backend",
"version": "0.1.0", "version": "1.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/server.js", "main": "src/server.js",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "project-linkedcorp-frontend", "name": "project-linkedcorp-frontend",
"private": true, "private": true,
"version": "0.1.0", "version": "1.0.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",