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
- 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`.
+13
View File
@@ -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).
+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
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 <Cargando/>` 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 `<input type="date">` 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 `<input type="date">` 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.
+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
**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,
+1 -1
View File
@@ -1 +1 @@
0.1.0
1.0.0
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "project-linkedcorp-backend",
"version": "0.1.0",
"version": "1.0.0",
"private": true,
"type": "module",
"main": "src/server.js",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "project-linkedcorp-frontend",
"private": true,
"version": "0.1.0",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",