Перейти к основному содержимому

Подключение к базе

Строка подключения лежит в панели, на странице базы, и выглядит так:

postgresql://<роль>:<пароль>@db.layero.ru:5432/<база>?sslmode=require

db.layero.ru — единый вход для всех баз Layero. Адрес сервера, на котором лежит именно ваша база, наружу не выдаётся: он может смениться, а строка подключения — нет.

Приложениям, задеплоенным на Layero, эта строка приезжает сама в переменной DATABASE_URL, как только вы подключите базу к проекту. Вписывать её руками нужно только там, где приложение живёт не у нас.

Шифрование обязательно

sslmode=require — не рекомендация: подключение без TLS сервер отклоняет. Это относится и к psql, и к любому драйверу.

require шифрует канал, но не проверяет собеседника

Разница неочевидна.

  • require — трафик зашифрован, но клиент не проверяет, чей сертификат ему предъявили. От чтения на промежуточном узле защищает, от подмены сервера — нет.
  • verify-full — клиент проверяет и подпись сертификата, и совпадение имени. Защищает и от подмены.

По умолчанию мы выдаём require, и вот почему. verify-full требует, чтобы у клиента был корневой сертификат в том месте, где его ищет библиотека. libpq ищет его в ~/.postgresql/root.crt и в системное хранилище не смотрит, а sslrootcert=system понимают не все драйверы — asyncpg, например, не понимает. Если строка подключения не работает у половины пользователей, это не безопасность.

Поэтому verify-full — осознанное усиление. Ниже готовый рецепт.

Как включить verify-full

Сертификат db.layero.ru выпущен Let's Encrypt, корень — ISRG Root X1.

1. Положить корень туда, где его ищет клиент

mkdir -p ~/.postgresql
curl -fsSL https://letsencrypt.org/certs/isrgrootx1.pem -o ~/.postgresql/root.crt

Проверьте, что файл действительно корневой сертификат:

openssl x509 -in ~/.postgresql/root.crt -noout -subject
# subject=C = US, O = Internet Security Research Group, CN = ISRG Root X1

2. Поменять строку подключения

postgresql://<роль>:<пароль>@db.layero.ru:5432/<база>?sslmode=verify-full

Драйверы

КлиентЧто нужно
psql, libpqшаг 1 выше, дальше sslmode=verify-full работает
asyncpgшаг 1 обязателен: sslrootcert=system не понимает
node-pgберёт системные корни сам, шаг 1 не нужен
Prismasslmode=verify-full в DATABASE_URL, корень по шагу 1
Drizzleзависит от драйвера под ним — смотрите его строку в этой таблице

В контейнере, где нет домашнего каталога

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

postgresql://<роль>:<пароль>@db.layero.ru:5432/<база>?sslmode=verify-full&sslrootcert=/etc/ssl/certs/isrgrootx1.pem

Кого пускать к базе

На странице базы, во вкладке «Сеть», три режима:

РежимКто может подключиться
Только ресурсы Layeroприложения, подключённые к этой базе, и сервисы платформы
Список адресовони же плюс адреса, которые вы перечислили
Открыто всемкто угодно, если знает пароль

Новые базы заводятся в режиме «Только ресурсы Layero»: приложение работает сразу, а доступ снаружи — с ноутбука, из CI, из чужого хостинга — вы открываете сами и осознанно.

У правила в списке адресов может быть срок: удобно, когда доступ нужен подрядчику на неделю, а не навсегда.

:::tip Не знаете свой адрес Домашний и офисный адреса обычно меняются. Если подключение перестало проходить после смены провайдера или переезда, сначала проверьте, что ваш текущий адрес всё ещё в списке. :::

Если подключение не проходит

Что говорит клиентЧто это значит
login rejectedваш адрес не подходит ни под одно правило — проверьте вкладку «Сеть»
SASL authentication failedадрес разрешён, не подошёл пароль
no such userопечатка в имени роли
ошибка проверки сертификатавы включили verify-full, но не положили корень — см. шаг 1
соединение висит и отваливаетсяслишком много подключений с одного адреса; закройте лишние