#!/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_DATABASE=false HELP=false USE_TEST_KEYS=false while [[ $# -gt 0 ]]; do case $1 in --preserve-database|-p) PRESERVE_DATABASE=true shift ;; --test-keys|-t) USE_TEST_KEYS=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-database, -p Keep existing database files (don't delete for fresh start)" echo " --test-keys, -t Use deterministic test keys for development (admin: all 'a's, relay: all '1's)" echo " --help, -h Show this help message" echo "" echo "Event-Based Configuration:" echo " This relay now uses event-based configuration stored directly in the database." echo " On first startup, keys are automatically generated and printed once." echo " Database file: .db (created automatically)" echo "" echo "Examples:" echo " $0 # Fresh start with new keys (default)" echo " $0 -p # Preserve existing database and keys" echo " $0 -t # Use test keys for consistent development" echo " $0 -t -p # Use test keys and preserve database" echo "" echo "Default behavior: Deletes existing database files to start fresh with new keys" echo " for development purposes" exit 0 fi # Handle database file cleanup for fresh start if [ "$PRESERVE_DATABASE" = false ]; then if ls *.db >/dev/null 2>&1 || ls build/*.db >/dev/null 2>&1; then echo "Removing existing database files to trigger fresh key generation..." rm -f *.db build/*.db echo "✓ Database files removed - will generate new keys and database" else echo "No existing database found - will generate fresh setup" fi else echo "Preserving existing database files as requested" # Back up database files before clean build if ls build/*.db >/dev/null 2>&1; then echo "Backing up existing database files..." mkdir -p /tmp/relay_backup_$$ cp build/*.db* /tmp/relay_backup_$$/ 2>/dev/null || true echo "Database files backed up to temporary location" fi fi # Clean up legacy files that are no longer used rm -rf dev-config/ 2>/dev/null rm -f db/c_nostr_relay.db* 2>/dev/null # Build the project first echo "Building project..." make clean all # Restore database files if preserving if [ "$PRESERVE_DATABASE" = true ] && [ -d "/tmp/relay_backup_$$" ]; then echo "Restoring preserved database files..." cp /tmp/relay_backup_$$/*.db* build/ 2>/dev/null || true rm -rf /tmp/relay_backup_$$ echo "Database files restored to build directory" fi # 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 # with event-based configuration system 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')" # Change to build directory before starting relay so database files are created there cd build # Start relay in background and capture its PID if [ "$USE_TEST_KEYS" = true ]; then echo "Using deterministic test keys for development..." ./$(basename $BINARY_PATH) -a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -r 1111111111111111111111111111111111111111111111111111111111111111 > ../relay.log 2>&1 & else # No command line arguments needed for random key generation ./$(basename $BINARY_PATH) > ../relay.log 2>&1 & fi RELAY_PID=$! # Change back to original directory cd .. 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" # Wait for relay to fully initialize and detect the actual port it's using sleep 2 # Extract actual port from relay logs ACTUAL_PORT="" if [ -f relay.log ]; then # Look for the success message with actual port ACTUAL_PORT=$(grep "WebSocket relay started on ws://127.0.0.1:" relay.log 2>/dev/null | tail -1 | sed -n 's/.*ws:\/\/127\.0\.0\.1:\([0-9]*\).*/\1/p') # If we couldn't find the port in logs, try to detect from netstat if [ -z "$ACTUAL_PORT" ]; then ACTUAL_PORT=$(netstat -tln 2>/dev/null | grep -E ":888[0-9]" | head -1 | sed -n 's/.*:\([0-9]*\).*/\1/p') fi fi # Display the actual endpoint if [ -n "$ACTUAL_PORT" ]; then if [ "$ACTUAL_PORT" = "8888" ]; then echo "WebSocket endpoint: ws://127.0.0.1:$ACTUAL_PORT" else echo "WebSocket endpoint: ws://127.0.0.1:$ACTUAL_PORT (fell back from port 8888)" fi else echo "WebSocket endpoint: ws://127.0.0.1:8888 (port detection failed - check logs)" fi echo "HTTP endpoint: http://127.0.0.1:${ACTUAL_PORT:-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 "IMPORTANT: SAVE THIS ADMIN PRIVATE KEY SECURELY!" relay.log 2>/dev/null; then echo "=== IMPORTANT: NEW ADMIN PRIVATE KEY GENERATED ===" echo "" # Extract and display the admin private key section from the log grep -A 15 -B 2 "IMPORTANT: SAVE THIS ADMIN PRIVATE KEY SECURELY!" relay.log | head -n 20 echo "" echo "⚠️ SAVE THIS ADMIN PRIVATE KEY SECURELY - IT CONTROLS YOUR RELAY CONFIGURATION!" echo "⚠️ This key is needed to update configuration and is only displayed once" echo "⚠️ The relay and database information is also logged in relay.log for reference" echo "" fi echo "=== Event-Based Relay Server Running ===" echo "Configuration: Event-based (kind 33334 Nostr events)" echo "Database: Automatically created with relay pubkey naming" 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 (zero configuration needed)" 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 ""