Documentation

Run a node

The eiou-docker image bundles everything a node needs — nginx, PHP-FPM, MariaDB, Tor, the P2P processors, and the web GUI — so a single docker compose up brings a wallet online. This page is split into Setup (one-time install and configuration, ending with docker compose up and the GUI sign-in) and Node management (storage, recovery from seed, container control, multi-node, troubleshooting). CLI examples run from the host; everything inside the container is reachable through docker exec <container>. For the full environment-variable, volume, SSL, and network reference, see Docker Configuration.

Setup

One-time steps to install, configure, and bring up your node. The defaults — Docker-internal address https://eiou, auto-generated self-signed certificate, auto-generated wallet and Tor onion — are enough to test on a single host. Skip past the configuration sections unless you need to: rename the container (running more than one node), publish externally (peers reach you over the public internet or LAN), or replace SSL (real Let's Encrypt / CA-signed cert instead of self-signed).

Option 1 — clone & buildFetch the source tree (repo, compose file, scripts, dockerfile)
git clone https://gitlab.com/eiou-org/eiou-docker.git
Move into the cloned directory — every later command runs from here
cd eiou-docker
Option 2 — pull from Docker HubDownload the prebuilt image (no source tree needed)
docker pull eiou/eiou:latest
Grab the reference docker-compose.yml so you have something to compose up — edit the build: block to image: eiou/eiou:latest afterwards
curl -O https://gitlab.com/eiou-org/eiou-docker/-/raw/main/docker-compose.yml
Option A — .env file (with docker compose)Drop a file called .env next to docker-compose.yml with one line per variable. docker compose up picks it up automatically.
NODE_NAME=my-wallet
Option B — environment: block in docker-compose.ymlInline the value in the service definition. Same result, but lives in the compose file rather than a sibling .env.
environment: - NODE_NAME=my-wallet
Option C — docker run -eIf you skip docker compose, declare all seven persistent mounts yourself. Pass environment variables before the image name.
docker run -d --restart unless-stopped --name my-wallet -e NODE_NAME=my-wallet -p 80:80 -p 443:443 -v my-wallet-mysql-data:/var/lib/mysql -v my-wallet-config:/etc/eiou/config -v my-wallet-plugins:/etc/eiou/plugins -v my-wallet-plugin-scratch:/var/lib/eiou/plugin-scratch -v my-wallet-backups:/var/lib/eiou/backups -v my-wallet-backup-locks:/var/lib/eiou/backup-locks -v my-wallet-ssl-cert:/var/lib/eiou/ssl eiou/eiou:latest
Example — public IP on a non-standard portDrop QUICKSTART from docker-compose.yml (or leave the default; EIOU_HOST overrides it). The node registers https://88.99.69.172:8443 as its address.
environment: - EIOU_NAME=My eIOU Node - EIOU_HOST=88.99.69.172 - EIOU_PORT=8443
Example — Let's EncryptEIOU_HOST needs to resolve in public DNS to this container's host. Certbot inside the container uses the HTTP-01 challenge on port 80, then nginx switches to the issued cert automatically.
environment: - EIOU_HOST=node.example.com - LETSENCRYPT_EMAIL=admin@example.com
Bring the node upBuild the image (skip --build if you used the Docker Hub path), create the volumes, and start the container detached. Run this once.
docker compose up -d --build
Stream startup logs in real time — this is where you'll see "Waiting for MariaDB", the OPEN ALPHA banner, and the auth code on first boot. Ctrl+C to detach (the container keeps running).
docker compose logs -f
Snapshot of the container's current state — status column should read Up (healthy) once MariaDB and the GUI are ready.
docker compose ps
Read the boot-time tmpfs file (first 15 min only)First find the actual filename — the suffix is random per boot, so it's different on every node:
docker exec eiou-node ls /dev/shm/
Then cat that file. Replace <random-hex> with the suffix you saw above (e.g. a1b2c3...):
docker exec eiou-node cat /dev/shm/eiou_wallet_info_<random-hex>
Or fetch the auth code on demandNo filename hunt — this regenerates a fresh auth-code-only file (same 15-min TTL) and prints the path:
docker exec eiou-node eiou info --show-auth
Node management

Day-to-day operations and recovery once your node is up: storage, restoring from a seed, container control, multi-node, and troubleshooting.

Example — file-based restorationAdd to your docker-compose.yml service block: tells startup.sh to read the seed from /restore/seed inside the container, mounted from the host file you'll create next.
environment: - RESTORE_FILE=/restore/seed volumes: - /secure/path/seed.txt:/restore/seed:ro
On the host, write the 24 words into the file the volume mount points to. chmod 600 keeps other user accounts on the host from reading it.
echo "word1 word2 ... word24" > seed.txt && chmod 600 seed.txt
Day-to-day commandsStatus check — container, health, uptime, mapped ports
docker compose ps
Tail combined logs from all services — Ctrl+C to detach
docker compose logs -f
Stop and start the container in place — quickest way to pick up an env-var change in docker-compose.yml
docker compose restart
Stop the container and remove it. Volumes are kept — data is safe; compose up brings the same wallet back
docker compose down
Run any CLI command inside the container from the host — here, print node addresses, public key, and balance summary
docker exec eiou-node eiou info
Wipe everything — deletes the wallet
Destructive — cannot be undone

Adding -v deletes every named volume along with the container — wallet keys, transaction history, and the on-disk encrypted backups all go with it. Recovery requires both your 24-word BIP39 seed phrase and any database backups you've copied off this host — both must already be safe somewhere else before you run this. With the seed alone you get the same identity back (Tor address, public key) but a blank ledger; with backups alone you get the ledger but no identity. You need both.

Stop the container and destroy the volumes. Use only when you are deliberately starting fresh.
docker compose down -v

Stuck at "Waiting for MariaDB"

Normal on first boot — MariaDB initialization can take up to two minutes. Make sure at least 512 MB of memory is available to the container.

Browser shows a certificate warning

Expected with the default self-signed certificate. Either accept the warning for testing, switch to Let's Encrypt with LETSENCRYPT_EMAIL, or generate a local CA with ./scripts/create-ssl-ca.sh ./ssl-ca and trust it on your machine.

P2P HTTPS fails between nodes

Self-signed certs are rejected on outbound P2P by default. For dev clusters set P2P_SSL_VERIFY=false; for production share a CA via P2P_CA_CERT or put the nodes behind a reverse proxy with valid certificates.

Slow startup on WSL2

Bump the Tor timeouts so Tor has time to bootstrap on a slower I/O path:

environment: - EIOU_HS_TIMEOUT=120 - EIOU_TOR_TIMEOUT=240

Reading logs inside the container

nginx errors live at /var/log/nginx/error.log, PHP errors at /var/log/php_errors.log, and Tor at /var/log/tor/log.

docker exec eiou-node tail -f /var/log/php_errors.log