Как подключить приложение к приватному PostgreSQL в Inquir
Создание PostgreSQL в проекте Inquir, DATABASE_URL, пул соединений, постоянный том и проверка резервных копий.
Публичный API не требует публичной базы данных. Приложение может принимать HTTPS-запросы, а PostgreSQL — оставаться доступным только по приватной сети проекта. Это уменьшает поверхность доступа, но не отменяет пароль, роли базы и резервные копии.
Создайте базу рядом с приложением
Предположим, у вас уже есть приложение my-api. Узнайте его проект в консоли: база и приложение должны находиться в нужном общем проекте. После настройки CLI замените <project> на его идентификатор, slug или уникальное имя:
inquir apps create my-db --template postgres --project <project>
inquir apps status my-db
inquir apps connect my-db my-api
Шаблон PostgreSQL создаёт приложение базы с постоянным томом и сгенерированным паролем. Команда connect добавляет приложению DATABASE_URL. Если приватный адрес ещё не подтверждён, дождитесь готовности базы и повторите подключение; не заменяйте приватную связь публичным доступом только ради обхода ожидания.
Переменные применяются к новому релизу. Если код не менялся, перезапустите его через новый релиз:
inquir apps redeploy my-api
Если добавили клиент PostgreSQL в код, сначала сохраните изменения и выполните inquir apps deploy my-api --promote из каталога приложения. localhost внутри API обозначает контейнер API, а не соседнюю базу.
Используйте небольшой пул соединений
В Node.js установите pg, сохраните lock-файл и создайте один пул на процесс:
import pg from 'pg';
const pool = new pg.Pool({
connectionString: process.env.DATABASE_URL,
max: 5,
connectionTimeoutMillis: 5000,
idleTimeoutMillis: 30000,
});
export async function databaseTime() {
const { rows } = await pool.query('select now() as now');
return rows[0].now;
}
Не создавайте пул на каждый HTTP-запрос. При трёх репликах и двух процессах в каждой max: 5 означает до 30 соединений от этого приложения. Это верхняя граница конфигурации; фактическое число зависит от нагрузки. Оставьте место для миграций, диагностики и других потребителей. На завершении процесса закрывайте пул через pool.end().
Проверку select now() можно вызвать из защищённого диагностического маршрута. Не выводите DATABASE_URL в ответ или логи: строка содержит учётные данные. Рекомендации по пулу есть в документации node-postgres.
Том и резервная копия решают разные задачи
Постоянный том сохраняет файлы между жизненными циклами контейнера. Он не защищает от ошибочного DELETE и не доказывает возможность восстановиться на выбранный момент времени. Наличие шаблона PostgreSQL также не является обещанием managed HA или PITR.
Для логической резервной копии используйте pg_dump из окружения с доступом к базе. Настройте безопасную передачу учётных данных через поддерживаемый PostgreSQL механизм, например .pgpass с ограниченными правами, и запускайте:
pg_dump -Fc -f backup.dump
Команда предполагает заранее настроенные параметры подключения и PostgreSQL-клиент. Не пытайтесь подключаться к приватному адресу проекта с обычного ноутбука без сетевого пути. Проверяйте код завершения, храните копию отдельно от рабочего тома и регулярно восстанавливайте её в тестовую базу. Детали — в руководстве PostgreSQL по дампам.
Проверьте результат после обновления
Запишите тестовую строку, выпустите новый релиз API и убедитесь, что она читается. Затем проверьте отказ базы: приложение должно выдавать контролируемую ошибку и восстанавливаться после возвращения соединения. Не переносите реальные данные, пока не проверили восстановление резервной копии. Продолжить можно с документации приложений и примера API с PostgreSQL.