If you want to run your own directory node, here's the basic setup:
Docker Compose Setup
services:
joinmarket-directory:
image: ghcr.io/joinmarket-webui/jam-standalone:v0.4.0-clientserver-v0.9.11
container_name: joinmarket-directory
volumes:
- /data/joinmarket-directory/:/joinmarket/
entrypoint: ""
command: >
bash -c "
service tor start &&
python3 /joinmarket/start-dn.py --datadir=/joinmarket/ '${MOTD}'
"
environment:
- JOINMARKET_DATADIR=/joinmarket
deploy:
resources:
limits:
cpus: 2
memory: 1G
restart: always
labels:
- "traefik.enable=false"
healthcheck:
test: ["CMD", "sh", "-c", "timeout 10 curl --socks5-hostname 127.0.0.1:9050 --connect-timeout 10 http://${HIDDEN_SERVICE_HOSTNAME}:5222 2>&1 | grep -q 'Empty reply from server'"]
interval: 30s
timeout: 15s
retries: 3
start_period: 60s
Environment Variables (.env)
MOTD=Your custom message here
# cat /joinmarket/tor_hidden_service/hostname after the first run
HIDDEN_SERVICE_HOSTNAME=your_onion_address.onion
Configuration (joinmarket.cfg)
Key settings for directory nodes:
[DAEMON]
no_daemon = 1
daemon_port = 27183
daemon_host = localhost
use_ssl = false
[BLOCKCHAIN]
blockchain_source = no-blockchain
network = mainnet
[MESSAGING:onion]
type = onion
socks5_host = tor
socks5_port = 9050
tor_control_host = tor
tor_control_port = 9051
onion_serving_host = 0.0.0.0
onion_serving_port = 5222
# CRITICAL: This enables directory node functionality
hidden_service_dir = /joinmarket/tor_hidden_service
directory_nodes = your_onion_address.onion:5222
[LOGGING]
console_log_level = INFO
color = true
Required Script
Download the directory node script:
wget https://raw.githubusercontent.com/JoinMarket-Org/custom-scripts/master/start-dn.py
Place it in your JoinMarket directory before starting the container.
Finding existing directory nodes
- GitHub issue: https://github.com/JoinMarket-Org/joinmarket-clientserver/issues/1445
- Telegram: https://t.me/joinmarketorg
Every additional directory node helps make JoinMarket more robust for everyone.