#!/usr/bin/env bash # Deploy Backend API Container on Proxmox VE set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CONFIG_FILE="$SCRIPT_DIR/config/dapp.conf" # Load configuration if [[ -f "$CONFIG_FILE" ]]; then source "$CONFIG_FILE" fi # Default values VMID="${VMID_BACKEND:-3001}" HOSTNAME="${HOSTNAME:-solace-backend}" IP_ADDRESS="${BACKEND_IP:-192.168.11.61}" MEMORY="${BACKEND_MEMORY:-2048}" CORES="${BACKEND_CORES:-2}" DISK="${BACKEND_DISK:-20}" # Application configuration BACKEND_PORT="${BACKEND_PORT:-3001}" PROJECT_ROOT="${PROJECT_ROOT:-/home/intlc/projects/solace-bg-dubai}" echo "==========================================" echo "Deploying Backend API Container" echo "==========================================" echo "VMID: $VMID" echo "Hostname: $HOSTNAME" echo "IP: $IP_ADDRESS" echo "Memory: ${MEMORY}MB" echo "Cores: $CORES" echo "Disk: ${DISK}GB" echo "" # Check if running on Proxmox host if ! command -v pct &> /dev/null; then echo "ERROR: This script must be run on Proxmox host (pct command not found)" exit 1 fi # Check if container already exists if pct list | grep -q "^\s*$VMID\s"; then echo "Container $VMID already exists. Skipping creation." echo "To recreate, delete the container first: pct destroy $VMID" else echo "Creating container $VMID..." pct create "$VMID" \ "${CONTAINER_OS_TEMPLATE:-local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst}" \ --storage "${PROXMOX_STORAGE:-local-lvm}" \ --hostname "$HOSTNAME" \ --memory "$MEMORY" \ --cores "$CORES" \ --rootfs "${PROXMOX_STORAGE:-local-lvm}:${DISK}" \ --net0 "bridge=${PROXMOX_BRIDGE:-vmbr0},name=eth0,ip=${IP_ADDRESS}/24,gw=${GATEWAY:-192.168.11.1},type=veth" \ --unprivileged "${CONTAINER_UNPRIVILEGED:-1}" \ --swap "${CONTAINER_SWAP:-512}" \ --onboot "${CONTAINER_ONBOOT:-1}" \ --timezone "${CONTAINER_TIMEZONE:-UTC}" \ --features nesting=1,keyctl=1 echo "Container $VMID created successfully" fi # Start container echo "Starting container $VMID..." pct start "$VMID" || true # Wait for container to be ready echo "Waiting for container to be ready..." sleep 5 for i in {1..30}; do if pct exec "$VMID" -- test -f /etc/os-release 2>/dev/null; then break fi sleep 1 done # Install Node.js and pnpm echo "Installing Node.js and pnpm..." pct exec "$VMID" -- bash -c " export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y curl # Install Node.js 18 curl -fsSL https://deb.nodesource.com/setup_18.x | bash - apt-get install -y nodejs # Install pnpm npm install -g pnpm # Install PostgreSQL client apt-get install -y postgresql-client " # Create application directory echo "Setting up application directory..." pct exec "$VMID" -- bash -c " mkdir -p /opt/solace-backend chown -R 1000:1000 /opt/solace-backend " # Copy backend code to container echo "Copying backend code to container..." if [[ -d "$PROJECT_ROOT/backend" ]]; then # Remove existing directory if it exists pct exec "$VMID" -- bash -c "rm -rf /opt/solace-backend/* /opt/solace-backend/.* 2>/dev/null || true" # Copy files using tar for better directory handling cd "$PROJECT_ROOT" tar czf - backend | pct exec "$VMID" -- bash -c "cd /opt && tar xzf - && mv backend/* solace-backend/ && mv backend/.* solace-backend/ 2>/dev/null || true && rmdir backend 2>/dev/null || true" else echo "WARNING: Backend directory not found at $PROJECT_ROOT/backend" echo "You will need to copy the code manually or clone the repository" fi # Install dependencies and build echo "Installing dependencies..." pct exec "$VMID" -- bash -c " cd /opt/solace-backend export NODE_ENV=production # Use --no-frozen-lockfile if lockfile is missing if [[ -f pnpm-lock.yaml ]]; then pnpm install --frozen-lockfile else pnpm install --no-frozen-lockfile fi # Try to build, but continue if it fails (backend may be placeholder) pnpm run build || echo 'Build failed, continuing anyway (backend may be placeholder)' " # Create systemd service echo "Creating systemd service..." pct exec "$VMID" -- bash -c " cat > /etc/systemd/system/solace-backend.service <<'EOF' [Unit] Description=Solace Treasury Backend API After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/solace-backend Environment=NODE_ENV=production EnvironmentFile=/opt/solace-backend/.env ExecStart=/usr/bin/node /opt/solace-backend/dist/index.js Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable solace-backend " # Create log directory pct exec "$VMID" -- bash -c " mkdir -p /var/log/backend chmod 755 /var/log/backend " echo "" echo "==========================================" echo "Backend Container Deployment Complete" echo "==========================================" echo "Container: $VMID ($HOSTNAME)" echo "IP Address: $IP_ADDRESS" echo "Port: $BACKEND_PORT" echo "" echo "Next steps:" echo "1. Copy backend/.env to container: pct push $VMID backend/.env /opt/solace-backend/.env" echo "2. Update .env with database connection and RPC URL" echo "3. Run database migrations: pct exec $VMID -- bash -c 'cd /opt/solace-backend && pnpm run db:migrate'" echo "4. Start the service: pct exec $VMID -- systemctl start solace-backend" echo "5. Check status: pct exec $VMID -- systemctl status solace-backend"