master-zapier-plan-draft/packages/verae-ops/docker-compose.yml
George Lambert 1b199ca4d4
Some checks are pending
offline / test (push) Waiting to run
Separate Zapier, web, API, and leaf access planes with NATS authz
Zapier is one ingress. Direct web, customer API, and S2S leaf nodes are their own services. Every hop to an internal subject must pass verae.access.authz.check (default deny by plane).
2026-09-11 16:05:05 -04:00

260 lines
6.5 KiB
YAML

# Lab / small-prod. NATS stays on the internal network (not published).
# Usage:
# MONOREPO=/path/to/master-zapier-plan-draft docker compose up --build
# or clone sibling repos next to this directory.
x-node: &node
restart: unless-stopped
networks: [verae]
services:
nats1:
image: nats:2.10-alpine
command:
- "--js"
- "--http_port=8222"
- "--cluster=nats://0.0.0.0:6222"
- "--cluster_name=verae"
- "--routes=nats://nats2:6222,nats://nats3:6222"
- "--name=nats1"
networks: [verae]
restart: unless-stopped
nats2:
image: nats:2.10-alpine
command:
- "--js"
- "--cluster=nats://0.0.0.0:6222"
- "--cluster_name=verae"
- "--routes=nats://nats1:6222,nats://nats3:6222"
- "--name=nats2"
networks: [verae]
restart: unless-stopped
nats3:
image: nats:2.10-alpine
command:
- "--js"
- "--cluster=nats://0.0.0.0:6222"
- "--cluster_name=verae"
- "--routes=nats://nats1:6222,nats://nats2:6222"
- "--name=nats3"
networks: [verae]
restart: unless-stopped
zappier-edge:
<<: *node
build:
context: ${MONOREPO:-..}/packages/zappier
dockerfile: Dockerfile
environment:
PORT: "3000"
ZAPPIER_UPSTREAM: http://middleware:3100
NATS_URL: nats://nats1:4222
AUTHZ_URL: http://access-authz:3020
ports:
- "3000:3000"
depends_on: [nats1, account-balance, access-authz]
access-authz:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/verae-access-authz:/app
command: ["node", "src/server.js"]
environment:
PORT: "3020"
NATS_URL: nats://nats1:4222
ports:
- "3020:3020"
depends_on: [nats1]
access-web:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/verae-access-web:/app
command: ["node", "src/server.js"]
environment:
PORT: "3021"
AUTHZ_URL: http://access-authz:3020
ACCOUNT_BALANCE_URL: http://account-balance:3010
NATS_URL: nats://nats1:4222
ports:
- "3021:3021"
depends_on: [access-authz, account-balance]
access-api:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/verae-access-api:/app
command: ["node", "src/server.js"]
environment:
PORT: "3022"
AUTHZ_URL: http://access-authz:3020
ACCOUNT_BALANCE_URL: http://account-balance:3010
ZAPPIER_UPSTREAM: http://middleware:3100
NATS_URL: nats://nats1:4222
ports:
- "3022:3022"
depends_on: [access-authz, middleware]
access-leaf:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/verae-access-leaf:/app
command: ["node", "src/server.js"]
environment:
PORT: "3023"
AUTHZ_URL: http://access-authz:3020
LEAF_TOKEN: leaf-dev-token
NATS_URL: nats://nats1:4222
ports:
- "3023:3023"
depends_on: [access-authz, nats1]
access-zapier:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/verae-access-zapier:/app
command: ["node", "src/server.js"]
environment:
PORT: "3024"
AUTHZ_URL: http://access-authz:3020
ZAPPIER_UPSTREAM: http://middleware:3100
NATS_URL: nats://nats1:4222
ports:
- "3024:3024"
depends_on: [access-authz, middleware]
account-balance:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/zappier-account-balance:/app
command: ["node", "src/server.js"]
environment:
PORT: "3010"
NATS_URL: nats://nats1:4222
ports:
- "3010:3010"
depends_on: [nats1]
customer-service:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/zappier-customer-service:/app
command: ["node", "src/server.js"]
environment:
PORT: "3011"
ZAPPIER_ADMIN_URL: http://zappier-edge:3000
ACCOUNT_BALANCE_URL: http://account-balance:3010
NATS_URL: nats://nats1:4222
AUTHZ_URL: http://access-authz:3020
ports:
- "3011:3011"
depends_on: [zappier-edge, account-balance, nats1]
sales-pricing:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/zappier-sales-pricing:/app
command: ["node", "src/server.js"]
environment:
PORT: "3012"
ZAPPIER_ADMIN_URL: http://zappier-edge:3000
ACCOUNT_BALANCE_URL: http://account-balance:3010
NATS_URL: nats://nats1:4222
ports:
- "3012:3012"
depends_on: [zappier-edge, account-balance, nats1]
accounting-export:
<<: *node
image: node:22-alpine
working_dir: /app
volumes:
- ${MONOREPO:-..}/packages/zappier-accounting-export:/app
command: ["node", "src/server.js"]
environment:
PORT: "3013"
ZAPPIER_ADMIN_URL: http://zappier-edge:3000
ACCOUNT_BALANCE_URL: http://account-balance:3010
NATS_URL: nats://nats1:4222
ports:
- "3013:3013"
depends_on: [zappier-edge, account-balance, nats1]
middleware:
<<: *node
build:
context: ${MONOREPO:-..}/packages/verae-zapier-middleware
dockerfile: Dockerfile
environment:
PORT: "3100"
MOCK_VERAE: "true"
NATS_ENABLED: "true"
NATS_URL: nats://nats1:4222
ports:
- "3100:3100"
depends_on: [nats1, nats2, nats3]
archive-worm:
<<: *node
image: node:22-alpine
working_dir: /opt/fleet
volumes:
- ${MONOREPO:-..}/packages/verae-fleet:/opt/fleet
- ${MONOREPO:-..}/packages/verae-archive-worm:/opt/worm
- worm-data:/data
command: ["node", "src/worker.js"]
environment:
NATS_URL: nats://nats1:4222
FLEET_ROLE: archive-worm
FLEET_SERVICE: archive-worm
FLEET_HEALTH_BIND: 0.0.0.0
FLEET_HEALTH_PORT: "13500"
FLEET_STATE_DIR: /data
deploy:
replicas: 3
tree-node:
<<: *node
image: node:22-alpine
working_dir: /opt/fleet
volumes:
- ${MONOREPO:-..}/packages/verae-fleet:/opt/fleet
- ${MONOREPO:-..}/packages/verae-tree-node:/opt/tree
- tree-data:/data
command: ["node", "src/worker.js"]
environment:
NATS_URL: nats://nats1:4222
FLEET_ROLE: tree-node
FLEET_SERVICE: tree-node
FLEET_HEALTH_BIND: 0.0.0.0
FLEET_HEALTH_PORT: "13600"
FLEET_STATE_DIR: /data
deploy:
replicas: 3
networks:
verae:
driver: bridge
internal: false
volumes:
worm-data:
tree-data: