Skip to content

build: upgrade postgres to v4 - #254

Merged
agentHits merged 1 commit into
AgentHits-Devfrom
build/postgres-4
Nov 9, 2026
Merged

agentHits merged 1 commit into
AgentHits-Devfrom
build/postgres-4

Conversation

@agentHits

Copy link
Copy Markdown
Collaborator

Зачем

postgres (postgres.js) — драйвер, через который drizzle-orm ходит в базу самой панели, а также миграции (apps/dokploy/migration.ts, server/db/migration.ts) и сброс базы. Форк сидел на 3.4.9, последняя версия 4.1.0.

Что даёт новая версия:

  • 4.0: переписаны пул, соединение и протокол, публичный API тот же.
  • 4.1: новые query_timeout и cancel_timeout, отменённый запрос больше не может зависнуть навсегда, listen переподключается и после неудачной первой попытки.
  • Ещё в 4.1 начали учитываться PGSSLMODE и sslrootcert из url, а FATAL-ошибки от пулеров вроде PgBouncer теперь распознаются.
  • Кэш подготовленных запросов больше не держит их значения и строки результата: до 1000 запросов на соединение.

Что изменилось

  • postgres ^3.4.9 → ^4.1.0 в apps/dokploy/package.json и packages/server/package.json.
  • Корневой override >=3.4.9 <4.0.0 → >=4.1.0 <5.0.0.
  • Код не менялся. Форк сам вызывает только postgres(url, { idle_timeout | max }) и .end(), всё остальное идёт через drizzle-orm 0.45.4 (его peer-зависимость postgres >=3). sql.array(), убранный в 4.0, ручные begin и reserve форк не использует.
  • Пакет теперь только ESM. Панель работает на Bun, Node 26 загружает такой пакет через require(esm).

Главный риск и как он проверен

В 4.0 тип каждого параметра выбирает сервер (infer: false), а drizzle подменяет внутренние parsers и serializers клиента для дат, JSON и интервалов. Поэтому я сравнил обе версии на настоящем Postgres 18.6 через drizzle 0.45.4, под Node 26 и под Bun 1.4.4:

  • вставка и чтение всех типов колонок, которые есть в схеме: boolean, integer, bigint, jsonb, json, text[], timestamp строкой и датой, date, interval, enum;
  • условия по boolean, по дате, по enum и через IN;
  • update с датой и JSON;
  • сырой sql;
  • транзакция и откат.

Все 19 проверок дали одинаковый результат на 3.4.9 и 4.1.0, включая одинаковые ошибки.

Проверки

Linux, Bun 1.4.4, Node 26.13.0:

  • bun install, bun audit --audit-level=moderate, bun run server:build, bun run typecheck проходят.
  • apps/dokploy/migration.ts под bun на чистом Postgres 18.6: все 219 миграций, 81 таблица; повторный запуск тоже проходит.
  • Unit-тесты: 6238 прошли, 4 упали в трёх файлах. Все они так же падают на базовой ветке без этого изменения:
    • backup-files — таймаут под нагрузкой;
    • acme-delete-signals;
    • service-webhook-secret > Bitbucket — обращается к настоящему Bitbucket API.
  • Запуск собранного образа с Postgres проверяет main-image-smoke в CI.

Что проверить вручную на dev

  • Панель стартует, миграции проходят.
  • Списки проектов, сервисов и деплоев открываются.
  • Деплой проходит, бэкап запускается.

🤖 Generated with Claude Code

Что: драйвер postgres (postgres.js) ^3.4.9 -> ^4.1.0 в apps/dokploy и packages/server, корневой override >=3.4.9 <4.0.0 -> >=4.1.0 <5.0.0.

Зачем: через этот драйвер drizzle-orm ходит в базу самой панели, миграции и сброс базы. 4.0 переписал пул, соединение и протокол под тем же API; 4.1 добавил query_timeout, cancel_timeout и исправил зависания отменённых запросов, переподключение listen, чтение PGSSLMODE и sslrootcert из url, разбор FATAL-ошибок, а кэш подготовленных запросов больше не держит их строки и параметры.

Риски: главное изменение 4.0 - тип параметра выбирает сервер (infer: false), и drizzle подменяет внутренние parsers/serializers клиента для дат, JSON и интервалов. Проверено сравнением на настоящем Postgres 18 через drizzle 0.45.4 под Node 26 и Bun 1.4.4: вставка и выборка всех типов колонок схемы (boolean, integer, bigint, jsonb, json, text[], timestamp строкой и датой, date, interval, enum), условия по boolean, дате, enum и IN, update с датой и JSON, сырой sql, транзакция и откат - 19 из 19 одинаковы на 3.4.9 и 4.1.0, включая одинаковые ошибки. Форк сам вызывает только postgres(url, { idle_timeout | max }) и .end(); sql.array, ручные begin и reserve не используются. Пакет теперь только ESM; панель на Bun, Node 26 загружает его через require(esm).

Проверки на Linux: bun install, bun audit --audit-level=moderate, server:build и typecheck проходят; apps/dokploy/migration.ts под bun на чистом Postgres 18.6: все 219 миграций, 81 таблица, повторный запуск проходит; unit-тесты: 6238 прошли, 4 упали в трёх файлах, и каждый из них так же падает на базовой ветке без этого изменения.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@agentHits
agentHits merged commit 3555bd3 into AgentHits-Dev Nov 9, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant