Run a Node with Docker#
Docker is the recommended way to run a DecentralChain node. The image is built from docker/Dockerfile in node-scala and runs the node as the unprivileged user dcc.
Note
Verified against node-scala v1.7.0.
Requirements#
Requirement |
Minimum |
Recommended |
|---|---|---|
Docker Engine |
25.x |
Latest stable |
RAM |
4 GB |
8 GB |
CPU |
2 cores |
4+ cores |
Disk (Mainnet, SSD) |
200 GB |
500 GB |
Network |
100 Mbit/s |
1 Gbit/s |
Ports#
Port |
Purpose |
Exposure |
|---|---|---|
|
P2P, Mainnet (Testnet uses |
Open to the internet so peers can reach you |
|
REST API |
Keep private: bind to localhost, or place behind a reverse proxy |
Quick start#
docker run -d \
--name dcc-node \
--restart unless-stopped \
-p 6868:6868 \
-p 127.0.0.1:6869:6869 \
-v dcc-data:/var/lib/dcc \
-e DCC_NETWORK=mainnet \
-e DCC_HEAP_SIZE=4g \
-e DCC_REST_API_BIND=0.0.0.0 \
ghcr.io/decentral-america/node-scala:mainnet-latest
Important
Inside the container the REST API binds to 127.0.0.1 by default (DCC_REST_API_BIND). Docker cannot forward a published port to a service listening only on the container’s loopback interface, so without DCC_REST_API_BIND=0.0.0.0 the API is unreachable from the host. The example above then publishes the port only on the host’s loopback (-p 127.0.0.1:6869:6869), which keeps the API off the public internet.
Data is stored in the /var/lib/dcc volume and logs in /var/log/dcc. Keep the data volume between restarts and upgrades — losing it forces a full re-sync.
Docker Compose#
services:
dcc-node:
image: ghcr.io/decentral-america/node-scala:mainnet-latest
container_name: dcc-node
restart: unless-stopped
stop_signal: SIGINT
stop_grace_period: 60s
ports:
- "6868:6868"
- "127.0.0.1:6869:6869"
environment:
DCC_NETWORK: mainnet
DCC_HEAP_SIZE: 4g
DCC_LOG_LEVEL: INFO
DCC_REST_API_BIND: 0.0.0.0
env_file: .env # DCC_WALLET_SEED, DCC_WALLET_PASSWORD (chmod 600)
volumes:
- dcc-data:/var/lib/dcc
- dcc-logs:/var/log/dcc
volumes:
dcc-data:
dcc-logs:
Note
DCC_WALLET_SEED and DCC_WALLET_PASSWORD only take effect when a config file is mounted at /etc/dcc/dcc.conf (and no command arguments are passed to the container): the entrypoint layers the wallet secrets on top of that file. Without a mounted config they are silently ignored. See Configuration.
Verify it is running#
curl -s http://localhost:6869/node/status
docker inspect --format='{{.State.Health.Status}}' dcc-node # healthy
The image’s built-in HEALTHCHECK polls /node/status. See Configuration for every environment variable and Sync and Rollback for what to expect on first start.