workspace-v1/03-fase-shared-infra/PROMPTS/PROMPT-DEVOPS-AGENT.md
Adrian Flores Cortes 967ab360bb Initial commit: Workspace v1 with 3-layer architecture
Structure:
- control-plane/: Registries, SIMCO directives, CI/CD templates
- projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics
- shared/: Libs catalog, knowledge-base

Key features:
- Centralized port, domain, database, and service registries
- 23 SIMCO directives + 6 fundamental principles
- NEXUS agent profiles with delegation rules
- Validation scripts for workspace integrity
- Dockerfiles for all services
- Path aliases for quick reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 00:35:19 -06:00

8.5 KiB

PROMPT: DEVOPS-AGENT - FASE 3

Fase: 3 - Shared Infrastructure Agente: DevOps-Agent Version: 1.0.0


PROMPT DE INICIALIZACION

Seras DevOps-Agent trabajando en la migracion del workspace
para realizar: Crear infraestructura compartida (Fase 3)

## CONTEXTO

Las Fases 1 y 2 estan completadas:
- Control Plane creado en: /home/adrian/Documentos/workspace-v1/control-plane/
- Registries creados: ports.registry.yml, domains.registry.yml, databases.registry.yml
- Directivas SIMCO actualizadas con registry awareness
- SIMCO-DEVOPS.md creado

Tu tarea es crear la infraestructura Docker compartida que usaran todos los proyectos.

## TUS TAREAS ESPECIFICAS

### 1. Docker Networks

Crear sistema de redes aisladas por proyecto:

```yaml
ESTRUCTURA:
control-plane/devtools/docker/networks/
  +-- networks.yml         # Definicion de redes
  +-- create-networks.sh   # Script para crear redes
  +-- README.md            # Documentacion

REQUISITOS:
- Red compartida: infra_shared (para Traefik, monitoring)
- Redes por proyecto: {proyecto}_{ambiente}
  - gamilit_local, gamilit_dev, gamilit_staging, gamilit_prod
  - erp_local, erp_dev, erp_staging, erp_prod
  - trading_local, trading_dev, trading_staging, trading_prod
  - betting_local, betting_dev, betting_staging, betting_prod

2. Traefik Configuration

Crear configuracion de Traefik como reverse proxy:

ESTRUCTURA:
control-plane/devtools/docker/traefik/
  +-- traefik.yml                    # Config principal
  +-- docker-compose.traefik.yml     # Compose para Traefik
  +-- dynamic/
        +-- routers.yml              # Routers dinamicos
        +-- middlewares.yml          # Middlewares comunes

REQUISITOS:
- Solo Traefik expone puertos 80, 443
- Dashboard en puerto 8080 (solo dev)
- Routing basado en domains.registry.yml
- Middlewares: CORS, rate-limit, security-headers

3. Docker Compose Templates

Crear templates reutilizables:

ESTRUCTURA:
control-plane/devtools/docker/templates/
  +-- docker-compose.base.yml       # Logging, healthcheck defaults
  +-- docker-compose.backend.yml    # Template backend Node/Python
  +-- docker-compose.frontend.yml   # Template frontend React/Vue
  +-- docker-compose.fullstack.yml  # Template completo

REQUISITOS:
- Usar expose en lugar de ports
- Labels de Traefik
- Conectar a redes correctas
- Healthcheck configurado
- Placeholders: {{SERVICE_NAME}}, {{PORT}}, {{DOMAIN}}, {{PROJECT}}

4. Environment Configuration

Crear templates de variables de entorno:

ESTRUCTURA:
control-plane/devtools/configs/env/
  +-- .env.template           # Template completo
  +-- .env.local.template     # Para desarrollo local
  +-- .env.dev.template       # Para ambiente dev
  +-- .env.staging.template   # Para staging
  +-- .env.prod.template      # Para produccion

REQUISITOS:
- Variables de BD (host, port, name, user, password)
- Variables de Redis
- Variables de JWT
- Variables de logging
- Placeholders claros

5. Scripts de Setup

Crear scripts de automatizacion:

ESTRUCTURA:
control-plane/devtools/scripts/bootstrap/
  +-- init-workspace.sh      # Setup inicial del workspace
  +-- init-project.sh        # Setup de proyecto individual

REQUISITOS:
init-workspace.sh:
- Verificar Docker instalado
- Crear redes
- Levantar Traefik
- Crear directorios necesarios

init-project.sh:
- Parametros: nombre proyecto, tipo (backend/frontend/fullstack)
- Generar docker-compose desde template
- Generar .env desde template
- Verificar red existe

REGISTRIES DE REFERENCIA

ports.registry.yml

# Extraer puertos de:
# control-plane/registries/ports.registry.yml

# Proyectos y puertos:
gamilit:
  api: 3000
  web: 3001
  websocket: 3002

erp_suite:
  api: 3010
  web: 3011

erp_construccion:
  api: 3012
  web: 3013

domains.registry.yml

# Extraer dominios de:
# control-plane/registries/domains.registry.yml

# Dominios locales:
gamilit:
  api: api.gamilit.localhost
  web: gamilit.localhost

erp:
  api: api.erp.localhost
  web: erp.localhost

RESTRICCIONES

  • NO exponer puertos directamente (solo via Traefik)
  • Usar redes externas (external: true)
  • Scripts deben ser idempotentes
  • Documentar cada archivo creado
  • Incluir comentarios explicativos

PROTOCOLO DE TRABAJO

  1. Crear estructura de carpetas
  2. Crear networks.yml y script
  3. Crear configuracion de Traefik
  4. Crear templates de docker-compose
  5. Crear templates de environment
  6. Crear scripts de setup
  7. Probar en entorno local
  8. Documentar en IMPLEMENTACION/00-EJECUCION.md

VALIDACION

# Verificar que redes se crean
docker network ls | grep -E "(infra|gamilit|erp|trading|betting)"

# Verificar Traefik
curl http://localhost:8080/api/overview

# Verificar routing
curl http://api.gamilit.localhost/health

ENTREGABLES

  1. networks/

    • networks.yml
    • create-networks.sh
    • README.md
  2. traefik/

    • traefik.yml
    • docker-compose.traefik.yml
    • dynamic/routers.yml
    • dynamic/middlewares.yml
  3. templates/

    • docker-compose.base.yml
    • docker-compose.backend.yml
    • docker-compose.frontend.yml
    • docker-compose.fullstack.yml
  4. configs/env/

    • .env.template
    • .env.local.template
  5. scripts/bootstrap/

    • init-workspace.sh
    • init-project.sh
  6. Documentacion actualizada


---

## TEMPLATE: create-networks.sh

```bash
#!/bin/bash
# ==============================================================================
# create-networks.sh - Crea redes Docker para el workspace
# ==============================================================================

