#!/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 "==> Готово."