Files
logiflow/README.md

114 lines
3.8 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.
# Logiflow
Бэкенд для логистической платформы. Управление заказами на перевозку, водителями, транспортом и складами. При создании заказа строится реальный маршрут через OSRM, считается стоимость перевозки, трекинг водителя в реальном времени через WebSocket.
## Стек
- **Go 1.25** — Chi v5, oapi-codegen, pgx/v5, go-redis
- **PostgreSQL** — миграции через Goose
- **Redis** — хранение JWT access/refresh токенов
- **Nominatim** — геокодинг адресов (OpenStreetMap, без ключа)
- **OSRM** — построение маршрутов и расчёт дистанции
- **Prometheus + Grafana** — мониторинг
- **Podman** — контейнеризация
## Запуск
```bash
# поднять все сервисы
make up
# пересобрать и поднять
make build-up
# остановить
make down
# для деплоя (pull + build + up)
make deploy
```
Перед запуском создать сеть:
```bash
podman network create LogiflowNetwork
```
Скопировать `.env` и заполнить секреты:
```bash
cp .env.example .env
```
Обязательные переменные:
```
LOGIFLOW_DATABASE_USER=
LOGIFLOW_DATABASE_PASSWORD=
LOGIFLOW_DATABASE_NAME=
LOGIFLOW_REDIS_PASSWORD=
LOGIFLOW_JWT_KEY=
```
## Конфигурация
Конфиг читается из `configs/config.toml`, переменные окружения с префиксом `LOGIFLOW_` перекрывают файл.
```toml
[pricing]
baseFee = 5000.0 # базовая ставка, руб
perKm = 100.0 # руб/км
perKg = 15.0 # руб/кг
perM3 = 600.0 # руб/м³
```
Цена заказа считается по формуле:
```
total = baseFee + distance_km * perKm + weight_kg * perKg + volume_m3 * perM3
```
## Роли
| Роль | Возможности |
|---|---|
| `client` | Создаёт заказы, следит за своими заявками |
| `driver` | Меняет свой статус, видит назначенные маршруты |
| `manager` | Назначает водителей на заказы |
| `admin` | Создаёт профили водителей и менеджеров, видит всё |
Клиенты регистрируются сами через `POST /auth/register`. Водителей и менеджеров создаёт только администратор.
## Авторизация
JWT (HS256) + refresh токены. Access токен живёт 24 часа, refresh — 7 дней в HTTP-only cookie. Оба хранятся в Redis — при логауте удаляются.
```
Authorization: <access_token>
```
## Флоу заказа
```
Клиент создаёт заказ (адреса → Nominatim → координаты → OSRM → маршрут)
Менеджер назначает водителя (pending → assigned)
Водитель начинает поездку (assigned → in_transit)
Трекинг по WebSocket — current_index двигается по массиву координат
Водитель завершает (in_transit → delivered)
```
## Структура БД
```
users
├── drivers (user_id) → vehicles
└── managers (user_id) → warehouses
orders (created_by_id → users, driver_id → drivers, manager_id → managers)
└── routes (order_id) — JSONB координаты маршрута, current_index
notifications (user_id → users)
```
Сервер поднимается на `localhost:3001`, Grafana на `localhost:3000`, Prometheus на `localhost:9090`.