Skip to content

fix(db): share one connection pool across the panel's API routers - #121

Merged
agentHits merged 1 commit into
AgentHits-Devfrom
fix/shared-db-pool
Oct 28, 2026
Merged

agentHits merged 1 commit into
AgentHits-Devfrom
fix/shared-db-pool

Conversation

@agentHits

Copy link
Copy Markdown
Collaborator

Зачем

Роутеры tag, network и libsql берут базу из @/server/db. В production этот модуль создавал собственный пул postgres.js до 10 соединений, рядом с общим пулом из @dokploy/server/db. В итоге панель держала до 20 соединений к Postgres вместо 10. tag.all вызывается на странице проектов, так что второй пул открывался почти сразу. Общий модуль уже кеширует клиента в globalThis, чтобы в процессе был один пул; модуль приложения этот кеш в production не использовал.

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

  • apps/dokploy/server/db/index.ts переэкспортирует db, dbUrl, and и eq из @dokploy/server/db, а не создаёт свой пул. Импорты в роутерах и моки в тестах не меняются.
  • Тест apps/dokploy/__test__/db/app-db-module.test.ts проверяет, что оба модуля отдают один и тот же клиент.

Проверки

  • vitest нового теста и тестов роутера tag: проходят. Новый тест на коде без правки падает.
  • Полный vitest: 4293 прошли, 5 упали в vector-validate.test.ts. Они падают и без правки: на Mac Colima не монтирует временную папку для docker run.
  • tsc --noEmit в apps/dokploy и packages/server и biome check проходят без ошибок.
  • Замеры: нативный arm64-образ этой ветки против образа AgentHits-Dev того же коммита.
    • Стенд изолированный: Docker-in-Docker на Mac. Абсолютные цифры на сервере будут другими.
    • Прогоны чередовались с другими вариантами. В каждом прогоне сценарий повторяется три раза, после него идёт пачка из 120 одновременных запросов к tag.all и project.all и две минуты простоя. В таблице медиана по прогонам.
Без правки (3 прогона) С правкой (2 прогона)
Шаги сценария без ошибок 90 из 90 60 из 60
Соединений Postgres под нагрузкой и после простоя 20 10
Память процессов Postgres 107 МиБ 91 МиБ
API, запросов в секунду (1000 запросов, 10 одновременно) 446 446
API, задержка 95% запросов 28 мс 28 мс
Страница проектов, запросов в секунду 386 386
Память сервера панели в простое / пик 234 / 532 МиБ 237 / 524 МиБ

Память Postgres падает меньше, чем вдвое, потому что каждое соединение кеширует подготовленные запросы: когда соединений меньше, каждое обслуживает больше разных запросов.

Сценарий: вход; пять страниц панели; 10 запросов project.all подряд; 1000 запросов к API по 10 одновременно и 200 к странице проектов по 5; проект; деплой Compose со сборкой и живым логом; логи и терминал контейнера; деплой из образа; добавление сервера и SSH-терминал.

С соседним PR про закрытие простаивающих соединений эффекты складываются: под нагрузкой 10 соединений и 88 МиБ, после простоя одно соединение и 15 МиБ.

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

  • Теги: создать, назначить проекту, отфильтровать список проектов.
  • Сети: список, синхронизация, назначение приложению.
  • Страница базы libsql.

🤖 Generated with Claude Code

Что:
- `apps/dokploy/server/db/index.ts` больше не создаёт свой пул postgres.js, а переэкспортирует общий клиент из `@dokploy/server/db`.
- Тест `__test__/db/app-db-module.test.ts` проверяет, что оба модуля отдают один и тот же клиент.
Зачем:
- Роутеры `tag`, `network` и `libsql` брали базу из `@/server/db`. В production этот модуль создавал второй пул до 10 соединений рядом с общим, поэтому панель держала до 20 соединений к Postgres вместо 10. Общий модуль уже кеширует клиент в `globalThis`, чтобы на процесс был один пул.
- На изолированном стенде под нагрузкой соединений стало 10 вместо 20, память процессов Postgres снизилась со 107 до 91 МБ.
Риски:
- Роутеры `tag`, `network` и `libsql` теперь делят пул с остальными; лимит в 10 соединений на процесс тот же, что у остальной панели. Скорость API на стенде не изменилась.
Проверки:
- Команды и результаты: `vitest run __test__/db/app-db-module.test.ts __test__/tag` проходит, новый тест на коде без правки падает; полный `vitest run`: 4293 прошли, 5 упали в `vector-validate.test.ts` (на Mac Colima не монтирует временную папку `docker run`, без правки так же); `tsc --noEmit` в `apps/dokploy` и `packages/server` без ошибок; `biome check` без замечаний. Стенд: нативный arm64-образ этой ветки против образа `AgentHits-Dev` того же коммита в Docker-in-Docker, сценарий из входа, страниц, нагрузки на API, деплоев, логов, терминалов и 120 одновременных запросов к `tag.all` и `project.all`.
- Ограничения: стенд на Mac, а не на сервере.

What:
- `apps/dokploy/server/db/index.ts` no longer creates its own postgres.js pool; it re-exports the shared client from `@dokploy/server/db`.
- The test `__test__/db/app-db-module.test.ts` checks that both modules return the same client.
Why:
- The `tag`, `network` and `libsql` routers took the database from `@/server/db`. In production that module created a second pool of up to 10 connections next to the shared one, so the panel held up to 20 Postgres connections instead of 10. The shared module already caches the client on `globalThis` to keep one pool per process.
- On the isolated bench, connections under load went from 20 to 10 and Postgres process memory from 107 to 91 MB.
Risks:
- The `tag`, `network` and `libsql` routers now share the pool with the rest; the limit of 10 connections per process is the same as for the rest of the panel. API speed on the bench did not change.
Checks:
- Commands and results: `vitest run __test__/db/app-db-module.test.ts __test__/tag` passes, the new test fails without the change; full `vitest run`: 4293 passed, 5 failed in `vector-validate.test.ts` (Colima on the Mac does not mount the `docker run` temp folder, same without the change); `tsc --noEmit` in `apps/dokploy` and `packages/server` clean; `biome check` clean. Bench: a native arm64 image of this branch against an `AgentHits-Dev` image of the same commit in Docker-in-Docker, a scenario of sign-in, pages, API load, deploys, logs, terminals and 120 concurrent `tag.all` and `project.all` requests.
- Limitations: the bench runs on a Mac, not the server.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@agentHits
agentHits merged commit 66b3a55 into AgentHits-Dev Oct 28, 2026
7 checks passed
@agentHits
agentHits deleted the fix/shared-db-pool branch October 29, 2026 00:24
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