#!/usr/bin/env bash # Deploy PostgreSQL Database 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_DATABASE:-3002}" HOSTNAME="${HOSTNAME:-solace-db}" IP_ADDRESS="${DATABASE_IP:-192.168.11.62}" MEMORY="${DATABASE_MEMORY:-4096}" CORES="${DATABASE_CORES:-2}" DISK="${DATABASE_DISK:-50}" # Database configuration DB_NAME="${DATABASE_NAME:-solace_treasury}" DB_USER="${DATABASE_USER:-solace_user}" DB_PASSWORD="${DATABASE_PASSWORD:-}" if [[ -z "$DB_PASSWORD" ]]; then echo "ERROR: DATABASE_PASSWORD must be set in environment or config file" exit 1 fi echo "==========================================" echo "Deploying Database 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 PostgreSQL echo "Installing PostgreSQL..." pct exec "$VMID" -- bash -c " export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y postgresql postgresql-contrib systemctl enable postgresql systemctl start postgresql " # Configure PostgreSQL echo "Configuring PostgreSQL..." pct exec "$VMID" -- bash -c " # Update postgresql.conf to listen on container IP sed -i \"s/#listen_addresses = 'localhost'/listen_addresses = '${IP_ADDRESS},localhost'/\" /etc/postgresql/*/main/postgresql.conf # Update pg_hba.conf to allow connections from backend container echo \"host all all 192.168.11.0/24 md5\" >> /etc/postgresql/*/main/pg_hba.conf # Restart PostgreSQL systemctl restart postgresql " # Create database and user echo "Creating database and user..." pct exec "$VMID" -- bash -c " sudo -u postgres psql <