Mirrors every chain
A holder keeps a full copy of every wallet’s chain and adds new blocks as the network confirms them, so the chains survive if any machine is lost.
Help keep OneEur safe by keeping a full copy of every chain on your own machine. One command, no open ports, and it catches up by itself.
A holder keeps a full copy of every wallet’s chain and adds new blocks as the network confirms them, so the chains survive if any machine is lost.
It checks each block’s signature and the ledger rules itself and refuses anything that does not fit. It does not confirm payments; the primary does.
It connects to wss://gateway.oneeur.com over an encrypted WebSocket. No open ports, so it works behind a home router.
a-z, 0-9, _ and -, unique in the network, for example your nickname and a number.Replace alice1 with your holder’s name:
docker run -d --name oneeur-holder --restart unless-stopped \
-e ONEEUR_HOLDER_NAME=alice1 \
-v oneeur-data:/data \
-p 127.0.0.1:4100:4100 \
maiduule/oneeur:latestOr with Docker Compose: save this as docker-compose.yml, set the name, then run docker compose up -d.
services:
holder:
image: maiduule/oneeur:latest
restart: unless-stopped
environment:
ONEEUR_HOLDER_NAME: change-me # 1-32 of a-z 0-9 _ -
# ONEEUR_STATUS_PASSWORD: pick-one # protect the status page
volumes:
- oneeur-data:/data # the holder's key and chains: keep it
ports:
- "127.0.0.1:4100:4100" # status page: http://127.0.0.1:4100
stop_grace_period: 30s
volumes:
oneeur-data:On first start the holder creates its own key and prints its name and public key. Read it with docker logs oneeur-holder (or docker compose logs holder):
To be let in, send this line to the network operator:
alice1=e73c9c2b10ff2fb8d5ca6e41396429cab605687e1a7963e579aed6d65edf2de2Send that line to the network operator. It holds only the public key; the secret key never leaves the /data volume.
Until the operator adds you, the holder retries every 30 seconds and its status page says “refused by the proxy”. You don’t need to do anything. Once added, it connects by itself, downloads every chain (a few minutes) and then keeps up.
The /data volume holds the holder’s key (its identity) and the chains. Without it, a new key is made and has to be added again.
Open it on the machine running the container. It shows whether the holder is online, catching up or offline, its blocks, wallets, disk use and blocks per minute, and its link to the network with the last connects and losses.
Publish the port only to 127.0.0.1 as above, or set ONEEUR_STATUS_PASSWORD to make the page ask for a password (user oneeur).
ONEEUR_HOLDER_NAMEONEEUR_PROXY_URLwss://gateway.oneeur.com/holder/socketONEEUR_STATUS_PASSWORDoneeur).Default: noneONEEUR_STATUS_PORT0 turns it off (and the health check then fails).Default: 4100docker pull maiduule/oneeur:latest
docker rm -f oneeur-holder
docker run ... # the same command as beforeThe key and chains stay in the volume. The restarted holder reads its chains in the background and catches up on what it missed.
The image holds no keys, secrets or chain data. It runs as an unprivileged user (oneeur, uid 10001) on Debian bookworm slim, and has a built-in health check on the status page.
Two blocks per payment, one primary that confirms, full copies on every holder.
Read moreEd25519 and SHA-256, a key that stays on your phone, and what is still to do.
Read moreThe OneEur wallet for iOS and Android: send, receive, scan and see your chain.
Read more