Files
docs/docker-internal-inventory.md
fkrebs 688f3cac45 docker-internal-inventory: 3-tier model with per-container recommendation
Lists all containers without LAN-published ports across CT 104/105/109/110/111/112/113.
Recommends keep-internal vs expose for each. Confirms the public/LAN/docker-internal
tiering is clean across the fleet.
2026-05-24 08:41:46 +02:00

3.9 KiB

Docker-internal inventory

Live at http://192.168.1.8:13080/docker-internal-inventory/.

Containers that have no LAN-published port — reachable only on their Docker bridge network. This is the third tier of our access model:

  1. public — Zoraxy-routed via *.nuclide.systems (internet-reachable)
  2. LAN192.168.1.0/24 direct (host port mapping)
  3. docker-internal — only via container-to-container bridge (this doc)

Default per feedback_internal_only: keep new things at tier 2 or 3 unless there's a real external-access reason. Most of what is on tier 3 should stay there — that's the point of having three tiers.

Recommendation legend

  • 🟢 Keep internal — sidecar / backend / engine, must not be exposed
  • 🟡 Maybe — admin UI exists; could be useful to reach directly but low value
  • 🔴 Expose to LAN — broken access pattern, fix recommended

CT 104 (docker host) — 43 internal-only

AI / MCP plumbing — all 🟢 keep internal

Backend MCP servers consumed only by the MCP gateway. Exposing them would bypass auth + audit.

  • mcp-proxmox, gitea-mcp, mcp-immich, mcp-fetch, mcp-time, mcp-git, mcp-gotify, mcp-unifi, mcp-ntfy, mcp-markitdown, mcp-context7, mcp-youtube-transcript, mcp-sequential-thinking, mcp-wikipedia-mcp, mcp-gitlab, mcp-crawl4ai, coder-mcp, ariel-mcp, paperless-mcp, claude-max-bridge
  • Plus the ephemeral crazy_colden/stoic_kirch/etc. (auto-spawned MCP one-shots — Docker name collisions, no static port).

Backends for exposed services — 🟢 keep internal

  • karakeep_meilisearch, karakeep_chrome (Karakeep search + headless browser)
  • immich_postgres, immich_redis, immich_machine_learning (Immich backends)
  • immich_power_tools🟡 maybe. Power-user UI for Immich. Bind to LAN if you ever want to use it directly.
  • paperless-ngx-tika-1, paperless-ngx-gotenberg-1, paperless-ngx-broker-1 (Paperless OCR/PDF/redis)
  • redis-searxng, rdtclient (auxiliary)

Diagrams — 🟢 keep internal

  • kroki, kroki-mermaid, kroki-excalidraw — rendered via MCP, no UI to expose.

Monitoring agents — 🟢 keep internal

  • node-exporter (scraped by Prometheus on :9100 over container network; LAN exposure not needed since Prometheus is on the same LAN already)
  • arcane-agent (talks back to Arcane server on CT 109)

CT 105 (nextcloud) — 8 internal-only

🟢 All keep internal — Nextcloud AIO architecture.

  • nextcloud-aio-nextcloud (fronted by AIO apache proxy on :11000)
  • nextcloud-aio-database (Postgres), nextcloud-aio-redis, nextcloud-aio-imaginary, nextcloud-aio-notify-push, nextcloud-aio-collabora, nextcloud-aio-docker-socket-proxy
  • arcane-agent

Exposing the AIO backends directly would break Nextcloud's auth model and crash backups.

CT 109 (ops) — 1 internal-only

  • node-exporter🟢 keep internal. Scraped via host.docker.internal from Prometheus on the same host.

CT 110 / 111 / 112 / 113 — arcane-agent only

🟢 All keep internal. The Arcane agent on each Docker host calls back to the Arcane server on 192.168.1.8:10002; no inbound LAN traffic needed.

Plus:

  • CT 111: act-runner 🟢 (Gitea Actions runner — outbound to Gitea API; never needs inbound)
  • CT 112: infisical-db, infisical-redis 🟢 (Infisical app on :8200 is the only intended entry)

Cross-tier issues spotted

None. The 3-tier model is clean across the fleet:

  • No backend Postgres/Redis is accidentally LAN-bound
  • No MCP server is double-exposed
  • No admin UI is bound to LAN when it shouldn't be

Candidate LAN-bind, if you want them

If you ever want direct LAN access to one of the 🟡 services, the pattern is to add a ports: line to its compose entry:

Service Suggested port Why you might
immich_power_tools :3001 on CT 104 Bulk Immich operations (album merge, dedup) the main UI doesn't expose

Everything else: leave at tier 3.