Files
Maven/deploy/ecosystem/docker-compose.yml
T
kami 9190f897a3 Add a locked-down maven.<domain> block to the nginx template (#354)
The template's wildcard `listen 80` with no ACL was fixed in 50cc17f, but it
still only covered nexus/praxis/hexis. mavweb — the one service in the set
that serves an RCE surface (POST /tools defines argv internal/tool executes)
— had no block at all, so anyone wiring it up wrote their own, which is how
the wildcard got there the first time.

Adds a maven.kvmx.ru server with the same wg+LAN bind and allow/deny,
proxying 127.0.0.1:9201, with the WebSocket upgrade /ws needs, a 32m body
limit for push-to-talk PCM, and a 300s read timeout because an LLM turn on
the iGPU is slow.

Also records in deploy/ecosystem/docker-compose.yml that the sibling
`build:` paths pin nothing and ship the sibling working tree, with the
command to check what is about to be deployed. The stale public DNS records
(item 2) are outside the repo.

Verified: nginx -t on the template inside a minimal http{} accepts it.
2026-08-01 01:27:11 +04:00

67 lines
2.5 KiB
YAML

# Nexus / Praxis / Hexis — the three sibling services Maven coordinates.
# One container each, built from the sibling repos (siblings of the Maven repo
# on the same mount). HTTP is published to 127.0.0.1 so the host nginx can
# reverse-proxy the *.subdomains; container-to-container (Maven → sibling) goes
# over the shared `ecosystem` network by service name, no host round-trip.
#
# docker compose -f deploy/ecosystem/docker-compose.yml up -d --build
#
# Maven's own compose joins this same network (add `ecosystem` as an external
# network there) to reach nexus:9740 / praxis:8989 / hexis:9741 directly.
#
# NO RELEASE PINNING (Vikunja #354): each `build:` below points at a sibling
# WORKING TREE, so `up --build` ships whatever is checked out there, including
# uncommitted edits. Before bringing this up, check what you are about to
# deploy:
#
# for r in nexus praxis hexis; do git -C ../../../$r status --short; \
# git -C ../../../$r log -1 --oneline; done
#
# The host nginx that fronts these is deploy/ecosystem/nginx.conf — it binds
# the wg and LAN addresses only, with allow/deny. Keep it that way: none of
# these containers has auth of its own.
name: ecosystem
services:
nexus:
build: ../../../nexus
restart: unless-stopped
ports: ["127.0.0.1:9740:9740"] # host nginx → nexus.<domain>
volumes:
- nexus-data:/data
- sockets:/run/ecosystem # nexus.sock, shared with Maven
networks: [ecosystem]
praxis:
build: ../../../praxis
restart: unless-stopped
ports: ["127.0.0.1:8989:8989"] # host nginx → praxis.<domain>
volumes:
- praxis-data:/data
networks: [ecosystem]
hexis:
build: ../../../hexis
restart: unless-stopped
ports: ["127.0.0.1:9741:9741"] # host nginx → hexis.<domain> (MCP moved off hexis.*)
environment:
# hexis fronts the workspace MCP; point at wherever it listens on the
# host/network. Empty ⇒ workspace provider disabled (systemd-only).
- WORKSPACE_MCP_URL=${WORKSPACE_MCP_URL:-http://192.168.1.104:9930}
volumes:
- hexis-data:/data
- sockets:/run/ecosystem
# required when WORKSPACE_MCP_URL is set — hexisd fatals without it.
- ../../../hexis/etc/workspace-allowlist.yaml:/data/workspace-allowlist.yaml:ro
networks: [ecosystem]
volumes:
nexus-data:
praxis-data:
hexis-data:
sockets:
networks:
ecosystem:
name: ecosystem # stable name so Maven's compose can reference it as external