Fecha: 28 de Abril, 2026
Autor: Carlos Torres - Solutions Architect
Estado: Borrador para validacion con Ingenieria de Infraestructura
Documento de referencia normativa: GUIA_REQUERIMIENTOS_INFRAESTRUCTURA.md
Este documento inventaria el estado real del NODO-01 (ambiente DEV) entregado por TI y define el plan operativo para replicar la misma topologia en el NODO-02 (ambiente QA).
Toda la especificacion normativa (hardware, software, politicas, topologia logica) esta en la Guia de Requerimientos de Infraestructura. Este documento es el delta entre lo que la guia pide y lo que TI ha entregado realmente, mas el plan para llevar QA al mismo estado.
Resultado del inventario:
docker-compose.yml (mas adelante se identifican uno a uno).docker run que se convierten a Compose en este plan.dev-network)./srv/kafka/dev).Hallazgos a resolver con TI antes de iniciar la replicacion:
| # | Hallazgo | Impacto | Accion sugerida |
|---|---|---|---|
| 1 | NODO-01 entrega 16 GB RAM, la guia pide 32 GB. Ademas, hoy se reportan 9.7 GB / 15 GB de RAM en uso y 3.1 GB de swap activo, es decir el servidor esta operando al limite. | Riesgo alto de saturacion al agregar mas servicios en DEV; QA replicado con 16 GB sufrira igual. | Solicitar formalmente a TI ampliar RAM a 32 GB en NODO-01 y entregar NODO-02 con 32 GB segun la guia. |
| 2 | NODO-02 (186.80.17.24:2203) no responde por SSH al 2026-04-28 |
Bloquea inicio de la replicacion | TI debe restablecer acceso o reentregar credenciales |
| 3 | 7 contenedores fuera de Compose (administracion manual) en DEV | Configuracion no reproducible, riesgo de deriva con QA | Plan incluye conversion completa a Compose en QA (seccion 6.3); luego retroaplicar a DEV |
| 4 | Politica de Contenedorizacion Total cumplida en general, pero los 7 huerfanos no tienen YAML | Auditoria parcial | Cubierto por hallazgo #3 |
Las URLs publicas internas siguen el formato:
| Ambiente | Patron DNS | Ejemplos |
|---|---|---|
| Desarrollo | <servicio>-dev.centricasoluciones.com |
gitlab-dev.centricasoluciones.com, minio-dev.centricasoluciones.com, grafana-dev.centricasoluciones.com |
| QA | <servicio>-qa.centricasoluciones.com |
gitlab-qa.centricasoluciones.com, minio-qa.centricasoluciones.com, grafana-qa.centricasoluciones.com |
| Produccion | <servicio>.nebula.centricasoluciones.com |
(segun guia) |
Implicacion para el plan: todos los hostnames *-dev.centricasoluciones.com declarados en configs (Grafana, Nginx Proxy Manager en NODO-00, vhosts publicos) deben pasar a *-qa.centricasoluciones.com cuando se replique en NODO-02.
| Aspecto | Valor real | Spec guia | Cumple |
|---|---|---|---|
| Hostname | nodo-01 | - | - |
| IP interna | 10.120.0.2/24 (eth0) | - | - |
| OS | Ubuntu Server 24.04.3 LTS | Ubuntu Server 24.04 LTS | Si |
| Kernel | Linux 6.8.0-106-generic | - | - |
| CPU | 4 vCPU | 4 vCPU | Si |
| RAM | 16 GB (15 Gi visibles), 9.7 GB en uso, 3.1 GB swap activo | 32 GB | No |
| Disco | 200 GB SSD | 200 GB SSD | Si |
| Docker Engine | 29.2.1 | - | Si |
| Docker Compose | v5.0.2 | - | Si |
| Usuario operativo | sysadmin (sudo, docker) | - | Si |
Particionado a replicar en NODO-02:
| Punto de montaje | FS | Tamano | Usado | Proposito |
|---|---|---|---|---|
/ |
ext4 | 49 GB | 13 GB (27%) | Sistema |
/boot |
ext4 | 974 MB | 201 MB | Boot |
/boot/efi |
vfat | 1.1 GB | 6.2 MB | EFI |
/swap |
ext4 | 7.8 GB | 24 KB | Swap dedicado |
/var |
ext4 | 39 GB | 1.5 GB (4%) | Logs/var |
/var/lib/docker |
ext4 | 98 GB | 47 GB (51%) | Imagenes y volumenes Docker |
docker-compose.yml (8 proyectos)Todos los archivos viven bajo /home/sysadmin/docker/compose/. Se listan en orden de dependencia. Para cada uno se documenta: objetivo, servicios, puertos publicos, archivos auxiliares montados y el cambio de entorno (DEV -> QA) que debe aplicarse antes de levantar el stack en NODO-02.
oracle-xeoracle-xe/docker-compose.ymlXEPDB1).oracle-xeoracle-xe_oracle_dataORACLE_PASSWORD) por uno especifico de QA.serverbusiness/server/docker-compose.ymlsimappe-config-server (8890), simappe-eureka-server (8761), simappe-gateway-server (8090), simappe-oauth2-server (8787)simappe-config-server declara extra_hosts: gitlab.centricasoluciones.com -> 10.110.0.2 para resolver hairpin NAT.APP_PROFILE=dev -> APP_PROFILE=qa en los 4 servicios.extra_hosts apuntando a la IP interna de NODO-00 (10.110.0.2).businessbusiness/business/docker-compose.ymlsimappe-admin, simappe-clientAPP_PROFILE=dev -> APP_PROFILE=qa.frontendbusiness/frontend/docker-compose.ymlsimappe-app (8888 HTTP, 4443 HTTPS)*-dev.centricasoluciones.com a *-qa.centricasoluciones.com en el Nginx Proxy Manager de NODO-00 (no en este compose).cross-cuttingnebula/cross-cutting/docker-compose.ymlnebula-masters (catalogos compartidos)unhealthy al momento del inventario (a investigar antes de la replicacion).APP_PROFILE=dev -> APP_PROFILE=qa.financenebula/business-domains/finance/docker-compose.ymlnebula-accounting-coreunhealthy al momento del inventario.APP_PROFILE=dev -> APP_PROFILE=qa.metricsmetrics/docker-compose.ymlprometheus (9090), grafana (3000), eureka-sd (sidecar Python)metrics/prometheus/prometheus.ymlmetrics/prometheus/rules/alerts.ymlmetrics/prometheus/scripts/eureka-sd.pymetrics/grafana/provisioning/{dashboards,datasources}/metrics/grafana/dashboards/prometheus.yml: external_labels.environment: dev -> qa, external_labels.cluster: nodo-01 -> nodo-02.grafana: GF_SERVER_ROOT_URL=http://10.120.0.2:3000 -> http://<IP_NODO02>:3000, GF_SERVER_DOMAIN=10.120.0.2 -> <IP_NODO02> (o el FQDN grafana-qa.centricasoluciones.com).GF_SECURITY_ADMIN_PASSWORD.datavaultdatavault/docker-compose.ymldatavault-backend (8547), oais-watcheroais-cloud-sync-sip, oais-cloud-sync-aip (profiles: cloud), oais-preservation-verifier (profiles: preservation)./oais -> /home/egs/datavault (scripts Python, watcher, daemons).datavault-uploads, oais-repositorio, backend-preservation-state.SIMAPPE_JWT_SECRET esta hardcoded en el YAML.ENVIRONMENT=development -> ENVIRONMENT=qa.DATABASE_URL mantiene host postgres-dev (alias en dev-network).SIMAPPE_ADMIN_URL mantiene host simappe-gateway-server.Son 7 servicios de infraestructura base que en DEV se crearon en su dia con docker run. Ninguno tiene archivo Compose en NODO-01. El plan los reagrupa en un nuevo stack llamado infra (seccion 6.3). Aqui se documentan tal como estan corriendo hoy.
| Contenedor | Imagen | Puertos host | Volumen | Red | Restart | Anomalia detectada |
|---|---|---|---|---|---|---|
postgres-dev |
postgres:16 | 5432 | postgres-dev-data | dev-network | unless-stopped | - |
mongodb-dev |
mongo:7.0 | 27017 | mongodb-dev-data | dev-network | unless-stopped | - |
redis-dev |
redis:7.2 | 6379 | redis-dev-data | dev-network | unless-stopped | - |
kafka-dev |
confluentinc/cp-kafka:7.5.0 | 9092, 29092 | bind /srv/kafka/dev |
dev-network | unless-stopped | KAFKA_ADVERTISED_LISTENERS apunta a 10.120.0.2:29092 (cambiar en QA) |
zookeeper-dev |
zookeeper:3.9 | 2181 | volumenes anonimos | dev-network | unless-stopped | Volumenes anonimos (no rastreables); el plan los nombra |
minio-dev |
minio/minio | 9100->9000, 9101->9001 | minio-data | dev-network | no |
RestartPolicy mal configurado (debe ser unless-stopped) |
mongo-express |
mongo-express:latest | 8081 | - | bridge |
always | Red incorrecta (deberia estar en dev-network para resolver mongodb-dev por hostname) |
portainer |
portainer/portainer-ce:latest | 9000, 9443 | portainer_data + bind /var/run/docker.sock |
bridge | always | UI de gestion; intencionalmente en bridge (acceso aislado) |
Cambios para QA (vs. estado actual de DEV):
| Servicio | Cambio | Razon |
|---|---|---|
kafka-dev |
KAFKA_ADVERTISED_LISTENERS=INTERNAL://kafka-dev:9092,EXTERNAL://<IP_NODO02>:29092 |
Productor/consumidor externo debe alcanzar QA, no DEV |
kafka-dev |
bind /srv/kafka/dev -> /srv/kafka/qa |
Aislar volumetria por ambiente |
minio-dev |
restart: unless-stopped (era no) |
Corregir anomalia |
mongo-express |
red dev-network (era bridge); URL mongodb://sysadmin:***@mongodb-dev:27017/?authSource=admin (era @10.120.0.2:27017) |
Corregir anomalia y eliminar dependencia con IP fija |
zookeeper-dev |
volumenes nombrados zookeeper-dev-data, zookeeper-dev-datalog |
Reemplazar volumenes anonimos |
| Todos los anteriores | passwords y access keys rotados | QA con credenciales propias, no compartidas con DEV |
nodo-02 desde la estacion del arquitecto./var/lib/docker en particion dedicada de ~100 GB).10.110.0.2:5000 (registry privado en NODO-00).200.118.43.29:80/443 (registry centricasoluciones publico, fallback).*-qa.centricasoluciones.com apuntando a IP de nodo-02.ssh nodo-02 'uname -a && docker version'.get-docker.sh)./etc/docker/daemon.json:{
"insecure-registries": ["10.110.0.2:5000"],
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
/etc/hosts:10.110.0.2 gitlab-dev.centricasoluciones.com nexus-dev.centricasoluciones.com
10.110.0.2 registry.centricasoluciones.com
docker network create dev-network
Mantener el nombre dev-network (no renombrar a qa-network) para no editar todos los Compose.rsync -av --exclude 'oais/Repositorio' --exclude 'metrics/backups' \
/home/sysadmin/docker/ sysadmin@nodo-02:/home/sysadmin/docker/
infra (seccion 6.3) en /home/sysadmin/docker/compose/infra/docker-compose.yml. Sustituye los 7 huerfanos.docker login 10.110.0.2:5000.for d in oracle-xe infra business/server business/business nebula/cross-cutting \
nebula/business-domains/finance metrics datavault business/frontend; do
docker compose -f /home/sysadmin/docker/compose/$d/docker-compose.yml pull
done
oracle-xe (db de negocio)infra (postgres, mongo, redis, kafka, zookeeper, minio, mongo-express, portainer)business/server (config-server -> eureka -> gateway/oauth2)business/business (admin, client)nebula/cross-cutting (masters)nebula/business-domains/finance (accounting-core)metrics (eureka-sd -> prometheus -> grafana)datavault (datavault-backend, oais-watcher)business/frontend (simappe-app)docker ps muestra 22 contenedores en estado Up (healthy) o Up.http://<IP>:8761) lista los servicios.http://<IP>:3000) carga dashboards aprovisionados.http://<IP>:9000) accesible.curl http://<IP>:8547/health) responde.simappe-gateway-server (8090).*-qa.centricasoluciones.com, alta de vhosts en el Nginx Proxy Manager de NODO-00, reglas de firewall por puerto, alta en VPN, alta en monitoreo.infra para los 7 huerfanosArchivo propuesto: /home/sysadmin/docker/compose/infra/docker-compose.yml
# =================================================================
# Infraestructura base (Centrica QA)
# =================================================================
# Reemplaza los 7 contenedores que en DEV se crearon manualmente
# con docker run: postgres, mongodb, redis, kafka, zookeeper, minio,
# mongo-express y portainer.
# Red: dev-network (externa, compartida)
# =================================================================
services:
postgres-dev:
image: postgres:16
container_name: postgres-dev
restart: unless-stopped
environment:
POSTGRES_PASSWORD: <ROTAR_QA>
volumes:
- postgres-dev-data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks: [dev-network]
deploy:
resources:
limits: { memory: 1G }
mongodb-dev:
image: mongo:7.0
container_name: mongodb-dev
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: sysadmin
MONGO_INITDB_ROOT_PASSWORD: <ROTAR_QA>
volumes:
- mongodb-dev-data:/data/db
ports:
- "27017:27017"
networks: [dev-network]
deploy:
resources:
limits: { memory: 1G }
redis-dev:
image: redis:7.2
container_name: redis-dev
restart: unless-stopped
volumes:
- redis-dev-data:/data
ports:
- "6379:6379"
networks: [dev-network]
deploy:
resources:
limits: { memory: 256M }
zookeeper-dev:
image: zookeeper:3.9
container_name: zookeeper-dev
restart: unless-stopped
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
volumes:
- zookeeper-dev-data:/data
- zookeeper-dev-datalog:/datalog
ports:
- "2181:2181"
networks: [dev-network]
deploy:
resources:
limits: { memory: 512M }
kafka-dev:
image: confluentinc/cp-kafka:7.5.0
container_name: kafka-dev
restart: unless-stopped
depends_on:
- zookeeper-dev
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-dev:2181
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
# AJUSTAR a la IP real de NODO-02 antes de levantar
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-dev:9092,EXTERNAL://<IP_NODO02>:29092
KAFKA_LISTENERS: INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:29092
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
volumes:
- /srv/kafka/qa:/var/lib/kafka/data
ports:
- "9092:9092"
- "29092:29092"
networks: [dev-network]
deploy:
resources:
limits: { memory: 1G }
minio-dev:
image: minio/minio
container_name: minio-dev
restart: unless-stopped
command: server /data --console-address :9001
environment:
MINIO_ROOT_USER: sysadmin
MINIO_ROOT_PASSWORD: <ROTAR_QA>
volumes:
- minio-data:/data
ports:
- "9100:9000"
- "9101:9001"
networks: [dev-network]
deploy:
resources:
limits: { memory: 512M }
mongo-express:
image: mongo-express:latest
container_name: mongo-express
restart: unless-stopped
depends_on:
- mongodb-dev
environment:
ME_CONFIG_MONGODB_URL: mongodb://sysadmin:<ROTAR_QA>@mongodb-dev:27017/?authSource=admin
ME_CONFIG_MONGODB_ENABLE_ADMIN: "true"
ME_CONFIG_BASICAUTH: "true"
ME_CONFIG_BASICAUTH_USERNAME: admin
ME_CONFIG_BASICAUTH_PASSWORD: <ROTAR_QA>
ME_CONFIG_SITE_SESSIONSECRET: <ROTAR_QA>
ports:
- "8081:8081"
networks: [dev-network]
deploy:
resources:
limits: { memory: 256M }
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
ports:
- "9000:9000"
- "9443:9443"
networks: [dev-network]
deploy:
resources:
limits: { memory: 512M }
volumes:
postgres-dev-data: { name: postgres-dev-data }
mongodb-dev-data: { name: mongodb-dev-data }
redis-dev-data: { name: redis-dev-data }
zookeeper-dev-data: { name: zookeeper-dev-data }
zookeeper-dev-datalog: { name: zookeeper-dev-datalog }
minio-data: { name: minio-data }
portainer_data: { name: portainer_data }
networks:
dev-network:
external: true
name: dev-network
| # | Riesgo | Probabilidad | Mitigacion |
|---|---|---|---|
| R1 | RAM insuficiente (16 GB en DEV operando al limite; QA replicado con misma especificacion repetira el problema) | Alta | Solicitar formalmente a TI ampliar a 32 GB segun guia. Mientras tanto, reducir limites de memoria por servicio y mantener desactivados los perfiles cloud / preservation de datavault |
| R2 | Imagenes del registry privado no descargables desde nodo-02 (firewall VLAN) | Media | Probar docker login + docker pull antes de configurar todos los stacks |
| R3 | KAFKA_ADVERTISED_LISTENERS mal configurado deja consumidores externos inutiles |
Media | Set explicito a IP de NODO-02; validar con kafkacat desde otra maquina |
| R4 | Hairpin NAT no resuelto en NODO-02 para los hostnames *-dev.centricasoluciones.com necesarios al pull desde GitLab |
Media | Mantener extra_hosts en simappe-config-server y agregar entradas equivalentes en /etc/hosts del host |
| R5 | Secretos compartidos entre DEV y QA | Alta | Rotar todos los passwords/JWT antes del go-live de QA |
| R6 | Datos de DEV no se replican; aplicaciones fallan por estado faltante (catalogos, masters) | Media | Definir, por servicio, si QA necesita un dump baseline; planificar segunda fase |
ssh nodo-01 'docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"'
ssh nodo-01 'docker ps -a --format "{{.Names}}" | while read n; do \
docker inspect "$n" --format "$n | {{ index .Config.Labels \"com.docker.compose.project.config_files\" }}"; \
done'
ssh nodo-01 'find /home/sysadmin/docker/compose -name "docker-compose*.y*ml"'
Volumenes nombrados (16) que contienen datos productivos del ambiente DEV. No se copian a QA salvo decision puntual de baseline:
backend-preservation-state grafana-data oracle-xe_oracle_data
datavault-uploads minio-data portainer_data
mongodb-dev-data postgres-dev-data prometheus-data
prometheus-sd redis-dev-data oais-repositorio
Bind mounts con datos: /srv/kafka/dev, /home/sysadmin/docker/compose/datavault/oais, /home/sysadmin/docker/compose/metrics/{prometheus,grafana}/....
10.110.0.2:5000/nebula/cross-cutting/nebula-masters:latest
10.110.0.2:5000/nebula/business-domains/finance/nebula-accounting-core:latest
10.110.0.2:5000/simappe/simappe-admin:latest
10.110.0.2:5000/simappe/simappe-client:latest
10.110.0.2:5000/simappe/simappe-config-server:latest
10.110.0.2:5000/simappe/simappe-eureka-server:latest
10.110.0.2:5000/simappe/simappe-gateway-server:latest
10.110.0.2:5000/simappe/simappe-oauth2-server:latest
registry.centricasoluciones.com/datavault/datavault-backend:latest
| Version | Fecha | Autor | Descripcion |
|---|---|---|---|
| 1.0.0 | 2026-04-28 | Carlos Torres | Inventario inicial de NODO-01 y plan de replicacion a NODO-02. |