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:
@@ -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`.
|
||||||
|
|||||||
@@ -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
@@ -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).
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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`.
|
||||||
@@ -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,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,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",
|
||||||
|
|||||||
Reference in New Issue
Block a user