ДокументацияХранение данныхБазы данных

Базы данных

Управляемый PostgreSQL и Redis-совместимое key–value хранилище: создаются рядом с сервисами и подключаются через переменные окружения.

Что можно создать#

FieldDescription
PostgreSQLРеляционная база для данных приложения: пользователи, заказы, контент. Схемы, индексы, расширения и SQL-миграции.
Key–value (Redis-совместимое)Хранилище в памяти для кеша, сессий, rate limiting и простых очередей.
Своё в контейнереЛюбой другой движок (MySQL, MongoDB, ClickHouse) можно запустить как приватный сервис с подключённым постоянным диском.

Создание базы данных#

  1. 1
    Откройте панель управления
    Перейдите на console.muerte.cloud Создать сервисБаза данных.
  2. 2
    Выберите движок и версию
    PostgreSQL или key–value, версия — та, которую ожидает приложение.
  3. 3
    Задайте ресурсы и размер хранилища
    vCPU, RAM и размер диска можно увеличить позже; в хранилище лежат сами данные, поэтому оставьте запас.
  4. 4
    Скопируйте строку подключения
    После создания в панели появятся внутренняя и внешняя строки подключения, а также хост, порт, пользователь и имя базы.

Подключение сервиса#

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

.env
bash
DATABASE_URL=postgres://user:password@internal-host:5432/appdb
REDIS_URL=redis://internal-host:6379
db.js
js
import { Pool } from "pg";

export const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  max: 10,
});
Не раздувайте пул соединений
У управляемой базы есть лимит соединений. Несколько инстансов сервиса с большим пулом исчерпают его — размер пула считайте на инстанс, а не на проект.

Миграции#

Запускайте миграции в pre-deploy-команде: они выполнятся один раз за релиз, до того как новая версия начнёт принимать трафик. См. как работают деплои.

bash
# pre-deploy команда
npm run migrate:deploy

Внешний доступ

Внешняя строка подключения нужна, чтобы подключиться локальным клиентом (psql, DBeaver, TablePlus) для отладки и разовых запросов. Для всего, что работает в проде, используйте внутренний адрес.

Бэкапы и восстановление#

Базы попадают в ту же систему резервного копирования, что и диски: копии по расписанию или вручную, настраиваемая глубина хранения, восстановление из любой сохранённой копии. Настройте расписание до появления реальных пользователей — см. резервные копии.

Откат кода не откатывает данные
Если релиз изменил схему, откат кода не спасёт — данные нужно восстановить из бэкапа.

Практические заметки#

В проде — внутренний хост
Меньше задержка, нет публичного доступа.
Индексируйте то, по чему фильтруете
Медленные запросы чаще про отсутствие индекса, чем про vCPU.
Разделяйте кеш и источник истины
Key–value — сессии и кеш, Postgres — данные, которые нельзя потерять.
Следите за диском
Заполненный диск останавливает запись; расширяйте заранее.
Меняйте пароли при отзыве доступа
Перегенерируйте пароль, когда кто-то теряет доступ.
Проверяйте восстановление
Бэкап, из которого вы ни разу не восстанавливались, — это предположение.