mirror of
https://github.com/waku-org/nwaku-compose.git
synced 2025-02-16 17:26:37 +00:00
479 lines
15 KiB
Bash
479 lines
15 KiB
Bash
|
#!/usr/bin/env bash
|
|||
|
|
|||
|
# Colors and styling
|
|||
|
RED='\033[0;31m'
|
|||
|
GREEN='\033[0;32m'
|
|||
|
BLUE='\033[0;34m'
|
|||
|
YELLOW='\033[1;33m'
|
|||
|
NC='\033[0m' # No Color
|
|||
|
BOLD='\033[1m'
|
|||
|
|
|||
|
# Print banner
|
|||
|
print_banner() {
|
|||
|
echo -e "${BLUE}${BOLD}"
|
|||
|
echo '██╗ ██╗ █████╗ ██╗ ██╗██╗ ██╗ ███╗ ██╗ ██████╗ ██████╗ ███████╗ █████╗ ██████╗ ███████╗██████╗ █████╗ ████████╗ █████╗ ██████╗'
|
|||
|
echo '██║ ██║██╔══██╗██║ ██╔╝██║ ██║ ████╗ ██║██╔═══██╗██╔══██╗██╔════╝ ██╔══██╗██╔══██╗██╔════╝██╔══██╗██╔══██╗╚══██╔══╝██╔══██╗██╔══██╗'
|
|||
|
echo '██║ █╗ ██║███████║█████╔╝ ██║ ██║ ██╔██╗ ██║██║ ██║██║ ██║█████╗ ██║ ██║██████╔╝█████╗ ██████╔╝███████║ ██║ ██║ ██║██████╔╝'
|
|||
|
echo '██║███╗██║██╔══██║██╔═██╗ ██║ ██║ ██║╚██╗██║██║ ██║██║ ██║██╔══╝ ██║ ██║██╔═══╝ ██╔══╝ ██╔══██╗██╔══██║ ██║ ██║ ██║██╔══██╗'
|
|||
|
echo '╚███╔███╔╝██║ ██║██║ ██╗╚██████╔╝ ██║ ╚████║╚██████╔╝██████╔╝███████╗ ╚█████╔╝██║ ███████╗██║ ██║██║ ██║ ██║ ╚█████╔╝██║ ██║'
|
|||
|
echo ' ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚════╝ ╚═╝ ╚═╝'
|
|||
|
echo -e "${NC}"
|
|||
|
echo -e "${YELLOW}Your professional toolkit for operating Waku nodes${NC}"
|
|||
|
echo
|
|||
|
}
|
|||
|
|
|||
|
# Show spinner while running command
|
|||
|
spinner() {
|
|||
|
local pid=$1
|
|||
|
local delay=0.1
|
|||
|
local spinstr='|/-\'
|
|||
|
while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
|
|||
|
local temp=${spinstr#?}
|
|||
|
printf " [%c] " "$spinstr"
|
|||
|
local spinstr=$temp${spinstr%"$temp"}
|
|||
|
sleep $delay
|
|||
|
printf "\b\b\b\b\b\b"
|
|||
|
done
|
|||
|
printf " \b\b\b\b"
|
|||
|
}
|
|||
|
|
|||
|
# Interactive setup function
|
|||
|
setup() {
|
|||
|
clear
|
|||
|
echo -e "${BOLD}🚀 Starting Waku Node Setup${NC}\n"
|
|||
|
|
|||
|
# Check if .env already exists
|
|||
|
if [ -f .env ]; then
|
|||
|
read -p "💡 .env file already exists. Do you want to reconfigure? (y/N): " confirm
|
|||
|
if [[ $confirm != [yY] ]]; then
|
|||
|
echo -e "${YELLOW}Setup cancelled${NC}"
|
|||
|
return
|
|||
|
fi
|
|||
|
fi
|
|||
|
|
|||
|
# Copy .env.example to .env if it doesn't exist
|
|||
|
if [ ! -f .env ]; then
|
|||
|
cp .env.example .env
|
|||
|
if [ $? -ne 0 ]; then
|
|||
|
echo -e "${RED}Error: Could not find .env.example file${NC}"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
fi
|
|||
|
|
|||
|
# Get Sepolia RPC URL
|
|||
|
while true; do
|
|||
|
read -p "🌐 Enter your Sepolia RPC URL (e.g., https://sepolia.infura.io/v3/YOUR-KEY): " rpc_url
|
|||
|
if [[ $rpc_url == http* ]]; then
|
|||
|
sed -i.bak "s|RLN_RELAY_ETH_CLIENT_ADDRESS=.*|RLN_RELAY_ETH_CLIENT_ADDRESS=$rpc_url|" .env
|
|||
|
break
|
|||
|
else
|
|||
|
echo -e "${RED}Please enter a valid HTTP(S) URL${NC}"
|
|||
|
fi
|
|||
|
done
|
|||
|
|
|||
|
# Get Ethereum private key
|
|||
|
while true; do
|
|||
|
echo -e "\n🔑 Enter your Sepolia ETH private key:"
|
|||
|
echo -e "${YELLOW}Note: Input will be hidden for security${NC}"
|
|||
|
IFS= read -r eth_key
|
|||
|
|
|||
|
# Remove any 0x prefix if present
|
|||
|
eth_key="${eth_key#0x}"
|
|||
|
|
|||
|
# Validate the key
|
|||
|
if [[ ${#eth_key} == 64 && "$eth_key" =~ ^[0-9a-fA-F]+$ ]]; then
|
|||
|
sed -i.bak "s|ETH_TESTNET_KEY=.*|ETH_TESTNET_KEY=$eth_key|" .env
|
|||
|
break
|
|||
|
else
|
|||
|
echo -e "${RED}Error: Private key should be 64 hexadecimal characters (excluding any '0x' prefix)${NC}"
|
|||
|
echo -e "${YELLOW}Please try again...${NC}"
|
|||
|
fi
|
|||
|
done
|
|||
|
|
|||
|
# Get RLN password
|
|||
|
read -s -p "🔒 Create a password for your RLN membership: " rln_password
|
|||
|
echo
|
|||
|
sed -i.bak "s|RLN_RELAY_CRED_PASSWORD=.*|RLN_RELAY_CRED_PASSWORD=\"$rln_password\"|" .env
|
|||
|
|
|||
|
# Clean up backup file
|
|||
|
rm -f .env.bak
|
|||
|
|
|||
|
echo -e "\n${GREEN}✅ Configuration saved${NC}"
|
|||
|
|
|||
|
# Show configuration summary
|
|||
|
echo -e "\n${BOLD}Configuration Summary:${NC}"
|
|||
|
echo -e "RPC URL: $rpc_url"
|
|||
|
echo -e "Private Key: ****${eth_key: -4}"
|
|||
|
echo -e "RLN Password: ********"
|
|||
|
|
|||
|
# Confirm before proceeding
|
|||
|
read -p $'\n'"Ready to start the node? (Y/n): " start_confirm
|
|||
|
if [[ $start_confirm == [nN] ]]; then
|
|||
|
echo -e "${YELLOW}Setup completed. Run './waku-cli.sh start' when you're ready to start the node.${NC}"
|
|||
|
return
|
|||
|
fi
|
|||
|
|
|||
|
# Register RLN membership
|
|||
|
echo -e "\n📝 Registering RLN membership..."
|
|||
|
./register_rln.sh &
|
|||
|
spinner $!
|
|||
|
|
|||
|
# Start the node
|
|||
|
echo -e "\n🚀 Starting Waku node..."
|
|||
|
docker-compose up -d &
|
|||
|
spinner $!
|
|||
|
|
|||
|
echo -e "\n${GREEN}${BOLD}✨ Your Waku node is ready!${NC}"
|
|||
|
echo -e "📊 View metrics: http://localhost:3000"
|
|||
|
echo -e "💬 Chat interface: http://localhost:4000"
|
|||
|
echo -e "🔍 Check node health: ./waku-cli.sh status"
|
|||
|
}
|
|||
|
|
|||
|
# Interactive menu function
|
|||
|
show_interactive_menu() {
|
|||
|
while true; do
|
|||
|
clear
|
|||
|
print_banner
|
|||
|
|
|||
|
echo -e "${BOLD}📋 Main Menu${NC}\n"
|
|||
|
echo -e "1) 🚀 Quick Start (Setup & Run Node)"
|
|||
|
echo -e "2) 🔧 Node Management"
|
|||
|
echo -e "3) 📊 Monitoring & Logs"
|
|||
|
echo -e "4) 🛠️ Maintenance"
|
|||
|
echo -e "5) 📚 Help & Documentation"
|
|||
|
echo -e "6) 🔚 Exit"
|
|||
|
echo
|
|||
|
read -p "Please select an option [1-6]: " main_choice
|
|||
|
|
|||
|
case $main_choice in
|
|||
|
1) quick_start_menu ;;
|
|||
|
2) node_management_menu ;;
|
|||
|
3) monitoring_menu ;;
|
|||
|
4) maintenance_menu ;;
|
|||
|
5) help_menu ;;
|
|||
|
6)
|
|||
|
clear
|
|||
|
print_banner
|
|||
|
echo -e "${GREEN}✨ Thanks for using Waku Node Manager! Goodbye! ✨${NC}"
|
|||
|
exit 0
|
|||
|
;;
|
|||
|
*)
|
|||
|
echo -e "${RED}Invalid option${NC}"
|
|||
|
sleep 1
|
|||
|
;;
|
|||
|
esac
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
# Quick Start Menu
|
|||
|
quick_start_menu() {
|
|||
|
while true; do
|
|||
|
clear
|
|||
|
echo -e "${BOLD}🚀 Quick Start Guide${NC}\n"
|
|||
|
echo -e "1) 📝 First Time Setup (Configure & Register)"
|
|||
|
echo -e "2) 🚀 Start Node"
|
|||
|
echo -e "3) 🔙 Back to Main Menu"
|
|||
|
echo
|
|||
|
read -p "Please select an option [1-4]: " choice
|
|||
|
|
|||
|
case $choice in
|
|||
|
1)
|
|||
|
setup
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
2)
|
|||
|
echo -e "\n${BOLD}Starting Waku node...${NC}"
|
|||
|
docker-compose up -d
|
|||
|
echo -e "\n${GREEN}✅ Node started successfully!${NC}"
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
3) return ;;
|
|||
|
*)
|
|||
|
echo -e "${RED}Invalid option${NC}"
|
|||
|
sleep 1
|
|||
|
;;
|
|||
|
esac
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
# Node Management Menu
|
|||
|
node_management_menu() {
|
|||
|
while true; do
|
|||
|
clear
|
|||
|
echo -e "${BOLD}🔧 Node Management${NC}\n"
|
|||
|
echo -e "1) ▶️ Start Node"
|
|||
|
echo -e "2) ⏹️ Stop Node"
|
|||
|
echo -e "3) 🔄 Restart Node"
|
|||
|
echo -e "4) 🔍 Check Node Status"
|
|||
|
echo -e "5) 🆙 Update Node"
|
|||
|
echo -e "6) 🔙 Back to Main Menu"
|
|||
|
echo
|
|||
|
read -p "Please select an option [1-6]: " choice
|
|||
|
|
|||
|
case $choice in
|
|||
|
1)
|
|||
|
echo -e "\n${BOLD}Starting node...${NC}"
|
|||
|
docker-compose up -d
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
2)
|
|||
|
echo -e "\n${BOLD}Stopping node...${NC}"
|
|||
|
docker-compose down
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
3)
|
|||
|
echo -e "\n${BOLD}Restarting node...${NC}"
|
|||
|
docker-compose restart
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
4)
|
|||
|
status
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
5)
|
|||
|
update
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
6) return ;;
|
|||
|
esac
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
# Monitoring Menu
|
|||
|
monitoring_menu() {
|
|||
|
while true; do
|
|||
|
clear
|
|||
|
echo -e "${BOLD}📊 Monitoring & Logs${NC}\n"
|
|||
|
echo -e "1) 📜 View Node Logs"
|
|||
|
echo -e "2) 📈 Open Metrics Dashboard"
|
|||
|
echo -e "3) 💬 Open Chat Interface"
|
|||
|
echo -e "4) 📉 Show Node Statistics"
|
|||
|
echo -e "5) 🔙 Back to Main Menu"
|
|||
|
echo
|
|||
|
read -p "Please select an option [1-5]: " choice
|
|||
|
|
|||
|
case $choice in
|
|||
|
1)
|
|||
|
docker-compose logs --tail=100 -f
|
|||
|
;;
|
|||
|
2)
|
|||
|
echo -e "\n${BOLD}Opening metrics dashboard...${NC}"
|
|||
|
xdg-open http://localhost:3000 2>/dev/null || open http://localhost:3000 2>/dev/null || echo "Please open http://localhost:3000 in your browser"
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
3)
|
|||
|
echo -e "\n${BOLD}Opening chat interface...${NC}"
|
|||
|
xdg-open http://localhost:4000 2>/dev/null || open http://localhost:4000 2>/dev/null || echo "Please open http://localhost:4000 in your browser"
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
4)
|
|||
|
show_node_stats
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
5) return ;;
|
|||
|
esac
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
# Maintenance Menu
|
|||
|
maintenance_menu() {
|
|||
|
while true; do
|
|||
|
clear
|
|||
|
echo -e "${BOLD}🛠️ Maintenance${NC}\n"
|
|||
|
echo -e "1) 🧹 Clean Docker Artifacts"
|
|||
|
echo -e "2) 💾 Backup Configuration"
|
|||
|
echo -e "3) 📥 Restore Configuration"
|
|||
|
echo -e "4) 🔄 Reset Node"
|
|||
|
echo -e "5) 🔙 Back to Main Menu"
|
|||
|
echo
|
|||
|
read -p "Please select an option [1-5]: " choice
|
|||
|
|
|||
|
case $choice in
|
|||
|
1)
|
|||
|
cleanup
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
2)
|
|||
|
backup_config
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
3)
|
|||
|
restore_config
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
4)
|
|||
|
reset_node
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
5) return ;;
|
|||
|
esac
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
# Help Menu
|
|||
|
help_menu() {
|
|||
|
while true; do
|
|||
|
clear
|
|||
|
echo -e "${BOLD}📚 Help & Documentation${NC}\n"
|
|||
|
echo -e "1) 🚀 Show Quick Start Guide"
|
|||
|
echo -e "2) 🔧 Troubleshooting Guide"
|
|||
|
echo -e "3) 📖 View Documentation"
|
|||
|
echo -e "4) ℹ️ About"
|
|||
|
echo -e "5) 🔙 Back to Main Menu"
|
|||
|
echo
|
|||
|
read -p "Please select an option [1-5]: " choice
|
|||
|
|
|||
|
case $choice in
|
|||
|
1)
|
|||
|
show_quick_start_guide
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
2)
|
|||
|
show_troubleshooting
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
3)
|
|||
|
xdg-open "https://docs.waku.org" 2>/dev/null || open "https://docs.waku.org" 2>/dev/null || echo "Please visit https://docs.waku.org"
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
4)
|
|||
|
show_about
|
|||
|
press_enter
|
|||
|
;;
|
|||
|
5) return ;;
|
|||
|
esac
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
# Utility Functions
|
|||
|
press_enter() {
|
|||
|
echo
|
|||
|
read -p "Press Enter to continue..."
|
|||
|
}
|
|||
|
|
|||
|
status() {
|
|||
|
echo -e "${BOLD}🔍 Checking node status...${NC}\n"
|
|||
|
./chkhealth.sh
|
|||
|
}
|
|||
|
|
|||
|
update() {
|
|||
|
echo -e "${BOLD}🆙 Updating Waku node...${NC}\n"
|
|||
|
|
|||
|
echo "Stopping node..."
|
|||
|
docker-compose down
|
|||
|
|
|||
|
echo "Getting latest version..."
|
|||
|
git pull origin master
|
|||
|
|
|||
|
echo "Starting updated node..."
|
|||
|
docker-compose up -d
|
|||
|
|
|||
|
echo -e "\n${GREEN}✅ Node updated successfully!${NC}"
|
|||
|
}
|
|||
|
|
|||
|
cleanup() {
|
|||
|
echo -e "${YELLOW}⚠️ Warning: This will clean up all Docker artifacts not used by Waku${NC}"
|
|||
|
read -p "Are you sure you want to continue? (y/N): " confirm
|
|||
|
if [[ $confirm == [yY] ]]; then
|
|||
|
echo "Cleaning Docker system..."
|
|||
|
docker system prune -a
|
|||
|
docker image prune -a
|
|||
|
docker container prune
|
|||
|
docker volume prune
|
|||
|
echo -e "${GREEN}✅ Cleanup completed${NC}"
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
show_node_stats() {
|
|||
|
echo -e "${BOLD}📊 Node Statistics${NC}\n"
|
|||
|
echo "Memory Usage:"
|
|||
|
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
|
|||
|
echo -e "\nDisk Usage:"
|
|||
|
df -h | grep -E '^/dev/'
|
|||
|
}
|
|||
|
|
|||
|
backup_config() {
|
|||
|
backup_dir="backups/$(date +%Y%m%d_%H%M%S)"
|
|||
|
mkdir -p "$backup_dir"
|
|||
|
cp .env "$backup_dir/"
|
|||
|
echo -e "${GREEN}✅ Configuration backed up to $backup_dir${NC}"
|
|||
|
}
|
|||
|
|
|||
|
restore_config() {
|
|||
|
if [ ! -d "backups" ]; then
|
|||
|
echo -e "${RED}No backups found${NC}"
|
|||
|
return
|
|||
|
fi
|
|||
|
|
|||
|
echo "Available backups:"
|
|||
|
select backup in $(ls backups); do
|
|||
|
if [ -n "$backup" ]; then
|
|||
|
cp "backups/$backup/.env" .env
|
|||
|
echo -e "${GREEN}✅ Configuration restored from $backup${NC}"
|
|||
|
break
|
|||
|
fi
|
|||
|
done
|
|||
|
}
|
|||
|
|
|||
|
reset_node() {
|
|||
|
echo -e "${RED}⚠️ Warning: This will reset your node to default settings${NC}"
|
|||
|
read -p "Are you sure? (y/N): " confirm
|
|||
|
if [[ $confirm == [yY] ]]; then
|
|||
|
docker-compose down -v
|
|||
|
rm -f .env
|
|||
|
echo -e "${GREEN}✅ Node reset complete${NC}"
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
show_quick_start_guide() {
|
|||
|
echo -e "${BOLD}🚀 Quick Start Guide${NC}\n"
|
|||
|
echo "1. Ensure you have:"
|
|||
|
echo " - Docker and Docker Compose installed"
|
|||
|
echo " - A Sepolia RPC URL"
|
|||
|
echo " - Some Sepolia ETH for RLN registration"
|
|||
|
echo
|
|||
|
echo "2. Run the setup wizard from the main menu"
|
|||
|
echo "3. Follow the prompts to configure your node"
|
|||
|
echo "4. Monitor your node using the dashboard"
|
|||
|
}
|
|||
|
|
|||
|
show_troubleshooting() {
|
|||
|
echo -e "${BOLD}🔧 Troubleshooting Guide${NC}\n"
|
|||
|
echo "Common Issues:"
|
|||
|
echo
|
|||
|
echo "1. Node won't start:"
|
|||
|
echo " - Check Docker status"
|
|||
|
echo " - Verify .env configuration"
|
|||
|
echo " - Ensure ports aren't in use"
|
|||
|
echo
|
|||
|
echo "2. RLN registration fails:"
|
|||
|
echo " - Verify Sepolia RPC URL"
|
|||
|
echo " - Ensure sufficient Sepolia ETH"
|
|||
|
echo
|
|||
|
echo "3. Performance issues:"
|
|||
|
echo " - Check system resources"
|
|||
|
echo " - Monitor disk space"
|
|||
|
echo " - Review log files"
|
|||
|
}
|
|||
|
|
|||
|
show_about() {
|
|||
|
echo -e "${BOLD}ℹ️ About Waku Node Manager${NC}\n"
|
|||
|
echo "Version: 1.0.0"
|
|||
|
echo "A user-friendly interface for managing Waku nodes"
|
|||
|
echo
|
|||
|
echo "Resources:"
|
|||
|
echo "- 📚 Documentation: https://docs.waku.org"
|
|||
|
echo "- 🐙 GitHub: https://github.com/waku-org/nwaku"
|
|||
|
echo "- 💬 Community: https://discord.gg/waku"
|
|||
|
}
|
|||
|
|
|||
|
# Main command handler
|
|||
|
case "$1" in
|
|||
|
setup|status|update|cleanup|help)
|
|||
|
"$1"
|
|||
|
;;
|
|||
|
*)
|
|||
|
show_interactive_menu
|
|||
|
;;
|
|||
|
esac
|