45 lines
2.5 KiB
Bash
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 "==> Готово." |