Manual técnico interno del SIH-HNSM. Si mañana no tuviéramos programadores y debiéramos construirlo solos: éste es el paso a paso documentado.
systemd timer hnsm-backup.timer (diario 02:30 UTC, retención 7 días): pg_dump de 12 BD + SHA256SUMS cifrados con GPG asimétrico (RSA 4096) hacia la llave pública; la VM no puede descifrar sus respaldos (privada solo en C:). Auditoría de los 11 módulos sembrados: integridad referencial (0 huérfanos vía dblink) y multi-tenant SANAS; corregidas 7 unidades de sangre caducadas que seguían IN_INVENTORY. Copia local + git bundle.dblink, con scripts idempotentes. Bug latente descubierto y corregido: KpiRepository de banco de leche casteaba a java.sql.Date lo que Hibernate 7 entrega como LocalDate → 500 en los 7 KPI; fix + rebuild + redeploy → 200 OK.Fractal Index ≈ 830). Acciones reversibles vía drop-ins de systemd: HikariCP 10→3, heap -Xmx384m, listeners Kafka apagados (sin broker), 2 duplicados muertos retirados (appointments-service, clinical-imaging-service) y stub icu apagado. Cutover servicios-generales-svc :8123 fusiona mantenimiento+flota+gases+lavandería (4 JVM→1 / 1 BD / 4 esquemas). Resultado: 36→30 JVMs, RAM 12.7→9.6 GB (−3 GB), conexiones PG 115→17, 0 unidades fallidas. Roadmap de 8 macroservicios documentado (pausado tras el 1.º).systemd (puertos 8080–8121, sin 8102/8119). Sobre el corte de 16-may (34) se confirman además en PROD: almacen-general-service :8101, citas-svc :8103 (agenda clínica legacy), rrhh-svc :8104, presupuesto-svc :8105, adquisiciones-svc :8110 (Compras del Estado · Decreto 57-92) y reference-data-svc :8121 (catálogos compartidos). terapia-respiratoria-svc y seguimiento-egreso-svc permanecen planificados (sin unit en la VM). Gateway :8080 e IAM JWKS :8086 → 200 OK. Diseño objetivo original 25 → sobrepaso +11.@ConditionalOnProperty. Auditoría RAM en VM Toscana reveló 15 GiB total / 14 GiB usado por 34 JVMs (784 MiB libres + swap tocado). Redpanda descartado por restricción de RAM y presupuesto. Solución: @ConditionalOnProperty(name="sih.outbox.enabled", havingValue="true", matchIfMissing=false) en los 5 svcs activos (anatomopat, banco-leche, dietas, imágenes, nutrición) + los 14 latentes del repo. Resultado: 0 warnings de reconnect en journalctl, endpoints 200 OK por gateway con JWT. Para encender outbox a futuro: env var SIH_OUTBOX_ENABLED=true en systemd — cero cambios de código.mantenimiento-svc :8111 (CMMS, 6 áreas, FSM NUEVA→ASIGNADA→EN_PROCESO→CERRADA), flota-svc :8112 (4 unidades + viajes con km/combustible), gases-medicinales-svc :8113 (4 depósitos O2/aire/vacío con semáforo crítico + lecturas + reposiciones), lavanderia-svc :8114 (tandas + entregas ropería + sastrería). 4 DBs PostgreSQL + roles + schemas + V1 SQL aplicado manual (Spring Boot 4 no autoejecuta Flyway). 4 systemd units hospital-{mantenimiento,flota,gases-medicinales,lavanderia}-svc. Gateway swap con 4 rutas Tree B. Bug Spring Data JPA: nested interfaces no se escanean por defecto — fix con @EnableJpaRepositories(considerNestedRepositories=true). Lección cementada: SQLs siempre se copian a /tmp/ porque postgres no lee /root/.AgendaAdminPage.tsx en portal Consulta Externa entre «Atender» y «Citas». Backend añade 3 endpoints (POST /v1/citas/ce/agenda con validación + 409 en UNIQUE conflict, DELETE soft-delete con vigente_hasta, GET /agenda/todas). UI con 4 selects (puesto físico CL-A..CL-L × clínica/especialidad agrupadas CE/ER en <optgroup> × día 1–7 × turno MANANA/TARDE/COMPLETO) + tabla con filtros + badges color por turno y tipo. Bundle index-neW6BbEO.js. La jefa CE puede ahora gestionar la agenda sin TI; soft-delete deja auditoría.V3__ce_clinicas_real_hnsm.sql aplicada manual a DB citas: 4 tablas nuevas (tipo_clinica 2 filas, especialidad 21 filas legacy, clinica_especialidad 32 filas = 23 CE + 9 ER, agenda_clinica estructura cerrada). Trazabilidad legacy_id + origen=LEGACY_HNSM_V2 + fecha_adopcion en cada fila. 4 entidades JPA + 4 repos Spring Data + 4 endpoints REST nuevos (/tipos-clinica, /especialidades, /clinicas-especialidad?tipo=CE|ER, /agenda?fecha=). JAR swap con backup .bak.20260516. Smokes regresión OK.dietas-svc :8115, nutricion-clinica-svc :8116, anatomopatologia-svc :8117, banco-leche-svc :8118 e imagenes-svc :8120. Cada uno con DB + role + schema + V1…V3 aplicadas. Bug Spring Boot 4.0.0-M1 documentado: no autoCrea KafkaTemplate<String,String> aunque spring-kafka esté en classpath — fix con KafkaConfig explícito (ProducerFactory + KafkaTemplate). Bug @Lob String: Hibernate mapea a OID en Postgres pero schema declara TEXT — fix con @Column(columnDefinition="text") sin @Lob. Patrones replicables. PostgreSQL max_connections subido 100→300 (VPS tenía ~27 svcs sin connection slots, FATAL: remaining slots reserved). Nuevos svcs con Hikari pool=3/min=1.adquisiciones-svc :8110 con 4 slices live — Requerimientos (flujo BORRADOR→SOLICITADO→AVALADO_JEFE→CON_CDP→AUTORIZADO_DIRECTOR→EN_PROCESO_COMPRA→ADQUIRIDO→ENTREGADO→CERRADO), Eventos NOG (BORRADOR→BASES_APROBADAS→PUBLICADO→RECEPCION_OFERTAS→APERTURA→EVALUACION→ADJUDICADO→CONTRATADO con sub-recursos ofertas/adjudicación), Órdenes de Compra + Acta Recepción (EMITIDA→ENTREGA_PARCIAL⇄RECIBIDA→LIQUIDADA→PAGADA), Juntas (actas COTIZACION/LICITACION/RECEPCION). 6 páginas SPA cableadas (MisRequerimientos, BandejaAvales, BandejaCDP, BandejaAutorizaciones, EventosGuatecompras, OrdenesCompra con modal contextual, Juntas) + 3 catálogos.PortalNavItem con campo opcional section?: string y PortalShell.tsx con header de sección + divisor. Portales agrupados: Administración (5 secciones · Mi día / Ciclo de compra / Inventario / Servicios al paciente / Personal), Dirección (2), Hospitalización (7), Apoyo (3). Dos builds distintos por base path: Hostinger bundle index-k755EpQq.js en /pages/sistema-medico-spa/ + Cloudflare Worker bundle index--6FEV1oV.js en / (worker version 30b7a3d8-f68f-451d-9d72-497df98259c9). Fix de _publish_spa_full.ps1: $key = '$env:VPS_KEY' (literal por comillas simples) cambiado a $key = $env:VPS_KEY con fallback hardcoded + Test-Path. Backup remoto: sistema-medico-spa.bak.20260515-192603. Backup local: _server_backup/20260515-192600-spa-portales-secciones/. Backlog técnico ahora 9/9 (ítem #3 «Publicar SPA en Nginx» cerrado por Cloudflare Worker + Hostinger).otelcol-contrib v0.152.0 systemd · OTLP 4317/4318 · /var/log/otel/traces.jsonl · hostmetrics), (3) SPA cubierta por Cloudflare Worker, (4) carga HSTS + rate-limit 4/4 PASS (evidencias/loadtest-20260514-202728/), (5) manual de capacitación manual-capacitacion-hnsm.html 13 secciones imprimible, (6) QA wireframes 41 sub-páginas verificadas, (7) scripts auditados y renombrados, (8) TODOs/refactor barridos. Único pendiente: issuer-uri en RRHH/Presupuesto/Compras/Facturación (15-may con Ingeniería).PortalShell (NavLink absoluto bajo splat). Bundle index-k7YiJ098.js · worker 8e6e05ed. 0 portales WIP, 0 items SOON.hospital-forms-sigsa-service quedó estable tras eliminar la inyección de ObjectMapper en SubmissionExportService y recompilar en VM. Estado final verificado: 21 activos / 0 fallidos en hospital-*.service.hn-diseno-desarrollo.php, hn-ingenieros.php, hn-ing-construccion.php) y fuentes locales en _server_upload. Bitácora y memory.md sincronizadas. Dominio operativo adicional registrado: www.sistema-medico.com.fhir-gateway-svc (25%, skeleton + 5 mapeos FHIR R4 para corte 2026-05-22). Ver §11.2 →/opt/java-platform/services/<servicio>/ conforme al ADR-11. MongoDB/GridFS, TimescaleDB, Kafka y Mirth son del plan posterior al MVP (ADRs 05, 06, 07 y 08).hospital-<svc>.service con Restart=on-failure; estado verificado 21 activos / 0 fallidos./etc/sih/jwt/private.pem + /etc/sih/jwt/public.pem con JWT_KEY_ID=hospital-prod-1. Se confirma JWKS operativo en /.well-known/jwks.json./var/www/html. Hoy Nginx solo expone /api/ y /healthz; / retorna 404. Plan: 13-may-26 (Senior 1 · Giordano). La SPA no cuenta como microservicio.sih-frontend avanza 70% (5 páginas: Dashboard, EWS live STOMP, CPOE Rx, Expediente, Seguimiento egreso). Backlog: 9 pantallas completadas al día siguiente.dev-up.ps1 con perfiles core/obs/apps/all + SIH-HNSM-README.md + 5 usuarios demo (dr.ramirez, enf.perez, qf.mendoza, dra.cuc, admin.sih · password Cambiar1!).toscana-sih/* creados (template-svc + 25 placeholders).Las primeras 10 son el manual de construcción. La 11 es la bitácora viva del sistema real en marcha.
Diagnóstico Frankenstein, actores, casos de uso, alcance funcional y no funcional.
Abrir sección →Arquitectura, bounded contexts, capas, decisiones (ADRs).
Abrir sección →Cómo construir un microservicio paso a paso: estructura, código, pruebas, contenedor.
Abrir sección →Cómo construir una pantalla paso a paso: design system, hooks, validación, accesibilidad.
Abrir sección →Vista de ingeniería: paquetes, endpoints REST, esquema BD, patrones por servicio.
Abrir sección →Procesos clínicos y administrativos en secuencias paso a paso entre servicios.
Abrir sección →18 entidades transaccionales y 10 catálogos SIGSA/MSPAS · reglas de oro.
Abrir sección →Recetas paso a paso: SIGSA · SICOIN · Guatecompras · RENAP · FHIR R4.
Abrir sección →Cronograma 34 semanas · recetas de build/deploy · runbook de hito.
Abrir sección →Equipo asignado, plan de pruebas, observabilidad, DRP, capacitación, soporte y artefactos.
Abrir sección →Estado real del sistema · microservicios, entornos, deploys, decisiones e incidentes. Bitácora viva.
Abrir sección →