Как подключить приложение к приватному PostgreSQL в Inquir

Создание PostgreSQL в проекте Inquir, DATABASE_URL, пул соединений, постоянный том и проверка резервных копий.

Как подключить приложение к приватному PostgreSQL в Inquir

Публичный 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.