Files
2026-03-02 12:14:09 -08:00

196 lines
5.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Deploy Token Aggregation Service to Proxmox VM
# This script creates an LXC container and deploys the service with control panel
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
SERVICE_DIR="$PROJECT_ROOT/smom-dbis-138/services/token-aggregation"
# Load common functions if available
if [[ -f "$PROJECT_ROOT/smom-dbis-138-proxmox/lib/common.sh" ]]; then
source "$PROJECT_ROOT/smom-dbis-138-proxmox/lib/common.sh"
fi
# Configuration
VMID="${VMID:-3600}"
HOSTNAME="${HOSTNAME:-token-aggregation}"
MEMORY="${MEMORY:-4096}"
CORES="${CORES:-2}"
DISK="${DISK:-40}"
IP_ADDRESS="${IP_ADDRESS:-}"
log_info "Deploying Token Aggregation Service to Proxmox VMID: $VMID"
# Check if running on Proxmox host
if ! command_exists pct 2>/dev/null; then
log_error "This script must be run on Proxmox host (pct command not found)"
exit 1
fi
# Check if container exists
if pct list | grep -q "^\s*$VMID\s"; then
log_warn "Container $VMID already exists"
read -p "Do you want to recreate it? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
log_info "Stopping and destroying existing container..."
pct stop $VMID 2>/dev/null || true
pct destroy $VMID || true
else
log_info "Using existing container $VMID"
pct start $VMID 2>/dev/null || true
exit 0
fi
fi
# Create container
log_info "Creating LXC container $VMID..."
OS_TEMPLATE="${CONTAINER_OS_TEMPLATE:-local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst}"
if [[ -n "$IP_ADDRESS" ]]; then
NETWORK_CONFIG="bridge=vmbr0,name=eth0,ip=$IP_ADDRESS/24,gw=192.168.11.1"
else
NETWORK_CONFIG="bridge=vmbr0,name=eth0,ip=dhcp"
fi
pct create "$VMID" \
"$OS_TEMPLATE" \
--storage local-lvm \
--hostname "$HOSTNAME" \
--memory "$MEMORY" \
--cores "$CORES" \
--rootfs local-lvm:"$DISK" \
--net0 "$NETWORK_CONFIG" \
--unprivileged 1 \
--swap 1024 \
--onboot 1 \
--features nesting=1,keyctl=1
log_success "Container $VMID created"
# Start container
log_info "Starting container..."
pct start "$VMID"
sleep 5
# Wait for container to be ready
log_info "Waiting for container to be ready..."
for i in {1..30}; do
if pct exec "$VMID" -- test -f /etc/os-release 2>/dev/null; then
break
fi
sleep 2
done
# Update container
log_info "Updating container..."
pct exec "$VMID" -- bash -c "export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get upgrade -y"
# Install dependencies
log_info "Installing dependencies..."
pct exec "$VMID" -- bash -c "export DEBIAN_FRONTEND=noninteractive && apt-get install -y curl wget git build-essential postgresql-client"
# Install Node.js 20
log_info "Installing Node.js 20..."
pct exec "$VMID" -- bash -c "curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs"
# Install nginx for frontend
log_info "Installing nginx..."
pct exec "$VMID" -- bash -c "export DEBIAN_FRONTEND=noninteractive && apt-get install -y nginx"
# Create service user
log_info "Creating service user..."
pct exec "$VMID" -- bash -c "useradd -m -s /bin/bash token-aggregation || true"
# Create service directory
log_info "Setting up service directory..."
pct exec "$VMID" -- bash -c "mkdir -p /opt/token-aggregation && chown token-aggregation:token-aggregation /opt/token-aggregation"
# Copy service files
log_info "Copying service files..."
pct push "$VMID" "$SERVICE_DIR" /opt/token-aggregation --recursive
# Install service dependencies
log_info "Installing service dependencies..."
pct exec "$VMID" -- bash -c "cd /opt/token-aggregation && npm install"
# Build service
log_info "Building service..."
pct exec "$VMID" -- bash -c "cd /opt/token-aggregation && npm run build"
# Build frontend
log_info "Building frontend..."
pct exec "$VMID" -- bash -c "cd /opt/token-aggregation/frontend && npm install && npm run build"
# Create systemd service
log_info "Creating systemd service..."
pct exec "$VMID" -- bash -c "cat > /etc/systemd/system/token-aggregation.service << 'EOF'
[Unit]
Description=Token Aggregation Service
After=network.target
[Service]
Type=simple
User=token-aggregation
WorkingDirectory=/opt/token-aggregation
Environment=NODE_ENV=production
ExecStart=/usr/bin/node /opt/token-aggregation/dist/index.js
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
"
# Configure nginx for frontend
log_info "Configuring nginx..."
pct exec "$VMID" -- bash -c "cat > /etc/nginx/sites-available/token-aggregation << 'EOF'
server {
listen 80;
server_name _;
# Frontend
location / {
root /opt/token-aggregation/frontend/dist;
try_files \$uri \$uri/ /index.html;
}
# API proxy
location /api {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host \$host;
proxy_cache_bypass \$http_upgrade;
}
}
EOF
"
pct exec "$VMID" -- bash -c "ln -sf /etc/nginx/sites-available/token-aggregation /etc/nginx/sites-enabled/ && rm -f /etc/nginx/sites-enabled/default"
# Enable and start services
log_info "Enabling services..."
pct exec "$VMID" -- systemctl daemon-reload
pct exec "$VMID" -- systemctl enable token-aggregation
pct exec "$VMID" -- systemctl enable nginx
pct exec "$VMID" -- systemctl restart nginx
# Get container IP
CONTAINER_IP=$(pct exec "$VMID" -- hostname -I | awk '{print $1}')
log_success "Container IP: $CONTAINER_IP"
log_info "Deployment complete!"
log_info "Service will be available at: http://$CONTAINER_IP"
log_info "Control Panel: http://$CONTAINER_IP"
log_info ""
log_info "Next steps:"
log_info "1. Configure .env file in /opt/token-aggregation"
log_info "2. Run database migration"
log_info "3. Start service: systemctl start token-aggregation"
log_info "4. Create admin user via API or database"