Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ jobs:
with:
commit: "chore(release): version apps"
title: "Release New Version"
version: pnpm changeset:version
publish: pnpm changeset-publish
version: pnpm changeset:version && pnpm release:postversion
Comment thread
sevenzing marked this conversation as resolved.
Outdated
publish: pnpm changeset:publish
createGithubReleases: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release_snapshot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ jobs:

- name: Publish snapshot packages to NPM
if: steps.snapshot.outputs.hasChanges == 'true'
run: pnpm changeset-publish:next
run: pnpm changeset:publish:next
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Expand Down
10 changes: 5 additions & 5 deletions docker/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ All commands are run from the **monorepo root**.

| File | Purpose |
| ---------------------------------------- | -------------------------------------------------------------------------------------- |
| `docker/docker-compose.yml` | Base stack — ensindexer, ensapi, ensrainbow, ensadmin, postgres. For mainnet/sepolia. |
| `docker/docker-compose.yml` | Base stack — ensindexer, ensapi, ensrainbow, ensadmin, ensdb. For mainnet/sepolia. |
| `docker/docker-compose.devnet.yml` | Full stack against local devnet (`ens-test-env`). Includes all base services + devnet. |
| `docker/docker-compose.orchestrator.yml` | Minimal infra for CI — devnet + postgres only. Used by `orchestrator.ts`. |
| `docker/docker-compose.orchestrator.yml` | Minimal infra for CI — devnet + ensdb only. Used by `orchestrator.ts`. |
| `docker/services/*.yml` | Individual service definitions. Extended by the compose files above. |
| `docker/envs/.env.docker.common` | Shared env defaults (postgres credentials, internal service URLs). Committed. |
| `docker/envs/.env.docker.common` | Shared env defaults (ensdb credentials, internal service URLs). Committed. |
| `docker/envs/.env.docker.devnet` | Devnet defaults (PLUGINS, etc.). Committed. Works out of the box. |
| `docker/envs/.env.docker.example` | Example for user-specific config. Copy to `.env.docker.local` for mainnet/sepolia. |
| `docker/envs/.env.docker.local` | User config (gitignored). Required for base stack, optional for devnet overrides. |
Expand Down Expand Up @@ -57,7 +57,7 @@ To override defaults (e.g. change `PLUGINS`), create `docker/envs/.env.docker.lo
docker compose -f docker/docker-compose.devnet.yml up -d

# Start only devnet + core services (no ensadmin)
docker compose -f docker/docker-compose.devnet.yml up -d devnet postgres ensrainbow ensindexer ensapi
docker compose -f docker/docker-compose.devnet.yml up -d ensindexer ensapi

# Start only devnet (quick local EVM node, also shows data information about devnet)
docker compose -f docker/docker-compose.devnet.yml up devnet
Expand All @@ -83,7 +83,7 @@ pnpm docker:build:ensadmin

### CI / integration tests

Used internally by `orchestrator.ts` via testcontainers. Starts devnet + postgres only.
Used internally by `orchestrator.ts` via testcontainers. Starts devnet + ensdb only.

```bash
pnpm test:integration:ci
Expand Down
30 changes: 8 additions & 22 deletions docker/docker-compose.devnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,6 @@ services:
file: services/ensindexer.yml
service: ensindexer
environment:
# TODO: in future we will migrate devnet to chain_id=1
Comment thread
sevenzing marked this conversation as resolved.
# need to remove `RPC_URL_15658733` in that case
RPC_URL_15658733: http://devnet:8545
RPC_URL_1: http://devnet:8545
ENSINDEXER_SCHEMA_NAME: docker_devnet_v1
LABEL_SET_ID: ens-test-env
NAMESPACE: ens-test-env
env_file:
- path: envs/.env.docker.common
Expand All @@ -21,7 +15,7 @@ services:
depends_on:
ensrainbow:
condition: service_healthy
postgres:
ensdb:
condition: service_healthy
devnet:
condition: service_healthy
Expand All @@ -30,14 +24,8 @@ services:
extends:
file: services/ensapi.yml
service: ensapi
environment:
# TODO: in future we will migrate devnet to chain_id=1
# need to remove `RPC_URL_15658733` in that case
RPC_URL_15658733: http://devnet:8545
RPC_URL_1: http://devnet:8545
ENSINDEXER_SCHEMA_NAME: docker_devnet_v1
depends_on:
postgres:
ensdb:
condition: service_healthy
env_file:
- path: envs/.env.docker.common
Expand All @@ -51,8 +39,6 @@ services:
extends:
file: services/ensrainbow.yml
service: ensrainbow
environment:
LABEL_SET_ID: ens-test-env
env_file:
- path: envs/.env.docker.common
required: true
Expand All @@ -76,12 +62,12 @@ services:
- path: envs/.env.docker.local
required: false

