#!/bin/bash set -e # Sync production database into the local development database. # Use this when running the app natively with `npm run dev` and Docker deps only. # Usage: scripts/dev/sync-from-prod-deps.sh # # Requires: # - SSH access to production server via id_ed25519_crm # - Dependencies are running (scripts/dev/start-deps.sh) # - .env.local exists with DATABASE_URL pointing to localhost:5432 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" PROJECT_NAME="crm-local" COMPOSE_FILE="${PROJECT_ROOT}/docker-compose.deps.yml" SSH_HOST="root@82.202.130.22" DUMP_FILE="${PROJECT_ROOT}/tmp/crm-prod-sync.dump.gz" # Resolve SSH key if [[ -n "${CRM_SSH_KEY:-}" && -f "${CRM_SSH_KEY}" ]]; then SSH_KEY="${CRM_SSH_KEY}" elif [[ -f "${HOME}/.ssh/id_ed25519_crm" ]]; then SSH_KEY="${HOME}/.ssh/id_ed25519_crm" elif [[ -f "${PROJECT_ROOT}/../.ssh_id_ed25519_crm" ]]; then SSH_KEY="${PROJECT_ROOT}/../.ssh_id_ed25519_crm" else echo "ERROR: SSH key not found." echo "Set CRM_SSH_KEY or place id_ed25519_crm in ~/.ssh/ or project parent folder." exit 1 fi cd "${PROJECT_ROOT}" if [[ ! -f .env.local ]]; then echo "ERROR: .env.local not found. Copy .env.local.example to .env.local and fill secrets." exit 1 fi mkdir -p tmp echo "=== 1. Testing SSH connection ===" ssh -o IdentitiesOnly=yes -o BatchMode=yes -o ConnectTimeout=10 -i "${SSH_KEY}" "${SSH_HOST}" 'echo SSH_OK' || { echo "ERROR: Cannot connect to production server." exit 1 } echo "=== 2. Dumping production database ===" ssh -o IdentitiesOnly=yes -i "${SSH_KEY}" "${SSH_HOST}" \ 'docker exec -i crm-db-1 pg_dump -U appuser -d appdb -Fc' | gzip > "${DUMP_FILE}" echo "Dump saved to: ${DUMP_FILE}" echo "=== 3. Stopping and recreating local database ===" docker compose --env-file "${PROJECT_ROOT}/.env.local" -f "${COMPOSE_FILE}" -p "${PROJECT_NAME}" stop db docker compose --env-file "${PROJECT_ROOT}/.env.local" -f "${COMPOSE_FILE}" -p "${PROJECT_NAME}" rm -f db docker volume rm "${PROJECT_NAME}_postgres_data" >/dev/null 2>&1 || true docker compose --env-file "${PROJECT_ROOT}/.env.local" -f "${COMPOSE_FILE}" -p "${PROJECT_NAME}" up -d db echo "=== 4. Waiting for local database ===" for i in {1..30}; do if docker exec "${PROJECT_NAME}-db-1" pg_isready -U appuser -d appdb >/dev/null 2>&1; then echo "Database is ready" break fi sleep 1 done echo "=== 5. Restoring dump to local database ===" zcat "${DUMP_FILE}" | docker exec -i "${PROJECT_NAME}-db-1" pg_restore -U appuser -d appdb --clean --if-exists echo "" echo "=== Sync complete ===" echo "Start the app with: npm run dev" echo "Dump file kept at: ${DUMP_FILE}" echo "You can delete it manually when no longer needed."