Appearance
Компоненты стенда
Стенд Orbita — это набор Docker-контейнеров, описанный одним compose-файлом. Все стенды (on-premise, SaaS, демо) собираются из одних и тех же компонентов; различаются только env-файл, имена контейнеров и схема сетей.
Схема
┌──────────────┐
:80/:443 → │ Traefik │ TLS (Let's Encrypt), роутинг по Host/Path
└──────┬───────┘
┌──────────┬───────┼───────────┬──────────┐
▼ ▼ ▼ ▼ ▼
┌─────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│frontend │ │backend │ │ reverb │ │seaweedfs│ │ docs │
│Vue SPA │ │Laravel │ │WebSocket│ │ S3 │ │VitePress│
│(nginx) │ │(Apache)│ │ │ │ │ │(nginx) │
└─────────┘ └───┬────┘ └───┬────┘ └────────┘ └────────┘
│ │
┌─────────┬───┴────┬─────┴───┬──────────────┐
▼ ▼ ▼ ▼ ▼
┌────────┐ ┌──────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐
│database│ │redis │ │meilisearch│ │ queue │ │ scheduler │
│Postgres│ │ │ │ поиск │ │ + queue- │ │ cron-задачи│
│ 16 │ │ │ │ │ │ reports │ │ │
└────────┘ └──────┘ └───────────┘ └───────────┘ └───────────┘Сервисы
| Сервис | Образ / база | Роль | Наружу |
|---|---|---|---|
traefik | traefik | Reverse proxy, TLS-терминация (Let's Encrypt), роутинг по хостам и путям | 80, 443 |
frontend | node build → nginx | Vue SPA — статика | через Traefik |
backend | php:8.4 + Apache | Laravel API (/api, /sanctum, /storage, /login, /logout) | через Traefik |
reverb | тот же образ backend | WebSocket-сервер (Laravel Reverb), путь /app | через Traefik |
database | postgres:16-alpine | Основная БД | нет |
redis | redis | Кэш, сессии, очереди | нет |
meilisearch | getmeili/meilisearch | Полнотекстовый поиск | нет |
seaweedfs | chrislusf/seaweedfs | S3-совместимое хранилище файлов (вложения), путь /s3 | через Traefik |
queue | тот же образ backend | Воркер основной очереди (queue:work) | нет |
queue-reports | тот же образ backend | Выделенный воркер экспорта отчётов (очередь reports, 512M) | нет |
scheduler | тот же образ backend | Планировщик (schedule:work) — cron-задачи приложения | нет |
docs | node build → nginx | Пользовательская документация (VitePress) | через Traefik |
admin-docs | node build → nginx | Эта документация | через Traefik |
Контейнеры backend, reverb, queue, queue-reports, scheduler собираются из одного образа — различаются только командой запуска. Любое обновление кода требует пересборки одного образа и перезапуска всех пяти.
Именование контейнеров по стендам
| Стенд | Compose-файл | Префикс контейнеров | Env-файл |
|---|---|---|---|
| On-premise (у заказчика) | docker-compose-onpremise.yml | orbita_onpremise_* | onpremise.env |
| SaaS production | docker-compose-prod.yml | orbita_prod_* | prod.env |
| Демо app.orbitaitsm.ru (лендинг на orbitaitsm.ru) | docker-compose-orbitaitsm.yml | orbitaitsm_prod_* | orbitaitsm.env |
В командах ниже по документации используются имена on-premise стенда (orbita_onpremise_backend и т.д.) — для других стендов подставьте соответствующий префикс.
Сети
- Внутренняя сеть стенда —
database,redis,meilisearch,queue,queue-reports,schedulerподключены только к ней. Наружу они не смотрят и через Traefik недоступны. - Сеть Traefik — к ней подключены только сервисы, которые Traefik маршрутизирует:
frontend,backend,reverb,seaweedfs,docs.
Не объединяйте внутренние сети разных стендов
Если два стенда на одном сервере окажутся в общей сети, Docker DNS будет резолвить одинаковые hostname (например, database) в случайный из двух контейнеров. Это реальный пережитый инцидент («password authentication failed for user orbita»). Внутренняя сеть — строго своя у каждого стенда; общая — только сеть Traefik. Подробнее: Второй стенд на одном сервере.
Потоки данных
- HTTP-запросы: браузер → Traefik →
frontend(статика) илиbackend(/api/...). - Realtime: браузер держит WebSocket через Traefik (
/app) кreverb; backend публикует события через Redis. - Файлы: вложения хранятся в SeaweedFS (S3 API); ссылки для скачивания идут через путь
/s3того же домена. - Поиск: backend индексирует записи в Meilisearch (Laravel Scout); глобальный поиск ходит в него же.
- Фоновые задачи: backend кладёт задания в Redis-очереди;
queueразбирает основную очередь,queue-reports— тяжёлые экспорты отчётов;schedulerзапускает регулярные задачи каждую минуту.
Режимы работы
APP_MODE | Что означает |
|---|---|
onpremise | Один тенант, одна организация. Регистрация обычно закрыта, интерфейс может быть зафиксирован на одном языке (LOCALE_LOCK=ru). Работает лицензирование |
saas | Мультитенантный режим: много организаций в одной БД, управление через панель суперадмина, поддомены тенантов |