Docker
Polygon provides official Docker images for setting up nodes on the Polygon Mainnet. This guide details the process for running a Full Node, with the flexibility to adapt these instructions for sentry nodes and validators.
Prerequisites¶
To run a Polygon full node, your machine should meet these minimum specifications:
- CPU and RAM: At least 4 CPUs/cores and 16 GB of RAM. In this guide, we use an AWS
t3.2xlargeinstance, suitable for both x86 and ARM architectures. - Operating System: This guide is based on Docker, compatible with most operating systems, but we’ll focus on Ubuntu for simplicity.
- Storage Requirements: For a full node, expect to need between 2.5 to 5 terabytes of SSD storage, or faster.
- Network Configuration: Polygon full nodes typically require ports 30303 and 26656 to be open. Ensure these ports are accessible in your firewall or AWS security group settings.
Summary:
- Ensure a minimum of 4 cores and 16GB RAM.
- Have 2.5 TB to 5 TB of high-speed storage.
- Use a public IP and open ports 30303 and 26656.
Initial setup¶
You should have root-level shell access to a Linux machine.
Installing Docker¶
Your operating system likely doesn’t include Docker by default. Follow these steps to install Docker, consulting the official Docker installation guide for the latest instructions:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Verify the installation:
sudo docker run hello-world
For convenience, configure Docker to run without requiring sudo:
sudo groupadd docker
sudo usermod -aG docker $USER
Logout and log back in to apply these changes.
Disk setup¶
The specific steps for disk setup will vary. Typically, you’ll have a root partition for the OS and separate devices for blockchain data. For this guide, we’ll assume an additional device mounted at /mnt/data.
Example setup with a 4 TB device at /dev/nvme1n1:
sudo mkdir /mnt/data
sudo mount /dev/nvme1n1 /mnt/data
Use df -h to verify the mount. Then, create directories for Bor and Heimdall:
sudo mkdir /mnt/data/bor
sudo mkdir /mnt/data/heimdall
To ensure the device mounts on reboot, add it to /etc/fstab:
- Obtain the UUID with
blkid. - Edit
/etc/fstaband add a line for your device, e.g.,UUID={your uuid} /mnt/data {your filesystem} defaults 0 1. - Use
sudo emacs /etc/fstabto edit the file. - Verify with
sudo findmnt --verify --verbose.
Reboot to confirm the proper loading of your mount.
Heimdall setup¶
With Docker running and storage prepared, it’s time to set up Heimdall:
-
Test Heimdall with Docker:
docker run -it 0xpolygon/heimdall:1.0.3 heimdallcli version -
Initialize Heimdall’s home directory:
docker run -v /mnt/data/heimdall:/heimdall-home:rw --entrypoint /usr/bin/heimdalld -it 0xpolygon/heimdall:1.0.3 init --home=/heimdall-home -
Edit
config.tomlin/mnt/data/heimdall/config:- Set
monikerto a unique node name. - Change
laddrtotcp://0.0.0.0:26657. - Update
seedswith the latest list (found in the section on seed nodes and bootnodes).
- Set
-
Edit
heimdall-config.toml:- Set
eth_rpc_urlto your Ethereum Mainnet RPC URL. - Change
bor_rpc_urlto<http://bor:8545>.
- Set
-
Update the
genesis.jsonfor Mainnet:sudo curl -o /mnt/data/heimdall/config/genesis.json https://raw.githubusercontent.com/maticnetwork/heimdall/master/builder/files/genesis-mainnet-v1.json
Verify the hash with sha256sum genesis.json.
Starting Heimdall¶
Create a Docker network for container communication:
docker network create polygon
Start Heimdall:
docker run -p 26657:26657 -p 26656:26656 -v /mnt/data/heimdall:/heimdall-home:rw --net polygon --name heimdall --entrypoint /usr/bin/heimdalld -d --restart unless-stopped 0xpolygon/heimdall:1.0.3 start --home=/heimdall-home
Monitor Heimdall with docker ps and docker logs -ft heimdall. Verify syncing status with curl localhost:26657/status.
Starting Bor¶
Start Heimdall’s REST server:
docker run -p 1317:1317 -v /mnt/data/heimdall:/heimdall-home:rw --net polygon --name heimdallrest --entrypoint /usr/bin/heimdalld -d --restart unless-stopped 0xpolygon/heimdall:1.0.3 rest-server --home=/heimdall-home --node "tcp://heimdall:26657"
Verify the REST server with curl localhost:1317/bor/span/1.
Download and verify the Bor genesis file:
sudo curl -o /mnt/data/bor/genesis.json 'https://raw.githubusercontent.com/maticnetwork/bor/master/builder/files/genesis-mainnet-v1.json'
Generate and configure the Bor config.toml:
docker run -it 0xpolygon/bor:1.1.0 dumpconfig | sudo tee /mnt/data/bor/config.toml
Edit the config.toml file as needed.
Start Bor:
docker run -p 30303:30303 -p 8545:8545 -v /mnt/data/bor:/bor-home:rw --net polygon --name bor -d --restart unless-stopped 0xpolygon/bor:1.1.0 server --config /bor-home/config.toml
Check Bor’s sync status with:
curl 'localhost:8545/' --header 'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}'
Seed nodes and bootnodes¶
- Heimdall Seed Nodes:
Update the seeds in config.toml with the appropriate values for Mainnet or Testnet.
- Bootnodes:
Update the bootnodes in Bor’s config.toml as per the Mainnet or Testnet requirements.
Congratulations! You’ve successfully set up a Polygon full node using Docker.