Files
next.orly.dev/scripts/tor-dev-setup.sh
woikos 25d087697e
Some checks failed
Go / build-and-release (push) Has been cancelled
Add Tor hidden service support and fallback relay profile fetching (v0.46.0)
- Add pkg/tor package for Tor hidden service integration
- Add Tor config options: ORLY_TOR_ENABLED, ORLY_TOR_PORT, ORLY_TOR_HS_DIR, ORLY_TOR_ONION_ADDRESS
- Extend NIP-11 relay info with addresses field for .onion URLs
- Add fallback relays (Damus, nos.lol, nostr.band, purplepag.es) for profile lookups
- Refactor profile fetching to try local relay first, then fallback relays
- Add Tor setup documentation and deployment scripts

Files modified:
- app/config/config.go: Add Tor configuration options
- app/handle-relayinfo.go: Add ExtendedRelayInfo with addresses field
- app/main.go: Initialize and manage Tor service lifecycle
- app/server.go: Add torService field to Server struct
- app/web/src/constants.js: Add FALLBACK_RELAYS
- app/web/src/nostr.js: Add fallback relay profile fetching
- pkg/tor/: New package for Tor hidden service management
- docs/TOR_SETUP.md: Documentation for Tor configuration
- deploy/orly-tor.service: Systemd service for Tor integration
- scripts/tor-*.sh: Setup scripts for Tor development and production

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 05:50:03 +01:00

218 lines
5.6 KiB
Bash
Executable File

