The "import accounts" browse was shelling out a single unbounded ldapsearch call, which failed outright with "Size limit exceeded (4)" once the directory grew past whatever sizeLimit the LDAP server enforces for this bind account. Added RFC 2696 paged results (-E pr=500/noprompt) so ldapsearch transparently walks the whole base DN in pages instead of one request that trips the limit. Separately: execFile's rejection .message is "Command failed: <full argv>\n<stderr>", and the full argv includes the bind password passed via -w — that was reaching the admin UI verbatim in the error banner shown after a failed search. Only stderr (ldapsearch's own diagnostic text, which never echoes its invocation) is now surfaced. Also fixes an unrelated image-build flake: drizzle-kit's migrate step leaves db.sqlite in SQLite's default (non-WAL) journal mode, and next build's parallel page-data-collection workers then race to perform the first-ever journal_mode=WAL switch — a mode change that, unlike ordinary statements, doesn't reliably honor busy_timeout, so one worker's pragma call throws SQLITE_BUSY regardless of the configured timeout. Switching to WAL once, single-process, right after migration avoids the race entirely. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gh2UXUQUVBWroWEnn1FLFG
top-tickets
Хелпдеск-система: тикеты, дашборд по статусам, канал Telegram, realtime-обновления без перезагрузки страницы, отдельный клиентский портал. MVP-1 — см. /root/.claude/plans/refactored-discovering-corbato.md за архитектурой и тем, что отложено на MVP-2 (email, встраиваемый виджет).
Запуск в Docker
cp .env.example .env
npm run generate-key # вставить результат в CREDENTIALS_ENCRYPTION_KEY
# заполнить ADMIN_BOOTSTRAP_EMAIL / ADMIN_BOOTSTRAP_PASSWORD / TELEGRAM_BOT_TOKEN в .env
docker compose up --build -d
Приложение слушает :8081 (уже проброшено внешним nginx на help.top-sysops.ru). При первом старте контейнер сам применяет миграции и создаёт админ-аккаунт из .env.
Локальная разработка
npm install
cp .env.example .env # + generate-key, как выше
npm run db:migrate
npm run bootstrap-admin
npm run dev
Telegram
Подключается через Настройки → Telegram в интерфейсе (или через TELEGRAM_BOT_TOKEN в .env — сработает только при первом старте, если бот ещё не настроен). Чтобы бот видел все сообщения в группе, а не только с упоминанием — @BotFather → /setprivacy → Disable.
Токен, который прислали в чат Claude Code, стоит перевыпустить (@BotFather → /revoke) — он засветился в истории сессии.