Files
aura-crm/core/README.md
T

63 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Service Center — core
Это **core**-сервис модульной платформы сервисного центра: ремонт и
продажа техники, заправка картриджей, физ/юр лица. Core владеет только тем, что
обязано быть общим — staff-идентичностью (JWT) и реестром модулей. Бизнес-логика
(приём в ремонт, склад, заказы) живёт в отдельных модулях-сервисах, которые
регистрируются здесь.
**Модули (каждый — отдельный репозиторий/рантайм):**
| Модуль | Статус | Репозиторий |
|--------|--------|-------------|
| core (этот репозиторий) | ✅ Фаза 0 | `service-center` |
| production (приём в ремонт, Kanban, гарантия) | ✅ первая версия зарегистрирована | `production` |
| site (публичный лендинг) | ✅ зарегистрирован, heartbeat здоровый | `site` |
| online-store (продажа техники) | ✅ уже в проде, не подключён к реестру | `online-store` |
Название/домен всей платформы ещё не выбраны — репозиторий и internal-хосты
временно называются `service-center`.
## Стек core
- Go + Fiber, PostgreSQL (pgx/v5 + goose), MinIO
- Auth: JWT (роли owner/manager/master), без публичной регистрации — первый
owner бутстрапится из `OWNER_*` env при пустой `staff_users`
## Контракт модуля
Модуль — независимый сервис (свой рантайм, своя БД). Чтобы подключиться к core:
1. Owner создаёт запись модуля: `POST /api/modules` (JWT owner) с телом
`{"name", "base_url", "health_path"?, "metadata"?}`. Ответ отдаёт `token`
**один раз** — сохранить в `MODULE_TOKEN` модуля, core хранит только его hash.
2. Модуль периодически шлёт `POST /api/modules/:name/heartbeat` с заголовком
`X-Module-Token: <token>` и телом `{"status": "healthy"|"unhealthy"}`.
Core не ходит к модулям сам — статус только push (модули могут жить в
разных сетях/хостингах, core не обязан до них достучаться).
3. Для проверки staff-токена модуль верифицирует JWT тем же `JWT_SECRET`
(HS256, общий секрет, см. `.env.example`) — своего auth-сервиса у модуля нет.
4. Управление: `GET /api/modules` (список+статус), `DELETE /api/modules/:name`
(отозвать) — оба owner-only.
## Разработка
```bash
docker network create platform_net # once — shared with module repos, see Контракт модуля
cp .env.example .env # заполнить секреты + OWNER_* для первого владельца
docker compose up -d --build
curl http://127.0.0.1:18090/api/health
```
На хосте с несколькими проектами backend слушает только `127.0.0.1:18090`
наружу отдаёт хостовый системный Caddy (`/etc/caddy/Caddyfile`), когда появится
домен. `Caddyfile` в корне репо — для отдельного standalone-VPS деплоя, где
у этого проекта есть весь хост (порты 80/443) для себя.
## Дорожная карта
0 — Инфраструктура + реестр модулей ✅ (этот коммит) → 1 — модуль `production` (MVP приём
в ремонт) → 2 — Документы юрлиц → 3 — Заправка картриджей → 4 — `online-store`
регистрируется как модуль → 5 — Склад → 6 — AI-приёмка → 7 — Касса → 8 — Telegram-бот →
9 — Аналитика → 10 — доп.