#!/bin/bash
# tor-dev-setup.sh - Development Tor hidden service setup for ORLY relay
#
# This script sets up a user-space Tor hidden service for local development.
# No root privileges required (except for initial Tor installation).
#
# Usage: ./scripts/tor-dev-setup.sh [port]
# port: internal port ORLY listens on for Tor traffic (default: 3336)
#
# After running this script:
# 1. Start ORLY with: ORLY_TOR_ENABLED=true ORLY_TOR_HS_DIR=~/.tor/orly-dev ./orly
# 2. Connect via Tor Browser to the .onion address
set -e
# Configuration
TOR_PORT="${1:-3336}"
TOR_DATA_DIR="${HOME}/.tor/orly-dev"
TOR_CONFIG="${TOR_DATA_DIR}/torrc"
TOR_PID_FILE="${TOR_DATA_DIR}/tor.pid"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
debug() { echo -e "${BLUE}[DEBUG]${NC} $1"; }
# Check if Tor is installed
check_tor() {
if ! command -v tor &> /dev/null; then
error "Tor is not installed. Please install it first:
Debian/Ubuntu: sudo apt install tor
Arch: sudo pacman -S tor
macOS: brew install tor
Fedora: sudo dnf install tor"
fi
info "Tor is installed: $(tor --version | head -1)"
}
# Create directory structure
setup_dirs() {
info "Creating directory structure..."
mkdir -p "${TOR_DATA_DIR}"
mkdir -p "${TOR_DATA_DIR}/hidden_service"
chmod 700 "${TOR_DATA_DIR}"
chmod 700 "${TOR_DATA_DIR}/hidden_service"
info "Directory created: ${TOR_DATA_DIR}"
}
# Create Tor configuration
create_config() {
info "Creating Tor configuration..."
cat > "$TOR_CONFIG" << EOF
# ORLY Development Tor Configuration
# Generated by tor-dev-setup.sh on $(date)
# Data directory
DataDirectory ${TOR_DATA_DIR}/data
# Run in background
RunAsDaemon 1
PidFile ${TOR_PID_FILE}
# SOCKS proxy for outgoing connections (optional, for testing)
SocksPort 9150
# Hidden service for ORLY relay
HiddenServiceDir ${TOR_DATA_DIR}/hidden_service/
HiddenServicePort 80 127.0.0.1:${TOR_PORT}
# Logging
Log notice file ${TOR_DATA_DIR}/tor.log
EOF
chmod 600 "$TOR_CONFIG"
info "Configuration created: ${TOR_CONFIG}"
}
# Stop existing Tor instance
stop_tor() {
if [ -f "$TOR_PID_FILE" ]; then
PID=$(cat "$TOR_PID_FILE" 2>/dev/null)
if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then
info "Stopping existing Tor instance (PID: $PID)..."
kill "$PID" 2>/dev/null || true
sleep 2
fi
rm -f "$TOR_PID_FILE"
fi
}
# Start Tor
start_tor() {
info "Starting Tor..."
# Ensure data directory exists
mkdir -p "${TOR_DATA_DIR}/data"
# Start Tor with our config
tor -f "$TOR_CONFIG" 2>&1 | head -20 &
# Wait for Tor to bootstrap
info "Waiting for Tor to connect to the network..."
for i in {1..60}; do
if [ -f "${TOR_DATA_DIR}/hidden_service/hostname" ]; then
ONION_ADDR=$(cat "${TOR_DATA_DIR}/hidden_service/hostname")
if [ -n "$ONION_ADDR" ]; then
break
fi
fi
# Check if Tor is still running
if [ -f "$TOR_PID_FILE" ]; then
PID=$(cat "$TOR_PID_FILE")
if ! kill -0 "$PID" 2>/dev/null; then
error "Tor process died. Check ${TOR_DATA_DIR}/tor.log"
fi
fi
sleep 1
echo -n "."
done
echo ""
if [ -f "${TOR_DATA_DIR}/hidden_service/hostname" ]; then
ONION_ADDR=$(cat "${TOR_DATA_DIR}/hidden_service/hostname")
info "Tor started successfully"
echo ""
echo -e "${GREEN}======================================${NC}"
echo -e "${GREEN}Hidden Service Address:${NC}"
echo -e "${YELLOW}${ONION_ADDR}${NC}"
echo -e "${GREEN}======================================${NC}"
echo ""
else
warn "Tor started but hidden service not ready yet"
warn "Check: tail -f ${TOR_DATA_DIR}/tor.log"
fi
}
# Print usage instructions
print_instructions() {
echo ""
info "Development Tor setup complete!"
echo ""
echo " To start ORLY with Tor:"
echo -e " ${BLUE}ORLY_TOR_ENABLED=true ORLY_TOR_HS_DIR=${TOR_DATA_DIR}/hidden_service ./orly${NC}"
echo ""
echo " To view the .onion address:"
echo -e " ${BLUE}cat ${TOR_DATA_DIR}/hidden_service/hostname${NC}"
echo ""
echo " To view Tor logs:"
echo -e " ${BLUE}tail -f ${TOR_DATA_DIR}/tor.log${NC}"
echo ""
echo " To stop Tor:"
echo -e " ${BLUE}kill \$(cat ${TOR_PID_FILE})${NC}"
echo ""
echo " To restart Tor:"
echo -e " ${BLUE}./scripts/tor-dev-setup.sh${NC}"
echo ""
}
# Status command
status() {
if [ -f "$TOR_PID_FILE" ]; then
PID=$(cat "$TOR_PID_FILE")
if kill -0 "$PID" 2>/dev/null; then
info "Tor is running (PID: $PID)"
if [ -f "${TOR_DATA_DIR}/hidden_service/hostname" ]; then
ONION_ADDR=$(cat "${TOR_DATA_DIR}/hidden_service/hostname")
echo -e " Address: ${YELLOW}${ONION_ADDR}${NC}"
fi
return 0
fi
fi
warn "Tor is not running"
return 1
}
# Main
main() {
case "${1:-}" in
status)
status
exit $?
;;
stop)
stop_tor
info "Tor stopped"
exit 0
;;
*)
;;
esac
info "ORLY Development Tor Setup"
info "Internal port: ${TOR_PORT}"
echo ""
check_tor
setup_dirs
stop_tor
create_config
start_tor
print_instructions
}
main "$@"