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