Files
solace-bg-dubai/deployment/proxmox/deploy-backend.sh
defiQUG c94eb595f8
Some checks failed
CI / lint-and-test (push) Has been cancelled
Initial commit: add .gitignore and README
2026-02-09 21:51:53 -08:00

181 lines
5.5 KiB
Bash
Executable File

#!/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"