postgres:
ensdb:
extends:
file: services/postgres.yml
service: postgres
file: services/ensdb.yml
service: ensdb
env_file:
- path: ./envs/.env.docker.common
- path: envs/.env.docker.common
required: true

devnet:
Expand All @@ -94,8 +80,8 @@ volumes:
# compose file that references them — they cannot be inherited via `extends`.
# Explicit `name:` prevents collision with the base stack's volumes when both
# are run from the same directory (same project name).
postgres_data:
name: ensnode_devnet_postgres_data
ensdb_data:
name: ensnode_devnet_ensdb_data
driver: local
ensrainbow_data:
name: ensnode_devnet_ensrainbow_data
Expand Down
12 changes: 6 additions & 6 deletions docker/docker-compose.orchestrator.yml
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
# Minimal compose for CI integration tests.
# Provides only the infrastructure services needed by orchestrator.ts:
# devnet (local EVM) and postgres (database).
# devnet (local EVM) and ensdb (database).
services:
devnet:
extends:
file: services/devnet.yml
service: devnet

postgres:
ensdb:
extends:
file: services/postgres.yml
service: postgres
file: services/ensdb.yml
service: ensdb
env_file:
- path: ./envs/.env.docker.common
- path: envs/.env.docker.common
required: true

volumes:
# Docker Compose requires volumes used by services to be declared in each
# compose file that references them — they cannot be inherited via `extends`.
postgres_data:
ensdb_data:
driver: local
12 changes: 6 additions & 6 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ services:
depends_on:
ensrainbow:
condition: service_healthy
postgres:
ensdb:
condition: service_healthy
env_file:
- path: envs/.env.docker.common
Expand All @@ -24,7 +24,7 @@ services:
environment:
ENSINDEXER_SCHEMA_NAME: docker_ensindexer_v1
depends_on:
postgres:
ensdb:
condition: service_healthy
env_file:
- path: envs/.env.docker.common
Expand Down Expand Up @@ -55,18 +55,18 @@ services:
- path: envs/.env.docker.local
required: true

postgres:
ensdb:
extends:
file: services/postgres.yml
service: postgres
file: services/ensdb.yml
service: ensdb
env_file:
- path: envs/.env.docker.common
required: true

volumes:
# Docker Compose requires volumes used by services to be declared in each
# compose file that references them — they cannot be inherited via `extends`.
postgres_data:
ensdb_data:
driver: local
ensrainbow_data:
driver: local
5 changes: 2 additions & 3 deletions docker/envs/.env.docker.common
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
# Shared Docker Compose environment variables
# Used by docker/docker-compose.yml and its variants


# Postgres
Comment thread
sevenzing marked this conversation as resolved.
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password

# Internal service URLs (container-to-container)
ENSDB_URL=postgresql://postgres:password@postgres:5432/postgres
ENSDB_URL=postgresql://postgres:password@ensdb:5432/postgres
ENSRAINBOW_URL=http://ensrainbow:3223

# ENS Admin
# ENSAdmin
ENSADMIN_PUBLIC_URL=http://localhost:4173
Comment thread
sevenzing marked this conversation as resolved.
NEXT_PUBLIC_SERVER_CONNECTION_LIBRARY=http://localhost:4334
16 changes: 16 additions & 0 deletions docker/envs/.env.docker.devnet
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
# Default configuration for devnet docker-compose stack.
# These values work out of the box — override by creating .env.docker.local.

# ENSIndexer
PLUGINS=subgraph,ensv2
# ENSIndexer and ENSRainbow
Comment thread
sevenzing marked this conversation as resolved.
Outdated
NAMESPACE=ens-test-env
# ENSIndexer and ENSApi
ENSINDEXER_SCHEMA_NAME=docker_devnet_v1
# ENSIndexer and ENSApi
RPC_URL_1=http://devnet:8545
# ENSIndexer and ENSRainbow
LABEL_SET_VERSION=0
# ENSIndexer and ENSRainbow
LABEL_SET_ID=ens-test-env
# ENSRainbow
DB_SCHEMA_VERSION=3
Comment thread
sevenzing marked this conversation as resolved.


Comment thread
sevenzing marked this conversation as resolved.
Outdated
# TODO: in future we will migrate devnet to chain_id=1
Comment thread
sevenzing marked this conversation as resolved.
Outdated
# need to remove `RPC_URL_15658733` in that case
RPC_URL_15658733=http://devnet:8545
Comment on lines +4 to +18

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Reorder these env keys before merging.

