#!/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 Keep existing configuration file (don't regenerate)" echo " --help, -h Show this help message" echo "" echo "Default behavior: Automatically regenerates configuration file on each build" echo " for development purposes" exit 0 fi # Handle configuration file regeneration CONFIG_FILE="$HOME/.config/c-relay/c_relay_config_event.json" if [ "$PRESERVE_CONFIG" = false ] && [ -f "$CONFIG_FILE" ]; then echo "Removing old configuration file to trigger regeneration..." rm -f "$CONFIG_FILE" echo "✓ Configuration file removed - will be regenerated with latest database values" elif [ "$PRESERVE_CONFIG" = true ] && [ -f "$CONFIG_FILE" ]; then echo "Preserving existing configuration file as requested" elif [ ! -f "$CONFIG_FILE" ]; then echo "No existing configuration file found - will generate new one" 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 # Initialize database if needed if [ ! -f "./db/c_nostr_relay.db" ]; then echo "Initializing database..." ./db/init.sh --force >/dev/null 2>&1 fi # 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 $BINARY_PATH > 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 a new private key was generated and display it sleep 1 # Give relay time to write initial logs if grep -q "GENERATED RELAY ADMIN PRIVATE KEY" relay.log 2>/dev/null; then echo "=== IMPORTANT: NEW ADMIN PRIVATE KEY GENERATED ===" echo "" # Extract and display the private key section from the log grep -A 8 -B 2 "GENERATED RELAY ADMIN PRIVATE KEY" relay.log | head -n 12 echo "" echo "⚠️ SAVE THIS PRIVATE KEY SECURELY - IT CONTROLS YOUR RELAY!" echo "⚠️ This key is also logged in relay.log for reference" echo "" fi echo "=== Relay server running in background ===" 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" 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 ""