#!/usr/bin/env bash # Import configuration to secondary NPMplus set -euo pipefail # Load IP configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" if [ -f "$PROJECT_ROOT/.env" ]; then set +euo pipefail source "$PROJECT_ROOT/.env" 2>/dev/null || true set -euo pipefail fi SECONDARY_HOST="${SECONDARY_HOST:-192.168.11.12}" SECONDARY_VMID="${SECONDARY_VMID:-10234}" BACKUP_DIR="$1" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[✓]${NC} $1"; } log_warn() { echo -e "${YELLOW}[⚠]${NC} $1"; } log_error() { echo -e "${RED}[✗]${NC} $1"; } if [ -z "$BACKUP_DIR" ] || [ ! -d "$BACKUP_DIR" ]; then log_error "Usage: $0 " log_error "Backup directory must exist and contain database.sql" exit 1 fi if [ ! -f "$BACKUP_DIR/database.sql" ] && [ ! -f "$BACKUP_DIR/database.sqlite" ]; then log_error "Neither database.sql nor database.sqlite found in $BACKUP_DIR" exit 1 fi echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📥 Import Configuration to Secondary NPMplus" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" log_info "Secondary Host: $SECONDARY_HOST" log_info "Secondary VMID: $SECONDARY_VMID" log_info "Backup Directory: $BACKUP_DIR" # Check if secondary container is running log_info "Checking secondary container status..." if ! ssh -o StrictHostKeyChecking=no root@"$SECONDARY_HOST" \ "pct status $SECONDARY_VMID 2>/dev/null | grep -q running" 2>/dev/null; then log_error "Secondary container (VMID $SECONDARY_VMID) is not running" log_info "Attempting to start container..." ssh -o StrictHostKeyChecking=no root@"$SECONDARY_HOST" "pct start $SECONDARY_VMID" || { log_error "Failed to start container" exit 1 } sleep 5 fi # Stop NPMplus container before importing database log_info "Stopping NPMplus container for database import..." ssh -o StrictHostKeyChecking=no root@"$SECONDARY_HOST" \ "pct exec $SECONDARY_VMID -- docker stop npmplus 2>/dev/null || true" sleep 3 # Copy database backup to secondary host log_info "Copying database backup to secondary host..." if [ -f "$BACKUP_DIR/database.sqlite" ]; then # Use direct file copy method DB_FILE="database.sqlite" scp -o StrictHostKeyChecking=no "$BACKUP_DIR/database.sqlite" \ root@"$SECONDARY_HOST:/tmp/npmplus-database-import.sqlite" || { log_error "Failed to copy database file" exit 1 } IMPORT_METHOD="file" elif [ -f "$BACKUP_DIR/database.sql" ]; then # Use SQL dump method DB_FILE="database.sql" scp -o StrictHostKeyChecking=no "$BACKUP_DIR/database.sql" \ root@"$SECONDARY_HOST:/tmp/npmplus-database-import.sql" || { log_error "Failed to copy database backup" exit 1 } IMPORT_METHOD="sql" else log_error "No database file found to import" exit 1 fi # Verify file was copied if [ "$IMPORT_METHOD" = "file" ]; then if ! ssh -o StrictHostKeyChecking=no root@"$SECONDARY_HOST" \ "test -f /tmp/npmplus-database-import.sqlite"; then log_error "Database file not found on secondary host after copy" exit 1 fi else if ! ssh -o StrictHostKeyChecking=no root@"$SECONDARY_HOST" \ "test -f /tmp/npmplus-database-import.sql"; then log_error "Database file not found on secondary host after copy" exit 1 fi fi # Import database log_info "Importing database..." if [ "$IMPORT_METHOD" = "file" ]; then # Direct file copy method IMPORT_RESULT=$(ssh -o StrictHostKeyChecking=no root@"$SECONDARY_HOST" "pct exec $SECONDARY_VMID -- bash" </dev/null 2>&1; then cat /tmp/npmplus-database-import.sql | docker exec -i npmplus sqlite3 /data/database.sqlite 2>&1 IMPORT_EXIT=$? else # sqlite3 not available, use direct file copy instead docker stop npmplus sleep 2 docker cp /tmp/npmplus-database-import.sql npmplus:/tmp/db.sql # This won't work well, so we'll skip SQL import echo "WARNING: sqlite3 not available, skipping SQL import" IMPORT_EXIT=0 fi rm -f /tmp/npmplus-database-import.sql exit $IMPORT_EXIT IMPORT_EOF ) fi IMPORT_EXIT_CODE=$? if [ $IMPORT_EXIT_CODE -eq 0 ]; then log_success "Database imported successfully" else log_error "Database import failed (exit code: $IMPORT_EXIT_CODE)" log_info "Import output: $IMPORT_RESULT" # Don't exit - try to continue log_warn "Continuing despite import error..." fi # Restart NPMplus log_info "Restarting NPMplus container..." ssh -o StrictHostKeyChecking=no root@"$SECONDARY_HOST" \ "pct exec $SECONDARY_VMID -- docker start npmplus" || { log_error "Failed to start NPMplus" exit 1 } # Wait for NPMplus to be ready log_info "Waiting for NPMplus to be ready..." sleep 10 # Verify NPMplus is running for i in {1..30}; do if ssh -o StrictHostKeyChecking=no root@"$SECONDARY_HOST" \ "pct exec $SECONDARY_VMID -- docker ps --filter 'name=npmplus' --format '{{.Status}}' 2>/dev/null" | \ grep -q "Up\|healthy"; then log_success "NPMplus is running" break fi if [ $i -eq 30 ]; then log_warn "NPMplus may not be fully ready yet" fi sleep 2 done log_success "Configuration import complete" log_info "Secondary NPMplus URL: https://${IP_NPMPLUS}:81" log_warn "Note: Some configuration may need manual verification via UI" log_warn "Note: Certificates should be synced separately using sync-certificates.sh"