#!/bin/bash # loopctl — эксплуатация Loop: переезды баз и инстансов, прокси, DNS, проверки. Подробно: README.md set -euo pipefail D=$(cd "$(dirname "$(readlink -f "$0")")" && pwd) usage() { cat <<'EOF' loopctl db move <куб> <кластер БД> [--scale-0] перенос базы: dump -> verify -> cutover -> bind loopctl db migrate <куб> <кластер БД> [--scale-0] только копия базы (инстанс работает на старой) loopctl db verify <куб> [кластер БД] сверка количества строк loopctl db cutover <куб> [кластер БД] переключить инстанс на новую базу loopctl db bind <куб> прописать базу из CR в визор (провайдер + env) loopctl k8s move ... перенос инстанса на DST (по умолчанию loop-3) loopctl k8s rebind только секреты + перепривязка в визоре loopctl proxy make <исходный куб> манифест временного прокси -> DST loopctl proxy traffic <исходный куб> [секунд] запросы через прокси за интервал (0 = можно снимать) loopctl dns show|ttl|cname <поддомен> [значение] записи *.loop.ru в Selectel DNS loopctl check ... | --db <хост> | --all здоровье инстансов на DST Кластеры БД: lm, lp3, ff, wilix. Всё, что меняет состояние, спрашивает подтверждение (LOOPCTL_YES=1 — не спрашивать). EOF } db_move() { local ctx=$1 id=$2 cl=$3 prev=$D/db/logs/$2.scale0-prev; shift 3 rm -f "$prev" # --scale-0: инстанс остаётся 0 через verify до cutover, иначе посты за это время останутся в старой базе if ! MIGRATE_FORCE=1 MIGRATE_KEEP_SCALED=1 "$D/db/migrate-one.sh" "$ctx" "$id" "$cl" "$@" || ! "$D/db/verify-one.sh" "$ctx" "$id" "$cl"; then # копия или сверка не прошли: инстанс остаётся на старой базе, вернуть ему реплики после --scale-0 [ -s "$prev" ] && [ "$(cat "$prev")" -ge 1 ] && kubectl --context "$ctx" -n loop patch mattermost "$id" --type merge -p "{\"spec\":{\"replicas\":$(cat "$prev")}}" echo "СТОП: $id остался на старой базе"; return 1 fi [ -s "$prev" ] && [ "$(cat "$prev")" -ge 1 ] && export CUTOVER_REPLICAS=$(cat "$prev") "$D/db/cutover-one.sh" "$ctx" "$id" "$cl" "$D/db/bind.sh" "$ctx" "$id" } [ $# -gt 0 ] && [ "$1" != -h ] && [ "$1" != help ] || { usage; exit 0; } . "$D/lib/common.sh" # KUBECONFIG и прочие настройки для всех подкоманд case "${1:-}/${2:-}" in db/move) shift 2; confirm "Перенесу базу $2 на $3 (dump, verify, cutover, визор)." && LOOPCTL_YES=1 db_move "$@" ;; db/migrate) shift 2; confirm "Скопирую базу $2 на ${3:-?} (создам роль и базу, Job pg_dump|psql)." && exec "$D/db/migrate-one.sh" "$@" ;; db/verify) shift 2; exec "$D/db/verify-one.sh" "$@" ;; db/cutover) shift 2; confirm "Переключу $2 на новую базу (секрет, env CR, рестарт)." && exec "$D/db/cutover-one.sh" "$@" ;; db/bind) shift 2; exec "$D/db/bind.sh" "$@" ;; k8s/move) shift 2; exec "$D/k8s/move.sh" "$@" ;; k8s/rebind) shift 2; exec "$D/k8s/rebind.sh" "$@" ;; proxy/make) shift 2; exec "$D/k8s/proxy.sh" "$@" ;; proxy/traffic) shift 2; exec "$D/k8s/proxy-traffic.sh" "$@" ;; dns/*) shift 1; exec "$D/dns/dns.sh" "$@" ;; check/*) shift 1; exec "$D/check.sh" "$@" ;; *) usage; exit 1 ;; esac