База данных
В поставке db-postgres содержатся все SQL‑скрипты и утилиты для подготовки и обслуживания PostgreSQL. Ниже описаны два поддерживаемых сценария: минимальный (только обязательные логины) и многопользовательский (отдельные логины для сервисов). Все команды предполагается выполнять суперпользователем PostgreSQL или аккаунтом с аналогичными привилегиями, если явно не указано иное.
Команды можно выполнять в IDE (DBeaver, DataGrip, pgAdmin) задавая значения параметров явно в скриптах.
Минимальный вариант (портал + grafana)#
Инициализация#
- Создать базу данных (однократно):
psql -v ON_ERROR_STOP=1 -d postgres \ -v DB_NAME=smartcpd \ -f db-postgres/sql/00-create-db-once.sql - Создать обязательные логины (портал и 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 самостоятельно управляют своими схемами и миграциями БД, поэтому присутствует необходимость назначения корректных привилегий для работы решения.
Инициализация#
- Выполнить шаги минимального варианта.
- Создать дополнительные логины и правила взаимодействия (как и раньше, пароли можно опустить пустой строкой, если они уже заданы):
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.
Процесс восстановления без суперпользователя:
- Администратор (или любой пользователь с доступом к
pg_catalog) запускает оба генератора и сохраняет результаты. - Для строк с
run_as = DB_OWNERтребуется участие владельца базы или суперпользователя (но в большинстве случаев их можно пропустить, если пользовали были созданы в соответствии с требованиями: connect к БД, гранты на схемы и search_path) - Остальные блоки выполняют владельцы соответствующих ролей (portal, billing, markup и т.д.). Таким образом, даже при ограниченных правах можно вернуть прежние гранты.
Дополнительные материалы#
db/utils/list-object-owner.sql— вспомогательный запрос, показывающий текущих владельцев объектов в схемеpublic.
Все скрипты обновляются от релиза к релизу, но их назначение и именование сохраняются, что позволяет встроить их в автоматизацию (CI/CD, Ansible и т.д.). Перед обновлением рекомендуется ознакомиться с примечаниями релиза и выполнить скрипты соответствующего сценария.