This repository has no description
20 kB
603 lines
1services:
2 redis:
3 image: redis:7-alpine
4 restart: unless-stopped
5 networks: [tngl]
6
7 postgres:
8 image: postgres:14-alpine
9 restart: unless-stopped
10 environment:
11 POSTGRES_USER: tnglr
12 POSTGRES_PASSWORD: tnglr
13 volumes:
14 - postgres-data:/var/lib/postgresql/data
15 - ./localinfra/postgres-init.sql:/docker-entrypoint-initdb.d/init.sql
16 healthcheck:
17 test: ["CMD-SHELL", "pg_isready -U tnglr -d plc"]
18 interval: 2s
19 timeout: 2s
20 retries: 30
21 start_period: 5s
22 networks: [tngl]
23
24 pds:
25 image: ghcr.io/bluesky-social/pds:0.4.219
26 restart: unless-stopped
27 env_file: localinfra/pds.env
28 environment:
29 PDS_DID_PLC_URL: http://plc:8080
30 NODE_EXTRA_CA_CERTS: /caddy-ca/root.crt
31 volumes:
32 - pds-data:/pds
33 - ./localinfra/certs/root.crt:/caddy-ca/root.crt:ro
34 healthcheck:
35 test: ["CMD", "wget", "-qO-", "http://localhost:3000/xrpc/_health"]
36 interval: 2s
37 timeout: 2s
38 retries: 30
39 start_period: 5s
40 depends_on:
41 plc:
42 condition: service_started
43 networks: [tngl]
44
45 init-accounts:
46 image: alpine:3.22
47 restart: "no"
48 env_file: localinfra/pds.env
49 environment:
50 PDS_URL: http://pds:3000
51 OWNER_USER: alice
52 KNOT_HOSTNAME: knot.tngl.boltless.dev
53 SPINDLE_HOSTNAME: spindle.tngl.boltless.dev
54 volumes:
55 - ./localinfra/scripts/init-accounts.sh:/init.sh:ro
56 - init-state:/shared
57 command: sh -c "apk add --no-cache curl jq >/dev/null && sh /init.sh"
58 depends_on:
59 pds:
60 condition: service_healthy
61 networks: [tngl]
62
63 plc:
64 platform: linux/amd64
65 image: ghcr.io/bluesky-social/did-method-plc:plc-f2ab7516bac5bc0f3f86842fa94e996bd1b3815b
66 restart: unless-stopped
67 environment:
68 DEBUG_MODE: "1"
69 LOG_ENABLED: "true"
70 LOG_LEVEL: debug
71 LOG_DESTINATION: "1"
72 PLC_VERSION: 0.0.1
73 PORT: "8080"
74 DB_CREDS_JSON: &DB_CREDS_JSON '{"username":"tnglr","password":"tnglr","host":"postgres","port":5432}'
75 DB_MIGRATE_CREDS_JSON: *DB_CREDS_JSON
76 depends_on: [postgres]
77 networks: [tngl]
78
79 jetstream:
80 platform: linux/amd64
81 image: ghcr.io/bluesky-social/jetstream:sha-d5a3b62
82 restart: unless-stopped
83 environment:
84 JETSTREAM_DATA_DIR: /data
85 JETSTREAM_LIVENESS_TTL: 300s
86 JETSTREAM_WS_URL: wss://pds.tngl.boltless.dev/xrpc/com.atproto.sync.subscribeRepos
87 volumes:
88 - jetstream-data:/data
89 - ./localinfra/certs/root.crt:/etc/ssl/certs/ca-certificates.crt:ro
90 depends_on:
91 pds:
92 condition: service_healthy
93 networks: [tngl]
94
95 knot:
96 build:
97 context: .
98 dockerfile: localinfra/knot.Dockerfile
99 restart: unless-stopped
100 environment:
101 KNOT_SERVER_HOSTNAME: knot.tngl.boltless.dev
102 KNOT_SERVER_LISTEN_ADDR: 0.0.0.0:5555
103 KNOT_SERVER_INTERNAL_LISTEN_ADDR: 127.0.0.1:5444
104 KNOT_SERVER_DB_PATH: /home/git/knotserver.db
105 KNOT_SERVER_PLC_URL: https://plc.tngl.boltless.dev
106 KNOT_SERVER_JETSTREAM_ENDPOINT: wss://jetstream.tngl.boltless.dev/subscribe
107 KNOT_SERVER_DEV: "false"
108 KNOT_REPO_SCAN_PATH: /home/git/repositories
109 APPVIEW_ENDPOINT: https://tangled.org
110 KNOT_MIRRORS: https://mirror.tngl.boltless.dev
111 ports:
112 - "2222:22"
113 volumes:
114 - knot-data:/home/git
115 - knot-ssh-keys:/etc/ssh/keys
116 - init-state:/shared:ro
117 - ./localinfra/certs/root.crt:/usr/local/share/ca-certificates/caddy.crt:ro
118 healthcheck:
119 test: ["CMD", "wget", "-qO-", "http://localhost:5555/"]
120 interval: 2s
121 timeout: 2s
122 retries: 60
123 start_period: 30s
124 depends_on:
125 plc:
126 condition: service_started
127 jetstream:
128 condition: service_started
129 knotmirror:
130 condition: service_healthy
131 init-accounts:
132 condition: service_completed_successfully
133 networks: [tngl]
134
135 ncps-migrate:
136 image: &ncps-image ghcr.io/kalbasit/ncps:v0.9.4
137 profiles: ["linux"]
138 restart: "no"
139 command:
140 - /bin/dbmate
141 - --migrations-dir=/share/ncps/db/migrations/sqlite
142 - --no-dump-schema
143 - --url=sqlite:/storage/db.sqlite
144 - up
145 volumes:
146 - ncps-data:/storage
147 networks: [tngl]
148
149 ncps:
150 image: *ncps-image
151 profiles: ["linux"]
152 restart: unless-stopped
153 environment:
154 ANALYTICS_REPORTING_ENABLED: "false"
155 command: ["/bin/ncps", "serve", "--config", "/etc/ncps/ncps.yaml"]
156 volumes:
157 - ncps-data:/storage
158 - ./localinfra/ncps.yaml:/etc/ncps/ncps.yaml:ro
159 - ./localinfra/ncps-secret-key:/keys/ncps-secret-key:ro
160 depends_on:
161 ncps-migrate:
162 condition: service_completed_successfully
163 networks: [tngl]
164
165 spindle:
166 profiles: ["linux"]
167 build:
168 context: .
169 dockerfile: localinfra/spindle.Dockerfile
170 restart: unless-stopped
171 environment:
172 SPINDLE_SERVER_HOSTNAME: spindle.tngl.boltless.dev
173 SPINDLE_SERVER_LISTEN_ADDR: 0.0.0.0:6555
174 SPINDLE_SERVER_DB_PATH: /var/lib/spindle/spindle.db
175 SPINDLE_SERVER_PLC_URL: https://plc.tngl.boltless.dev
176 SPINDLE_SERVER_JETSTREAM_ENDPOINT: wss://jetstream.tngl.boltless.dev/subscribe
177 SPINDLE_SERVER_DEV: "true"
178 SPINDLE_SERVER_DEV_EXTRA_HOSTS: knot.tngl.boltless.dev,mirror.tngl.boltless.dev
179 SPINDLE_SERVER_TAP_DB_PATH: /var/lib/spindle/tap.db
180 SPINDLE_SERVER_TAP_RELAY_URL: https://pds.tngl.boltless.dev
181 SPINDLE_MICROVM_PIPELINES_IMAGE_DIR: /var/lib/spindle/images
182 SPINDLE_MICROVM_PIPELINES_OVERLAY_DIR: /var/lib/spindle/overlays
183 SPINDLE_MICROVM_PIPELINES_AGENT_PORT: "11240"
184 SPINDLE_S3_LOG_BUCKET: ""
185 SPINDLE_MICROVM_PIPELINES_ENABLE_CGROUPS: "false"
186 # route guest nix substitution + uploads through the local ncps cache.
187 # ncps re-signs on serve with cache.local's key, so the guest trusts the
188 # matching public key below (no signing happens in spindle itself).
189 SPINDLE_NIX_CACHE_READ_URLS: http://ncps:8501
190 SPINDLE_NIX_CACHE_TRUSTED_PUBLIC_KEYS: cache.local:F7YqpMzuBdILYd/v+wMZN2YKxCzliXQyFmeezOxw7rU=
191 SPINDLE_NIX_CACHE_UPLOAD_URL: http://ncps:8501/upload
192 # these two are required for cgroups, uncomment if testing
193 # privileged: true
194 # cgroup: host
195 devices:
196 - /dev/vsock:/dev/vsock
197 - /dev/kvm:/dev/kvm
198 - /dev/vhost-vsock:/dev/vhost-vsock
199 - /dev/net/tun:/dev/net/tun
200 cap_add:
201 - NET_ADMIN
202 - SYS_ADMIN
203 security_opt:
204 - label=disable
205 - seccomp=unconfined
206 volumes:
207 - spindle-data:/var/lib/spindle
208 - spindle-logs:/var/log/spindle
209 - ./out/localinfra-spindle-images:/var/lib/spindle/images:ro
210 - init-state:/shared:ro
211 - ./localinfra/certs/root.crt:/usr/local/share/ca-certificates/caddy.crt:ro
212 healthcheck:
213 test: ["CMD", "wget", "-qO-", "http://localhost:6555/"]
214 interval: 2s
215 timeout: 2s
216 retries: 30
217 start_period: 5s
218 depends_on:
219 plc:
220 condition: service_started
221 jetstream:
222 condition: service_started
223 init-accounts:
224 condition: service_completed_successfully
225 ncps:
226 condition: service_started
227 networks: [tngl]
228
229 knotmirror-tap:
230 image: ghcr.io/bluesky-social/indigo/tap:sha-4f47add43060c27e8a37d9d76482ecddf001fcd8 # 0.1.10
231 restart: unless-stopped
232 environment:
233 TAP_BIND: ":2480"
234 TAP_PLC_URL: https://plc.tngl.boltless.dev
235 TAP_RELAY_URL: https://pds.tngl.boltless.dev # PDS can be used as basic relay without collectiondir.
236 TAP_DATABASE_URL: postgres://tnglr:tnglr@postgres:5432/mirror_tap?sslmode=disable
237 TAP_COLLECTION_FILTERS: sh.tangled.repo
238 TAP_SIGNAL_COLLECTION: sh.tangled.repo
239 TAP_RESYNC_PARALLELISM: "10"
240 TAP_RETRY_TIMEOUT: 60s
241 volumes:
242 - ./localinfra/certs/root.crt:/etc/ssl/certs/ca-certificates.crt:ro
243 depends_on:
244 postgres:
245 condition: service_started
246 pds:
247 condition: service_healthy
248 networks: [tngl]
249
250 knotmirror:
251 build:
252 context: .
253 dockerfile: localinfra/knotmirror.Dockerfile
254 restart: unless-stopped
255 environment:
256 MIRROR_LISTEN: 0.0.0.0:7000
257 MIRROR_ADMIN_LISTEN: 0.0.0.0:7200
258 MIRROR_HOSTNAME: mirror.tngl.boltless.dev
259 MIRROR_TAP_URL: http://knotmirror-tap:2480
260 MIRROR_DB_URL: postgres://tnglr:tnglr@postgres:5432/mirror?sslmode=disable
261 MIRROR_REDIS_ADDR: redis:6379
262 MIRROR_PLC_URL: https://plc.tngl.boltless.dev
263 MIRROR_GIT_BASEPATH: /data/repos
264 MIRROR_KNOT_USE_SSL: "true"
265 MIRROR_KNOT_SSRF: "false"
266 MIRROR_RESYNC_PARALLELISM: "4"
267 MIRROR_APPVIEW_URL: http://appview:3000
268 MIRROR_SEARCH_ZOEKT_URL: https://zoekt.tngl.boltless.dev/indexserver
269 volumes:
270 - knotmirror-data:/data
271 - ./localinfra/certs/root.crt:/usr/local/share/ca-certificates/caddy.crt:ro
272 healthcheck:
273 test: ["CMD", "wget", "-qO-", "http://localhost:7000/"]
274 interval: 2s
275 timeout: 2s
276 retries: 30
277 start_period: 5s
278 ports:
279 - "7201:7200"
280 depends_on:
281 postgres:
282 condition: service_started
283 knotmirror-tap:
284 condition: service_started
285 networks: [tngl]
286
287 zoekt-webserver:
288 build:
289 context: https://tangled.org/boltless.me/zoekt.git#tngl
290 volumes:
291 - zoekt-index:/data/index
292 - ./localinfra/certs/root.crt:/etc/ssl/certs/caddy.crt:ro
293 command: ["zoekt-webserver", "-index", "/data/index", "-pprof", "-rpc"]
294 networks: [tngl]
295
296 zoekt-tngl-indexserver:
297 build:
298 context: .
299 dockerfile: localinfra/zoekt-tngl-indexserver.Dockerfile
300 environment:
301 TANGLED_ZOEKT_INDEX_DIR: /data/index
302 TANGLED_ZOEKT_PLC_URL: https://plc.tngl.boltless.dev
303 TANGLED_ZOEKT_APPVIEW_URL: http://127.0.0.1:3000
304 TANGLED_ZOEKT_ALLOW_HTTP: "true"
305 volumes:
306 - zoekt-index:/data/index
307 - ./localinfra/certs/root.crt:/etc/ssl/certs/caddy.crt:ro
308 command: ["zoekt-tngl-indexserver", "serve"]
309 networks: [tngl]
310
311 tailwind:
312 build:
313 context: .
314 dockerfile: localinfra/tailwind.Dockerfile
315 restart: unless-stopped
316 working_dir: /build
317 init: true
318 volumes:
319 - ./tailwind.config.js:/build/tailwind.config.js:ro
320 - ./input.css:/build/input.css:ro
321 - ./appview/pages/templates:/build/appview/pages/templates:ro
322 - ./docs:/build/docs:ro
323 - ./blog/templates:/build/blog/templates:ro
324 - ./blog/posts:/build/blog/posts:ro
325 - ./appview/pages/static:/build/appview/pages/static
326 command:
327 ["-i", "input.css", "-o", "appview/pages/static/tw.css", "--watch=always"]
328 network_mode: none
329
330 appview:
331 build:
332 context: .
333 dockerfile: localinfra/appview.Dockerfile
334 restart: unless-stopped
335 environment:
336 TANGLED_DEV: "true"
337 TANGLED_APPVIEW_HOST: 127.0.0.1:3000
338 TANGLED_XRPC_ENABLED: "true"
339 TANGLED_DB_PATH: /var/lib/appview/appview.db
340 TANGLED_PLC_URL: https://plc.tngl.boltless.dev
341 TANGLED_JETSTREAM_ENDPOINT: wss://jetstream.tngl.boltless.dev/subscribe
342 TANGLED_REDIS_ADDR: redis:6379
343 TANGLED_KNOTMIRROR_URL: https://mirror.tngl.boltless.dev
344 TANGLED_CODESEARCH_ZOEKT_URL: https://zoekt.tngl.boltless.dev
345 TANGLED_SSH_ENABLED: "true"
346 TANGLED_SSH_LISTEN_ADDR: "0.0.0.0:3333"
347 ports:
348 - "3000:3000"
349 - "3333:3333"
350 healthcheck:
351 test: ["CMD", "wget", "-qO-", "http://localhost:3000/"]
352 interval: 5s
353 timeout: 2s
354 retries: 15
355 start_period: 10s
356 volumes:
357 - .:/src:cached
358 - go-cache:/go/cache
359 - go-mod-cache:/go/mod
360 - appview-data:/var/lib/appview
361 - init-state:/shared:ro
362 - ./localinfra/certs/root.crt:/usr/local/share/ca-certificates/caddy.crt:ro
363 depends_on:
364 redis:
365 condition: service_started
366 pds:
367 condition: service_healthy
368 init-accounts:
369 condition: service_completed_successfully
370 networks: [tngl]
371
372 pdsls:
373 build:
374 context: .
375 dockerfile: localinfra/pdsls.Dockerfile
376 restart: unless-stopped
377 ports:
378 - "8081:80"
379 depends_on:
380 init-accounts:
381 condition: service_completed_successfully
382 networks: [tngl]
383
384 hydrant:
385 build:
386 context: https://tangled.org/ptr.pet/hydrant.git#main
387 restart: unless-stopped
388 user: root
389 environment:
390 HYDRANT_API_BIND: 0.0.0.0:3000
391 HYDRANT_DATABASE_PATH: /data/hydrant.db
392 HYDRANT_RELAY_HOSTS: pds::wss://pds.tngl.boltless.dev
393 HYDRANT_CRAWLER_URLS: list_repos::https://pds.tngl.boltless.dev
394 HYDRANT_PLC_URL: https://plc.tngl.boltless.dev
395 HYDRANT_FILTER_COLLECTIONS: sh.tangled.*
396 HYDRANT_FILTER_SIGNALS: sh.tangled.actor.profile,sh.tangled.feed.comment,sh.tangled.feed.reaction,sh.tangled.feed.star,sh.tangled.git.refUpdate,sh.tangled.graph.follow,sh.tangled.graph.vouch,sh.tangled.knot,sh.tangled.knot.member,sh.tangled.label.definition,sh.tangled.label.op,sh.tangled.pipeline,sh.tangled.pipeline.status,sh.tangled.publicKey,sh.tangled.repo,sh.tangled.repo.artifact,sh.tangled.repo.collaborator,sh.tangled.repo.issue,sh.tangled.repo.issue.comment,sh.tangled.repo.issue.state,sh.tangled.repo.pull,sh.tangled.repo.pull.comment,sh.tangled.repo.pull.status,sh.tangled.spindle,sh.tangled.spindle.member,sh.tangled.string
397 HYDRANT_BACKFILL_STRATEGY: sparse-filter
398 HYDRANT_VERIFY_SIGNATURES: none
399 RUST_LOG: info
400 volumes:
401 - hydrant-data:/data
402 - ./localinfra/certs/root.crt:/etc/ssl/certs/ca-certificates.crt:ro
403 healthcheck:
404 test: ["CMD", "bash", "-c", "echo > /dev/tcp/127.0.0.1/3000"]
405 interval: 5s
406 timeout: 2s
407 retries: 15
408 start_period: 10s
409 depends_on:
410 plc:
411 condition: service_started
412 pds:
413 condition: service_healthy
414 caddy:
415 condition: service_started
416 init-accounts:
417 condition: service_completed_successfully
418 networks: [tngl]
419 bobbin:
420 build:
421 context: .
422 dockerfile: localinfra/bobbin.Dockerfile
423 restart: unless-stopped
424 environment:
425 BOBBIN_BIND: 0.0.0.0:8090
426 BOBBIN_HYDRANT_URL: http://hydrant:3000
427 BOBBIN_SLINGSHOT_URL: http://hydrant:3000
428 BOBBIN_KNOT_ALLOW_PRIVATE: "true"
429 BOBBIN_KNOT_REQUIRE_HTTPS: "false"
430 BOBBIN_LOG: info
431 volumes:
432 - .:/src:cached
433 - bobbin-cargo:/cargo
434 - bobbin-target:/target
435 - ./localinfra/certs/root.crt:/etc/ssl/certs/ca-certificates.crt:ro
436 healthcheck:
437 test: ["CMD", "wget", "-qO-", "http://localhost:8090/xrpc/sh.tangled.bobbin.getCoverage"]
438 interval: 5s
439 timeout: 2s
440 retries: 15
441 start_period: 10s
442 depends_on:
443 hydrant:
444 condition: service_started
445 caddy:
446 condition: service_started
447 networks: [tngl]
448
449 web:
450 build:
451 context: .
452 dockerfile: localinfra/web.Dockerfile
453 restart: unless-stopped
454 environment:
455 BOBBIN_URL: https://bobbin.tngl.boltless.dev
456 # browser-reachable appview for authed xrpc; host must match the
457 # appview's TANGLED_APPVIEW_HOST so the service-auth aud lines up
458 TANGLED_API_URL: http://127.0.0.1:3000
459 # suffix shown in the sites claim UI; must match the appview's TANGLED_SITES_DOMAIN
460 SITES_DOMAIN: tngl.io
461 KNOTMIRROR_URL: https://mirror.tngl.boltless.dev
462 CAMO_URL: https://camo.tngl.boltless.dev
463 CAMO_SHARED_SECRET: localinfra-camo-secret
464 AVATAR_URL: https://avatar.tngl.boltless.dev
465 AVATAR_SHARED_SECRET: localinfra-avatar-secret
466 VITE_HANDLE_RESOLVER_URL: https://pds.tngl.boltless.dev
467 VITE_PLC_DIRECTORY_URL: https://plc.tngl.boltless.dev
468 # host-side port; keeps the oauth loopback redirect consistent
469 VITE_DEV_PORT: "5174"
470 # the bind mount below does not deliver inotify, see vite.config.ts
471 VITE_WATCH_POLL: "true"
472 NODE_EXTRA_CA_CERTS: /caddy-ca/root.crt
473 ports:
474 - "5174:5174"
475 volumes:
476 - ./web:/src:cached
477 # shadow generated dirs so the host tree stays untouched
478 - web-node-modules:/src/node_modules
479 - web-svelte-kit:/src/.svelte-kit
480 - ./localinfra/certs/root.crt:/caddy-ca/root.crt:ro
481 healthcheck:
482 test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:5174/').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))"]
483 interval: 5s
484 timeout: 2s
485 retries: 30
486 start_period: 20s
487 depends_on:
488 bobbin:
489 condition: service_started
490 caddy:
491 condition: service_started
492 networks: [tngl]
493
494 camo:
495 build:
496 context: .
497 dockerfile: localinfra/camo.Dockerfile
498 restart: unless-stopped
499 environment:
500 CAMO_SHARED_SECRET: localinfra-camo-secret
501 WRANGLER_SEND_METRICS: "false"
502 volumes:
503 - ./camo:/src:cached
504 # shadow generated dirs so the host tree stays untouched
505 - camo-node-modules:/src/node_modules
506 - camo-wrangler:/src/.wrangler
507 - ./localinfra/certs/root.crt:/caddy-ca/root.crt:ro
508 healthcheck:
509 test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8787/').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))"]
510 interval: 5s
511 timeout: 2s
512 retries: 30
513 start_period: 30s
514 networks: [tngl]
515
516 avatar:
517 build:
518 context: .
519 dockerfile: localinfra/avatar.Dockerfile
520 restart: unless-stopped
521 environment:
522 AVATAR_SHARED_SECRET: localinfra-avatar-secret
523 PLC_DIRECTORY_URL: https://plc.tngl.boltless.dev
524 WRANGLER_SEND_METRICS: "false"
525 volumes:
526 - ./avatar:/src:cached
527 - avatar-node-modules:/src/node_modules
528 - avatar-wrangler:/src/.wrangler
529 - ./localinfra/certs/root.crt:/caddy-ca/root.crt:ro
530 healthcheck:
531 test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8787/').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))"]
532 interval: 5s
533 timeout: 2s
534 retries: 30
535 start_period: 30s
536 networks: [tngl]
537
538 caddy:
539 image: caddy:2-alpine
540 restart: unless-stopped
541 ports:
542 - "80:80"
543 - "443:443"
544 - "8090:8090"
545 volumes:
546 - ./localinfra/Caddyfile:/etc/caddy/Caddyfile
547 - ./localinfra/certs:/etc/caddy/certs:ro
548 - caddy-data:/data
549 networks:
550 tngl:
551 aliases:
552 - plc.tngl.boltless.dev
553 - pds.tngl.boltless.dev
554 - alice.pds.tngl.boltless.dev
555 - bob.pds.tngl.boltless.dev
556 - charlie.pds.tngl.boltless.dev
557 - david.pds.tngl.boltless.dev
558 - jetstream.tngl.boltless.dev
559 - knot.tngl.boltless.dev
560 - spindle.tngl.boltless.dev
561 - tngl.boltless.dev
562 - mirror.tngl.boltless.dev
563 - zoekt.tngl.boltless.dev
564 - pdsls.tngl.boltless.dev
565 - bobbin.tngl.boltless.dev
566 - camo.tngl.boltless.dev
567 - avatar.tngl.boltless.dev
568
569volumes:
570 caddy-data:
571 postgres-data:
572 pds-data:
573 jetstream-data:
574 knot-data:
575 knot-ssh-keys:
576 knotmirror-data:
577 zoekt-index:
578 spindle-data:
579 spindle-logs:
580 ncps-data:
581 init-state:
582 go-cache:
583 go-mod-cache:
584 appview-data:
585 hydrant-data:
586 bobbin-cargo:
587 bobbin-target:
588 web-node-modules:
589 web-svelte-kit:
590 camo-node-modules:
591 camo-wrangler:
592 avatar-node-modules:
593 avatar-wrangler:
594
595networks:
596 tngl:
597 driver: bridge
598 # Public-looking subnet so SSRF checks see container IPs as "public".
599 # RFC1918 + doc/benchmark ranges are blocklisted; 11.x is unrouted on
600 # the public internet, so it passes the check and won't collide.
601 ipam:
602 config:
603 - subnet: 11.0.0.0/24