name: ailixir services: # ── Laravel API ───────────────────────────────────────────── laravel: build: context: . dockerfile: Dockerfile container_name: ailixir-laravel restart: unless-stopped ports: - "${LARAVEL_HTTP_PORT:-8080}:8000" env_file: - docker/laravel.env environment: CLOUDINARY_URL: cloudinary://dummy_key:dummy_secret@dummy_cloud CLOUDINARY_CLOUD_NAME: dummy_cloud CLOUDINARY_API_KEY: dummy_key CLOUDINARY_API_SECRET: dummy_secret GENERATION_SERVICE_URL: http://generation:8000 CHEMICAL_AI_URL: http://chemical-rag:5000 ADMET_AI_URL: http://admet:8000 AI_ADMET_SERVICE_URL: http://admet:8000 DRUG_REPURPOSING_URL: http://drug-repurposing:8000 AI_SERVICE_URL: http://drug-repurposing:8000 AI_INTEGRATION_ROUTES_ENABLED: "true" volumes: - laravel-storage:/var/www/html/storage depends_on: generation: condition: service_healthy admet: condition: service_healthy chemical-rag: condition: service_healthy drug-repurposing: condition: service_healthy networks: - ailixir queue: build: context: . dockerfile: Dockerfile container_name: ailixir-queue restart: unless-stopped env_file: - docker/laravel.env environment: CLOUDINARY_URL: cloudinary://dummy_key:dummy_secret@dummy_cloud CLOUDINARY_CLOUD_NAME: dummy_cloud CLOUDINARY_API_KEY: dummy_key CLOUDINARY_API_SECRET: dummy_secret CHEMICAL_AI_URL: http://chemical-rag:5000 ADMET_AI_URL: http://admet:8000 AI_ADMET_SERVICE_URL: http://admet:8000 DRUG_REPURPOSING_URL: http://drug-repurposing:8000 AI_SERVICE_URL: http://drug-repurposing:8000 RUN_MIGRATIONS: "false" # Wait for Laravel to complete migrations before starting queue command: sh -c "sleep 30 && php artisan queue:work --sleep=3 --tries=3 --timeout=300" depends_on: laravel: condition: service_started healthcheck: test: ["CMD", "php", "artisan", "queue:work", "--once"] interval: 30s timeout: 10s retries: 5 start_period: 90s networks: - ailixir # ── AI microservices ──────────────────────────────────────── generation-deeppurpose: build: context: ./ai_apps/generation dockerfile: Dockerfile.dp container_name: ailixir-generation-deeppurpose restart: unless-stopped ports: - "${GENERATION_DEEPPURPOSE_HTTP_PORT:-8006}:8001" volumes: - generation-outputs:/app/outputs - ./ai_apps/generation/bundle:/app/bundle networks: - ailixir healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8001/health')"] interval: 30s timeout: 10s retries: 8 start_period: 240s deploy: resources: limits: memory: 6G generation: build: context: ./ai_apps/generation dockerfile: Dockerfile.api container_name: ailixir-generation restart: unless-stopped ports: - "${GENERATION_HTTP_PORT:-8005}:8000" environment: PUBLIC_BASE_URL: http://localhost:8005 DEEPPURPOSE_URL: http://generation-deeppurpose:8001/reinvent_predict REINVENT_DEVICE: cpu NVIDIA_VISIBLE_DEVICES: all NVIDIA_DRIVER_CAPABILITIES: compute,utility ADGPU_BIN: /opt/AutoDock-GPU/bin/autodock_gpu_64wi volumes: - generation-outputs:/app/outputs - ./ai_apps/generation/bundle:/app/bundle depends_on: generation-deeppurpose: condition: service_healthy networks: - ailixir healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 10s retries: 8 start_period: 300s deploy: resources: limits: memory: 8G admet: build: context: ./ai_apps/ADMIT/admet_inference dockerfile: Dockerfile container_name: ailixir-admet restart: unless-stopped ports: - "${ADMET_HTTP_PORT:-8002}:8000" environment: PYTHONUNBUFFERED: "1" LOG_LEVEL: INFO networks: - ailixir healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 10s retries: 8 start_period: 240s deploy: resources: limits: memory: 6G drug-repurposing: build: context: "./ai_apps/Drug Reporposing" dockerfile: docker/Dockerfile container_name: ailixir-drug-repurposing restart: unless-stopped ports: - "${DRUG_REPURPOSING_HTTP_PORT:-8001}:8000" environment: HOST: 0.0.0.0 PORT: "8000" DEBUG: "False" LOG_LEVEL: INFO USE_MOCK_MODEL: "False" USE_MOCK_DRUGS: "False" networks: - ailixir healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 10s retries: 5 start_period: 180s deploy: resources: limits: memory: 8G chemical-rag: build: context: ./ai_apps/chemical-rag-system/chemical-rag-system dockerfile: Dockerfile container_name: ailixir-chemical-rag restart: unless-stopped ports: - "${CHEMICAL_RAG_HTTP_PORT:-5000}:5000" environment: PYTHONUNBUFFERED: "1" API_PORT: "5000" API_HOST: 0.0.0.0 volumes: - chemical-rag-data:/app/data networks: - ailixir healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5000/health')"] interval: 30s timeout: 10s retries: 5 start_period: 180s deploy: resources: limits: memory: 4G networks: ailixir: driver: bridge volumes: generation-outputs: laravel-storage: chemical-rag-data: