Saltar a contenido

Desarrollo de Servicios – Despliegue

Contenedores

Dockerfiles por servicio/MFE; imágenes versionadas.

Ambientes

Dev/staging/prod con configuración por variables; endpoints de MFEs y APIs resueltos por ambiente.

Publicación vía EDI

Servicios backend se exponen en X-Road con certificados y versionado; pruebas de interoperabilidad antes de publicar.

CI/CD

Pipelines para build, test, lint y push de imágenes; actualización de refs de submódulos en dev-env del shell.

Documentación operativa

Health checks, dashboards, alertas; runbooks básicos (restart, rotación de secretos, escalado).


deploy-env backend – Ambiente de despliegue

Repositorio que orquesta imágenes versionadas en producción:

deploy-env/
├── config/
│   └── nginx.conf          # opcional
├── data/                   # volúmenes de persistencia (postgres, minio, etc.)
├── versions.json           # mapping servicio → imagen + versión
├── docker-compose.yml      # compose productivo
├── Makefile                # deploy/rollback/logs
├── .env                    # secretos y configuración (NO en git)
└── README.md

Principios: 1. Un único repositorio de despliegue (sin branches por ambiente). 2. versions.json versionado en git; .env siempre fuera de git. 3. Imágenes inmutables; solo se despliega código compilado. 4. CI/CD actualiza versions.json, commitea y taguea deploy-env.

versions.json

Define solo servicios propios construidos en CI/CD:

{
  "backend": {
    "image": "registry.io/proyecto/backend",
    "version": "1.0.1"
  },
  "frontend": {
    "image": "registry.io/proyecto/frontend",
    "version": "1.0.0"
  }
}

.env de deploy-env

Contiene puertos, secretos y configuración (no versionado):

BACKEND_PORT=8010
FRONTEND_PORT=8011
POSTGRES_PORT=8014

POSTGRES_USER=postgres
POSTGRES_PASSWORD=STRONG_PASSWORD
POSTGRES_DB=app_db_prod

NODE_ENV=production
JWT_SECRET=STRONG_JWT_SECRET
LOG_MAX_SIZE=10m
LOG_MAX_FILE=3

docker-compose productivo (backend)

Usa versiones tomadas de versions.json para servicios propios; versiones fijas para conectables:

services:
  backend:
    image: registry.io/proyecto/backend:${BACKEND_VERSION}
    restart: unless-stopped
    ports:
      - "${BACKEND_PORT}:3000"
    environment:
      - NODE_ENV=${NODE_ENV}
      - DATABASE_HOST=postgres
      - DATABASE_PORT=5432
      - DATABASE_USER=${POSTGRES_USER}
      - DATABASE_PASSWORD=${POSTGRES_PASSWORD}
      - DATABASE_NAME=${POSTGRES_DB}
      - JWT_SECRET=${JWT_SECRET}
    depends_on:
      postgres:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    logging:
      driver: "json-file"
      options:
        max-size: ${LOG_MAX_SIZE}
        max-file: ${LOG_MAX_FILE}

deploy-env frontend – Shell y microfrontends

Estructura

deploy-env/
├── config/
│   ├── env.example           # variables de ambiente
│   ├── microfrontends.json   # configuración de MFEs
│   └── nginx.conf            # opcional
├── docker-compose.yml        # orquestación
├── Makefile                  # deploy/rollback
└── .env                      # valores reales

Shell (contenedor madre)

services:
  shell:
    image: registry.url/proyecto/eter-shell:${SHELL_VERSION}
    ports:
      - "${SHELL_PORT}:80"
    environment:
      - NODE_ENV=production
      - BACKEND_URL=${BACKEND_URL}
    depends_on:
      - backend
    volumes:
      - ./config/microfrontends.json:/config/microfrontends.json:ro
    restart: always
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health"]
      interval: 30s
      timeout: 10s
      retries: 3

Microfrontends

  personas-frontend:
    image: registry.url/proyecto/eter-personas-frontend:${PERSONAS_FRONTEND_VERSION}
    environment:
      - NODE_ENV=production
      - BACKEND_URL=${BACKEND_URL}
    restart: always
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health"]
      interval: 30s
      timeout: 10s
      retries: 3

microfrontends.json

Define metadata de MFEs, URLs y rutas:

{
  "environment": "production",
  "shell": {
    "name": "eter-shell",
    "version": "1.3.0"
  },
  "microfrontends": [
    {
      "name": "personas",
      "title": "Gestión de Personas",
      "version": "1.0.0",
      "url": "https://personas.example.com",
      "healthcheck": "https://personas.example.com/health",
      "routes": ["/personas", "/personas/:id"]
    }
  ]
}

CI/CD y operaciones

  • Pipelines de cada servicio construyen imágenes dev/prod y actualizan versions.json o variables de versión.
  • Pipelines del deploy-env aplican docker compose pull + docker compose up -d con las nuevas versiones.
  • Operación diaria: uso de healthchecks, dashboards, alertas, runbooks de rollback (docker compose rollback o equivalente Makefile).