#!/bin/bash # Hive Platform Development Environment Setup # This script sets up a complete development environment for the Hive platform set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" MULGA_ROOT="$(cd "$PROJECT_ROOT/.." && pwd)" # Default configuration NATS_PORT=4222 PREDASTORE_PORT=8443 HIVE_GATEWAY_PORT=9999 DATA_DIR="$PROJECT_ROOT/data" CONFIG_DIR="$PROJECT_ROOT/config" echo "๐Ÿš€ Setting up Hive development environment..." echo "Project root: $PROJECT_ROOT" echo "Data directory: $DATA_DIR" # Create necessary directories mkdir -p "$DATA_DIR"/{nats,predastore,viperblock,logs} mkdir -p "$CONFIG_DIR" # Function to check if command exists command_exists() { command -v "$1" >/dev/null 2>&1 } # Function to check if port is available port_available() { ! nc -z localhost "$1" 2>/dev/null } # Check dependencies echo "๐Ÿ” Checking dependencies..." # Check for required commands required_commands=("go" "make" "nats-server") for cmd in "${required_commands[@]}"; do if command_exists "$cmd"; then echo "โœ… $cmd found" else echo "โŒ $cmd not found. Please install $cmd" case "$cmd" in "nats-server") echo " Install NATS: https://docs.nats.io/running-a-nats-service/introduction/installation" ;; "go") echo " Install Go: https://golang.org/dl/" ;; esac fi done # Check optional commands optional_commands=("air" "nbdkit") for cmd in "${optional_commands[@]}"; do if command_exists "$cmd"; then echo "โœ… $cmd found (optional)" else echo "โš ๏ธ $cmd not found (optional)" case "$cmd" in "air") echo " Install air for hot reloading: go install github.com/cosmtrek/air@latest" ;; "nbdkit") echo " Install nbdkit: sudo apt-get install nbdkit (Ubuntu/Debian)" ;; esac fi done # Check component repositories echo "" echo "๐Ÿ“ฆ Checking component repositories..." components=("viperblock" "predastore") for component in "${components[@]}"; do component_path="$MULGA_ROOT/$component" if [[ -d "$component_path" ]]; then echo "โœ… $component found at $component_path" if [[ -f "$component_path/go.mod" ]]; then echo " Go module verified" else echo " โš ๏ธ No go.mod found in $component" fi else echo "โŒ $component not found at $component_path" echo " Run: ./scripts/clone-deps.sh" fi done # Check port availability echo "" echo "๐Ÿ”Œ Checking port availability..." ports=("$NATS_PORT:NATS" "$PREDASTORE_PORT:Predastore" "$HIVE_GATEWAY_PORT:Hive Gateway") for port_info in "${ports[@]}"; do port="${port_info%:*}" service="${port_info#*:}" if port_available "$port"; then echo "โœ… Port $port available for $service" else echo "โš ๏ธ Port $port already in use (needed for $service)" fi done # Generate TLS certificates for development echo "" echo "๐Ÿ” Setting up TLS certificates..." if [[ ! -f "$CONFIG_DIR/server.pem" ]] || [[ ! -f "$CONFIG_DIR/server.key" ]]; then echo "๐Ÿ“‹ Generating self-signed certificate for development..." openssl req -x509 -newkey rsa:4096 -keyout "$CONFIG_DIR/server.key" -out "$CONFIG_DIR/server.pem" \ -days 365 -nodes -subj "/C=US/ST=Dev/L=Development/O=Hive/CN=localhost" \ -addext "subjectAltName=DNS:localhost,IP:127.0.0.1,IP:::1" echo "โœ… TLS certificates generated" else echo "โœ… TLS certificates already exist" fi # Create development configuration echo "" echo "โš™๏ธ Creating development configuration..." cat > "$CONFIG_DIR/dev.yaml" << EOF # Hive Development Configuration server: host: "0.0.0.0" port: $HIVE_GATEWAY_PORT tls: cert_file: "$CONFIG_DIR/server.pem" key_file: "$CONFIG_DIR/server.key" nats: host: "nats://localhost:$NATS_PORT" acl: token: "dev-token" services: predastore: host: "https://localhost:$PREDASTORE_PORT" access_key: "EXAMPLEKEY" secret_key: "EXAMPLEKEY" bucket: "predastore" region: "ap-southeast-2" viperblock: base_dir: "$DATA_DIR/viperblock" data: base_dir: "$DATA_DIR" logging: level: "info" format: "json" EOF echo "โœ… Development configuration created at $CONFIG_DIR/dev.yaml" # Create air configuration for hot reloading if command_exists "air"; then echo "" echo "๐Ÿ”ฅ Setting up air configuration for hot reloading..." cat > "$PROJECT_ROOT/.air.toml" << EOF # Air configuration for Hive development root = "." testdata_dir = "testdata" tmp_dir = "tmp" [build] args_bin = ["daemon", "--config", "config/dev.yaml"] bin = "./tmp/hive" cmd = "go build -o ./tmp/hive cmd/hive/main.go" delay = 1000 exclude_dir = ["assets", "tmp", "vendor", "testdata", "data", "nbdkit"] exclude_file = [] exclude_regex = ["_test.go"] exclude_unchanged = false follow_symlink = false full_bin = "" include_dir = [] include_ext = ["go", "tpl", "tmpl", "html"] kill_delay = "0s" log = "build-errors.log" send_interrupt = false stop_on_root = false [color] app = "" build = "yellow" main = "magenta" runner = "green" watcher = "cyan" [log] time = false [misc] clean_on_exit = false [screen] clear_on_rebuild = false EOF echo "โœ… Air configuration created" fi # Create startup script echo "" echo "๐Ÿ“ Creating startup scripts..." cat > "$PROJECT_ROOT/scripts/start-dev.sh" << 'EOF' #!/bin/bash # Start Hive development environment # This script starts all required services in the correct order set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" MULGA_ROOT="$(cd "$PROJECT_ROOT/.." && pwd)" echo "๐Ÿš€ Starting Hive development environment..." # Function to start service in background start_service() { local name="$1" local command="$2" local pidfile="$PROJECT_ROOT/data/logs/$name.pid" local logfile="$PROJECT_ROOT/data/logs/$name.log" echo "๐Ÿ“ก Starting $name..." nohup $command > "$logfile" 2>&1 & echo $! > "$pidfile" echo " PID: $(cat $pidfile), Log: $logfile" } # Create logs directory mkdir -p "$PROJECT_ROOT/data/logs" # Start services in dependency order echo "" echo "1๏ธโƒฃ Starting NATS server..." start_service "nats" "nats-server --port 4222 --auth dev-token" echo "" echo "2๏ธโƒฃ Starting Predastore..." cd "$MULGA_ROOT/predastore" start_service "predastore" "./bin/s3d --port 8443 --data-dir $PROJECT_ROOT/data/predastore" echo "" echo "3๏ธโƒฃ Starting NBDkit (if available)..." if command -v nbdkit >/dev/null; then start_service "nbdkit" "nbdkit --foreground --verbose memory 1G" else echo " โš ๏ธ NBDkit not available, skipping" fi echo "" echo "4๏ธโƒฃ Starting Hive Gateway..." cd "$PROJECT_ROOT" if command -v air >/dev/null; then echo " ๐Ÿ”ฅ Using air for hot reloading" air else echo " ๐Ÿ”จ Building and starting Hive" make build ./bin/hive daemon --config config/dev.yaml fi EOF chmod +x "$PROJECT_ROOT/scripts/start-dev.sh" # Create stop script cat > "$PROJECT_ROOT/scripts/stop-dev.sh" << 'EOF' #!/bin/bash # Stop Hive development environment SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" echo "๐Ÿ›‘ Stopping Hive development environment..." # Function to stop service stop_service() { local name="$1" local pidfile="$PROJECT_ROOT/data/logs/$name.pid" if [[ -f "$pidfile" ]]; then local pid=$(cat "$pidfile") if kill -0 "$pid" 2>/dev/null; then echo "๐Ÿ”ป Stopping $name (PID: $pid)..." kill "$pid" rm -f "$pidfile" else echo "โš ๏ธ $name process not found (PID: $pid)" rm -f "$pidfile" fi else echo "โš ๏ธ No PID file for $name" fi } # Stop services in reverse order stop_service "hive" stop_service "nbdkit" stop_service "predastore" stop_service "nats" echo "โœ… Development environment stopped" EOF chmod +x "$PROJECT_ROOT/scripts/stop-dev.sh" echo "โœ… Startup scripts created" # Build components echo "" echo "๐Ÿ”จ Building components..." # Build Viperblock if [[ -d "$MULGA_ROOT/viperblock" ]]; then echo "๐Ÿ“ฆ Building Viperblock..." cd "$MULGA_ROOT/viperblock" make build echo "โœ… Viperblock built successfully" else echo "โš ๏ธ Viperblock directory not found, skipping build" fi # Build Predastore if [[ -d "$MULGA_ROOT/predastore" ]]; then echo "๐Ÿ“ฆ Building Predastore..." cd "$MULGA_ROOT/predastore" make build echo "โœ… Predastore built successfully" else echo "โš ๏ธ Predastore directory not found, skipping build" fi # Build Hive echo "๐Ÿ“ฆ Building Hive..." cd "$PROJECT_ROOT" make build echo "โœ… Hive built successfully" echo "" echo "๐ŸŽ‰ Development environment setup complete!" echo "" echo "๐Ÿš€ To start the development environment:" echo " ./scripts/start-dev.sh" echo "" echo "๐Ÿ›‘ To stop the development environment:" echo " ./scripts/stop-dev.sh" echo "" echo "๐Ÿ”ง Development endpoints:" echo " - Hive Gateway: https://localhost:$HIVE_GATEWAY_PORT" echo " - Predastore S3: https://localhost:$PREDASTORE_PORT" echo " - NATS: nats://localhost:$NATS_PORT" echo "" echo "๐Ÿ“Š Monitor logs:" echo " tail -f data/logs/*.log" echo "" echo "๐Ÿงช Test with AWS CLI:" echo " aws --endpoint-url https://localhost:$HIVE_GATEWAY_PORT --no-verify-ssl ec2 describe-instances"