File size: 6,281 Bytes
907b200
 
 
 
 
 
 
 
 
 
 
7922c7a
907b200
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
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: