# FASE 3 - TAREAS DE IMPLEMENTACION **Fase:** 3 - Shared Infrastructure **Estado:** Planificado **Responsable:** DevOps-Agent --- ## RESUMEN DE TAREAS | Grupo | Tareas | Esfuerzo Total | |-------|--------|----------------| | T3.1 Docker Networks | 3 | 3 horas | | T3.2 Traefik | 4 | 6 horas | | T3.3 Templates | 4 | 5 horas | | T3.4 Environment | 3 | 3 horas | | T3.5 Scripts | 3 | 3 horas | | **TOTAL** | **17** | **20 horas** | --- ## T3.1 DOCKER NETWORKS ### T3.1.1 Crear networks.yml **Esfuerzo:** 1 hora **Ubicacion:** control-plane/devtools/docker/networks/networks.yml **Contenido:** ```yaml # networks.yml - Definicion de redes Docker version: "1.0.0" networks: # Infraestructura compartida infra: name: infra_shared driver: bridge description: "Red para servicios de infraestructura (Traefik, monitoring)" # Por proyecto - patron: {proyecto}_{ambiente} projects: gamilit: environments: [local, dev, staging, prod] pattern: "gamilit_{env}" erp_suite: environments: [local, dev, staging, prod] pattern: "erp_{env}" trading: environments: [local, dev, staging, prod] pattern: "trading_{env}" betting: environments: [local, dev, staging, prod] pattern: "betting_{env}" ``` ### T3.1.2 Crear create-networks.sh **Esfuerzo:** 1 hora **Ubicacion:** control-plane/devtools/docker/networks/create-networks.sh **Funcionalidad:** - Lee networks.yml - Crea redes Docker especificadas - Idempotente (no falla si red existe) ### T3.1.3 Documentar uso de redes **Esfuerzo:** 1 hora **Ubicacion:** control-plane/devtools/docker/networks/README.md --- ## T3.2 TRAEFIK CONFIGURATION ### T3.2.1 Crear traefik.yml **Esfuerzo:** 2 horas **Ubicacion:** control-plane/devtools/docker/traefik/traefik.yml **Contenido:** ```yaml # traefik.yml - Configuracion principal api: dashboard: true insecure: true # Solo para desarrollo entryPoints: web: address: ":80" websecure: address: ":443" providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false network: infra_shared file: directory: /etc/traefik/dynamic watch: true log: level: INFO ``` ### T3.2.2 Crear routers.yml **Esfuerzo:** 1.5 horas **Ubicacion:** control-plane/devtools/docker/traefik/dynamic/routers.yml **Contenido base:** ```yaml # routers.yml - Routers dinamicos http: routers: # Gamilit gamilit-api: rule: "Host(`api.gamilit.localhost`)" service: gamilit-api entryPoints: - web gamilit-web: rule: "Host(`gamilit.localhost`)" service: gamilit-web entryPoints: - web # ERP Suite - Core erp-api: rule: "Host(`api.erp.localhost`)" service: erp-api entryPoints: - web # ... mas routers segun domains.registry.yml ``` ### T3.2.3 Crear middlewares.yml **Esfuerzo:** 1 hora **Ubicacion:** control-plane/devtools/docker/traefik/dynamic/middlewares.yml **Contenido:** ```yaml # middlewares.yml - Middlewares comunes http: middlewares: # Rate limiting rate-limit: rateLimit: average: 100 burst: 50 # CORS cors-headers: headers: accessControlAllowMethods: - GET - POST - PUT - DELETE - OPTIONS accessControlAllowOriginList: - "*" accessControlAllowHeaders: - "*" # Security headers security-headers: headers: frameDeny: true browserXssFilter: true contentTypeNosniff: true ``` ### T3.2.4 Crear docker-compose.traefik.yml **Esfuerzo:** 1.5 horas **Ubicacion:** control-plane/devtools/docker/traefik/docker-compose.traefik.yml **Contenido:** ```yaml version: "3.8" services: traefik: image: traefik:v2.10 container_name: traefik restart: unless-stopped ports: - "80:80" - "443:443" - "8080:8080" # Dashboard volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik.yml:/etc/traefik/traefik.yml:ro - ./dynamic:/etc/traefik/dynamic:ro networks: - infra_shared networks: infra_shared: external: true ``` --- ## T3.3 DOCKER COMPOSE TEMPLATES ### T3.3.1 Crear docker-compose.base.yml **Esfuerzo:** 1.5 horas **Contenido base para todos los servicios:** ```yaml # docker-compose.base.yml # Template base - NO usar directamente x-logging: &default-logging driver: "json-file" options: max-size: "10m" max-file: "3" x-healthcheck: &default-healthcheck interval: 30s timeout: 5s retries: 3 start_period: 10s ``` ### T3.3.2 Crear docker-compose.backend.yml **Esfuerzo:** 1.5 horas **Template para servicios backend:** ```yaml # docker-compose.backend.yml # Template para backend services version: "3.8" services: {{SERVICE_NAME}}: build: context: . dockerfile: Dockerfile container_name: {{SERVICE_NAME}} restart: unless-stopped expose: - "{{PORT}}" environment: - NODE_ENV=${NODE_ENV:-development} - PORT={{PORT}} - DATABASE_URL=${DATABASE_URL} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:{{PORT}}/health"] <<: *default-healthcheck labels: - "traefik.enable=true" - "traefik.http.routers.{{SERVICE_NAME}}.rule=Host(`{{DOMAIN}}`)" - "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 ``` ### T3.3.3 Crear docker-compose.frontend.yml **Esfuerzo:** 1 hora ### T3.3.4 Crear docker-compose.fullstack.yml **Esfuerzo:** 1 hora --- ## T3.4 ENVIRONMENT CONFIGURATION ### T3.4.1 Crear .env.template **Esfuerzo:** 1 hora **Contenido:** ```bash # .env.template - Variables comunes # Copiar a .env.{ambiente} y completar valores # Ambiente NODE_ENV=development ENV=local # Database DATABASE_HOST=localhost DATABASE_PORT=5432 DATABASE_NAME= DATABASE_USER= DATABASE_PASSWORD= # Redis REDIS_HOST=localhost REDIS_PORT=6379 # JWT JWT_SECRET= JWT_EXPIRES_IN=1d # Logging LOG_LEVEL=info LOG_FORMAT=json ``` ### T3.4.2 Crear .env.local.template **Esfuerzo:** 0.5 horas ### T3.4.3 Crear generate-env.sh **Esfuerzo:** 1.5 horas **Script que genera .env desde template:** ```bash #!/bin/bash # generate-env.sh # Genera archivo .env desde template TEMPLATE="$1" OUTPUT="$2" VALUES_FILE="$3" if [ -z "$TEMPLATE" ] || [ -z "$OUTPUT" ]; then echo "Uso: generate-env.sh