#!/bin/bash # C-Relay Build and Restart Script # Builds the project first, then stops any running relay and starts a new one in the background echo "=== C Nostr Relay Build and Restart Script ===" # Parse command line arguments PRESERVE_CONFIG=false HELP=false while [[ $# -gt 0 ]]; do case $1 in --preserve-config|-p) PRESERVE_CONFIG=true shift ;; --help|-h) HELP=true shift ;; *) echo "Unknown option: $1" HELP=true shift ;; esac done # Show help if [ "$HELP" = true ]; then echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " --preserve-config, -p Keep existing configuration file (don't regenerate)" echo " --help, -h Show this help message" echo "" echo "Development Setup:" echo " Uses local config directory: ./dev-config/" echo " This avoids conflicts with production instances using ~/.config/c-relay/" echo "" echo "Default behavior: Automatically regenerates configuration file on each build" echo " for development purposes" exit 0 fi # Handle configuration file and database regeneration # Use local development config directory to avoid conflicts with production DEV_CONFIG_DIR="./dev-config" CONFIG_FILE="$DEV_CONFIG_DIR/c_relay_config_event.json" DB_FILE="./db/c_nostr_relay.db" # Create development config directory if it doesn't exist mkdir -p "$DEV_CONFIG_DIR" if [ "$PRESERVE_CONFIG" = false ]; then if [ -f "$CONFIG_FILE" ]; then echo "Removing old development configuration file to trigger regeneration..." rm -f "$CONFIG_FILE" echo "✓ Development configuration file removed - will be regenerated with new keys" fi if [ -f "$DB_FILE" ]; then echo "Removing old database to trigger fresh key generation..." rm -f "$DB_FILE"* # Remove db file and any WAL/SHM files echo "✓ Database removed - will be recreated with embedded schema and new keys" fi elif [ "$PRESERVE_CONFIG" = true ]; then echo "Preserving existing development configuration and database as requested" else echo "No existing development configuration or database found - will generate fresh setup" fi # Build the project first echo "Building project..." make clean all # Check if build was successful if [ $? -ne 0 ]; then echo "ERROR: Build failed. Cannot restart relay." exit 1 fi # Check if relay binary exists after build - detect architecture ARCH=$(uname -m) case "$ARCH" in x86_64) BINARY_PATH="./build/c_relay_x86" ;; aarch64|arm64) BINARY_PATH="./build/c_relay_arm64" ;; *) BINARY_PATH="./build/c_relay_$ARCH" ;; esac if [ ! -f "$BINARY_PATH" ]; then echo "ERROR: Relay binary not found at $BINARY_PATH after build. Build may have failed." exit 1 fi echo "Build successful. Proceeding with relay restart..." # Kill existing relay if running echo "Stopping any existing relay servers..." pkill -f "c_relay_" 2>/dev/null sleep 2 # Give time for shutdown # Check if port is still bound if lsof -i :8888 >/dev/null 2>&1; then echo "Port 8888 still in use, force killing..." fuser -k 8888/tcp 2>/dev/null || echo "No process on port 8888" fi # Get any remaining processes REMAINING_PIDS=$(pgrep -f "c_relay_" || echo "") if [ -n "$REMAINING_PIDS" ]; then echo "Force killing remaining processes: $REMAINING_PIDS" kill -9 $REMAINING_PIDS 2>/dev/null sleep 1 else echo "No existing relay found" fi # Clean up PID file rm -f relay.pid # Database initialization is now handled automatically by the relay # when it starts up with embedded schema echo "Database will be initialized automatically on startup if needed" # Start relay in background with output redirection echo "Starting relay server..." echo "Debug: Current processes: $(ps aux | grep 'c_relay_' | grep -v grep || echo 'None')" # Start relay in background and capture its PID with development config directory $BINARY_PATH --config-dir "$DEV_CONFIG_DIR" > relay.log 2>&1 & RELAY_PID=$! echo "Started with PID: $RELAY_PID" # Check if server is still running after short delay sleep 3 # Check if process is still alive if ps -p "$RELAY_PID" >/dev/null 2>&1; then echo "Relay started successfully!" echo "PID: $RELAY_PID" echo "WebSocket endpoint: ws://127.0.0.1:8888" echo "Log file: relay.log" echo "" # Save PID for debugging echo $RELAY_PID > relay.pid # Check if new keys were generated and display them sleep 1 # Give relay time to write initial logs if grep -q "GENERATED RELAY KEYPAIRS" relay.log 2>/dev/null; then echo "=== IMPORTANT: NEW KEYPAIRS GENERATED ===" echo "" # Extract and display the keypairs section from the log grep -A 12 -B 2 "GENERATED RELAY KEYPAIRS" relay.log | head -n 16 echo "" echo "⚠️ SAVE THESE PRIVATE KEYS SECURELY - THEY CONTROL YOUR RELAY!" echo "⚠️ These keys are also logged in relay.log for reference" echo "" fi echo "=== Relay server running in background ===" echo "Development config: $DEV_CONFIG_DIR/" echo "To kill relay: pkill -f 'c_relay_'" echo "To check status: ps aux | grep c_relay_" echo "To view logs: tail -f relay.log" echo "Binary: $BINARY_PATH --config-dir $DEV_CONFIG_DIR" echo "Ready for Nostr client connections!" else echo "ERROR: Relay failed to start" echo "Debug: Check relay.log for error details:" echo "--- Last 10 lines of relay.log ---" tail -n 10 relay.log 2>/dev/null || echo "No log file found" echo "--- End log ---" exit 1 fi echo ""