Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Run a public DarkIRC node

A public node accepts inbound P2P connections and advertises a reachable address. A clearnet address exposes the node’s IP or hostname to peers. Use the Tor guide if that is not acceptable.

First follow the normal-node or archive-node guide. Stop DarkIRC before editing ~/.config/darkfi/darkirc_config.toml.

Clearnet tcp+tls

This example listens on the conventional DarkIRC P2P port. Replace the advertised hostname, open TCP port 9600 in the firewall, and configure router port forwarding if necessary.

[net]
active_profiles = ["tcp+tls"]
outbound_connections = 8
inbound_connections = 64

[net.profiles."tcp+tls"]
seeds = ["tcp+tls://lilith0.dark.fi:9600", "tcp+tls://lilith1.dark.fi:9600"]
inbound = ["tcp+tls://0.0.0.0:9600", "tcp+tls://[::]:9600"]
external_addrs = ["tcp+tls://chat.example:9600"]

Remove the IPv6 listener if the host has no working IPv6 route. An external_addrs value must resolve to this host and be reachable from outside its LAN. Do not advertise 0.0.0.0, [::], loopback, or a private address.

The complete clearnet example is bin/darkirc/config/darkirc-clearnet.toml.

Multi-transport bridge

A bridge can accept both clearnet and Tor connections. Each inbound transport needs a reachable external address:

[net]
active_profiles = ["tcp+tls", "tor"]
outbound_connections = 8
inbound_connections = 64

[net.profiles."tcp+tls"]
seeds = ["tcp+tls://lilith0.dark.fi:9600", "tcp+tls://lilith1.dark.fi:9600"]
inbound = ["tcp+tls://0.0.0.0:9600"]
external_addrs = ["tcp+tls://chat.example:9600"]

[net.profiles."tor"]
seeds = [
    "tor://g7fxelebievvpr27w7gt24lflptpw3jeeuvafovgliq5utdst6xyruyd.onion:9600",
    "tor://yvklzjnfmwxhyodhrkpomawjcdvcaushsj6torjz2gyd7e25f3gfunyd.onion:9600",
]
inbound = ["tor://127.0.0.1:9601"]

The tor:// inbound form asks the built-in Arti transport to create an ephemeral onion service. Its onion address changes when the service is recreated and does not need a manual external_addrs entry. For a stable onion address, use the static Tor setup.

Set mixed_profiles only when deliberately routing one endpoint scheme through another active transport. It is not required merely to enable two profiles.

UPnP IGD

UPnP can request a router port mapping and discover the external address. It increases trust in the local router and must be enabled at compile time. Build with all features:

% cargo build --release --all-features --package darkirc --bin darkirc

This writes target/release/darkirc; run or install that binary so the feature-enabled build is the one actually used.

Then add the query to a clearnet listener:

[net.profiles."tcp+tls"]
inbound = ["tcp+tls://0.0.0.0:9600?upnp_igd=true"]

Optional URL parameters include upnp_igd_lease_duration, upnp_igd_timeout, upnp_igd_description, and upnp_igd_ext_addr_refresh. Verify the mapping from another network; a log message or local router entry alone does not prove reachability.

Verify the node

Restart DarkIRC, wait for Event Graph sync, and inspect sessions with dnet after enabling p2p.get_info as described in the dnet guide. Test every advertised URL from a separate network using the ping utility. An archive is useful to peers only while it remains reachable and retains complete message bodies (fast_mode = false).