2026-03-25 21:31:32 +05:00

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 — контейнеризация

Запуск

# поднять все сервисы
make up

# пересобрать и поднять
make build-up

# остановить
make down

# для деплоя (pull + build + up)
make deploy

Перед запуском создать сеть:

podman network create LogiflowNetwork

Скопировать .env и заполнить секреты:

cp .env.example .env

Обязательные переменные:

LOGIFLOW_DATABASE_USER=
LOGIFLOW_DATABASE_PASSWORD=
LOGIFLOW_DATABASE_NAME=
LOGIFLOW_REDIS_PASSWORD=
LOGIFLOW_JWT_KEY=

Конфигурация

Конфиг читается из configs/config.toml, переменные окружения с префиксом LOGIFLOW_ перекрывают файл.

[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.

Description
No description provided
Readme 282 KiB
Languages
Go 99.3%
Dockerfile 0.5%
Makefile 0.2%