|
2 | 2 | # Prereq: run scripts/dev-local.sh which dereferences tools/ and shared-tools/ symlinks into each package build context first. |
3 | 3 | # Ports come from shared/local-ports.json; internal port is always 10000 (Railway convention). |
4 | 4 |
|
| 5 | +x-integration-defaults: &integration-defaults |
| 6 | + env_file: .env |
| 7 | + environment: |
| 8 | + - OPENAI_API_KEY=${OPENAI_API_KEY:-sk-mock} |
| 9 | + - OPENAI_BASE_URL=http://aimock:4010/v1 |
| 10 | + - AIMOCK_URL=http://aimock:4010 |
| 11 | + depends_on: |
| 12 | + aimock: |
| 13 | + condition: service_healthy |
| 14 | + restart: unless-stopped |
| 15 | + healthcheck: |
| 16 | + test: ["CMD", "curl", "-f", "http://localhost:10000/health"] |
| 17 | + interval: 5s |
| 18 | + timeout: 3s |
| 19 | + retries: 5 |
| 20 | + start_period: 15s |
| 21 | + |
5 | 22 | services: |
6 | 23 | aimock: |
7 | 24 | # Local aimock so the 17 integration containers can hit a stable LLM mock |
8 | 25 | # on the compose network at http://aimock:4010 instead of the prod Railway |
9 | 26 | # aimock (which can OOM) or direct-to-OpenAI (which costs). |
10 | | - build: ./aimock |
11 | | - image: showcase-aimock:local |
| 27 | + image: ghcr.io/copilotkit/aimock:latest |
12 | 28 | container_name: showcase-aimock |
13 | 29 | env_file: .env |
14 | 30 | ports: |
15 | 31 | - "4010:4010" |
16 | | - restart: unless-stopped |
| 32 | + profiles: ["infra", "all"] |
| 33 | + restart: unless-stopped |
| 34 | + healthcheck: |
| 35 | + test: ["CMD", "curl", "-f", "http://localhost:4010/health"] |
| 36 | + interval: 5s |
| 37 | + timeout: 3s |
| 38 | + retries: 5 |
| 39 | + start_period: 10s |
| 40 | + |
| 41 | + pocketbase: |
| 42 | + build: ./pocketbase |
| 43 | + image: showcase-pocketbase:local |
| 44 | + container_name: showcase-pocketbase |
| 45 | + environment: |
| 46 | + - POCKETBASE_SUPERUSER_EMAIL=admin@localhost |
| 47 | + - POCKETBASE_SUPERUSER_PASSWORD=showcase-local-dev |
| 48 | + ports: |
| 49 | + - "8090:8090" |
| 50 | + volumes: |
| 51 | + - showcase-pb-data:/pb_data |
| 52 | + profiles: ["infra", "all"] |
| 53 | + restart: unless-stopped |
| 54 | + healthcheck: |
| 55 | + test: ["CMD", "curl", "-f", "http://localhost:8090/api/health"] |
| 56 | + interval: 5s |
| 57 | + timeout: 3s |
| 58 | + retries: 5 |
| 59 | + start_period: 10s |
| 60 | + |
| 61 | + dashboard: |
| 62 | + build: ./shell-dashboard |
| 63 | + image: showcase-dashboard:local |
| 64 | + container_name: showcase-dashboard |
| 65 | + environment: |
| 66 | + - POCKETBASE_URL=http://pocketbase:8090 |
| 67 | + - SHOWCASE_LOCAL=1 |
| 68 | + ports: |
| 69 | + - "3200:10000" |
| 70 | + depends_on: |
| 71 | + pocketbase: |
| 72 | + condition: service_healthy |
| 73 | + profiles: ["infra", "all"] |
| 74 | + restart: unless-stopped |
| 75 | + healthcheck: |
| 76 | + test: ["CMD", "curl", "-f", "http://localhost:10000/"] |
| 77 | + interval: 5s |
| 78 | + timeout: 3s |
| 79 | + retries: 5 |
| 80 | + start_period: 10s |
17 | 81 |
|
18 | 82 | langgraph-python: |
| 83 | + <<: *integration-defaults |
19 | 84 | build: ./integrations/langgraph-python |
20 | 85 | image: showcase-langgraph-python:local |
21 | 86 | container_name: showcase-langgraph-python |
22 | | - env_file: .env |
23 | 87 | ports: |
24 | 88 | - "3100:10000" |
25 | | - restart: unless-stopped |
| 89 | + profiles: ["langgraph-python", "all"] |
26 | 90 |
|
27 | 91 | langgraph-typescript: |
| 92 | + <<: *integration-defaults |
28 | 93 | build: ./integrations/langgraph-typescript |
29 | 94 | image: showcase-langgraph-typescript:local |
30 | 95 | container_name: showcase-langgraph-typescript |
31 | | - env_file: .env |
32 | 96 | ports: |
33 | 97 | - "3101:10000" |
34 | | - restart: unless-stopped |
| 98 | + profiles: ["langgraph-typescript", "all"] |
35 | 99 |
|
36 | 100 | langgraph-fastapi: |
| 101 | + <<: *integration-defaults |
37 | 102 | build: ./integrations/langgraph-fastapi |
38 | 103 | image: showcase-langgraph-fastapi:local |
39 | 104 | container_name: showcase-langgraph-fastapi |
40 | | - env_file: .env |
41 | 105 | ports: |
42 | 106 | - "3102:10000" |
43 | | - restart: unless-stopped |
| 107 | + profiles: ["langgraph-fastapi", "all"] |
44 | 108 |
|
45 | 109 | google-adk: |
| 110 | + <<: *integration-defaults |
46 | 111 | build: ./integrations/google-adk |
47 | 112 | image: showcase-google-adk:local |
48 | 113 | container_name: showcase-google-adk |
49 | | - env_file: .env |
50 | 114 | ports: |
51 | 115 | - "3103:10000" |
52 | | - restart: unless-stopped |
| 116 | + profiles: ["google-adk", "all"] |
53 | 117 |
|
54 | 118 | mastra: |
| 119 | + <<: *integration-defaults |
55 | 120 | build: ./integrations/mastra |
56 | 121 | image: showcase-mastra:local |
57 | 122 | container_name: showcase-mastra |
58 | | - env_file: .env |
59 | 123 | ports: |
60 | 124 | - "3104:10000" |
61 | | - restart: unless-stopped |
| 125 | + profiles: ["mastra", "all"] |
62 | 126 |
|
63 | 127 | crewai-crews: |
| 128 | + <<: *integration-defaults |
64 | 129 | build: ./integrations/crewai-crews |
65 | 130 | image: showcase-crewai-crews:local |
66 | 131 | container_name: showcase-crewai-crews |
67 | | - env_file: .env |
68 | 132 | ports: |
69 | 133 | - "3105:10000" |
70 | | - restart: unless-stopped |
| 134 | + profiles: ["crewai-crews", "all"] |
71 | 135 |
|
72 | 136 | pydantic-ai: |
| 137 | + <<: *integration-defaults |
73 | 138 | build: ./integrations/pydantic-ai |
74 | 139 | image: showcase-pydantic-ai:local |
75 | 140 | container_name: showcase-pydantic-ai |
76 | | - env_file: .env |
77 | 141 | ports: |
78 | 142 | - "3106:10000" |
79 | | - restart: unless-stopped |
| 143 | + profiles: ["pydantic-ai", "all"] |
80 | 144 |
|
81 | 145 | claude-sdk-python: |
| 146 | + <<: *integration-defaults |
82 | 147 | build: ./integrations/claude-sdk-python |
83 | 148 | image: showcase-claude-sdk-python:local |
84 | 149 | container_name: showcase-claude-sdk-python |
85 | | - env_file: .env |
86 | 150 | ports: |
87 | 151 | - "3107:10000" |
88 | | - restart: unless-stopped |
| 152 | + profiles: ["claude-sdk-python", "all"] |
89 | 153 |
|
90 | 154 | claude-sdk-typescript: |
| 155 | + <<: *integration-defaults |
91 | 156 | build: ./integrations/claude-sdk-typescript |
92 | 157 | image: showcase-claude-sdk-typescript:local |
93 | 158 | container_name: showcase-claude-sdk-typescript |
94 | | - env_file: .env |
95 | 159 | ports: |
96 | 160 | - "3108:10000" |
97 | | - restart: unless-stopped |
| 161 | + profiles: ["claude-sdk-typescript", "all"] |
98 | 162 |
|
99 | 163 | agno: |
| 164 | + <<: *integration-defaults |
100 | 165 | build: ./integrations/agno |
101 | 166 | image: showcase-agno:local |
102 | 167 | container_name: showcase-agno |
103 | | - env_file: .env |
104 | 168 | ports: |
105 | 169 | - "3109:10000" |
106 | | - restart: unless-stopped |
| 170 | + profiles: ["agno", "all"] |
107 | 171 |
|
108 | 172 | ag2: |
| 173 | + <<: *integration-defaults |
109 | 174 | build: ./integrations/ag2 |
110 | 175 | image: showcase-ag2:local |
111 | 176 | container_name: showcase-ag2 |
112 | | - env_file: .env |
113 | 177 | ports: |
114 | 178 | - "3110:10000" |
115 | | - restart: unless-stopped |
| 179 | + profiles: ["ag2", "all"] |
116 | 180 |
|
117 | 181 | llamaindex: |
| 182 | + <<: *integration-defaults |
118 | 183 | build: ./integrations/llamaindex |
119 | 184 | image: showcase-llamaindex:local |
120 | 185 | container_name: showcase-llamaindex |
121 | | - env_file: .env |
122 | 186 | ports: |
123 | 187 | - "3111:10000" |
124 | | - restart: unless-stopped |
| 188 | + profiles: ["llamaindex", "all"] |
125 | 189 |
|
126 | 190 | strands: |
| 191 | + <<: *integration-defaults |
127 | 192 | build: ./integrations/strands |
128 | 193 | image: showcase-strands:local |
129 | 194 | container_name: showcase-strands |
130 | | - env_file: .env |
131 | 195 | ports: |
132 | 196 | - "3112:10000" |
133 | | - restart: unless-stopped |
| 197 | + profiles: ["strands", "all"] |
134 | 198 |
|
135 | 199 | langroid: |
| 200 | + <<: *integration-defaults |
136 | 201 | build: ./integrations/langroid |
137 | 202 | image: showcase-langroid:local |
138 | 203 | container_name: showcase-langroid |
139 | | - env_file: .env |
140 | 204 | ports: |
141 | 205 | - "3113:10000" |
142 | | - restart: unless-stopped |
| 206 | + profiles: ["langroid", "all"] |
143 | 207 |
|
144 | 208 | ms-agent-python: |
| 209 | + <<: *integration-defaults |
145 | 210 | build: ./integrations/ms-agent-python |
146 | 211 | image: showcase-ms-agent-python:local |
147 | 212 | container_name: showcase-ms-agent-python |
148 | | - env_file: .env |
149 | 213 | ports: |
150 | 214 | - "3114:10000" |
151 | | - restart: unless-stopped |
| 215 | + profiles: ["ms-agent-python", "all"] |
152 | 216 |
|
153 | 217 | ms-agent-dotnet: |
| 218 | + <<: *integration-defaults |
154 | 219 | build: ./integrations/ms-agent-dotnet |
155 | 220 | image: showcase-ms-agent-dotnet:local |
156 | 221 | container_name: showcase-ms-agent-dotnet |
157 | | - env_file: .env |
158 | 222 | ports: |
159 | 223 | - "3115:10000" |
160 | | - restart: unless-stopped |
| 224 | + profiles: ["ms-agent-dotnet", "all"] |
161 | 225 |
|
162 | 226 | spring-ai: |
| 227 | + <<: *integration-defaults |
163 | 228 | build: ./integrations/spring-ai |
164 | 229 | image: showcase-spring-ai:local |
165 | 230 | container_name: showcase-spring-ai |
166 | | - env_file: .env |
167 | 231 | ports: |
168 | 232 | - "3116:10000" |
169 | | - restart: unless-stopped |
| 233 | + profiles: ["spring-ai", "all"] |
| 234 | + |
| 235 | +volumes: |
| 236 | + showcase-pb-data: |
0 commit comments