#!/bin/bash set -e # Sync production database into local Docker CRM. # Usage: scripts/dev/sync-from-prod.sh # # Requires: # - SSH access to production server via id_ed25519_crm # - Local CRM is defined in docker-compose.local.yml # - .env.local exists SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" PROJECT_NAME="crm-local" COMPOSE_FILE="${PROJECT_ROOT}/docker-compose.local.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 local app and document-worker ===" docker compose -f "${COMPOSE_FILE}" -p "${PROJECT_NAME}" stop app document-worker || true echo "=== 4. Recreating local database ===" docker compose -f "${COMPOSE_FILE}" -p "${PROJECT_NAME}" stop db docker compose -f "${COMPOSE_FILE}" -p "${PROJECT_NAME}" rm -f db docker volume rm "${PROJECT_NAME}_postgres_data" >/dev/null 2>&1 || true docker compose -f "${COMPOSE_FILE}" -p "${PROJECT_NAME}" up -d db echo "=== 5. 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 "=== 6. 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 "=== 7. Starting local app and document-worker ===" docker compose -f "${COMPOSE_FILE}" -p "${PROJECT_NAME}" up -d app document-worker echo "" echo "=== Sync complete ===" echo "Local CRM: http://localhost:5000" echo "Dump file kept at: ${DUMP_FILE}" echo "You can delete it manually when no longer needed."