Some checks failed
Test / test (push) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
201 lines
5.3 KiB
Bash
Executable File
201 lines
5.3 KiB
Bash
Executable File
#!/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 "$@"
|
|
|