Подключение к базе
Строка подключения лежит в панели, на странице базы, и выглядит так:
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 не нужен |
Prisma | sslmode=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 |
| соединение висит и отваливается | слишком много подключений с одного адреса; закройте лишние |