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=8081 - 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: - "8081:8081" 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:8081/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