Files
bakery-ia/docker-compose.yml

952 lines
27 KiB
YAML
Raw Normal View History

2025-07-19 17:49:03 +02:00
# ================================================================
2025-07-20 02:16:51 +02:00
# OPTIMIZED DOCKER COMPOSE - NO ENVIRONMENT DUPLICATION
# Single source of truth: .env file only
2025-07-19 17:49:03 +02:00
# ================================================================
2025-07-20 02:16:51 +02:00
# ================================================================
# NETWORKS & VOLUMES (same as before)
# ================================================================
2025-07-19 17:49:03 +02:00
networks:
bakery-network:
driver: bridge
2025-07-20 02:16:51 +02:00
ipam:
config:
- subnet: 172.20.0.0/16
2025-07-19 17:49:03 +02:00
volumes:
2025-07-20 02:16:51 +02:00
auth_db_data:
training_db_data:
forecasting_db_data:
2025-08-12 18:17:30 +02:00
sales_db_data:
external_db_data:
2025-07-20 02:16:51 +02:00
tenant_db_data:
notification_db_data:
inventory_db_data:
2025-08-15 18:09:35 +02:00
recipes_db_data:
suppliers_db_data:
2025-08-16 15:00:36 +02:00
pos_db_data:
2025-07-19 17:49:03 +02:00
redis_data:
rabbitmq_data:
prometheus_data:
grafana_data:
2025-07-20 02:16:51 +02:00
model_storage:
log_storage:
2025-08-15 18:09:35 +02:00
nominatim_data:
2025-07-22 17:01:12 +02:00
2025-07-20 02:16:51 +02:00
# ================================================================
# SERVICES - USING ONLY .env FILE
# ================================================================
services:
2025-07-20 02:16:51 +02:00
2025-07-19 17:49:03 +02:00
# ================================================================
2025-07-20 02:16:51 +02:00
# INFRASTRUCTURE - NO DUPLICATION
2025-07-19 17:49:03 +02:00
# ================================================================
redis:
image: redis:7-alpine
container_name: bakery-redis
2025-07-20 02:16:51 +02:00
restart: unless-stopped
# ONLY use environment substitution from .env
command: >
redis-server
--appendonly yes
--requirepass ${REDIS_PASSWORD}
--maxmemory ${REDIS_MAX_MEMORY:-512mb}
--databases 16
ports:
2025-07-20 02:16:51 +02:00
- "${REDIS_PORT}:6379"
volumes:
2025-07-19 17:49:03 +02:00
- redis_data:/data
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.10
healthcheck:
2025-07-20 02:16:51 +02:00
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 30s
timeout: 10s
retries: 3
2025-07-19 17:49:03 +02:00
rabbitmq:
2025-07-20 02:16:51 +02:00
image: rabbitmq:3.12-management-alpine
2025-07-19 17:49:03 +02:00
container_name: bakery-rabbitmq
2025-07-20 02:16:51 +02:00
restart: unless-stopped
# ONLY use environment substitution from .env
2025-07-19 17:49:03 +02:00
environment:
2025-07-20 02:16:51 +02:00
- RABBITMQ_DEFAULT_USER=${RABBITMQ_USER}
- RABBITMQ_DEFAULT_PASS=${RABBITMQ_PASSWORD}
- RABBITMQ_DEFAULT_VHOST=${RABBITMQ_VHOST}
ports:
2025-07-20 02:16:51 +02:00
- "${RABBITMQ_PORT}:5672"
- "${RABBITMQ_MANAGEMENT_PORT}:15672"
volumes:
2025-07-19 17:49:03 +02:00
- rabbitmq_data:/var/lib/rabbitmq
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.11
healthcheck:
2025-07-19 17:49:03 +02:00
test: ["CMD", "rabbitmq-diagnostics", "ping"]
interval: 30s
timeout: 10s
retries: 3
2025-07-19 17:49:03 +02:00
# ================================================================
2025-07-20 02:16:51 +02:00
# DATABASES - NO DUPLICATION
2025-07-19 17:49:03 +02:00
# ================================================================
auth-db:
2025-07-20 02:16:51 +02:00
image: postgres:15-alpine
container_name: bakery-auth-db
2025-07-20 02:16:51 +02:00
restart: unless-stopped
# ONLY reference .env variables
environment:
2025-07-20 02:16:51 +02:00
- POSTGRES_DB=${AUTH_DB_NAME}
- POSTGRES_USER=${AUTH_DB_USER}
- POSTGRES_PASSWORD=${AUTH_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
2025-07-20 02:16:51 +02:00
- auth_db_data:/var/lib/postgresql/data
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.20
healthcheck:
2025-07-20 02:16:51 +02:00
test: ["CMD-SHELL", "pg_isready -U ${AUTH_DB_USER} -d ${AUTH_DB_NAME}"]
2025-07-19 17:49:03 +02:00
interval: 10s
timeout: 5s
retries: 5
2025-07-20 02:16:51 +02:00
training-db:
image: postgres:15-alpine
container_name: bakery-training-db
restart: unless-stopped
2025-07-19 17:49:03 +02:00
environment:
2025-07-20 02:16:51 +02:00
- POSTGRES_DB=${TRAINING_DB_NAME}
- POSTGRES_USER=${TRAINING_DB_USER}
- POSTGRES_PASSWORD=${TRAINING_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
2025-07-19 17:49:03 +02:00
volumes:
2025-07-20 02:16:51 +02:00
- training_db_data:/var/lib/postgresql/data
2025-07-19 17:49:03 +02:00
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.21
2025-07-19 17:49:03 +02:00
healthcheck:
2025-07-20 02:16:51 +02:00
test: ["CMD-SHELL", "pg_isready -U ${TRAINING_DB_USER} -d ${TRAINING_DB_NAME}"]
2025-07-19 17:49:03 +02:00
interval: 10s
timeout: 5s
retries: 5
2025-07-20 02:16:51 +02:00
forecasting-db:
image: postgres:15-alpine
container_name: bakery-forecasting-db
restart: unless-stopped
environment:
2025-07-20 02:16:51 +02:00
- POSTGRES_DB=${FORECASTING_DB_NAME}
- POSTGRES_USER=${FORECASTING_DB_USER}
- POSTGRES_PASSWORD=${FORECASTING_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
2025-07-20 02:16:51 +02:00
- forecasting_db_data:/var/lib/postgresql/data
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.22
healthcheck:
2025-07-20 02:16:51 +02:00
test: ["CMD-SHELL", "pg_isready -U ${FORECASTING_DB_USER} -d ${FORECASTING_DB_NAME}"]
2025-07-19 17:49:03 +02:00
interval: 10s
timeout: 5s
retries: 5
2025-08-12 18:17:30 +02:00
sales-db:
2025-07-20 02:16:51 +02:00
image: postgres:15-alpine
2025-08-12 18:17:30 +02:00
container_name: bakery-sales-db
2025-07-20 02:16:51 +02:00
restart: unless-stopped
environment:
2025-08-12 18:17:30 +02:00
- POSTGRES_DB=${SALES_DB_NAME}
- POSTGRES_USER=${SALES_DB_USER}
- POSTGRES_PASSWORD=${SALES_DB_PASSWORD}
2025-07-20 02:16:51 +02:00
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
2025-08-12 18:17:30 +02:00
- sales_db_data:/var/lib/postgresql/data
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.23
healthcheck:
2025-08-12 18:17:30 +02:00
test: ["CMD-SHELL", "pg_isready -U ${SALES_DB_USER} -d ${SALES_DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
external-db:
image: postgres:15-alpine
container_name: bakery-external-db
restart: unless-stopped
environment:
- POSTGRES_DB=${EXTERNAL_DB_NAME}
- POSTGRES_USER=${EXTERNAL_DB_USER}
- POSTGRES_PASSWORD=${EXTERNAL_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- external_db_data:/var/lib/postgresql/data
networks:
bakery-network:
ipv4_address: 172.20.0.24
2025-08-12 18:17:30 +02:00
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${EXTERNAL_DB_USER} -d ${EXTERNAL_DB_NAME}"]
2025-07-19 17:49:03 +02:00
interval: 10s
timeout: 5s
retries: 5
2025-07-20 02:16:51 +02:00
tenant-db:
image: postgres:15-alpine
container_name: bakery-tenant-db
restart: unless-stopped
environment:
2025-07-20 02:16:51 +02:00
- POSTGRES_DB=${TENANT_DB_NAME}
- POSTGRES_USER=${TENANT_DB_USER}
- POSTGRES_PASSWORD=${TENANT_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
2025-07-20 02:16:51 +02:00
- tenant_db_data:/var/lib/postgresql/data
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.25
healthcheck:
2025-07-20 02:16:51 +02:00
test: ["CMD-SHELL", "pg_isready -U ${TENANT_DB_USER} -d ${TENANT_DB_NAME}"]
2025-07-19 17:49:03 +02:00
interval: 10s
timeout: 5s
retries: 5
notification-db:
2025-07-20 02:16:51 +02:00
image: postgres:15-alpine
container_name: bakery-notification-db
2025-07-20 02:16:51 +02:00
restart: unless-stopped
environment:
2025-07-20 02:16:51 +02:00
- POSTGRES_DB=${NOTIFICATION_DB_NAME}
- POSTGRES_USER=${NOTIFICATION_DB_USER}
- POSTGRES_PASSWORD=${NOTIFICATION_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
2025-07-20 02:16:51 +02:00
- notification_db_data:/var/lib/postgresql/data
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.26
healthcheck:
2025-07-20 02:16:51 +02:00
test: ["CMD-SHELL", "pg_isready -U ${NOTIFICATION_DB_USER} -d ${NOTIFICATION_DB_NAME}"]
2025-07-19 17:49:03 +02:00
interval: 10s
timeout: 5s
retries: 5
inventory-db:
image: postgres:15-alpine
container_name: bakery-inventory-db
restart: unless-stopped
environment:
- POSTGRES_DB=${INVENTORY_DB_NAME}
- POSTGRES_USER=${INVENTORY_DB_USER}
- POSTGRES_PASSWORD=${INVENTORY_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- inventory_db_data:/var/lib/postgresql/data
networks:
bakery-network:
ipv4_address: 172.20.0.27
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${INVENTORY_DB_USER} -d ${INVENTORY_DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
2025-08-15 18:09:35 +02:00
recipes-db:
image: postgres:15-alpine
container_name: bakery-recipes-db
restart: unless-stopped
environment:
- POSTGRES_DB=${RECIPES_DB_NAME}
- POSTGRES_USER=${RECIPES_DB_USER}
- POSTGRES_PASSWORD=${RECIPES_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- recipes_db_data:/var/lib/postgresql/data
networks:
bakery-network:
ipv4_address: 172.20.0.28
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${RECIPES_DB_USER} -d ${RECIPES_DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
suppliers-db:
image: postgres:15-alpine
container_name: bakery-suppliers-db
restart: unless-stopped
environment:
- POSTGRES_DB=${SUPPLIERS_DB_NAME}
- POSTGRES_USER=${SUPPLIERS_DB_USER}
- POSTGRES_PASSWORD=${SUPPLIERS_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- suppliers_db_data:/var/lib/postgresql/data
networks:
bakery-network:
ipv4_address: 172.20.0.29
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${SUPPLIERS_DB_USER} -d ${SUPPLIERS_DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
2025-08-16 15:00:36 +02:00
pos-db:
image: postgres:15-alpine
container_name: bakery-pos-db
restart: unless-stopped
environment:
- POSTGRES_DB=${POS_DB_NAME}
- POSTGRES_USER=${POS_DB_USER}
- POSTGRES_PASSWORD=${POS_DB_PASSWORD}
- POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- pos_db_data:/var/lib/postgresql/data
networks:
bakery-network:
ipv4_address: 172.20.0.31
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POS_DB_USER} -d ${POS_DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
2025-07-22 17:01:12 +02:00
# ================================================================
# LOCATION SERVICES (NEW SECTION)
# ================================================================
nominatim-db:
image: postgis/postgis:15-3.3 # Use PostGIS enabled PostgreSQL image
container_name: bakery-nominatim-db
restart: unless-stopped
environment:
- POSTGRES_DB=${NOMINATIM_DB_NAME}
- POSTGRES_USER=${NOMINATIM_DB_USER}
- POSTGRES_PASSWORD=${NOMINATIM_DB_PASSWORD}
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256" # Recommended for PostGIS
volumes:
- nominatim_db_data:/var/lib/postgresql/data
profiles:
- development
networks:
bakery-network:
ipv4_address: 172.20.0.30 # Assign a static IP for Nominatim to find it
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${NOMINATIM_DB_USER} -d ${NOMINATIM_DB_NAME}"]
interval: 10s
timeout: 5s
retries: 5
nominatim:
image: mediagis/nominatim:4.2 # A pre-built Nominatim image
container_name: bakery-nominatim
restart: unless-stopped
env_file: .env # Load environment variables from .env file
environment:
# Database connection details for Nominatim
- POSTGRES_HOST=nominatim-db
- POSTGRES_PORT=5432
- POSTGRES_USER=${NOMINATIM_DB_USER}
- POSTGRES_PASSWORD=${NOMINATIM_DB_PASSWORD}
- POSTGRES_DB=${NOMINATIM_DB_NAME}
- PBF_URL=${NOMINATIM_PBF_URL} # URL to your OpenStreetMap PBF data (e.g., Spain)
ports:
- "${NOMINATIM_PORT}:8080" # Expose Nominatim web interface
volumes:
- nominatim_data:/var/lib/nominatim # Persistent storage for Nominatim data and configuration
networks:
bakery-network:
ipv4_address: 172.20.0.120 # Assign a static IP for Nominatim service
depends_on:
nominatim-db:
condition: service_healthy # Ensure database is ready before Nominatim starts
# By default, mediagis/nominatim image will try to import data on first run
# if PBF_URL is set and the database is empty.
profiles:
- development
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/nominatim/status.php"]
interval: 30s
timeout: 10s
retries: 3
deploy:
resources:
limits:
memory: ${NOMINATIM_MEMORY_LIMIT:-8G} # Nominatim is memory-intensive for import
cpus: '${NOMINATIM_CPU_LIMIT:-4}' # Adjust based on your system and data
2025-07-19 17:49:03 +02:00
# ================================================================
2025-07-20 02:16:51 +02:00
# MICROSERVICES - CLEAN APPROACH
2025-07-19 17:49:03 +02:00
# ================================================================
gateway:
build:
context: .
dockerfile: ./gateway/Dockerfile
2025-07-20 02:16:51 +02:00
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/gateway:${IMAGE_TAG}
2025-07-19 17:49:03 +02:00
container_name: bakery-gateway
2025-07-20 02:16:51 +02:00
restart: unless-stopped
# ONLY load from .env file - no duplication
env_file: .env
2025-07-19 17:49:03 +02:00
ports:
2025-07-20 02:16:51 +02:00
- "${GATEWAY_PORT}:8000"
2025-07-19 17:49:03 +02:00
depends_on:
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.100
2025-07-19 17:49:03 +02:00
volumes:
2025-07-20 02:16:51 +02:00
- log_storage:/app/logs
2025-07-19 17:49:03 +02:00
- ./gateway:/app
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
auth-service:
2025-07-17 15:55:23 +02:00
build:
2025-07-19 17:49:03 +02:00
context: .
2025-07-17 15:55:23 +02:00
dockerfile: ./services/auth/Dockerfile
2025-07-20 02:16:51 +02:00
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/auth-service:${IMAGE_TAG}
container_name: bakery-auth-service
2025-07-20 02:16:51 +02:00
restart: unless-stopped
# ONLY load from .env file - no duplication
env_file: .env
ports:
2025-07-20 02:16:51 +02:00
- "${AUTH_SERVICE_PORT}:8000"
depends_on:
auth-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.101
volumes:
2025-07-20 02:16:51 +02:00
- log_storage:/app/logs
- ./services/auth:/app
2025-07-19 17:49:03 +02:00
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
2025-07-19 17:49:03 +02:00
tenant-service:
build:
context: .
dockerfile: ./services/tenant/Dockerfile
2025-07-20 02:16:51 +02:00
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/tenant-service:${IMAGE_TAG}
2025-07-19 17:49:03 +02:00
container_name: bakery-tenant-service
2025-07-20 02:16:51 +02:00
restart: unless-stopped
env_file: .env
2025-07-19 17:49:03 +02:00
ports:
2025-07-20 02:16:51 +02:00
- "${TENANT_SERVICE_PORT}:8000"
2025-07-19 17:49:03 +02:00
depends_on:
tenant-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.102
2025-07-19 17:49:03 +02:00
volumes:
2025-07-20 02:16:51 +02:00
- log_storage:/app/logs
2025-07-19 17:49:03 +02:00
- ./services/tenant:/app
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
training-service:
2025-07-17 15:55:23 +02:00
build:
2025-07-19 17:49:03 +02:00
context: .
2025-07-17 15:55:23 +02:00
dockerfile: ./services/training/Dockerfile
2025-07-20 02:16:51 +02:00
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/training-service:${IMAGE_TAG}
container_name: bakery-training-service
2025-07-20 02:16:51 +02:00
restart: unless-stopped
env_file: .env
ports:
2025-07-20 02:16:51 +02:00
- "${TRAINING_SERVICE_PORT}:8000"
depends_on:
training-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
2025-08-12 18:17:30 +02:00
sales-service:
condition: service_healthy
external-service:
2025-07-19 17:49:03 +02:00
condition: service_healthy
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.103
volumes:
2025-07-20 02:16:51 +02:00
- log_storage:/app/logs
- model_storage:/app/models
- ./services/training:/app
2025-07-19 17:49:03 +02:00
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
2025-07-20 02:16:51 +02:00
deploy:
resources:
limits:
memory: ${TRAINING_MEMORY_LIMIT:-2G}
cpus: '${TRAINING_CPU_LIMIT:-1.5}'
forecasting-service:
2025-07-17 15:55:23 +02:00
build:
2025-07-19 17:49:03 +02:00
context: .
2025-07-17 15:55:23 +02:00
dockerfile: ./services/forecasting/Dockerfile
2025-07-20 02:16:51 +02:00
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/forecasting-service:${IMAGE_TAG}
container_name: bakery-forecasting-service
2025-07-20 02:16:51 +02:00
restart: unless-stopped
env_file: .env
ports:
2025-07-20 02:16:51 +02:00
- "${FORECASTING_SERVICE_PORT}:8000"
depends_on:
forecasting-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
2025-07-19 17:49:03 +02:00
training-service:
condition: service_healthy
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.104
volumes:
2025-07-20 02:16:51 +02:00
- log_storage:/app/logs
- model_storage:/app/models
- ./services/forecasting:/app
2025-07-19 17:49:03 +02:00
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
2025-08-12 18:17:30 +02:00
sales-service:
2025-07-17 15:55:23 +02:00
build:
2025-07-19 17:49:03 +02:00
context: .
2025-08-12 18:17:30 +02:00
dockerfile: ./services/sales/Dockerfile
2025-07-20 02:16:51 +02:00
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
2025-08-12 18:17:30 +02:00
image: bakery/sales-service:${IMAGE_TAG}
container_name: bakery-sales-service
2025-07-20 02:16:51 +02:00
restart: unless-stopped
env_file: .env
ports:
2025-08-12 18:17:30 +02:00
- "${SALES_SERVICE_PORT}:8000"
depends_on:
2025-08-12 18:17:30 +02:00
sales-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.105
volumes:
2025-07-20 02:16:51 +02:00
- log_storage:/app/logs
2025-08-12 18:17:30 +02:00
- ./services/sales:/app
- ./shared:/app/shared
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()"]
interval: 30s
timeout: 10s
retries: 3
external-service:
build:
context: .
dockerfile: ./services/external/Dockerfile
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/external-service:${IMAGE_TAG}
container_name: bakery-external-service
restart: unless-stopped
env_file: .env
ports:
- "${EXTERNAL_SERVICE_PORT}:8000"
depends_on:
external-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
networks:
bakery-network:
ipv4_address: 172.20.0.106
2025-08-12 18:17:30 +02:00
volumes:
- log_storage:/app/logs
- ./services/external:/app
2025-07-19 17:49:03 +02:00
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
notification-service:
2025-07-17 15:55:23 +02:00
build:
2025-07-19 17:49:03 +02:00
context: .
2025-07-17 15:55:23 +02:00
dockerfile: ./services/notification/Dockerfile
2025-07-20 02:16:51 +02:00
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/notification-service:${IMAGE_TAG}
container_name: bakery-notification-service
2025-07-20 02:16:51 +02:00
restart: unless-stopped
env_file: .env
ports:
2025-07-20 02:16:51 +02:00
- "${NOTIFICATION_SERVICE_PORT}:8000"
depends_on:
notification-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.107
volumes:
2025-07-20 02:16:51 +02:00
- log_storage:/app/logs
- ./services/notification:/app
2025-07-19 17:49:03 +02:00
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
inventory-service:
build:
context: .
dockerfile: ./services/inventory/Dockerfile
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/inventory-service:${IMAGE_TAG}
container_name: bakery-inventory-service
restart: unless-stopped
env_file: .env
ports:
- "${INVENTORY_SERVICE_PORT}:8000"
depends_on:
inventory-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
networks:
bakery-network:
ipv4_address: 172.20.0.108
volumes:
- log_storage:/app/logs
- ./services/inventory:/app
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
2025-08-15 18:09:35 +02:00
recipes-service:
build:
context: .
dockerfile: ./services/recipes/Dockerfile
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/recipes-service:${IMAGE_TAG}
container_name: bakery-recipes-service
restart: unless-stopped
env_file: .env
ports:
- "${RECIPES_SERVICE_PORT}:8000"
depends_on:
recipes-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
inventory-service:
condition: service_healthy
networks:
bakery-network:
ipv4_address: 172.20.0.109
volumes:
- log_storage:/app/logs
- ./services/recipes:/app
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
suppliers-service:
build:
context: .
dockerfile: ./services/suppliers/Dockerfile
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/suppliers-service:${IMAGE_TAG}
container_name: bakery-suppliers-service
restart: unless-stopped
env_file: .env
ports:
- "${SUPPLIERS_SERVICE_PORT}:8000"
depends_on:
suppliers-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
2025-08-15 22:40:19 +02:00
# Temporarily disabled due to health check issues
# inventory-service:
# condition: service_healthy
2025-08-15 18:09:35 +02:00
networks:
bakery-network:
ipv4_address: 172.20.0.111
volumes:
- log_storage:/app/logs
- ./services/suppliers:/app
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
2025-08-16 15:00:36 +02:00
pos-service:
build:
context: .
dockerfile: ./services/pos/Dockerfile
args:
- ENVIRONMENT=${ENVIRONMENT}
- BUILD_DATE=${BUILD_DATE}
image: bakery/pos-service:${IMAGE_TAG}
container_name: bakery-pos-service
restart: unless-stopped
env_file: .env
ports:
- "${POS_SERVICE_PORT}:8000"
depends_on:
pos-db:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
auth-service:
condition: service_healthy
sales-service:
condition: service_healthy
networks:
bakery-network:
ipv4_address: 172.20.0.112
volumes:
- log_storage:/app/logs
- ./services/pos:/app
- ./shared:/app/shared
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
2025-07-19 17:49:03 +02:00
# ================================================================
2025-07-20 02:16:51 +02:00
# MONITORING - SIMPLE APPROACH
2025-07-19 17:49:03 +02:00
# ================================================================
2025-07-17 13:54:51 +02:00
prometheus:
2025-07-20 02:16:51 +02:00
image: prom/prometheus:v2.45.0
container_name: bakery-prometheus
2025-07-20 02:16:51 +02:00
restart: unless-stopped
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
2025-07-20 02:16:51 +02:00
- '--storage.tsdb.retention.time=${PROMETHEUS_RETENTION:-200h}'
- '--web.enable-lifecycle'
2025-07-19 17:49:03 +02:00
ports:
2025-07-20 02:16:51 +02:00
- "${PROMETHEUS_PORT}:9090"
2025-07-19 17:49:03 +02:00
volumes:
2025-07-20 02:16:51 +02:00
- ./infrastructure/monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
2025-07-19 17:49:03 +02:00
- prometheus_data:/prometheus
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.200
grafana:
2025-07-20 02:16:51 +02:00
image: grafana/grafana:10.0.0
container_name: bakery-grafana
2025-07-20 02:16:51 +02:00
restart: unless-stopped
environment:
2025-07-20 02:16:51 +02:00
- GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER}
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
2025-07-19 17:49:03 +02:00
- GF_USERS_ALLOW_SIGN_UP=false
2025-07-20 02:16:51 +02:00
- GF_DEFAULT_TIMEZONE=${TIMEZONE}
- GF_SERVER_ROOT_URL=${GRAFANA_ROOT_URL}
ports:
2025-07-20 02:16:51 +02:00
- "${GRAFANA_PORT}:3000"
volumes:
2025-07-19 17:49:03 +02:00
- grafana_data:/var/lib/grafana
2025-07-20 02:16:51 +02:00
- ./infrastructure/monitoring/grafana:/etc/grafana/provisioning:ro
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.201
depends_on:
2025-07-19 17:49:03 +02:00
- prometheus
2025-07-19 17:49:03 +02:00
# ================================================================
2025-07-20 02:16:51 +02:00
# FRONTEND - CLEAN CONFIG
2025-07-19 17:49:03 +02:00
# ================================================================
dashboard:
build:
context: ./frontend
2025-08-03 19:36:17 +02:00
dockerfile: Dockerfile.development # Use the existing development Dockerfile
2025-07-22 20:22:27 +02:00
args:
2025-08-03 19:36:17 +02:00
- NODE_ENV=development
image: bakery/dashboard:${IMAGE_TAG:-latest}
2025-07-20 02:16:51 +02:00
container_name: bakery-dashboard
restart: unless-stopped
2025-08-03 19:36:17 +02:00
environment:
- NODE_ENV=development
- VITE_APP_TITLE=PanIA Dashboard
- VITE_APP_VERSION=1.0.0
ports:
2025-08-03 19:36:17 +02:00
- "${DASHBOARD_PORT:-3000}:3000"
depends_on:
2025-07-20 02:16:51 +02:00
gateway:
condition: service_healthy
networks:
2025-07-20 02:16:51 +02:00
bakery-network:
ipv4_address: 172.20.0.110
2025-08-03 19:36:17 +02:00
volumes:
- ./frontend:/app
- /app/node_modules # Exclude node_modules from bind mount
2025-07-20 02:16:51 +02:00
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/"]
interval: 30s
timeout: 10s
retries: 3
2025-08-03 19:36:17 +02:00
start_period: 20s
2025-07-20 02:16:51 +02:00
# ================================================================
# DEVELOPMENT TOOLS - OPTIONAL
# ================================================================
pgadmin:
image: dpage/pgadmin4:7.4
container_name: bakery-pgadmin
restart: unless-stopped
environment:
- PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL}
- PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD}
- PGADMIN_CONFIG_SERVER_MODE=False
ports:
- "${PGADMIN_PORT}:80"
volumes:
- ./infrastructure/pgadmin/servers.json:/pgadmin4/servers.json:ro
networks:
- bakery-network
profiles:
- development
- admin
2025-07-20 02:16:51 +02:00
redis-commander:
image: rediscommander/redis-commander:latest
container_name: bakery-redis-commander
restart: unless-stopped
environment:
- REDIS_HOSTS=local:redis:6379:0:${REDIS_PASSWORD}
- HTTP_USER=${REDIS_COMMANDER_USER}
- HTTP_PASSWORD=${REDIS_COMMANDER_PASSWORD}
ports:
- "${REDIS_COMMANDER_PORT}:8081"
networks:
- bakery-network
profiles:
- development
- admin
depends_on:
- redis