A complete blockchain implementation featuring: - synord: Full node with GHOSTDAG consensus - explorer-web: Modern React blockchain explorer with 3D DAG visualization - CLI wallet and tools - Smart contract SDK and example contracts (DEX, NFT, token) - WASM crypto library for browser/mobile
239 lines
6.3 KiB
Bash
Executable file
239 lines
6.3 KiB
Bash
Executable file
#!/bin/bash
|
|
# =============================================================================
|
|
# Synor Testnet Deployment Script
|
|
# =============================================================================
|
|
# Usage:
|
|
# ./scripts/testnet-deploy.sh [command]
|
|
#
|
|
# Commands:
|
|
# start - Start all testnet services
|
|
# stop - Stop all testnet services
|
|
# restart - Restart all testnet services
|
|
# logs - View logs from all services
|
|
# status - Check status of all services
|
|
# clean - Remove all data (WARNING: destructive)
|
|
# build - Build Docker images
|
|
# explorer - Start with block explorer
|
|
# =============================================================================
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
COMPOSE_FILE="$PROJECT_DIR/docker-compose.testnet.yml"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
print_banner() {
|
|
echo -e "${BLUE}"
|
|
cat << 'EOF'
|
|
███████╗██╗ ██╗███╗ ██╗ ██████╗ ██████╗
|
|
██╔════╝╚██╗ ██╔╝████╗ ██║██╔═══██╗██╔══██╗
|
|
███████╗ ╚████╔╝ ██╔██╗ ██║██║ ██║██████╔╝
|
|
╚════██║ ╚██╔╝ ██║╚██╗██║██║ ██║██╔══██╗
|
|
███████║ ██║ ██║ ╚████║╚██████╔╝██║ ██║
|
|
╚══════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝
|
|
TESTNET DEPLOYMENT
|
|
EOF
|
|
echo -e "${NC}"
|
|
}
|
|
|
|
check_docker() {
|
|
if ! command -v docker &> /dev/null; then
|
|
log_error "Docker is not installed. Please install Docker first."
|
|
exit 1
|
|
fi
|
|
|
|
if ! docker info &> /dev/null; then
|
|
log_error "Docker daemon is not running. Please start Docker."
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
|
|
log_error "Docker Compose is not installed. Please install Docker Compose."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Determine docker compose command
|
|
get_compose_cmd() {
|
|
if docker compose version &> /dev/null 2>&1; then
|
|
echo "docker compose"
|
|
else
|
|
echo "docker-compose"
|
|
fi
|
|
}
|
|
|
|
cmd_build() {
|
|
log_info "Building Docker images..."
|
|
$(get_compose_cmd) -f "$COMPOSE_FILE" build
|
|
log_success "Build complete!"
|
|
}
|
|
|
|
cmd_start() {
|
|
log_info "Starting Synor testnet..."
|
|
$(get_compose_cmd) -f "$COMPOSE_FILE" up -d seed1 seed2 seed3 faucet
|
|
|
|
log_info "Waiting for services to start..."
|
|
sleep 10
|
|
|
|
log_success "Testnet started!"
|
|
echo ""
|
|
log_info "Services:"
|
|
echo " - Seed Node 1: http://localhost:17110 (RPC)"
|
|
echo " - Seed Node 2: http://localhost:17120 (RPC)"
|
|
echo " - Seed Node 3: http://localhost:17130 (RPC)"
|
|
echo " - Faucet: http://localhost:8080"
|
|
echo ""
|
|
log_info "To view logs: $0 logs"
|
|
}
|
|
|
|
cmd_start_explorer() {
|
|
log_info "Starting Synor testnet with block explorer..."
|
|
$(get_compose_cmd) -f "$COMPOSE_FILE" --profile explorer up -d
|
|
|
|
log_info "Waiting for services to start..."
|
|
sleep 15
|
|
|
|
log_success "Testnet with explorer started!"
|
|
echo ""
|
|
log_info "Services:"
|
|
echo " - Seed Node 1: http://localhost:17110 (RPC)"
|
|
echo " - Seed Node 2: http://localhost:17120 (RPC)"
|
|
echo " - Seed Node 3: http://localhost:17130 (RPC)"
|
|
echo " - Faucet: http://localhost:8080"
|
|
echo " - Explorer API: http://localhost:3000"
|
|
echo ""
|
|
}
|
|
|
|
cmd_stop() {
|
|
log_info "Stopping Synor testnet..."
|
|
$(get_compose_cmd) -f "$COMPOSE_FILE" --profile explorer down
|
|
log_success "Testnet stopped!"
|
|
}
|
|
|
|
cmd_restart() {
|
|
cmd_stop
|
|
sleep 2
|
|
cmd_start
|
|
}
|
|
|
|
cmd_logs() {
|
|
$(get_compose_cmd) -f "$COMPOSE_FILE" logs -f "$@"
|
|
}
|
|
|
|
cmd_status() {
|
|
log_info "Testnet Status:"
|
|
echo ""
|
|
$(get_compose_cmd) -f "$COMPOSE_FILE" ps
|
|
echo ""
|
|
|
|
# Check RPC endpoints
|
|
log_info "Checking RPC endpoints..."
|
|
for port in 17110 17120 17130; do
|
|
if curl -s "http://localhost:$port/health" > /dev/null 2>&1; then
|
|
echo -e " Port $port: ${GREEN}HEALTHY${NC}"
|
|
else
|
|
echo -e " Port $port: ${RED}UNAVAILABLE${NC}"
|
|
fi
|
|
done
|
|
|
|
# Check faucet
|
|
if curl -s "http://localhost:8080/health" > /dev/null 2>&1; then
|
|
echo -e " Faucet: ${GREEN}HEALTHY${NC}"
|
|
else
|
|
echo -e " Faucet: ${RED}UNAVAILABLE${NC}"
|
|
fi
|
|
}
|
|
|
|
cmd_clean() {
|
|
log_warn "This will remove all testnet data!"
|
|
read -p "Are you sure? (y/N) " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
log_info "Stopping services..."
|
|
$(get_compose_cmd) -f "$COMPOSE_FILE" --profile explorer down -v
|
|
log_success "All data removed!"
|
|
else
|
|
log_info "Cancelled."
|
|
fi
|
|
}
|
|
|
|
cmd_help() {
|
|
echo "Synor Testnet Deployment Script"
|
|
echo ""
|
|
echo "Usage: $0 [command]"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " start Start all testnet services"
|
|
echo " stop Stop all testnet services"
|
|
echo " restart Restart all testnet services"
|
|
echo " logs View logs from all services"
|
|
echo " status Check status of all services"
|
|
echo " clean Remove all data (WARNING: destructive)"
|
|
echo " build Build Docker images"
|
|
echo " explorer Start with block explorer"
|
|
echo " help Show this help message"
|
|
echo ""
|
|
}
|
|
|
|
# Main
|
|
print_banner
|
|
check_docker
|
|
|
|
case "${1:-help}" in
|
|
start)
|
|
cmd_start
|
|
;;
|
|
stop)
|
|
cmd_stop
|
|
;;
|
|
restart)
|
|
cmd_restart
|
|
;;
|
|
logs)
|
|
shift
|
|
cmd_logs "$@"
|
|
;;
|
|
status)
|
|
cmd_status
|
|
;;
|
|
clean)
|
|
cmd_clean
|
|
;;
|
|
build)
|
|
cmd_build
|
|
;;
|
|
explorer)
|
|
cmd_start_explorer
|
|
;;
|
|
help|--help|-h)
|
|
cmd_help
|
|
;;
|
|
*)
|
|
log_error "Unknown command: $1"
|
|
cmd_help
|
|
exit 1
|
|
;;
|
|
esac
|