База данных

В поставке db-postgres содержатся все SQL‑скрипты и утилиты для подготовки и обслуживания PostgreSQL. Ниже описаны два поддерживаемых сценария: минимальный (только обязательные логины) и многопользовательский (отдельные логины для сервисов). Все команды предполагается выполнять суперпользователем PostgreSQL или аккаунтом с аналогичными привилегиями, если явно не указано иное.

Команды можно выполнять в IDE (DBeaver, DataGrip, pgAdmin) задавая значения параметров явно в скриптах.

Минимальный вариант (портал + grafana)#

Инициализация#

  1. Создать базу данных (однократно):
    psql -v ON_ERROR_STOP=1 -d postgres \
         -v DB_NAME=smartcpd \
         -f db-postgres/sql/00-create-db-once.sql
  2. Создать обязательные логины (портал и grafana) и применить базовые права. При повторных запусках можно передать пустые строки в DB_*_PASSWORD, если не требуется менять пароль:
    psql -v ON_ERROR_STOP=1 -d smartcpd \
         -v DB_PORTAL_USER=portal \
         -v DB_PORTAL_PASSWORD=... \
         -v DB_GRAFANA_USER=grafana \
         -v DB_GRAFANA_PASSWORD=... \
         -f db-postgres/sql/10-users-required.sql

Запуск#

  • Развернуть сервисы SmartCPD, используя учётные записи, созданные выше.

Обслуживание#

  • Повторный запуск 10-users-required.sql безопасен: скрипт обновит пароли (если переданы) и восстановит схемные права.
  • Для восстановления прав без полного скрипта используйте утилиты из раздела «Maintenance без суперпользователя».

Расширенный вариант (отдельный логин на каждый сервис)#

Сервисы smartcpd самостоятельно управляют своими схемами и миграциями БД, поэтому присутствует необходимость назначения корректных привилегий для работы решения.

Инициализация#

  1. Выполнить шаги минимального варианта.
  2. Создать дополнительные логины и правила взаимодействия (как и раньше, пароли можно опустить пустой строкой, если они уже заданы):
    psql -v ON_ERROR_STOP=1 -d smartcpd \
         -v DB_PORTAL_USER=portal \
         -v DB_BILLING_USER=billing \
         -v DB_BILLING_PASSWORD=... \
         -v DB_AMD_USER=amd \
         -v DB_AMD_PASSWORD=... \
         -v DB_MARKUP_USER=markup \
         -v DB_MARKUP_PASSWORD=... \
         -v DB_ANALYZER_USER=analyzer \
         -v DB_ANALYZER_PASSWORD=... \
         -v DB_GRAFANA_DS_USER=grafanads \
         -v DB_GRAFANA_DS_PASSWORD=... \
         -f db-postgres/sql/20-users-optional.sql

Запуск#

  • Настройте сервисы SmartCPD на соответствующие логины (billing, amd, markup, analyzer, grafanads). Портал и grafana продолжают использовать пользователей из минимального сценария.

Обслуживание#

  • 20-users-optional.sql можно запускать повторно на каждом релизе: он обновит пароли (если заданы) и пересоздаст default privileges и гранты между ролями.
  • Для выборочного восстановления прав доступны генераторы из db/utils (см. ниже).

Скрипты восстановления и миграции#

Используйте эти скрипты, когда меняется модель владения объектами в базе:

  • db-postgres/sql/90-restore-single-user-ownership.sql — перевести все объекты в схеме public обратно под владельца портала. Применяется при миграции с многопользовательской модели к одно пользовательской.
  • db-postgres/sql/91-restore-billing-user-ownership.sql — вернуть владение критичным для биллинга объектам пользователю billing после миграции от единого владельца.
  • db-postgres/sql/92-restore-markup-user-ownership.sql — аналогично для пользователя markup.

Каждый скрипт принимает соответствующий DB_*_USER и выполняется в базе smartcpd. Запуск безопасен повторно.

Если нет прав суперпользователя#

Иногда требуется восстановить права, но доступ ограничен (оператор не может выполнять CREATE ROLE, менять владельцев и т.д.). Для таких ситуаций предусмотрены генераторы:

  • db/utils/generate-ownership-restore.sql — выводит набор команд ALTER ... OWNER TO ..., сгруппированных по текущим владельцам. Запустите скрипт под любым пользователем, имеющим доступ к системным каталогам, задайте переменные DB_PORTAL_USER, DB_BILLING_USER, DB_MARKUP_USER. На выходе получите таблицу scenario / sequence / run_as / script. Каждый блок script необходимо выполнить, подключившись под ролью run_as.
  • db/utils/generate-permissions-restore.sql — аналогичный генератор для GRANT и ALTER DEFAULT PRIVILEGES, повторяющий логику 10 и 20‑го скриптов. На выходе также scenario / sequence / run_as / script.

Процесс восстановления без суперпользователя:

  1. Администратор (или любой пользователь с доступом к pg_catalog) запускает оба генератора и сохраняет результаты.
  2. Для строк с run_as = DB_OWNER требуется участие владельца базы или суперпользователя (но в большинстве случаев их можно пропустить, если пользовали были созданы в соответствии с требованиями: connect к БД, гранты на схемы и search_path)
  3. Остальные блоки выполняют владельцы соответствующих ролей (portal, billing, markup и т.д.). Таким образом, даже при ограниченных правах можно вернуть прежние гранты.

Дополнительные материалы#

  • db/utils/list-object-owner.sql — вспомогательный запрос, показывающий текущих владельцев объектов в схеме public.

Все скрипты обновляются от релиза к релизу, но их назначение и именование сохраняются, что позволяет встроить их в автоматизацию (CI/CD, Ansible и т.д.). Перед обновлением рекомендуется ознакомиться с примечаниями релиза и выполнить скрипты соответствующего сценария.

Дата формирования

Powered by Altuera