You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Пачка правок надёжности процесса и env-footguns из архитектурного ревью.
Нет глобальных обработчиков rejection/exception
Grep по коду: нигде нет process.on('unhandledRejection' | 'uncaughtException'). Случайный rejection роняет процесс с не-pino стек-трейсом и exit до SIGTERM-пути. Фикс: добавить обработчики, логирующие через pino, затем аккуратный выход.
server.close() висит на keep-alive
src/index.ts:380-406 graceful shutdown хорош, но server.close() не завершится при idle keep-alive-соединениях → регулярно упирается в 10s force-exit exit(1). Фикс: явный server.closeIdleConnections() (Node ≥18.2).
Молчаливое проглатывание ошибок
src/domain/aliases/service.ts:142-144 (pruneExpired): catch {} без лога — падающий алиас ретраится ежечасно вечно без наблюдаемости. Логировать warn с адресом.
src/domain/mailboxes/dockerode-dms-client.ts:134-137 (listJunk): любой сбой (включая «DMS down») мапится в «пустой карантин» на debug. Различать «папки нет» (ожидаемо) и exec/transport-сбой (warn/пропагировать).
Env-footguns
resolveDockerOptions (lib/docker.ts:16-27) ждёт DOCKER_HOST вида tcp(s)://; значение unix:///var/run/docker.sock даёт {host:'', port:2375} — молча ломается. Гардить на protocol, для unix: уходить в socketPath.
Частичный OIDC-конфиг молча отключает SSO (index.ts:226): задан 1-3 из 4 переменных — кнопки SSO просто нет. Логировать warn (или fail-fast) при «часть задана».
WEBMAIL_URL: z.url() но RSPAMD_UI_URL: z.string() (env.ts:54 vs :74) — унифицировать на z.url().
Косметика: DATABASE_URL — это путь к файлу, не URL; переименовать в DATABASE_PATH до миграции на Postgres (PostgreSQL storage option #16), чтобы не создавать путаницу.
Пачка правок надёжности процесса и env-footguns из архитектурного ревью.
Нет глобальных обработчиков rejection/exception
Grep по коду: нигде нет
process.on('unhandledRejection' | 'uncaughtException'). Случайный rejection роняет процесс с не-pino стек-трейсом и exit до SIGTERM-пути.Фикс: добавить обработчики, логирующие через pino, затем аккуратный выход.
server.close()висит на keep-alivesrc/index.ts:380-406graceful shutdown хорош, ноserver.close()не завершится при idle keep-alive-соединениях → регулярно упирается в 10s force-exitexit(1).Фикс: явный
server.closeIdleConnections()(Node ≥18.2).Молчаливое проглатывание ошибок
src/domain/aliases/service.ts:142-144(pruneExpired):catch {}без лога — падающий алиас ретраится ежечасно вечно без наблюдаемости. Логироватьwarnс адресом.src/domain/mailboxes/dockerode-dms-client.ts:134-137(listJunk): любой сбой (включая «DMS down») мапится в «пустой карантин» наdebug. Различать «папки нет» (ожидаемо) и exec/transport-сбой (warn/пропагировать).Env-footguns
resolveDockerOptions(lib/docker.ts:16-27) ждётDOCKER_HOSTвидаtcp(s)://; значениеunix:///var/run/docker.sockдаёт{host:'', port:2375}— молча ломается. Гардить на protocol, дляunix:уходить вsocketPath.index.ts:226): задан 1-3 из 4 переменных — кнопки SSO просто нет. Логироватьwarn(или fail-fast) при «часть задана».WEBMAIL_URL: z.url()ноRSPAMD_UI_URL: z.string()(env.ts:54vs:74) — унифицировать наz.url().DATABASE_URL— это путь к файлу, не URL; переименовать вDATABASE_PATHдо миграции на Postgres (PostgreSQL storage option #16), чтобы не создавать путаницу.