Перейти к содержимому
WebShield Docs

База данных Postgres

Управляемая база Postgres для приложений — создание, подключение, бекапы и восстановление. Всё с примерами.

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

Если нужен не SQL, а «ключ — значение», посмотрите Valkey; у функций своя база — D1.

В кабинете: карточка проекта → блок Базы данных → Создать. Указываете имя, размер (до 20 ГБ) и, при желании, реплику на другой ноде — она подхватит работу, если основной экземпляр выйдет из строя.

Из терминала:

Окно терминала
webshield apps db create db --size 2 # база «db» на 2 ГБ
webshield apps db create db --size 2 --replica # то же, но с репликой
webshield apps db list # базы проекта
webshield apps db delete db # удалить

Размер только увеличивается, без остановки базы. Всем базам и Valkey с диском в проекте отведено 40 ГБ; журнал изменений занимает ещё четверть размера базы, реплика удваивает всё.

Строку подключения не нужно копировать: в переменной приложения напишите ссылку на базу, и при выкатке она заменится настоящим значением.

Ссылка Значение
${{db.url}} строка подключения базы db
${{db.host}}, .port, .user, .password, .database отдельные части
Окно терминала
webshield apps env set DATABASE_URL='${{db.url}}' --redeploy

Подключается приложение под владельцем app к базе app; прав суперпользователя нет.

Приложение получает строку подключения в переменной окружения DATABASE_URL. Node.js с библиотекой pg:

import pg from "pg";
const client = new pg.Client({ connectionString: process.env.DATABASE_URL });
await client.connect();
await client.query(
"CREATE TABLE IF NOT EXISTS hits (id serial PRIMARY KEY, at timestamptz DEFAULT now())",
);
await client.query("INSERT INTO hits DEFAULT VALUES");
const { rows } = await client.query("SELECT count(*) AS n FROM hits");
console.log(rows[0].n); // 1

Python с psycopg:

import os
import psycopg
with psycopg.connect(os.environ["DATABASE_URL"]) as conn:
conn.execute("CREATE TABLE IF NOT EXISTS hits (id serial PRIMARY KEY)")
conn.execute("INSERT INTO hits DEFAULT VALUES")
row = conn.execute("SELECT count(*) FROM hits").fetchone()
print(row[0]) # 1

Схему приложение создаёт само на старте или миграциями — как удобнее вам.

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

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

Из терминала:

Окно терминала
webshield apps db window db # с какого и по какой момент
webshield apps db restore db --as db2 --time 2026-10-21T15:00:00+03:00

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

Чтобы приложение перешло на восстановленную базу, поменяйте ссылку в переменной (${{db.url}} → ${{db2.url}}) и нажмите Выкатить заново. У новой базы свой пароль — ссылка подставит его сама. Старую базу удалите, когда она станет не нужна.

Когда в самой базе кончается место, запись отвергается с ошибкой No space left on device, а чтение продолжает работать. Размер можно увеличить на ходу — сделайте это заранее, до ошибок.