main
docker-compose.prod.yml
Antonio Mika
·
2026-10-11
1x-logging: &default-logging
2 driver: "json-file"
3 options:
4 max-file: "1"
5 max-size: "256m"
6
7services:
8 postgres:
9 env_file:
10 - .env.prod
11 volumes:
12 - ./data/postgres-data:/var/lib/postgresql/data
13 ports:
14 - "5432:5432"
15 command: -N 1024 -B 4096MB
16 logging: *default-logging
17 valkey:
18 image: valkey/valkey:9.0-alpine3.24
19 restart: always
20 env_file:
21 - .env.prod
22 volumes:
23 - ./data/valkey-data:/data
24 ports:
25 - "6379:6379"
26 command: valkey-server --appendonly yes --requirepass "${VALKEY_PASSWORD}"
27 networks:
28 - default
29 - pgs
30 logging: *default-logging
31 pipemgr:
32 env_file:
33 - .env.prod
34 volumes:
35 - ./data/pipemgr/data/term_info_ed25519:/key:ro
36 - ./data/pipemgr/data/term_info_ed25519-cert.pub:/key-cert.pub:ro
37 logging: *default-logging
38 imgproxy:
39 env_file:
40 - .env.prod
41 volumes:
42 - ./data/storage:/storage
43 networks:
44 prose:
45 pgs:
46 logging: *default-logging
47 auth-web:
48 logging: *default-logging
49 pastes-caddy:
50 image: ghcr.io/picosh/pico/caddy:latest
51 restart: always
52 networks:
53 - pastes
54 env_file:
55 - .env.prod
56 environment:
57 APP_DOMAIN: ${PASTES_DOMAIN:-pastes.sh}
58 APP_EMAIL: ${PASTES_EMAIL:-hello@pico.sh}
59 volumes:
60 - ${PASTES_CADDYFILE}:/etc/caddy/Caddyfile
61 - ./data/pastes-caddy/data:/data
62 - ./data/pastes-caddy/config:/config
63 ports:
64 - "${PASTES_HTTPS_V4:-443}:443"
65 - "${PASTES_HTTP_V4:-80}:80"
66 - "${PASTES_HTTPS_V6:-[::1]:443}:443"
67 - "${PASTES_HTTP_V6:-[::1]:80}:80"
68 profiles:
69 - pastes
70 - caddy
71 - all
72 logging: *default-logging
73 pastes-web:
74 dns: 1.1.1.1
75 networks:
76 pastes:
77 aliases:
78 - web
79 env_file:
80 - .env.prod
81 volumes:
82 - ./data/pastes-ssh/data:/app/ssh_data
83 logging: *default-logging
84 pastes-ssh:
85 networks:
86 pastes:
87 aliases:
88 - ssh
89 env_file:
90 - .env.prod
91 volumes:
92 - ./data/pastes-ssh/data:/app/ssh_data
93 ports:
94 - "${PASTES_SSH_V4:-22}:2222"
95 - "${PASTES_SSH_V6:-[::1]:22}:2222"
96 logging: *default-logging
97 pipe-caddy:
98 image: ghcr.io/picosh/pico/caddy:latest
99 restart: always
100 networks:
101 - pipe
102 env_file:
103 - .env.prod
104 environment:
105 APP_DOMAIN: ${PIPE_DOMAIN:-pipe.pico.sh}
106 APP_EMAIL: ${PIPE_EMAIL:-hello@pico.sh}
107 volumes:
108 - ${PIPE_CADDYFILE}:/etc/caddy/Caddyfile
109 - ./data/pipe-caddy/data:/data
110 - ./data/pipe-caddy/config:/config
111 ports:
112 - "${PIPE_HTTPS_V4:-443}:443"
113 - "${PIPE_HTTP_V4:-80}:80"
114 - "${PIPE_HTTPS_V6:-[::1]:443}:443"
115 - "${PIPE_HTTP_V6:-[::1]:80}:80"
116 profiles:
117 - pipe
118 - caddy
119 - all
120 logging: *default-logging
121 pipe-web:
122 networks:
123 pipe:
124 aliases:
125 - web
126 env_file:
127 - .env.prod
128 volumes:
129 - ./data/pipe-ssh/data:/app/ssh_data
130 logging: *default-logging
131 pipe-ssh:
132 networks:
133 pipe:
134 aliases:
135 - ssh
136 env_file:
137 - .env.prod
138 volumes:
139 - ./data/pipe-ssh/data:/app/ssh_data
140 ports:
141 - "${PIPE_SSH_V4:-22}:2222"
142 - "${PIPE_SSH_V6:-[::1]:22}:2222"
143 logging: *default-logging
144 prose-caddy:
145 image: ghcr.io/picosh/pico/caddy:latest
146 restart: always
147 networks:
148 - prose
149 env_file:
150 - .env.prod
151 environment:
152 APP_DOMAIN: ${PROSE_DOMAIN:-prose.sh}
153 APP_EMAIL: ${PROSE_EMAIL:-hello@pico.sh}
154 volumes:
155 - ${PROSE_CADDYFILE}:/etc/caddy/Caddyfile
156 - ./data/prose-caddy/data:/data
157 - ./data/prose-caddy/config:/config
158 labels:
159 pipemgr.enable: true
160 pipemgr.filter: "http.log.access"
161 depends_on:
162 pipemgr:
163 condition: service_healthy
164 ports:
165 - "${PROSE_HTTPS_V4:-443}:443"
166 - "${PROSE_HTTP_V4:-80}:80"
167 - "${PROSE_HTTPS_V6:-[::1]:443}:443"
168 - "${PROSE_HTTP_V6:-[::1]:80}:80"
169 profiles:
170 - prose
171 - caddy
172 - all
173 logging: *default-logging
174 prose-web:
175 dns: 1.1.1.1
176 networks:
177 prose:
178 aliases:
179 - web
180 env_file:
181 - .env.prod
182 volumes:
183 - ./data/prose-ssh/data:/app/ssh_data
184 - ./data/storage:/storage
185 logging: *default-logging
186 prose-ssh:
187 networks:
188 prose:
189 aliases:
190 - ssh
191 env_file:
192 - .env.prod
193 volumes:
194 - ./data/prose-ssh/data:/app/ssh_data
195 - ./data/storage:/storage
196 ports:
197 - "${PROSE_SSH_V4:-22}:2222"
198 - "${PROSE_SSH_V6:-[::1]:22}:2222"
199 logging: *default-logging
200 pgs-caddy:
201 image: ghcr.io/picosh/pico/caddy:latest
202 restart: always
203 networks:
204 - pgs
205 env_file:
206 - .env.prod
207 environment:
208 APP_DOMAIN: ${PGS_DOMAIN:-pgs.sh}
209 APP_EMAIL: ${PGS_EMAIL:-hello@pico.sh}
210 VALKEY_ADDR: ${VALKEY_ADDR:-valkey:6379}
211 VALKEY_PASSWORD: ${VALKEY_PASSWORD}
212 volumes:
213 - ${PGS_CADDYFILE}:/etc/caddy/Caddyfile
214 - ./data/pgs-caddy/data:/data
215 - ./data/pgs-caddy/config:/config
216 ports:
217 - "${PGS_HTTPS_V4:-443}:443"
218 - "${PGS_HTTP_V4:-80}:80"
219 - "${PGS_HTTPS_V6:-[::1]:443}:443"
220 - "${PGS_HTTP_V6:-[::1]:80}:80"
221 labels:
222 pipemgr.enable: true
223 pipemgr.filter: "http.log.access"
224 depends_on:
225 pipemgr:
226 condition: service_healthy
227 profiles:
228 - pgs
229 - pgs-cdn
230 - caddy
231 - all
232 logging: *default-logging
233 pgs-web:
234 dns: 1.1.1.1
235 networks:
236 pgs:
237 aliases:
238 - web
239 env_file:
240 - .env.prod
241 volumes:
242 - ./data/storage:/storage
243 - ./data/pgs-ssh/data:/app/ssh_data
244 deploy:
245 resources:
246 limits:
247 memory: 3g
248 logging: *default-logging
249 pgs-cdn:
250 dns: 1.1.1.1
251 networks:
252 pgs:
253 aliases:
254 - web
255 env_file:
256 - .env.prod
257 volumes:
258 - ./data/pgs-ssh/data:/app/ssh_data
259 deploy:
260 resources:
261 limits:
262 memory: 3g
263 logging: *default-logging
264 pgs-ssh:
265 networks:
266 pgs:
267 aliases:
268 - ssh
269 env_file:
270 - .env.prod
271 volumes:
272 - ./data/storage:/storage
273 - ./data/pgs-ssh/data:/app/ssh_data
274 - ./data/tmp:/tmp
275 ports:
276 - "${PGS_SSH_V4:-22}:2222"
277 - "${PGS_SSH_V6:-[::1]:22}:2222"
278 deploy:
279 resources:
280 limits:
281 memory: 3g
282 logging: *default-logging
283 feeds-caddy:
284 image: ghcr.io/picosh/pico/caddy:latest
285 restart: always
286 networks:
287 - feeds
288 env_file:
289 - .env.prod
290 environment:
291 APP_DOMAIN: ${FEEDS_DOMAIN:-feeds.pico.sh}
292 APP_EMAIL: ${FEEDS_EMAIL:-hello@pico.sh}
293 volumes:
294 - ${FEEDS_CADDYFILE}:/etc/caddy/Caddyfile
295 - ./data/feeds-caddy/data:/data
296 - ./data/feeds-caddy/config:/config
297 ports:
298 - "${FEEDS_HTTPS_V4:-443}:443"
299 - "${FEEDS_HTTP_V4:-80}:80"
300 - "${FEEDS_HTTPS_V6:-[::1]:443}:443"
301 - "${FEEDS_HTTP_V6:-[::1]:80}:80"
302 profiles:
303 - feeds
304 - caddy
305 - all
306 logging: *default-logging
307 feeds-web:
308 networks:
309 feeds:
310 aliases:
311 - web
312 env_file:
313 - .env.prod
314 volumes:
315 - ./data/feeds-ssh/data:/app/ssh_data
316 logging: *default-logging
317 feeds-ssh:
318 networks:
319 feeds:
320 aliases:
321 - ssh
322 env_file:
323 - .env.prod
324 volumes:
325 - ./data/feeds-ssh/data:/app/ssh_data
326 ports:
327 - "${FEEDS_SSH_V4:-22}:2222"
328 - "${FEEDS_SSH_V6:-[::1]:22}:2222"
329 logging: *default-logging
330 pico-caddy:
331 image: ghcr.io/picosh/pico/caddy:latest
332 restart: always
333 networks:
334 - pico
335 env_file:
336 - .env.prod
337 environment:
338 APP_DOMAIN: ${PICO_DOMAIN:-pico.sh}
339 APP_EMAIL: ${PICO_EMAIL:-hello@pico.sh}
340 volumes:
341 - ${PICO_CADDYFILE}:/etc/caddy/Caddyfile
342 - ./data/pico-caddy/data:/data
343 - ./data/pico-caddy/config:/config
344 ports:
345 - "${PICO_HTTPS_V4:-443}:443"
346 - "${PICO_HTTP_V4:-80}:80"
347 - "${PICO_HTTPS_V6:-[::1]:443}:443"
348 - "${PICO_HTTP_V6:-[::1]:80}:80"
349 profiles:
350 - pico
351 - caddy
352 - all
353 logging: *default-logging
354 pico-ssh:
355 dns: 1.1.1.1
356 networks:
357 pico:
358 aliases:
359 - ssh
360 env_file:
361 - .env.prod
362 volumes:
363 - ./data/pico-ssh/data:/app/ssh_data
364 ports:
365 - "${PICO_SSH_V4:-22}:2222"
366 - "${PICO_SSH_V6:-[::1]:22}:2222"
367 logging: *default-logging
368
369networks:
370 default:
371 enable_ipv6: true
372 ipam:
373 driver: default
374 config:
375 - subnet: "172.101.0.0/24"
376 - subnet: fd00:dead:beef:101::/112
377 prose:
378 enable_ipv6: true
379 driver_opts:
380 com.docker.network.bridge.name: prose
381 ipam:
382 config:
383 - subnet: 172.30.0.0/16
384 - subnet: fd00:dead:beef:18::/112
385 pastes:
386 enable_ipv6: true
387 driver_opts:
388 com.docker.network.bridge.name: pastes
389 ipam:
390 config:
391 - subnet: 172.19.0.0/16
392 - subnet: fd00:dead:beef:19::/112
393 feeds:
394 enable_ipv6: true
395 driver_opts:
396 com.docker.network.bridge.name: feeds
397 ipam:
398 config:
399 - subnet: 172.22.0.0/16
400 - subnet: fd00:dead:beef:22::/112
401 pgs:
402 enable_ipv6: true
403 driver_opts:
404 com.docker.network.bridge.name: pgs
405 ipam:
406 config:
407 - subnet: 172.23.0.0/16
408 - subnet: fd00:dead:beef:23::/112
409 pico:
410 enable_ipv6: true
411 driver_opts:
412 com.docker.network.bridge.name: pico
413 ipam:
414 config:
415 - subnet: 172.25.0.0/16
416 - subnet: fd00:dead:beef:25::/112
417 pipe:
418 enable_ipv6: true
419 driver_opts:
420 com.docker.network.bridge.name: pipe
421 ipam:
422 config:
423 - subnet: 172.27.0.0/16
424 - subnet: fd00:dead:beef:27::/112