203 lines
7.1 KiB
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 |