Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Stack

Staging host: Tailscale clc-gnosis (100.108.72.127), compose in clc-gnosis-repo.

Caddy fronts clc-core and storage-server; tracker and indexer share NATS and Postgres
ServiceImagePublishWatchtower
postgres 18postgres:18-alpine54432:5432no
natsnats:2 (-js)internalno
eth-trackereth-tracker:v1.14.0-stable127.0.0.1:5001no
eth-indexereth-indexer:latest127.0.0.1:5002yes
clc-coreclc-core:developvia Caddyyes
storage-serverstorage-server:v0.8.0-rcvia Caddyyes
caddycaddy-docker-proxy:2.10-alpine80/443no
watchtowercontainrrr/watchtowernonen/a

Watchtower: --interval 120 --label-enable --cleanup --rolling-restart. Only containers with com.centurylinklabs.watchtower.enable=true.

Hostnames:

  • gnosis-staging.cosmolocal.credit โ†’ clc-core
  • gnosis-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:

  1. Lists. koanf Strings() does not promote a single env value to []string. Repeat the NATS URL (nats://nats:4222,nats://nats:4222) in core.env / indexer.env. Do not do that for bootstrap.ge_registry (empty element panics). Put the registry in tracker-config.toml.
  2. Tracker reads jetstream.endpoint (singular). The image's endpoints key is unused.
  3. CORE_CHAIN__DIVVI_CONSUMER cannot be empty. Use the zero address.
  4. Do not mount config.toml over 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 watchtower

init_db.sql creates chain_data only on an empty volume.