# Default migration target: cnpg | selectel # Override per run: TARGET=selectel ./migrate-one.sh … # Or per list line: yc-loop-1 loopxxx selectel TARGET="${TARGET:-cnpg}" # CNPG target (pooler NodePort; use a node that runs a pooler pod) CNPG_HOST="${CNPG_HOST:-95.143.178.247}" CNPG_PORT="${CNPG_PORT:-31574}" CNPG_SSLMODE="${CNPG_SSLMODE:-disable}" # 1 = always use CNPG_HOST (public VIP); 0 = try pooler pod hostIP first CNPG_PREFER_CONFIG_HOST="${CNPG_PREFER_CONFIG_HOST:-0}" CNPG_POOLER_RW="${CNPG_POOLER_RW:-pooler-cnpg-wilix-rw}" # Admin role for CREATE ROLE / CREATE DATABASE (kubectl --context local) CNPG_KUBE_CONTEXT="${CNPG_KUBE_CONTEXT:-local}" CNPG_NAMESPACE="${CNPG_NAMESPACE:-cnpg-loop-wilix}" CNPG_CLUSTER="${CNPG_CLUSTER:-loop-cnpg-wilix-1}" CNPG_ADMIN_SECRET="${CNPG_ADMIN_SECRET:-cnpg-vizor-admin-role-secret}" # Selectel Managed PostgreSQL (create user/pass/db in UI = same as MM pod secret) SELECTEL_HOST="${SELECTEL_HOST:-}" SELECTEL_PORT="${SELECTEL_PORT:-5432}" SELECTEL_SSLMODE="${SELECTEL_SSLMODE:-require}" # Source (YC MDB) SSL for pg_dump inside transfer Job SRC_SSLMODE="${SRC_SSLMODE:-disable}" # Source Mattermost installs SOURCE_NS="${SOURCE_NS:-loop}" JOB_NS="${JOB_NS:-loop}" # Pin minor to avoid pg_dump/psql \\restrict mismatches across floating :15 tags PG_IMAGE="${PG_IMAGE:-postgres:15.8}" JOB_TTL_SECONDS="${JOB_TTL_SECONDS:-86400}" # pgxfer Job resources (cluster often tight on memory) XFER_CPU_REQUEST="${XFER_CPU_REQUEST:-200m}" XFER_CPU_LIMIT="${XFER_CPU_LIMIT:-2}" XFER_MEMORY_REQUEST="${XFER_MEMORY_REQUEST:-512Mi}" XFER_MEMORY_LIMIT="${XFER_MEMORY_LIMIT:-2Gi}" # migrate-list parallelism PARALLELISM="${PARALLELISM:-1}" # migrate-one local wait for Job (seconds). 0 = wait forever (manual monitoring). MIGRATE_JOB_TIMEOUT="${MIGRATE_JOB_TIMEOUT:-86400}" # On wait timeout while Job still Running: keep Job (do not delete / mark failed) MIGRATE_KEEP_JOB_ON_TIMEOUT="${MIGRATE_KEEP_JOB_ON_TIMEOUT:-1}" # Inside transfer Job: retry full dump|restore after short network blips (still restarts copy). TRANSFER_MAX_ATTEMPTS="${TRANSFER_MAX_ATTEMPTS:-30}" TRANSFER_RETRY_SLEEP_SEC="${TRANSFER_RETRY_SLEEP_SEC:-60}" # libpq TCP keepalives (seconds) — reduces silent idle drops on long COPY/INDEX PG_KEEPALIVES_IDLE="${PG_KEEPALIVES_IDLE:-30}" PG_KEEPALIVES_INTERVAL="${PG_KEEPALIVES_INTERVAL:-10}" PG_KEEPALIVES_COUNT="${PG_KEEPALIVES_COUNT:-9}" # Transfer mode: # stream — pg_dump | psql (default; retry = full re-dump from MDB) # file — pg_dump | tee >(zstd>PVC) | psql; on blip re-restore from file (no MDB re-dump) TRANSFER_MODE="${TRANSFER_MODE:-stream}" # file-mode volume: pvc | emptydir (emptydir = node disk; survives blips inside same pod only) DUMP_VOLUME="${DUMP_VOLUME:-pvc}" DUMP_PVC_SIZE="${DUMP_PVC_SIZE:-80Gi}" DUMP_STORAGE_CLASS="${DUMP_STORAGE_CLASS:-yc-network-ssd}" DUMP_EMPTYDIR_SIZE_LIMIT="${DUMP_EMPTYDIR_SIZE_LIMIT:-50Gi}" # zstd | gzip | none (postgres:15.8 image already has zstd + gzip) DUMP_COMPRESS="${DUMP_COMPRESS:-zstd}" DUMP_COMPRESS_LEVEL="${DUMP_COMPRESS_LEVEL:-3}" # Keep PVC + dump after success (1) so you can re-restore manually DUMP_KEEP_PVC="${DUMP_KEEP_PVC:-1}" # cutover-one: MM needs long plugin sync after DB switch CUTOVER_LIVENESS_INITIAL_DELAY="${CUTOVER_LIVENESS_INITIAL_DELAY:-600}" CUTOVER_LIVENESS_FAILURE_THRESHOLD="${CUTOVER_LIVENESS_FAILURE_THRESHOLD:-60}" CUTOVER_READINESS_INITIAL_DELAY="${CUTOVER_READINESS_INITIAL_DELAY:-120}" CUTOVER_READINESS_FAILURE_THRESHOLD="${CUTOVER_READINESS_FAILURE_THRESHOLD:-60}" CUTOVER_MEMORY_LIMIT="${CUTOVER_MEMORY_LIMIT:-4Gi}" CUTOVER_MEMORY_REQUEST="${CUTOVER_MEMORY_REQUEST:-512Mi}" CUTOVER_CPU_REQUEST="${CUTOVER_CPU_REQUEST:-200m}" # wait loop: attempts * sleep (default ~30 min) CUTOVER_WAIT_ATTEMPTS="${CUTOVER_WAIT_ATTEMPTS:-180}" CUTOVER_WAIT_SLEEP_SEC="${CUTOVER_WAIT_SLEEP_SEC:-10}" # kill idle CNPG backends left by crashed MM/session-pooler clients CUTOVER_STALE_IDLE_MINUTES="${CUTOVER_STALE_IDLE_MINUTES:-5}" # Files relative to this directory TRANSFER_LIST="${TRANSFER_LIST:-transfer-list.txt}" DONE_FILE="${DONE_FILE:-done.txt}" FAILED_FILE="${FAILED_FILE:-failed.txt}" # Unified migration table (source of truth for status / sizes / batches) REGISTRY_FILE="${REGISTRY_FILE:-registry.tsv}" LOG_DIR="${LOG_DIR:-logs}"