Deploy a Relay Node
Deploy a Relay Node
Relays are optional — apps work fully offline. A relay is only needed for real-time sync between different devices. Anyone can run one; the relay sees only ciphertext and signed events.
There are three relays, one per app:
| Relay | Port | Storage | What it does |
|---|---|---|---|
| iwacu | 4100 | files | Store-and-forward for encrypted family-tree sync |
| abantu | 3002 | files | Event-log rooms for community sync |
| isoko | 4000 | Redis | DIDComm messages, public listings, DID inboxes, protocol registry |
This guide assumes a Linux server with Docker and Docker Compose installed. If not: docs.docker.com/engine/install.
Get the code
# iwacu relay
git clone https://codeberg.org/phuman/iwacu.git
cd iwacu
docker compose up -d
# abantu relay
git clone https://codeberg.org/phuman/abantu.git
cd abantu/relay
docker compose up -d
# isoko relay
git clone https://codeberg.org/phuman/isoko.git
cd isoko/relay
docker compose up -d --build
# iwacu relay
git clone http://<gitea-onion>/pat/iwacu-nuxt.git
cd iwacu-nuxt
docker compose up -d
# abantu relay
git clone http://<gitea-onion>/pat/abantu.git
cd abantu/relay
docker compose up -d
# isoko relay
git clone http://<gitea-onion>/pat/isoko.git
cd isoko/relay
docker compose up -d --build
Gitea onion: vzorzotnj2ouvs7vi3n5dkdnkjvklhoasvgferehl63tpy2ftfh34did.onion
Live relay addresses:
| Relay | HTTPS (default) | Onion (fallback, via Tor/Orbot) |
|---|---|---|
| iwacu | wss://iwacurelay.paramira.org | ws://xijxk4pfwi7fd66qhjgyd73qg4ebct3fis357fg62p5qarfxxd3pkqqd.onion |
| abantu | wss://abanturelay.paramira.org | ws://bbxczm7ift34qf3botz53ukls22u23aiu2cbp2nxgpoagar474gmafqd.onion |
| isoko | https://isokorelay.paramira.org | http://jojqesyyk76xkqtnb7w2hunj2ao5ns3g3ijw7gwq4gnlb2ckupimryad.onion |
The HTTPS hostnames are what the apps ship with as defaults. The onion addresses reach the same relays through Tor — switch to them in the app's relay settings if the clearnet domain is blocked where you are. Plain http/ws over onion is safe: the hidden-service protocol provides end-to-end encryption and authentication itself.
The isoko relay
The isoko relay differs from the other two: it ships as a three-service stack — the relay itself, a Redis instance for storage (listings, DID inboxes, protocol adoption), and a Tor sidecar that exposes the relay as a hidden service. docker compose up -d --build starts all three.
Two optional environment variables (set them in a .env file next to the compose file, or inline):
| Variable | Purpose |
|---|---|
RELAY_BASE_URL | The public URL clients see in invitation links (default https://isokorelay.paramira.org) |
OPERATOR_DID | Your DID — lets you claim the daily +50 Community Credits hosting bonus in the app |
OPERATOR_DID=did:iwacu:yourdid docker compose up -d --build
The isoko relay listens on port 4000 for both HTTP and WebSocket, bound to loopback only — the public entry points are a TLS reverse proxy (nginx/Caddy) in front of it and the Tor sidecar. The onion address (port 80 → relay) appears once Tor bootstraps:
docker exec isoko-relay-tor cat /var/lib/tor/isoko_relay/hostname
Verify it is up:
curl http://localhost:4000/api/relay/info
curl http://localhost:4000/api/protocols # lists the system protocols
Share the relay URL with your community — members paste it into Settings → Relay in isoko, and into Settings → isoko marketplace relay in abantu (so published community protocols and adoptions flow to the same place).
Check it is running
docker compose logs -f
The iwacu (port 4100) and abantu (port 3002) relays expose a WebSocket endpoint on loopback. You can verify with:
curl http://localhost:4100/health # iwacu
curl http://localhost:3002 # abantu
Expose via Tor hidden service (recommended)
For a censorship-resistant relay with no public IP or domain needed, see Configure Tor Hidden Service.
Once Tor is running, your relay's .onion address will be in:
cat /var/lib/tor/<service-dir>/hostname
Share that address with your community — paste it into the relay field in the app's settings.
Expose via HTTPS (alternative)
Put the relay behind Caddy or nginx with a domain and TLS certificate. Add the public URL to the relay settings in the app.
Logs and privacy
The relay logs no token content, no IP addresses, and no user identifiers. The only output is startup messages and WebSocket connection events (connected / disconnected).
docker compose logs -f # follow logs
docker compose down # stop
docker compose up -d # start
Update
git pull
docker compose build
docker compose up -d
Self-Hosting Overview
What it means to run your own relay server, why you might want to, and what is required.
Configure Tor Hidden Service
How to make your relay reachable only via a .onion address. Nobody sees the server's IP — not the user, not their ISP, not the platform they use to share the link.