Self-Hosting

Deploy a Relay Node

How to run an iwacu, abantu, or isoko relay with Docker Compose. Takes about 15 minutes on a fresh server.

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:

RelayPortStorageWhat it does
iwacu4100filesStore-and-forward for encrypted family-tree sync
abantu3002filesEvent-log rooms for community sync
isoko4000RedisDIDComm 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

Gitea onion: vzorzotnj2ouvs7vi3n5dkdnkjvklhoasvgferehl63tpy2ftfh34did.onion

Live relay addresses:

RelayHTTPS (default)Onion (fallback, via Tor/Orbot)
iwacuwss://iwacurelay.paramira.orgws://xijxk4pfwi7fd66qhjgyd73qg4ebct3fis357fg62p5qarfxxd3pkqqd.onion
abantuwss://abanturelay.paramira.orgws://bbxczm7ift34qf3botz53ukls22u23aiu2cbp2nxgpoagar474gmafqd.onion
isokohttps://isokorelay.paramira.orghttp://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):

VariablePurpose
RELAY_BASE_URLThe public URL clients see in invitation links (default https://isokorelay.paramira.org)
OPERATOR_DIDYour 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

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