This commit is contained in:
2026-10-27 14:29:43 +03:00
commit 1769946c99
24 changed files with 3762 additions and 0 deletions
Executable
+52
View File
@@ -0,0 +1,52 @@
#!/bin/bash
# loopctl — эксплуатация Loop: переезды баз и инстансов, прокси, DNS, проверки. Подробно: README.md
set -euo pipefail
D=$(cd "$(dirname "$(readlink -f "$0")")" && pwd)
usage() { cat <<'EOF'
loopctl db move <куб> <id> <кластер БД> [--scale-0] перенос базы: dump -> verify -> cutover -> bind
loopctl db migrate <куб> <id> <кластер БД> [--scale-0] только копия базы (инстанс работает на старой)
loopctl db verify <куб> <id> [кластер БД] сверка количества строк
loopctl db cutover <куб> <id> [кластер БД] переключить инстанс на новую базу
loopctl db bind <куб> <id> прописать базу из CR в визор (провайдер + env)
loopctl k8s move <id>... перенос инстанса на DST (по умолчанию loop-3)
loopctl k8s rebind <id> только секреты + перепривязка в визоре
loopctl proxy make <id> <исходный куб> манифест временного прокси -> DST
loopctl proxy traffic <исходный куб> [секунд] запросы через прокси за интервал (0 = можно снимать)
loopctl dns show|ttl|cname <поддомен> [значение] записи *.loop.ru в Selectel DNS
loopctl check <id>... | --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