dotenv-linter is already flagging the new ordering here, so this file will keep failing lint until the entries are sorted into the project’s expected order.

🧰 Tools
🪛 dotenv-linter (4.0.0)

[warning] 7-7: [UnorderedKey] The ENSINDEXER_SCHEMA_NAME key should go before the PLUGINS key

(UnorderedKey)


[warning] 11-11: [UnorderedKey] The LABEL_SET_VERSION key should go before the PLUGINS key

(UnorderedKey)


[warning] 13-13: [UnorderedKey] The LABEL_SET_ID key should go before the LABEL_SET_VERSION key

(UnorderedKey)


[warning] 15-15: [UnorderedKey] The DB_SCHEMA_VERSION key should go before the ENSINDEXER_SCHEMA_NAME key

(UnorderedKey)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docker/envs/.env.docker.devnet` around lines 4 - 18, The env file entries are
out of order and failing dotenv-linter; reorder the keys (PLUGINS,
ENSINDEXER_SCHEMA_NAME, RPC_URL_1, RPC_URL_15658733, LABEL_SET_ID,
LABEL_SET_VERSION, DB_SCHEMA_VERSION) into the project’s expected sorted order
so dotenv-linter passes, keeping the existing comments with their related keys
and preserving values for keys like PLUGINS, ENSINDEXER_SCHEMA_NAME, RPC_URL_1,
RPC_URL_15658733, LABEL_SET_VERSION, LABEL_SET_ID, and DB_SCHEMA_VERSION.

2 changes: 1 addition & 1 deletion docker/services/ensadmin.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
services:
ensadmin:
container_name: ensadmin
image: ghcr.io/namehash/ensnode/ensadmin:latest
image: ghcr.io/namehash/ensnode/ensadmin:${ENSNODE_TAG:-1.10.1}
Comment thread
sevenzing marked this conversation as resolved.
Outdated
Comment thread
sevenzing marked this conversation as resolved.
Outdated
build:
dockerfile: ./apps/ensadmin/Dockerfile
context: ../..
Expand Down
2 changes: 1 addition & 1 deletion docker/services/ensapi.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
services:
ensapi:
container_name: ensapi
image: ghcr.io/namehash/ensnode/ensapi:latest
image: ghcr.io/namehash/ensnode/ensapi:${ENSNODE_TAG:-1.10.1}
build:
dockerfile: ./apps/ensapi/Dockerfile
context: ../..
Expand Down
6 changes: 3 additions & 3 deletions docker/services/postgres.yml → docker/services/ensdb.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
services:
postgres:
container_name: postgres
ensdb:
container_name: ensdb
image: postgres:17
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ensdb_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
Expand Down
2 changes: 1 addition & 1 deletion docker/services/ensindexer.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
services:
ensindexer:
container_name: ensindexer
image: ghcr.io/namehash/ensnode/ensindexer:latest
image: ghcr.io/namehash/ensnode/ensindexer:${ENSNODE_TAG:-1.10.1}
build:
dockerfile: ./apps/ensindexer/Dockerfile
context: ../..
Expand Down
2 changes: 1 addition & 1 deletion docker/services/ensrainbow.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
services:
ensrainbow:
container_name: ensrainbow
image: ghcr.io/namehash/ensnode/ensrainbow:latest
image: ghcr.io/namehash/ensnode/ensrainbow:${ENSNODE_TAG:-1.10.1}
build:
Comment thread
sevenzing marked this conversation as resolved.
dockerfile: ./apps/ensrainbow/Dockerfile
context: ../..
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ ENSIndexer runs `CREATE EXTENSION IF NOT EXISTS pg_trgm` at startup to back part

ENSNode provides several [Docker Compose](https://docs.docker.com/compose/) files for different use cases:

- **`docker/docker-compose.yml`** — base stack for mainnet/sepolia: ensindexer, ensapi, ensrainbow, ensadmin, postgres
- **`docker/docker-compose.yml`** — base stack for mainnet/sepolia: ensindexer, ensapi, ensrainbow, ensadmin, ensdb (postgres)
- **`docker/docker-compose.devnet.yml`** — full stack against local devnet (ens-test-env), works out of the box with no configuration required

### Mainnet / Sepolia
Expand Down
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@
"audit:osv": "osv-scanner scan source --lockfile pnpm-lock.yaml",
"typecheck": "pnpm -r --parallel --aggregate-output typecheck",
"changeset": "changeset",
"changeset:version": "changeset version && pnpm generate:openapi",
"changeset:version": "changeset version",
"changeset:next": "changeset version --snapshot next && pnpm generate:openapi",
"changeset-publish": "changeset publish",
"changeset-publish:next": "changeset publish --no-git-tag --snapshot --tag next",
"changeset:publish": "changeset publish",
"changeset:publish:next": "changeset publish --no-git-tag --snapshot --tag next",
"release:postversion": "pnpm docker:tag:sync && pnpm generate:openapi",
Comment thread
sevenzing marked this conversation as resolved.
Outdated
"packages:prepublish": "pnpm -r prepublish",
"devnet": "docker compose -f docker/docker-compose.devnet.yml up devnet",
"docker:build:ensnode": "pnpm run -w --parallel \"/^docker:build:.*/\"",
"docker:tag:sync": "node ./scripts/sync-docker-services-tags.mjs",
Comment thread
sevenzing marked this conversation as resolved.
Outdated
"docker:build:ensindexer": "docker build -f apps/ensindexer/Dockerfile -t ghcr.io/namehash/ensnode/ensindexer:latest .",
"docker:build:ensadmin": "docker build -f apps/ensadmin/Dockerfile -t ghcr.io/namehash/ensnode/ensadmin:latest .",
"docker:build:ensrainbow": "docker build -f apps/ensrainbow/Dockerfile -t ghcr.io/namehash/ensnode/ensrainbow:latest .",
Expand Down
22 changes: 11 additions & 11 deletions packages/integration-test-env/src/orchestrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
* monorepo-level integration tests, then tears everything down.
*
* Phases:
* 1. Postgres + devnet via docker-compose (testcontainers DockerComposeEnvironment)
* 1. ENSDb (postgres) + devnet via docker-compose (testcontainers DockerComposeEnvironment)
* 2. Download pre-built ENSRainbow LevelDB, extract, start ENSRainbow from source
* 3. Start ENSIndexer, wait for omnichain-following / omnichain-completed
* 4. Start ENSApi
* 5. Run `pnpm test:integration` at the monorepo root
*
* Design decisions:
* - Postgres and devnet are started from docker/docker-compose.orchestrator.yml via
* - ENSDb (postgres) and devnet are started from docker/docker-compose.orchestrator.yml via
* testcontainers DockerComposeEnvironment, ensuring the orchestrator always
* uses the same images and configuration defined there.
* - execa for child process management — automatic cleanup on parent exit,
Expand All @@ -22,7 +22,7 @@
* - ENSRainbow database is downloaded via the existing shell script and
* extracted with tar, mirroring the Docker entrypoint behavior.
* - Cleanup stops processes in reverse order (ensapi → ensindexer → ensrainbow)
* so DB consumers close connections before Postgres is stopped.
* so DB consumers close connections before ensdb is stopped.
* - Abort flag pattern: if a background service crashes during polling/health
* checks, the orchestrator fails fast instead of waiting for a timeout.
* - SIGINT/SIGTERM handler is guarded against re-entrance (repeated Ctrl-C).
Expand Down Expand Up @@ -237,21 +237,21 @@ async function main() {
log("Starting integration test environment...");
logVersions();

// Phase 1: Start Postgres + Devnet via docker-compose
log("Starting Postgres and devnet...");
// Phase 1: Start ENSDb + Devnet via docker-compose
log("Starting ENSDb and Devnet...");
composeEnvironment = await new DockerComposeEnvironment(
DOCKER_DIR,
"docker-compose.orchestrator.yml",
)
.withWaitStrategy("devnet", Wait.forHealthCheck())
.withWaitStrategy("postgres", Wait.forListeningPorts())
.withWaitStrategy("ensdb", Wait.forListeningPorts())
.withStartupTimeout(120_000)
.up(["postgres", "devnet"]);
.up(["ensdb", "devnet"]);

const postgresContainer = composeEnvironment.getContainer("postgres");
const postgresPort = postgresContainer.getMappedPort(5432);
const ENSDB_URL = `postgresql://postgres:password@localhost:${postgresPort}/postgres`;
log(`Postgres is ready (port ${postgresPort})`);
const ensdbContainer = composeEnvironment.getContainer("ensdb");
const ensdbPort = ensdbContainer.getMappedPort(5432);
const ENSDB_URL = `postgresql://postgres:password@localhost:${ensdbPort}/postgres`;
log(`ENSDb is ready (port ${ensdbPort})`);
log("Devnet is ready");

// Phase 2: Download ENSRainbow database and start from source
Expand Down
Loading
Loading