Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
6 changes: 6 additions & 0 deletions .changeset/hip-poems-shave.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@ensnode/integration-test-env": patch
"@docs/ensnode": patch
---

Moved docker-compose.yml file to separate `docker` directory, updates docs and cicd-tests
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@ ENSNode is a modern, multichain indexer for ENS. It supports backwards-compatibl

Documentation for the ENSNode suite of apps is available at [ensnode.io](https://ensnode.io).

## Running with Docker

```bash
docker compose -f docker/docker-compose.yml up -d
```

See [`docker/README.md`](docker/README.md) for all use cases and commands.

## Contributions

We welcome community contributions and feedback—please see [CONTRIBUTING.md](CONTRIBUTING.md) for more information.
Expand Down
1 change: 1 addition & 0 deletions apps/ensindexer/.env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ ENSRAINBOW_URL=http://localhost:3223
# https://ensnode.io/ensrainbow/usage/available-label-sets
#
# LABEL_SET_ID: see https://ensnode.io/ensrainbow/concepts/glossary#label-set-id.
# Should match ENSRainbow's LABEL_SET_ID.
LABEL_SET_ID=subgraph

# LABEL_SET_VERSION: see https://ensnode.io/ensrainbow/concepts/glossary#label-set-version.
Expand Down
2 changes: 1 addition & 1 deletion apps/ensrainbow/.env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ LOG_LEVEL=info
DB_SCHEMA_VERSION=3

# Label set ID (see https://ensnode.io/ensrainbow/concepts/glossary#label-set-id)
LABEL_SET_ID=ens-test-env
LABEL_SET_ID=subgraph

# Label set version (see https://ensnode.io/ensrainbow/concepts/glossary#label-set-version)
LABEL_SET_VERSION=0
127 changes: 0 additions & 127 deletions docker-compose.yml

This file was deleted.

90 changes: 90 additions & 0 deletions docker/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Docker Compose

All commands are run from the **monorepo root**.

## Files

| File | Purpose |
| ---------------------------------------- | -------------------------------------------------------------------------------------- |
| `docker/docker-compose.yml` | Base stack — ensindexer, ensapi, ensrainbow, ensadmin, postgres. 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/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.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. |

> To inspect the fully resolved config for any compose file (resolves all `extends`):
>
> ```
> docker compose -f docker/docker-compose.yml config
> ```
Comment thread
sevenzing marked this conversation as resolved.

## Use cases

### Mainnet / Sepolia

**1. Configure environment** (one-time setup):

```bash
cp docker/envs/.env.docker.example docker/envs/.env.docker.local
```

Edit `docker/envs/.env.docker.local` and set `NAMESPACE`, `PLUGINS`, and your RPC endpoints (e.g. `ALCHEMY_API_KEY` or `RPC_URL_1`).

**2. Start/stop the stack:**

```bash
# Start full stack in background
docker compose -f docker/docker-compose.yml up -d

# Stop
docker compose -f docker/docker-compose.yml down

# Stop and remove volumes
docker compose -f docker/docker-compose.yml down -v
```

### Local devnet (for developers)

No setup required — devnet defaults are committed in `docker/envs/.env.docker.devnet`.

To override defaults (e.g. change `PLUGINS`), create `docker/envs/.env.docker.local` with your values.

```bash
# Start full stack against devnet
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

# Start only devnet (quick local EVM node, also shows data information about devnet)
docker compose -f docker/docker-compose.devnet.yml up devnet
# or
pnpm devnet

# Stop
docker compose -f docker/docker-compose.devnet.yml down
```

### Build images locally

```bash
# Build all images
pnpm docker:build:ensnode

# Build a specific image
pnpm docker:build:ensindexer
pnpm docker:build:ensapi
pnpm docker:build:ensrainbow
pnpm docker:build:ensadmin
```

### CI / integration tests

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

```bash
pnpm test:integration:ci
```
100 changes: 100 additions & 0 deletions docker/docker-compose.devnet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
services:
ensindexer:
extends:
file: services/ensindexer.yml
service: ensindexer
environment:
# TODO: in future we will migrate devnet to chain_id=1
# need to update this line in that case
RPC_URL_15658733: 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
required: true
- path: envs/.env.docker.devnet
required: true
- path: envs/.env.docker.local
required: false
depends_on:
ensrainbow:
condition: service_healthy
postgres:
condition: service_healthy
devnet:
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this depends_on redefines depends_on from the ensindexer service; obviously the devnet dependency must be included, but do we need to re-specify the others?

Copy link
Copy Markdown
Member Author

@sevenzing sevenzing Apr 22, 2026

Choose a reason for hiding this comment

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

well, you are right, we can skip them. but after your comment I decided that it's better to move depends_on from services/ to each docker-compose.*.yml file. It's slightly more verbose (duplicate ensrainbow/postgres in both compose files) but each compose file becomes fully self-describing — no need to chase through extends merge rules to understand what a service waits for.

condition: service_healthy

ensapi:
extends:
file: services/ensapi.yml
service: ensapi
environment:
# TODO: in future we will migrate devnet to chain_id=1
# need to update this line in that case
RPC_URL_15658733: http://devnet:8545
ENSINDEXER_SCHEMA_NAME: docker_devnet_v1
depends_on:
postgres:
condition: service_healthy
env_file:
- path: envs/.env.docker.common
required: true
- path: envs/.env.docker.devnet
required: true
- path: envs/.env.docker.local
required: false

ensrainbow:
extends:
file: services/ensrainbow.yml
service: ensrainbow
environment:
LABEL_SET_ID: ens-test-env
env_file:
- path: envs/.env.docker.common
required: true
- path: envs/.env.docker.devnet
required: true
- path: envs/.env.docker.local
required: false

ensadmin:
extends:
file: services/ensadmin.yml
service: ensadmin
depends_on:
ensapi:
condition: service_started
env_file:
- path: envs/.env.docker.common
required: true
- path: envs/.env.docker.devnet
required: true
- path: envs/.env.docker.local
required: false

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

devnet:
extends:
file: services/devnet.yml
service: devnet

volumes:
# Docker Compose requires volumes used by services to be declared in each
# 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
driver: local
ensrainbow_data:
name: ensnode_devnet_ensrainbow_data
driver: local
Comment thread
sevenzing marked this conversation as resolved.
22 changes: 22 additions & 0 deletions docker/docker-compose.orchestrator.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Minimal compose for CI integration tests.
# Provides only the infrastructure services needed by orchestrator.ts:
# devnet (local EVM) and postgres (database).
services:
devnet:
extends:
file: services/devnet.yml
service: devnet

postgres:
extends:
file: services/postgres.yml
service: postgres
Comment thread
sevenzing marked this conversation as resolved.
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:
driver: local
Loading
Loading