#!/usr/bin/env bash set -e mkdir -p /root/.electrum/wallets # The allow-list may come from ALLOWED_USERS instead of a mounted file. Missing # is fine; a *directory* here means Docker auto-created one for a bind mount # that pointed at a non-existent path, which would silently lock everyone out. ALLOWED_FILE="${ALLOWED_USERS_FILE:-/app/allowed_users.txt}" if [ -d "$ALLOWED_FILE" ]; then echo "ERROR: $ALLOWED_FILE is a directory." echo "Create the file on the host before starting, or drop the bind mount" echo "and set ALLOWED_USERS=, in your .env instead." >&2 exit 1 fi if [ ! -f "$ALLOWED_FILE" ] && [ -z "${ALLOWED_USERS:-}" ]; then echo "WARNING: no allow-list found — set ALLOWED_USERS or mount $ALLOWED_FILE" >&2 fi echo "Starting Tor..." tor --RunAsDaemon 1 --SocksPort 9050 --DataDirectory /var/lib/tor echo "Waiting for Tor SOCKS proxy on 127.0.0.1:9050..." until echo > /dev/tcp/127.0.0.1/9050 2>/dev/null; do sleep 1 done echo "Tor is ready." echo "Starting Electrum daemon..." rm -f /root/.electrum/daemon PROXY="socks5:localhost:9050" # Everything the bot itself fetches must go through Tor too. Without these the # mempool.space fee check would open a direct clear-net connection and tie this # server's IP to its Bitcoin activity, defeating the point of Tor mode. export TOR_SOCKS="127.0.0.1:9050" export MEMPOOL_API_URL="${MEMPOOL_API_URL:-http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/api/v1/fees/recommended}" if [ -n "${ELECTRUM_SERVER:-}" ]; then # Pin to a single user-specified server (own node) electrum -1 -s "${ELECTRUM_SERVER}" -p "${PROXY}" daemon -d else # Route through Tor using a public .onion server electrum -s "${ELECTRUM_ONION_SERVER:-electrums3lojbuj.onion:50001:t}" -p "${PROXY}" daemon -d fi echo "Electrum daemon started. Launching bot..." exec /opt/electrum/bin/python3 /app/bot.py