Root cause of the regressions reported after the Web Push feature landed (chat messages not appearing until refresh, notifications stopping entirely — even in-page toast/sound, which has nothing to do with push): the fire-and-forget push call in appendMessage() had no .catch(). This app has no global unhandledRejection handler, and Node terminates the whole process on an unhandled rejection by default — so any error inside notifyPushForCustomerMessage() (e.g. the unguarded db.query.users.findMany() call, which can hit SQLITE_BUSY under concurrent load, something this exact codebase has already hit elsewhere) would crash the entire server on every customer message, not just fail that one push send. Docker's restart policy masked it as "weird flakiness" rather than an obvious crash loop. Two fixes: the push call now has a .catch() so a failure there can never escape as an unhandled rejection, and — as a general safety net, since this codebase had no equivalent to project-claude's uncaughtException/unhandledRejection handlers — instrumentation.ts now logs-and-continues on both, so a future bug in any other fire-and-forget path can't take the whole server down either. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012o9j9RezxbZVKQMrB7oRLY
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) — он засветился в истории сессии.