Cut the test environment over to the 3-node Proxmox NATS cluster.
Some checks are pending
offline / test (push) Waiting to run

Fleet/keep/middleware NATS_URL lists 10.10.10.21–23. Product streams
are replicas=3. px-worker worm/tree run on that cluster. Backup timer
and px-worker uptime watch are on. MOCK_VERAE and Zapier push unchanged.
This commit is contained in:
George Lambert 2026-09-11 23:59:38 -04:00
commit a73875f4ef
29 changed files with 184 additions and 43 deletions

View file

@ -18,7 +18,7 @@ Today’s NS1 box (`NS1.GEORGELAMBERT.ORG`, `70.88.205.138`) still runs the **la
nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
```
(`nats-a` VMID 511, `nats-b` 512, `nats-c` 513). Cluster routes on `:6222`. Nothing on `vmbr0`. Cut over workers with `NATS_URL` listing all three; then the same configs move to separate hardware. Fleet SSH hosts run **workers**, not extra public NATS listeners.
(`nats-a` VMID 511, `nats-b` 512, `nats-c` 513). Cluster routes on `:6222`. Nothing on `vmbr0`. **Test env is cut over:** fleet/keep/middleware `NATS_URL` lists all three; product streams `ZAPIER_*` and `VERAE_ARCHIVE` are `replicas=3`. Same configs later move to separate hardware. Fleet SSH hosts run **workers**, not extra public NATS listeners.
![NATS cluster](diagrams/nats-cluster.svg)

View file

@ -7,7 +7,8 @@ FLEET="$STACK/packages/verae-fleet"
EDGE_PORT="${EDGE_PORT:-13000}"
export STAFF_IAM_URL="${STAFF_IAM_URL:-https://iam.zapier.georgelambert.org}"
export STAFF_COOKIE_DOMAIN="${STAFF_COOKIE_DOMAIN:-.zapier.georgelambert.org}"
export NATS_URL="${NATS_URL:-nats://127.0.0.1:4222}"
export NATS_URL="${NATS_URL:-nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222}"
export JETSTREAM_REPLICAS="${JETSTREAM_REPLICAS:-3}"
export FLEET_ENABLE_LAN134="${FLEET_ENABLE_LAN134:-}"
export FLEET_FILE="${FLEET_FILE:-$FLEET/overlays/ns1/fleet.json}"
export FLEET_MACHINES="${FLEET_MACHINES:-$FLEET/overlays/ns1/machines.json}"

View file

@ -9,7 +9,7 @@
"maxRestartsPerHour": 40
},
"nats": {
"url": "nats://127.0.0.1:4222",
"url": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"publicBind": false
},
"services": {

View file

@ -18,7 +18,7 @@
"AUTHZ_URL": "http://127.0.0.1:3020",
"ACCOUNT_BALANCE_URL": "http://127.0.0.1:3010",
"ZAPPIER_UPSTREAM": "http://127.0.0.1:3100",
"NATS_URL": "nats://127.0.0.1:4222"
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222"
},
"nats": {
"in": [],

View file

@ -15,7 +15,7 @@
},
"env": {
"PORT": "3020",
"NATS_URL": "nats://127.0.0.1:4222"
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222"
},
"nats": {
"in": ["verae.access.authz.check"],

View file

@ -18,7 +18,7 @@
"AUTHZ_URL": "http://127.0.0.1:3020",
"LEAF_TOKEN": "leaf-dev-token",
"NATS_POLICY_PATH": "../verae-nats-accounts/policy.json",
"NATS_URL": "nats://127.0.0.1:4222"
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222"
},
"nats": {
"in": ["verae.access.leaf.in"],

View file

@ -17,7 +17,7 @@
"PORT": "3021",
"AUTHZ_URL": "http://127.0.0.1:3020",
"ACCOUNT_BALANCE_URL": "http://127.0.0.1:3010",
"NATS_URL": "nats://127.0.0.1:4222",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"ZAPPIER_EDGE_URL": "http://127.0.0.1:3000"
},
"nats": {

View file

@ -17,7 +17,7 @@
"PORT": "3024",
"AUTHZ_URL": "http://127.0.0.1:3020",
"ZAPPIER_UPSTREAM": "http://127.0.0.1:3100",
"NATS_URL": "nats://127.0.0.1:4222"
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222"
},
"nats": {
"in": [],

View file

@ -15,7 +15,7 @@
},
"env": {
"PORT": "3010",
"NATS_URL": "nats://127.0.0.1:4222"
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222"
},
"nats": {
"in": [

View file

@ -17,7 +17,7 @@
"PORT": "3013",
"ZAPPIER_ADMIN_URL": "http://127.0.0.1:3000",
"ACCOUNT_BALANCE_URL": "http://127.0.0.1:3010",
"NATS_URL": "nats://127.0.0.1:4222",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"STAFF_IAM_URL": "http://127.0.0.1:3028",
"STAFF_AUTH": "1"
},

View file

@ -17,7 +17,7 @@
"PORT": "3011",
"ZAPPIER_ADMIN_URL": "http://127.0.0.1:3000",
"ACCOUNT_BALANCE_URL": "http://127.0.0.1:3010",
"NATS_URL": "nats://127.0.0.1:4222",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"AUTHZ_URL": "http://127.0.0.1:3020",
"STAFF_IAM_URL": "http://127.0.0.1:3028",
"STAFF_AUTH": "1"

View file

@ -15,7 +15,7 @@
},
"env": {
"PORT": "3026",
"NATS_URL": "nats://127.0.0.1:4222"
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222"
},
"nats": {
"in": ["verae.identity.bind", "verae.identity.lookup"],

View file

@ -15,7 +15,7 @@
},
"env": {
"PORT": "3030",
"NATS_URL": "nats://127.0.0.1:4222"
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222"
},
"nats": {
"in": ["verae.zapier.jobs.events"],

View file

@ -15,9 +15,10 @@
},
"env": {
"PORT": "3100",
"NATS_URL": "nats://127.0.0.1:4222",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"NATS_ENABLED": "true",
"MOCK_VERAE": "true"
"MOCK_VERAE": "true",
"JETSTREAM_REPLICAS": "3"
},
"nats": {
"in": ["verae.zapier.jobs.events"],

View file

@ -17,7 +17,7 @@
"PORT": "3012",
"ZAPPIER_ADMIN_URL": "http://127.0.0.1:3000",
"ACCOUNT_BALANCE_URL": "http://127.0.0.1:3010",
"NATS_URL": "nats://127.0.0.1:4222",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"AUTHZ_URL": "http://127.0.0.1:3020",
"STAFF_IAM_URL": "http://127.0.0.1:3028",
"STAFF_AUTH": "1"

View file

@ -22,7 +22,7 @@
"CS_SERVICE_URL": "http://127.0.0.1:3011",
"SALES_PRICING_URL": "http://127.0.0.1:3012",
"ACCOUNTING_EXPORT_URL": "http://127.0.0.1:3013",
"NATS_URL": "nats://127.0.0.1:4222",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"AUTHZ_URL": "http://127.0.0.1:3020",
"ACCOUNT_BALANCE_URL": "http://127.0.0.1:3010",
"IDENTITY_URL": "http://127.0.0.1:3026"

View file

@ -9,7 +9,8 @@ Environment=FLEET_FILE=%h/verae-stack/packages/verae-fleet/overlays/ns1/fleet.js
Environment=FLEET_MACHINES=%h/verae-stack/packages/verae-fleet/overlays/ns1/machines.json
Environment=STAFF_IAM_URL=https://iam.zapier.georgelambert.org
Environment=STAFF_COOKIE_DOMAIN=.zapier.georgelambert.org
Environment=NATS_URL=nats://127.0.0.1:4222
Environment=NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
Environment=JETSTREAM_REPLICAS=3
Environment=FLEET_ENABLE_LAN134=
ExecStart=/usr/bin/node src/cli.js serve
Restart=always

View file

@ -7,6 +7,7 @@ Type=simple
WorkingDirectory=%h/verae-keep
Environment=KEEP_UNITS=%h/verae-keep/units.ns1.json
Environment=KEEP_STATE=%h/verae-keep/data
Environment=NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
ExecStart=/usr/bin/bash %h/verae-keep/scripts/guard.sh
Restart=always
RestartSec=2

View file

@ -0,0 +1,15 @@
[Unit]
Description=Verae keep-alive guard (restarts watch + keep)
After=network.target
[Service]
Type=simple
WorkingDirectory=%h/verae-keep
Environment=KEEP_UNITS=%h/verae-keep/units.ns1.json
Environment=KEEP_STATE=%h/verae-keep/data
ExecStart=/usr/bin/bash %h/verae-keep/scripts/guard.sh
Restart=always
RestartSec=2
[Install]
WantedBy=default.target

View file

@ -7,15 +7,22 @@
{
"id": "nats",
"title": "NATS JetStream (loopback)",
"tcp": { "host": "127.0.0.1", "port": 4222 },
"tcp": {
"host": "10.10.10.21",
"port": 4222
},
"managed": false,
"defaultIntent": "run"
"defaultIntent": "run",
"env": {}
},
{
"id": "job-poller-0",
"health": "http://127.0.0.1:13200/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "job-poller",
"FLEET_SERVICE": "job-poller",
@ -23,14 +30,19 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13200",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/job-poller-0"
"FLEET_STATE_DIR": "data/job-poller-0",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
},
{
"id": "webhook-deliver-0",
"health": "http://127.0.0.1:13300/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "webhook-deliver",
"FLEET_SERVICE": "webhook-deliver",
@ -38,14 +50,19 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13300",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/webhook-deliver-0"
"FLEET_STATE_DIR": "data/webhook-deliver-0",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
},
{
"id": "archive-aggregator-0",
"health": "http://127.0.0.1:13400/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "archive-aggregator",
"FLEET_SERVICE": "archive-aggregator",
@ -53,14 +70,19 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13400",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/archive-aggregator-0"
"FLEET_STATE_DIR": "data/archive-aggregator-0",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
},
{
"id": "archive-worm-0",
"health": "http://127.0.0.1:13500/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "archive-worm",
"FLEET_SERVICE": "archive-worm",
@ -68,14 +90,19 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13500",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/archive-worm-0"
"FLEET_STATE_DIR": "data/archive-worm-0",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
},
{
"id": "archive-worm-1",
"health": "http://127.0.0.1:13501/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "archive-worm",
"FLEET_SERVICE": "archive-worm",
@ -83,14 +110,19 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13501",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/archive-worm-1"
"FLEET_STATE_DIR": "data/archive-worm-1",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
},
{
"id": "archive-worm-2",
"health": "http://127.0.0.1:13502/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "archive-worm",
"FLEET_SERVICE": "archive-worm",
@ -98,14 +130,19 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13502",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/archive-worm-2"
"FLEET_STATE_DIR": "data/archive-worm-2",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
},
{
"id": "tree-node-0",
"health": "http://127.0.0.1:13600/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "tree-node",
"FLEET_SERVICE": "tree-node",
@ -113,14 +150,19 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13600",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/tree-node-0"
"FLEET_STATE_DIR": "data/tree-node-0",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
},
{
"id": "tree-node-1",
"health": "http://127.0.0.1:13601/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "tree-node",
"FLEET_SERVICE": "tree-node",
@ -128,14 +170,19 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13601",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/tree-node-1"
"FLEET_STATE_DIR": "data/tree-node-1",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
},
{
"id": "tree-node-2",
"health": "http://127.0.0.1:13602/health",
"cwd": "~/verae-fleet-runtime",
"command": ["node", "src/worker.js"],
"command": [
"node",
"src/worker.js"
],
"env": {
"FLEET_ROLE": "tree-node",
"FLEET_SERVICE": "tree-node",
@ -143,7 +190,9 @@
"FLEET_MACHINE": "ns1",
"FLEET_HEALTH_PORT": "13602",
"FLEET_HEALTH_BIND": "127.0.0.1",
"FLEET_STATE_DIR": "data/tree-node-2"
"FLEET_STATE_DIR": "data/tree-node-2",
"NATS_URL": "nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222",
"JETSTREAM_REPLICAS": "3"
}
}
]

Some files were not shown because too many files have changed in this diff Show more