Серверы · Каналы · Сообщения · Realtime · Operator-friendly
Статус: 🟢 LIVE in production (с 12.05.2026) →
https://app.star-crm.ru/eclipse-chat/v0.4 (Server / Member / invite end-to-end) завершён + path-based deploy на VPS Star CRM. Дальше — v0.5 UX polish (show password + user profile с avatar). Полная карта в ROADMAP.md.
Eclipse Chat — self-hosted чат с прицелом на:
- Свои данные у владельца — no cloud, no telemetry, no third-party SDK
- Каналы и серверы как control surface — для команд и операторов
- Bot/operator-friendly архитектура — Member может быть не только человеком, но и ботом/AI-агентом (см. §v0.10 в ROADMAP)
- Сначала текст и модель, потом голос/видео — приоритет фундаментальной модели Server → Member → Channel → Message
Это не Discord-клон. Discord-визуал — это поверхность, под ней — платформа для операторских workflow.
| Слой | Технологии |
|---|---|
| Frontend | React 19 · TypeScript 5 · Vite 6 · socket.io-client |
| Backend | Node.js · Fastify 5 · Socket.io 4 · Prisma 6 · JWT (@fastify/jwt) · zod |
| БД | SQLite (через Prisma) — migration на PostgreSQL в v0.6 |
| Auth | JWT access (15 мин) + refresh token (SHA-256 hash в БД, ротация) |
Что в roadmap но ещё НЕТ: PostgreSQL, Redis, MinIO, LiveKit, Tailwind, Zustand, Docker Compose, Caddy — всё в ROADMAP.md.
eclipse-chat/
├── apps/
│ ├── server/ — Fastify + Prisma + Socket.io backend
│ │ ├── prisma/
│ │ │ ├── schema.prisma — 4 модели: User, RefreshToken, Channel, Message
│ │ │ └── seed.ts — создаёт #general
│ │ ├── src/
│ │ │ ├── index.ts — Fastify + Socket.io bootstrap
│ │ │ ├── db.ts — Prisma client
│ │ │ ├── realtime.ts — emit helpers (message:new)
│ │ │ ├── auth/
│ │ │ │ ├── refresh.ts — refresh token hash/store/find/delete
│ │ │ │ └── socketAuth.ts — JWT middleware для Socket.io
│ │ │ └── routes/
│ │ │ ├── auth.ts — register / login / refresh / logout / me
│ │ │ └── channels.ts — каналы и сообщения
│ │ └── package.json
│ └── web/ — React 19 SPA
│ ├── src/
│ │ ├── App.tsx — MVP single-file (split в v0.5)
│ │ ├── main.tsx
│ │ └── index.css — inline styles, без Tailwind пока
│ ├── vite.config.ts — dev proxy /api + /socket.io → :3001
│ └── package.json
└── packages/
└── shared/ — заглушка, наполнится в v0.4 (общие типы)
Корень — package.json с npm workspaces.
- ✅
GET /health— service ping - ✅
GET /api/health— ping + DB check - ✅
GET /api/version—@eclipse-chat/server v0.3.0 - ✅
POST /api/auth/register— создаёт User + выдаёт access (15m) + refresh - ✅
POST /api/auth/login— выдаёт access + refresh (инвалидирует все предыдущие refresh) - ✅
POST /api/auth/refresh— body{ refreshToken }, ротирует refresh, выдаёт новую пару - ✅
POST /api/auth/logout— отзывает все refresh-токены user'а - ✅
GET /api/auth/me— текущий user по Bearer - ✅
GET /api/channels— список всех каналов - ✅
POST /api/channels— создание (со slug-генерацией + auto-retry на коллизии) - ✅
GET /api/channels/:id/messages?take=N— последние N (max 100, default 50) - ✅
POST /api/channels/:id/messages— отправка сообщения + Socket emit - ✅ Socket.io: handshake auth через JWT, rooms
channel:${id}, emitmessage:new,channel:join/channel:leave
Refresh-токены хранятся как SHA-256 hash в БД — это правильно, исходный токен не утечёт даже при компрометации dev.db.
- ✅ Auth flow: вход / регистрация / logout / автоматический refresh при 401
- ✅ Подключение Eclipse DnD Forge из меню профиля или настроек через PKCE S256; новый пользователь может создать аккаунт прямо в authorize-flow
- ✅ Список каналов + создание канала
- ✅ Быстрый preset
Реклама: аудит → согласование → проверкадля EXECUTION-комнаты: название и безопасный workflow заполняются автоматически, а бюджет не меняется без явного approval - ✅ Growth Command Room: draft создаётся прямо в Chat и проходит пять фиксированных AI Hub ролей по одному явному шагу; per-user budget, timeout/cancel, optimistic versioning и ручное approval работают без provider-ключей в браузере, tools и автопубликации
- ✅ Deck Review Room: импортирует утверждённый
deck.job.v1из AI Hub, сбрасывает исходный approval и требует независимой проверки фактов, прав и каждого слайда внутри workspace; после решения команды создаёт детерминированный editable PPTX без внешних tools и публикации - ✅ Builder Review Room: принимает только утверждённый
builder.project.v1, повторно блокирует build queue и требует workspace-scoped review требований, preview и security boundary; Chat не ставит зависимости, не запускает код, не подключает GitHub и не делает deploy - ✅ Выбор канала + загрузка истории + отправка сообщения
- ✅ Realtime: новые сообщения через Socket.io
- ✅ Token storage в localStorage с миграцией legacy ключа
eclipse_chat_token→eclipse_chat_access
Сейчас весь web в одном App.tsx (557 строк). Split в v0.5 —
см. ROADMAP.
См. docs/DEVELOPMENT.md — пошаговая инструкция. Контракт единого аккаунта с DnD Forge описан в docs/dnd-account-connection.md. Для рекламного workflow границы evidence/diff/approval/rollback описаны в docs/advertising-execution-room.md.
Коротко:
# 1. .env
cp apps/server/.env.example apps/server/.env
# подставить JWT_SECRET и (опционально) CORS_ORIGIN
# 2. Подготовка БД (из корня)
npm install
npm run db:push # создать таблицы SQLite
npm run db:seed # канал #general
# 3. Два терминала
npm run dev:server # :3001 Fastify + Socket.io
npm run dev:web # :5173 Vite (proxy /api + /socket.io → :3001)Открыть http://localhost:5173 — там MVP UI.
- docs/API.md — все реализованные REST endpoints с примерами запросов/ответов
- docs/SOCKET_EVENTS.md — все реализованные
Socket.io события (правильный colon-naming:
channel:join,message:new)
Не реализованные events / endpoints (servers, DMs, reactions, files, typing, presence, edit/delete) — в ROADMAP.md.
model User {
id String @id @default(cuid())
email String @unique
passwordHash String
displayName String
createdAt DateTime @default(now())
messages Message[]
refreshTokens RefreshToken[]
}
model RefreshToken {
id String @id @default(cuid())
tokenHash String @unique
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
expiresAt DateTime
createdAt DateTime @default(now())
}
model Channel {
id String @id @default(cuid())
name String
slug String @unique
createdAt DateTime @default(now())
messages Message[]
}
model Message {
id String @id @default(cuid())
content String
createdAt DateTime @default(now())
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
channelId String
channel Channel @relation(fields: [channelId], references: [id], onDelete: Cascade)
}Будущее расширение (Server, Member, Reaction, DirectMessage,
enums MemberRole/ChannelType/UserStatus) — в
ROADMAP § v0.4.
| Команда (из корня) | Описание |
|---|---|
npm run typecheck |
TypeScript по всем workspaces |
npm run build |
Production build server + web |
npm run dev:server |
Backend на :3001 (tsx watch) |
npm run dev:web |
Frontend на :5173 (Vite + proxy) |
npm run db:push |
Prisma schema → SQLite |
npm run db:seed |
Канал #general |
Полная дорожная карта — ROADMAP.md.
Главный следующий шаг (v0.4): Server / Member / invite-flow.
Без него Eclipse Chat — одна общая комната, что не соответствует vision
«self-hosted communication core».
Eclipse Chat uses the local eclipse-forge.visual-system.v1 snapshot in the operational profile: shared deep-black, signal-blue and warm-gold brand tokens with a quiet 2 px signal line. Dense communication and admin surfaces keep their existing fast motion and do not inherit cinematic cursor or parallax effects.
В Agent Office появился отдельный workspace Spec Review. Оператор импортирует только утверждённый eclipse.spec-gate.v1 из AI Hub. Сервер повторно валидирует exact schema, размер, порядок стадий, безопасные evidence paths и запрет внешних действий. Upstream approval намеренно сбрасывается: участник workspace с TASK_APPROVE отдельно подтверждает scope, риски и rollback.
Импорт и review tenant-scoped, имеют rate limit, idempotency key, optimistic version и metadata-only audit. Комната не запускает агента, shell, GitHub, deploy, публикацию или платёж.