База данных 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); // 1Python с psycopg:
import osimport 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,
а чтение продолжает работать. Размер можно увеличить на ходу — сделайте это заранее, до
ошибок.