Kit.Db/projects/pg/kit_auth_pg/deploy/apply-psql.sh

45 lines
2.5 KiB
Bash

#!/usr/bin/env bash
#
# Точечное применение одного .psql (идемпотентный CREATE OR REPLACE FUNCTION и т.п.)
# к работающей БД auth — БЕЗ полной замены схемы (в отличие от sync-to-prod.sh).
# Для «хирургических» изменений: добавить/переопределить функцию, не трогая данные.
#
# psql берётся из docker (локальный клиент не нужен).
#
# Использование:
# ./apply-psql.sh auth/functions/user/user_get_profile.psql # локальная БД
# TARGET=prod PROD_APP_PASS=... ./apply-psql.sh <файл.psql> # прод
#
# Локально идём в контейнер kit-auth-db напрямую (docker exec); на прод — по host-адресу.
# Любой параметр ниже переопределяется одноимённой env-переменной.
set -euo pipefail
FILE="${1:?укажи путь к .psql (например auth/functions/user/user_get_profile.psql)}"
[ -f "$FILE" ] || { echo "ОШИБКА: нет файла: $FILE" >&2; exit 1; }
command -v docker >/dev/null || { echo "ОШИБКА: нужен docker" >&2; exit 1; }
TARGET="${TARGET:-local}"
PG_IMAGE="${PG_IMAGE:-postgres:17-alpine}"
if [ "$TARGET" = "local" ]; then
# локальная БД — прямо в контейнере
LOCAL_CONTAINER="${LOCAL_CONTAINER:-kit-auth-db}"
LOCAL_DB="${LOCAL_DB:-kit-auth2}"
LOCAL_USER="${LOCAL_USER:-user_auth}"
echo "==> Применяю $(basename "$FILE") -> контейнер $LOCAL_CONTAINER, БД $LOCAL_DB (пользователь $LOCAL_USER)"
docker exec -i "$LOCAL_CONTAINER" \
psql -v ON_ERROR_STOP=1 -U "$LOCAL_USER" -d "$LOCAL_DB" < "$FILE"
else
# прод — по host-адресу, прикладным пользователем (он же владелец объектов)
PROD_HOST="${PROD_HOST:-176.99.5.31}"
PROD_PORT="${PROD_PORT:-5832}"
PROD_DB="${PROD_DB:-kit-auth2}"
PROD_APP_USER="${PROD_APP_USER:-user_auth}"
PROD_APP_PASS="${PROD_APP_PASS:?нужен PROD_APP_PASS (пароль прикладного пользователя прода)}"
echo "==> Применяю $(basename "$FILE") -> $PROD_APP_USER@$PROD_HOST:$PROD_PORT/$PROD_DB (prod)"
docker run --rm -i -e PGPASSWORD="$PROD_APP_PASS" "$PG_IMAGE" \
psql -v ON_ERROR_STOP=1 -h "$PROD_HOST" -p "$PROD_PORT" -U "$PROD_APP_USER" -d "$PROD_DB" < "$FILE"
fi
echo "==> Готово."