Files
tm_back/docker-compose.yml
T
2025-07-27 16:20:21 +03:30

201 lines
5.1 KiB
YAML

version: '3.8'
services:
# MongoDB Database
mongodb:
image: mongo:6.0
container_name: tm_mongodb
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
MONGO_INITDB_DATABASE: tender_management
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
- ./scripts/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
networks:
- tender_network
# Redis Cache
redis:
image: redis:7-alpine
container_name: tm_redis
restart: unless-stopped
command: redis-server --appendonly yes --requirepass password
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- tender_network
# RabbitMQ Message Queue
rabbitmq:
image: rabbitmq:3-management-alpine
container_name: tm_rabbitmq
restart: unless-stopped
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: password
RABBITMQ_DEFAULT_VHOST: /
ports:
- "5672:5672" # AMQP port
- "15672:15672" # Management UI
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- tender_network
# Elasticsearch Search Engine
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
container_name: tm_elasticsearch
restart: unless-stopped
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
- "9300:9300"
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
networks:
- tender_network
# Kibana (Optional - for Elasticsearch management)
kibana:
image: docker.elastic.co/kibana/kibana:8.11.0
container_name: tm_kibana
restart: unless-stopped
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- tender_network
# Tender Management API
api:
build:
context: .
dockerfile: Dockerfile
container_name: tm_api
restart: unless-stopped
environment:
- TM_SERVER_HOST=0.0.0.0
- TM_SERVER_PORT=8080
- TM_DATABASE_MONGODB_URI=mongodb://admin:password@mongodb:27017/tender_management?authSource=admin
- TM_CACHE_REDIS_HOST=redis
- TM_CACHE_REDIS_PASSWORD=password
- TM_QUEUE_RABBITMQ_URL=amqp://admin:password@rabbitmq:5672/
- TM_SEARCH_ELASTICSEARCH_URLS=http://elasticsearch:9200
- TM_AUTH_JWT_SECRET=super-secret-jwt-key-change-in-production
- TM_LOGGING_LEVEL=info
ports:
- "8080:8080"
depends_on:
- mongodb
- redis
- rabbitmq
- elasticsearch
volumes:
- ./configs:/configs:ro
- ./logs:/logs
networks:
- tender_network
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Background Worker (Optional)
worker:
build:
context: .
dockerfile: Dockerfile
container_name: tm_worker
restart: unless-stopped
command: ["/worker"] # Assuming we'll create a worker binary
environment:
- TM_DATABASE_MONGODB_URI=mongodb://admin:password@mongodb:27017/tender_management?authSource=admin
- TM_CACHE_REDIS_HOST=redis
- TM_CACHE_REDIS_PASSWORD=password
- TM_QUEUE_RABBITMQ_URL=amqp://admin:password@rabbitmq:5672/
- TM_LOGGING_LEVEL=info
depends_on:
- mongodb
- redis
- rabbitmq
volumes:
- ./configs:/configs:ro
networks:
- tender_network
profiles:
- worker # Only start with: docker-compose --profile worker up
# Tender Scraper (Optional)
scraper:
build:
context: .
dockerfile: Dockerfile
container_name: tm_scraper
restart: unless-stopped
command: ["/scraper"] # Assuming we'll create a scraper binary
environment:
- TM_DATABASE_MONGODB_URI=mongodb://admin:password@mongodb:27017/tender_management?authSource=admin
- TM_CACHE_REDIS_HOST=redis
- TM_CACHE_REDIS_PASSWORD=password
- TM_QUEUE_RABBITMQ_URL=amqp://admin:password@rabbitmq:5672/
- TM_LOGGING_LEVEL=info
depends_on:
- mongodb
- redis
- rabbitmq
volumes:
- ./configs:/configs:ro
networks:
- tender_network
profiles:
- scraper # Only start with: docker-compose --profile scraper up
# Nginx Reverse Proxy (Optional - for production)
nginx:
image: nginx:alpine
container_name: tm_nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/ssl:/etc/nginx/ssl:ro
depends_on:
- api
networks:
- tender_network
profiles:
- production
volumes:
mongodb_data:
driver: local
redis_data:
driver: local
rabbitmq_data:
driver: local
elasticsearch_data:
driver: local
networks:
tender_network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16