196 lines
5.8 KiB
Bash
Executable File
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"
|