Files
VoxPopuli/docker-compose-py.yaml

203 lines
7.1 KiB
YAML

# ============================================================
# VoxPopuli - docker-compose.yaml
# Orquesta la app + toda la infraestructura de datos/mensajería
# - MySQL → API Usuarios (8000)
# - MongoDB → API Reportes (8001)
# - MongoDB → API Notificaciones(8002)
# - MongoDB → API Moderación (8003)
# - PostgreSQL → API Métricas (8004) ← faltaba esto
# - RabbitMQ → cola de mensajes entre microservicios
# ============================================================
# Uso rápido:
# cp .env.example .env # ajusta credenciales
# docker compose up --build
# ============================================================
name: voxpopuli
services:
# ──────────────────────────────────────────
# INFRAESTRUCTURA
# ──────────────────────────────────────────
mysql:
image: mysql:8.0
container_name: voxpopuli_mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword}
MYSQL_DATABASE: voxpopuli_users
MYSQL_USER: ${MYSQL_USER:-voxpopuli}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-voxpopuli_pass}
ports:
- "${MYSQL_PORT:-3306}:3306"
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-rootpassword}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
networks:
- voxpopuli_net
mongodb-reports:
image: mongo:7.0
container_name: voxpopuli_mongo_reports
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER:-admin}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-admin_password}
MONGO_INITDB_DATABASE: voxpopuli_reports
command: mongod --auth
ports:
- "${MONGO_REPORTS_PORT:-27017}:27017"
volumes:
- mongo_reports_data:/data/db
healthcheck:
test: ["CMD", "mongosh", "--quiet", "--eval", "db.adminCommand('ping').ok", "--username", "${MONGO_USER:-admin}", "--password", "${MONGO_PASSWORD:-admin_password}", "--authenticationDatabase", "admin"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
networks:
- voxpopuli_net
mongodb-notifications:
image: mongo:7.0
container_name: voxpopuli_mongo_notifications
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER:-admin}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-admin_password}
MONGO_INITDB_DATABASE: voxpopuli_notifications
command: mongod --auth
ports:
- "${MONGO_NOTIFICATIONS_PORT:-27018}:27017"
volumes:
- mongo_notifications_data:/data/db
healthcheck:
test: ["CMD", "mongosh", "--quiet", "--eval", "db.adminCommand('ping').ok", "--username", "${MONGO_USER:-admin}", "--password", "${MONGO_PASSWORD:-admin_password}", "--authenticationDatabase", "admin"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
networks:
- voxpopuli_net
# PostgreSQL para la API de Métricas
postgres:
image: postgres:16-alpine
container_name: voxpopuli_postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-voxpopuli}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-voxpopuli_pass}
POSTGRES_DB: voxpopuli_metrics
ports:
- "${POSTGRES_PORT:-5432}:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-voxpopuli} -d voxpopuli_metrics"]
interval: 10s
timeout: 5s
retries: 5
start_period: 20s
networks:
- voxpopuli_net
rabbitmq:
image: rabbitmq:3.13-management
container_name: voxpopuli_rabbitmq
restart: unless-stopped
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-voxpopuli}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS:-voxpopuli_pass}
ports:
- "${RABBITMQ_AMQP_PORT:-5672}:5672"
- "${RABBITMQ_MGMT_PORT:-15672}:15672"
volumes:
- rabbitmq_data:/var/lib/rabbitmq
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
networks:
- voxpopuli_net
# ──────────────────────────────────────────
# APLICACIÓN
# ──────────────────────────────────────────
app:
build:
context: .
dockerfile: Dockerfile
image: voxpopuli-app:latest
container_name: voxpopuli_app
restart: unless-stopped
env_file:
- .env
environment:
# MySQL - Usuarios
MYSQL_URL: mysql+pymysql://${MYSQL_USER:-voxpopuli}:${MYSQL_PASSWORD:-voxpopuli_pass}@mysql/voxpopuli_users
# MongoDB - Reportes
MONGODB_URL: mongodb://${MONGO_USER:-admin}:${MONGO_PASSWORD:-admin_password}@mongodb-reports:27017
MONGODB_DB: voxpopuli_reports
# MongoDB - Notificaciones
MONGODB_NOTIFICATIONS_URL: mongodb://${MONGO_USER:-admin}:${MONGO_PASSWORD:-admin_password}@mongodb-notifications:27017
MONGODB_NOTIFICATIONS_DB: voxpopuli_notifications
# PostgreSQL - Métricas
POSTGRES_URL: postgresql://${POSTGRES_USER:-voxpopuli}:${POSTGRES_PASSWORD:-voxpopuli_pass}@postgres:5432/voxpopuli_metrics
# RabbitMQ
RABBITMQ_URL: amqp://${RABBITMQ_USER:-voxpopuli}:${RABBITMQ_PASS:-voxpopuli_pass}@rabbitmq:5672/
# App
HOST: 0.0.0.0
LOG_LEVEL: ${LOG_LEVEL:-info}
ports:
- "8000:8000" # API Usuarios
- "8001:8001" # API Reportes
- "8002:8002" # API Notificaciones
- "8003:8003" # API Moderación
- "8004:8004" # API Métricas
depends_on:
mysql:
condition: service_healthy
mongodb-reports:
condition: service_healthy
mongodb-notifications:
condition: service_healthy
postgres:
condition: service_healthy
rabbitmq:
condition: service_healthy
networks:
- voxpopuli_net
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/')"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
# ──────────────────────────────────────────
# VOLÚMENES
# ──────────────────────────────────────────
volumes:
mysql_data:
mongo_reports_data:
mongo_notifications_data:
postgres_data:
rabbitmq_data:
# ──────────────────────────────────────────
# RED INTERNA
# ──────────────────────────────────────────
networks:
voxpopuli_net:
driver: bridge