Root cause of "no toast, no sound, no live updates" reported in production: the ticket-event EventEmitter was only stashed on globalThis in development (to survive Next.js's dev-mode hot reload). The comment explaining that assumed production only loads the module once — true for a simple Node require() cache, but Turbopack's route-level bundling can inline this small shared module separately into each route's own output chunk instead of pointing them at one shared instance. So /api/events (the SSE endpoint) and whatever publishes an event (ticket creation, mail ingestion, agent replies, ...) were each getting their own private, disconnected EventEmitter — the SSE connection itself worked fine (heartbeats arrived reliably, confirmed via the browser's Network tab), but no actual ticket.created/message.created event ever reached a subscriber. Now globalThis is always used as the singleton home, regardless of NODE_ENV — verified locally end-to-end: streamed /api/events with curl while creating a ticket via the API, and the ticket.created + message.created events arrived on the stream immediately. 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) — он засветился в истории сессии.