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

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

Бета-версия

Базы данных — в бета-версии: всё, что здесь описано, работает, но интерфейс и отдельные возможности ещё меняются. Подробнее — на странице «Базы данных».

Строка подключения лежит в панели: меню карточки базы → Подключить. Выглядит она так:

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

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

Приложениям на Layero строка подключения приезжает сама — в переменной LAYERO_DATABASE_URL (с режимом require, см. ниже), со следующего деплоя после того, как вы подключите базу к проекту. Вписывать её руками нужно только там, где приложение живёт не у нас.

Вторая база того же проекта получает суффикс по слагу, LAYERO_DATABASE_URL_<СЛАГ>, чтобы две строки не спорили за одно имя.

Почему не DATABASE_URL

Так называется переменная у половины хостингов и библиотек, и подставленная нами она молча перекрывала бы ту, что человек задал сам. Связи, заведённые до этого правила, своё прежнее имя сохраняют — в карточке проекта видно, какое имя приезжает вашему приложению.

Что может приложение​

У каждого подключённого проекта свой пользователь базы. Он работает от имени владельца базы и может то же, что SQL-редактор в панели:

  • создавать и менять таблицы. Миграции, которые приложение запускает само при старте, проходят той же строкой LAYERO_DATABASE_URL, отдельная строка для миграций не нужна;
  • работать с таблицами, созданными в редакторе, и наоборот. Всё, что создало приложение, принадлежит владельцу базы: такие таблицы видны в редакторе, их можно изменить или удалить.

Отключение проекта отзывает только его пользователя. Другие проекты и редактор продолжают работать, таблицы остаются в базе.

⚠️ У таких прав две особенности, как и у владельца базы в других сервисах:

  • Политики доступа к строкам (RLS) на пользователя проекта не действуют. Если приложение на них опирается, заведите на странице «Роли» отдельную роль с нужными правами и подключайтесь ею.
  • Приложение может сменить пароль владельца базы. После этого SQL-редактор перестанет подключаться, пока вы не сбросите пароль в панели.

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

Подключение без TLS сервер отклоняет — и у psql, и у любого драйвера. Вопрос только в том, проверяет ли клиент, чей сертификат ему предъявили. Об этом ниже.

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

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

По умолчанию мы выдаём verify-full — самый строгий режим.

Режим одинаков для общей и выделенной базы: обе подключаются через общий вход db.layero.ru, и шифрование заканчивается на нашем сертификате.

⚠️ Кроме принесённой базы. Про чужой сервер мы не знаем ни кто подписал его сертификат, ни лежит ли у вас корневой, — проверять нечем. Строку подключения такой базы мы показываем в том виде, в каком вы её сохранили, и переключатель режима в панели для неё погашен.

⚠️ У verify-full есть цена, о которой надо знать заранее: режим требует, чтобы у клиента был корневой сертификат в том месте, где его ищет библиотека. libpq ищет его в ~/.postgresql/root.crt и в системное хранилище не смотрит, а sslrootcert=system понимают не все драйверы — asyncpg, например, не понимает. Без шага из следующего раздела часть клиентов по этой строке не подключится, и выглядеть это будет как «база не работает».

Рецепт занимает две команды. Если корень положить некуда (чужой контейнер, managed-раннер), переключите режим на require в панели: меню карточки базы → Подключить, переключатель «Проверять подлинность сервера». Канал останется зашифрованным, но подлинность сервера проверяться не будет.

Приложениям на Layero платформа подставляет require сама: класть корневой сертификат в образ, который собираете вы, мы не можем.

Как включить 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. Проверить строку подключения​

Если вы не переключали режим в панели, sslmode=verify-full в строке уже есть:

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

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

Снаружи — с ноутбука, из CI, с чужого хостинга — к базе подключаются только адреса из её списка: страница базы → Настройки → Разрешённые адреса. Приложения ваших проектов на Layero подключаются всегда, добавлять их в список не нужно.

С чем база приходит:

БазаСписок после создания
Общаяодин адрес — тот, с которого базу завели. Панель скажет об этом во всплывающем сообщении
Выделеннаястрока 0.0.0.0/0 с пометкой «Открыта всем при создании»: подключиться может любой, кто знает пароль

⚠️ Если выделенную базу не нужно открывать всему интернету, сразу после создания удалите строку 0.0.0.0/0 и добавьте свои адреса.

Как добавить адрес:

  1. Настройки → Разрешённые адреса → Добавить.
  2. Впишите адрес или подсеть. Есть быстрые варианты: «Мой адрес» и «Весь интернет» (0.0.0.0/0), для второго панель переспросит.
  3. При желании укажите, зачем нужен адрес и до какого числа он действует. Срок удобен, когда доступ нужен подрядчику на неделю, а не навсегда.

Изменения начинают действовать в течение минуты. Адреса IPv6 пока не поддерживаются — только IPv4.

Если адрес сменился

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

Автоматическая блокировка​

После 10 неверных паролей за 5 минут адрес блокируется на 30 минут, повторные блокировки длиннее, до 16 часов. Так перебор паролей не доходит до базы. Заблокированные адреса видны в Настройках базы: свой можно разблокировать кнопкой, когда пароль уже исправлен.

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

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