Stack
Staging host: Tailscale clc-gnosis (100.108.72.127), compose in clc-gnosis-repo.
| Service | Image | Publish | Watchtower |
|---|---|---|---|
| postgres 18 | postgres:18-alpine | 54432:5432 | no |
| nats | nats:2 (-js) | internal | no |
| eth-tracker | eth-tracker:v1.14.0-stable | 127.0.0.1:5001 | no |
| eth-indexer | eth-indexer:latest | 127.0.0.1:5002 | yes |
| clc-core | clc-core:develop | via Caddy | yes |
| storage-server | storage-server:v0.8.0-rc | via Caddy | yes |
| caddy | caddy-docker-proxy:2.10-alpine | 80/443 | no |
| watchtower | containrrr/watchtower | none | n/a |
Watchtower: --interval 120 --label-enable --cleanup --rolling-restart. Only containers with com.centurylinklabs.watchtower.enable=true.
Hostnames:
gnosis-staging.cosmolocal.creditโ clc-coregnosis-storage.cosmolocal.creditโ storage-server
Env mapping
CORE_A__B โ config key a.b. A value with a comma or space becomes a list. In core.env only, a value containing \n is passed through unsplit (PEM keys).
Gotchas:
- Lists. koanf
Strings()does not promote a single env value to[]string. Repeat the NATS URL (nats://nats:4222,nats://nats:4222) incore.env/indexer.env. Do not do that forbootstrap.ge_registry(empty element panics). Put the registry intracker-config.toml. - Tracker reads
jetstream.endpoint(singular). The image'sendpointskey is unused. CORE_CHAIN__DIVVI_CONSUMERcannot be empty. Use the zero address.- Do not mount
config.tomlover Watchtower-updated images. Tracker is pinned, so a mount is safe. clc-core / indexer would freeze on a stale file.
Ordered start
docker compose up -d postgres nats
docker compose logs -f postgres | grep -m1 "database system is ready"
docker compose up -d eth-tracker
docker compose up -d eth-indexer clc-core storage-server
docker compose up -d caddy watchtowerinit_db.sql creates chain_data only on an empty volume.