#!/bin/bash source ~/.bashrc # Configure Services on VMs # Sets up Cloudflare Tunnel, K3s, Git Server, and Observability set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" # Load environment variables if [ -f "$PROJECT_ROOT/.env" ]; then set -a source <(grep -v '^#' "$PROJECT_ROOT/.env" | grep -v '^$' | sed 's/#.*$//' | grep '=') set +a fi # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "\n${BLUE}=== $1 ===${NC}" } SSH_KEY="$HOME/.ssh/id_ed25519_proxmox" VM_USER="ubuntu" PROXMOX_HOST="${PROXMOX_ML110_IP:-192.168.1.206}" # Import helper library if [ -f "$PROJECT_ROOT/scripts/lib/proxmox_vm_helpers.sh" ]; then source "$PROJECT_ROOT/scripts/lib/proxmox_vm_helpers.sh" else log_error "Helper library not found. Run this script on Proxmox host or via SSH." exit 1 fi # VM definitions: vmid name (no IP - discovered via guest agent) VMS=( "100 cloudflare-tunnel" "101 k3s-master" "102 git-server" "103 observability" ) wait_for_vm() { local vmid=$1 local name=$2 local max_wait=300 local waited=0 log_info "Waiting for $name (VM $vmid) to be reachable..." # Ensure guest agent is enabled ensure_guest_agent_enabled "$vmid" || true while [ $waited -lt $max_wait ]; do local ip ip="$(get_vm_ip_from_guest_agent "$vmid" || true)" if [[ -n "$ip" ]]; then log_info "✓ $name is reachable at $ip" sleep 10 # Give it a bit more time for SSH if timeout 3 bash -c "cat < /dev/null > /dev/tcp/$ip/22" 2>/dev/null; then log_info "✓ SSH is available" return 0 fi fi sleep 5 waited=$((waited + 5)) echo -n "." done echo "" log_warn "$name (VM $vmid) not reachable after $max_wait seconds" return 1 } configure_cloudflare_tunnel() { local ip=$1 log_step "Configuring Cloudflare Tunnel on VM 100" log_info "Installing cloudflared..." ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$VM_USER@$ip" "sudo apt update && sudo apt install -y cloudflared" || { log_error "Failed to install cloudflared" return 1 } log_warn "Cloudflare Tunnel requires authentication - manual setup needed" log_info "See: docs/services/cloudflare-tunnel-setup.md" } configure_k3s() { local ip=$1 log_step "Configuring K3s on VM 101" log_info "Installing K3s..." ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$VM_USER@$ip" "curl -sfL https://get.k3s.io | sh -" || { log_error "Failed to install K3s" return 1 } log_info "Verifying K3s installation..." ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$VM_USER@$ip" "sudo kubectl get nodes" || { log_error "K3s not working properly" return 1 } log_info "✓ K3s installed and running" } configure_git_server() { local ip=$1 log_step "Configuring Git Server on VM 102" log_info "Installing Gitea..." ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$VM_USER@$ip" "sudo apt update && sudo apt install -y docker.io docker-compose" || { log_error "Failed to install Docker" return 1 } log_warn "Gitea setup requires manual configuration" log_info "See: docs/services/git-server-setup.md" } configure_observability() { local ip=$1 log_step "Configuring Observability Stack on VM 103" log_info "Installing Docker and Docker Compose..." ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "$VM_USER@$ip" "sudo apt update && sudo apt install -y docker.io docker-compose" || { log_error "Failed to install Docker" return 1 } log_warn "Observability stack requires manual configuration" log_info "See: docs/services/observability-setup.md" } main() { log_info "Configuring Services on VMs" echo "" if [ ! -f "$SSH_KEY" ]; then log_error "SSH key not found: $SSH_KEY" exit 1 fi # Wait for VMs to be accessible and get IPs declare -A VM_IPS for vm_spec in "${VMS[@]}"; do read -r vmid name <<< "$vm_spec" wait_for_vm "$vmid" "$name" # Get IP from guest agent local ip ip="$(get_vm_ip_or_warn "$vmid" "$name" || true)" if [[ -n "$ip" ]]; then VM_IPS["$vmid"]="$ip" else log_error "Cannot get IP for VM $vmid ($name), skipping" continue fi done # Configure services using discovered IPs if [[ -n "${VM_IPS[100]:-}" ]]; then configure_cloudflare_tunnel "${VM_IPS[100]}" fi if [[ -n "${VM_IPS[101]:-}" ]]; then configure_k3s "${VM_IPS[101]}" fi if [[ -n "${VM_IPS[102]:-}" ]]; then configure_git_server "${VM_IPS[102]}" fi if [[ -n "${VM_IPS[103]:-}" ]]; then configure_observability "${VM_IPS[103]}" fi log_step "Service Configuration Complete!" log_info "Some services require manual configuration (see docs/services/)" } main "$@"