set -e

# Colores
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

echo -e "${YELLOW}=== Creando redes Docker ===${NC}"

# Red de infraestructura
echo "Creando red: infra_shared"
docker network create infra_shared 2>/dev/null || echo "  (ya existe)"

# Proyectos y ambientes
PROJECTS=("gamilit" "erp" "trading" "betting")
ENVIRONMENTS=("local" "dev" "staging" "prod")

for project in "${PROJECTS[@]}"; do
    for env in "${ENVIRONMENTS[@]}"; do
        network_name="${project}_${env}"
        echo "Creando red: $network_name"
        docker network create "$network_name" 2>/dev/null || echo "  (ya existe)"
    done
done

echo -e "${GREEN}=== Redes creadas exitosamente ===${NC}"

# Listar redes creadas
echo ""
echo "Redes disponibles:"
docker network ls --filter "driver=bridge" --format "{{.Name}}" | grep -E "(infra|gamilit|erp|trading|betting)" || true

TEMPLATE: docker-compose.backend.yml

# ==============================================================================
# docker-compose.backend.yml - Template para servicios backend
# ==============================================================================
# Uso: Copiar y reemplazar placeholders
#   {{SERVICE_NAME}} - Nombre del servicio (ej: gamilit-api)
#   {{PORT}} - Puerto interno (ej: 3000)
#   {{DOMAIN}} - Dominio de Traefik (ej: api.gamilit.localhost)
#   {{PROJECT}} - Nombre del proyecto (ej: gamilit)
# ==============================================================================

version: "3.8"

x-logging: &default-logging
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

services:
  {{SERVICE_NAME}}:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: {{SERVICE_NAME}}
    restart: unless-stopped

    # IMPORTANTE: usar expose, NO ports
    expose:
      - "{{PORT}}"

    environment:
      - NODE_ENV=${NODE_ENV:-development}
      - PORT={{PORT}}
      - DATABASE_URL=${DATABASE_URL}
      - REDIS_URL=${REDIS_URL}
      - JWT_SECRET=${JWT_SECRET}

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:{{PORT}}/health"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s

    # Labels para Traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.{{SERVICE_NAME}}.rule=Host(`{{DOMAIN}}`)"
      - "traefik.http.routers.{{SERVICE_NAME}}.entrypoints=web"
      - "traefik.http.services.{{SERVICE_NAME}}.loadbalancer.server.port={{PORT}}"

    networks:
      - {{PROJECT}}_${ENV:-local}
      - infra_shared

    logging:
      <<: *default-logging

networks:
  {{PROJECT}}_${ENV:-local}:
    external: true
  infra_shared:
    external: true

NOTAS PARA EL AGENTE

  1. Principio fundamental: Solo Traefik expone puertos publicos
  2. Redes: Cada proyecto tiene su red aislada por ambiente
  3. Templates: Deben ser copiables y usables con minima modificacion
  4. Scripts: Idempotentes - pueden ejecutarse multiples veces
  5. Documentacion: Cada archivo debe tener header explicativo

Documento generado por: Architecture-Analyst