Edge node for the Evolving Edge CDN - caches and serves .ee workloads over WebRTC
2.5K
Run an Evolving Edge edge node in a container. Your node caches and serves content to people in your city for the Evolving Edge network from spare storage and bandwidth, and earns you cash payments.
In short: a multi-arch image for linux/amd64 and linux/arm64. Start it with the Compose file below, open the pairing link it prints in its logs, and keep its volumes. They hold the node's identity, and losing them starts you over as a new node.
Pulling eecdn/ee-cdn-edge:latest gives you the right image for your machine.
| Architecture | Docker platform | Runs on | Tags |
|---|---|---|---|
| x86-64 | linux/amd64 | Intel and AMD PCs and servers, most NAS devices, Intel Macs with Docker Desktop | latest, v0, vX.Y.Z, vX.Y.Z-amd64 |
| ARM 64-bit | linux/arm64 | Raspberry Pi 3, 4 and 5 running a 64-bit OS, Apple Silicon Macs with Docker Desktop, ARM servers, ARM-based NAS devices | latest, v0, vX.Y.Z, vX.Y.Z-arm64 |
32-bit ARM (armv7) is not available as an image. On a Raspberry Pi, install a 64-bit OS and use the arm64 image. Check with uname -m: aarch64 works, armv7l does not.
Home Assistant: an add-on for amd64 and aarch64 (64-bit ARM) is on the way. It runs the same node binary as this image.
| Tag | What it is |
|---|---|
latest | The newest release. Recommended. |
v0 | The newest release in the 0.x series |
vX.Y.Z (e.g. v0.0.103) | One exact release, pinned |
vX.Y.Z-amd64, vX.Y.Z-arm64 | A single-architecture image. You don't normally need these; the tags above select one for you. |
sha256-….sig | Cosign signatures for the images, not images themselves |
curl -fsSL https://cp.3dge.app/docker-compose.yml -o docker-compose.yml
docker compose up -d
docker compose logs -f edge-node
Keep the Compose file as it is. Three of its settings keep your node's identity; see Keep your node's identity below.
On its first start the node prints a pairing code and a link:
Code: XXXX-XXXX
URL: https://…
Waiting for authorization...
Open the link, sign in to your operator account and approve the device. The node finishes enrolling by itself; you don't need to restart it. You'll see:
[Auth] Enrollment complete — authenticating as <node-id>
Your node now appears under Edge Nodes in the portal.
docker runFirst create a machine ID file, once, and keep it. It gives the container a fixed identity (see below).
Linux and macOS:
uuidgen | tr -d '-' | tr 'A-F' 'a-f' > ~/edge-node-machine-id
Windows (PowerShell):
[guid]::NewGuid().ToString('N') | Out-File -Encoding ascii $HOME\edge-node-machine-id
Create the file before you start the container. If the path doesn't exist, Docker creates an empty directory there instead, and the node behaves as if it had no machine ID.
Then start the node:
docker volume create edge-data
docker run -d \
--name edge-node \
--hostname edge-node \
--restart unless-stopped \
-p 8080:8080 \
-v edge-data:/data \
-v ~/edge-node-machine-id:/etc/machine-id:ro \
-e HOME=/data \
-e PORT=8080 \
-e HOST=0.0.0.0 \
-e HEARTBEAT_SECONDS=30 \
-e EE_INSTALL_METHOD=docker \
-e CONTROL_PLANE_URL=https://cp.3dge.app \
docker.io/eecdn/ee-cdn-edge:latest
docker logs -f edge-node
Then pair it as described above.
Your Active Node Hours, badges, leaderboard position and referral program qualification belong to one node identity. A container has no identity of its own, so three settings supply one. They only work together:
| Setting | Compose | docker run | Why it matters |
|---|---|---|---|
| Node data on a volume | HOME=/data and the edge-data volume | -e HOME=/data -v edge-data:/data | Stores the node's encrypted credentials. Without HOME=/data they are written inside the container and lost when it is recreated. |
| A fixed hostname | hostname: edge-node | --hostname edge-node | One of the two inputs to the key that decrypts those credentials |
| A persistent machine ID | the edge-identity volume | the machine ID file | The other input, and what the network recognises the node by |
If you leave out any of them, or delete a volume or the machine ID file, recreating the container enrolls a brand-new node whose history starts from zero. Your account, balance and payouts are not affected.
Two more things:
edge-data volume as private. It holds the node's credentials.| Port | Protocol | Purpose |
|---|---|---|
8080 | TCP | The node's HTTP port |
If 8080 is already taken on your host, change only the left side of the mapping, e.g. 8081:8080.
To be eligible for gateway mode, the node must also be reachable from the internet. For example, forward a TCP port on your router to the Docker host's published port. You can check eligibility in the portal.
docker compose ps # or: docker ps
curl http://<docker-host>:8080/health
The container restarts itself unless you stop it. Each node checks in every 30 seconds, and uptime counts toward your Performance Index, so leave it running.
docker compose pull
docker compose up -d
With docker run, pull the new image, remove the container and run the same command again. Your volumes and machine ID file carry the node's identity across the update.
Removing a node in the portal doesn't reset the container, which keeps its saved credentials. To pair again from scratch, remove the container and its volumes (docker compose down -v, or docker rm -f edge-node && docker volume rm edge-data), delete the machine ID file if you used one, and start again. The result is a new node.
Deploy the Compose file as a stack. In Portainer, go to Stacks → Add stack → Web editor and paste the contents of cp.3dge.app/docker-compose.yml. The pairing link appears in the container's logs.
Content type
Image
Digest
sha256:25cbce750…
Size
13.4 MB
Last updated
43 minutes ago
docker pull eecdn/ee-cdn-edge