257 lines
6.8 KiB
Markdown
257 lines
6.8 KiB
Markdown
|
|
# 🚗 Система мониторинга транспорта
|
|||
|
|
|
|||
|
|
Веб-система для мониторинга местоположения транспортных средств в реальном времени.
|
|||
|
|
|
|||
|
|
## 🛠 Технологии
|
|||
|
|
|
|||
|
|
- **Backend**: FastAPI, SQLAlchemy, PostgreSQL
|
|||
|
|
- **Frontend**: Vue 3, Leaflet, Naive UI
|
|||
|
|
- **Инфраструктура**: Docker, Nginx
|
|||
|
|
|
|||
|
|
## 🚀 Быстрый старт
|
|||
|
|
|
|||
|
|
### Требования
|
|||
|
|
- Docker 20.10+
|
|||
|
|
- Docker Compose 2.0+
|
|||
|
|
|
|||
|
|
### Запуск (пошагово)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. Перейти в папку проекта
|
|||
|
|
cd transport
|
|||
|
|
|
|||
|
|
# 2. Собрать и запустить все сервисы
|
|||
|
|
docker-compose up --build -d
|
|||
|
|
|
|||
|
|
# 3. Проверить что все сервисы запущены
|
|||
|
|
docker-compose ps
|
|||
|
|
|
|||
|
|
# Должно быть 4 сервиса в статусе "Up":
|
|||
|
|
# - transport-nginx-1
|
|||
|
|
# - transport-backend-1
|
|||
|
|
# - transport-frontend-1
|
|||
|
|
# - transport-postgres-1
|
|||
|
|
|
|||
|
|
# 4. Проверить что API работает
|
|||
|
|
curl http://localhost/api/vehicles
|
|||
|
|
|
|||
|
|
# Должен вернуть JSON со списком транспорта
|
|||
|
|
|
|||
|
|
# 5. Открыть приложение в браузере
|
|||
|
|
open http://localhost
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Запуск симулятора
|
|||
|
|
|
|||
|
|
В **отдельном терминале** запустить симулятор данных:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker-compose exec backend python -m simulator.run
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Симулятор будет:
|
|||
|
|
- Генерировать координаты для 5 транспортных средств
|
|||
|
|
- Отправлять данные каждые 2 секунды
|
|||
|
|
- Имитировать движение, остановки, изменение скорости
|
|||
|
|
|
|||
|
|
Для остановки: `Ctrl+C`
|
|||
|
|
|
|||
|
|
### Доступ
|
|||
|
|
|
|||
|
|
| Сервис | URL |
|
|||
|
|
|--------|-----|
|
|||
|
|
| Приложение | http://localhost |
|
|||
|
|
| API | http://localhost/api/ |
|
|||
|
|
| API Docs (Swagger) | http://localhost/api/docs |
|
|||
|
|
| WebSocket | ws://localhost/ws/positions |
|
|||
|
|
|
|||
|
|
## 🔧 Полезные команды
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Посмотреть логи всех сервисов
|
|||
|
|
docker-compose logs -f
|
|||
|
|
|
|||
|
|
# Посмотреть логи только backend
|
|||
|
|
docker-compose logs -f backend
|
|||
|
|
|
|||
|
|
# Перезапустить сервис
|
|||
|
|
docker-compose restart backend
|
|||
|
|
|
|||
|
|
# Остановить все сервисы
|
|||
|
|
docker-compose down
|
|||
|
|
|
|||
|
|
# Остановить и удалить данные (включая БД)
|
|||
|
|
docker-compose down -v
|
|||
|
|
|
|||
|
|
# Пересобрать конкретный сервис
|
|||
|
|
docker-compose up --build backend -d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📡 Работа с API
|
|||
|
|
|
|||
|
|
### Создать транспорт
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost/api/vehicles \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"name": "Автобус А-999", "type": "bus"}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Отправить позицию
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost/api/ingest/position \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"vehicle_id": 1,
|
|||
|
|
"lat": 55.0304,
|
|||
|
|
"lon": 82.9204,
|
|||
|
|
"speed": 45.5,
|
|||
|
|
"heading": 180
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Получить список транспорта
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost/api/vehicles
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Получить историю позиций
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost/api/vehicles/1/positions?from=2025-12-18T00:00:00"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Получить события
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost/api/events
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📁 Структура проекта
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
transport/
|
|||
|
|
├── docker-compose.yml # Конфигурация Docker
|
|||
|
|
├── nginx/ # Nginx конфигурация
|
|||
|
|
│ ├── nginx.conf
|
|||
|
|
│ └── conf.d/default.conf
|
|||
|
|
├── backend/
|
|||
|
|
│ ├── Dockerfile
|
|||
|
|
│ ├── requirements.txt
|
|||
|
|
│ ├── app/ # FastAPI приложение
|
|||
|
|
│ │ ├── main.py # Точка входа
|
|||
|
|
│ │ ├── models/ # SQLAlchemy модели
|
|||
|
|
│ │ ├── schemas/ # Pydantic схемы
|
|||
|
|
│ │ ├── routers/ # API эндпоинты
|
|||
|
|
│ │ └── services/ # Бизнес-логика
|
|||
|
|
│ ├── alembic/ # Миграции БД
|
|||
|
|
│ └── simulator/ # Симулятор данных
|
|||
|
|
│ └── run.py
|
|||
|
|
└── frontend/
|
|||
|
|
├── Dockerfile
|
|||
|
|
├── package.json
|
|||
|
|
└── src/
|
|||
|
|
├── main.js
|
|||
|
|
├── App.vue # Главный компонент
|
|||
|
|
└── components/ # Vue компоненты
|
|||
|
|
├── MapView.vue
|
|||
|
|
├── VehicleList.vue
|
|||
|
|
├── VehicleCard.vue
|
|||
|
|
├── TrackHistory.vue
|
|||
|
|
└── EventFeed.vue
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔌 REST API
|
|||
|
|
|
|||
|
|
| Метод | URL | Описание |
|
|||
|
|
|-------|-----|----------|
|
|||
|
|
| GET | /api/vehicles | Список транспорта с последними позициями |
|
|||
|
|
| GET | /api/vehicles/{id} | Информация о конкретном ТС |
|
|||
|
|
| POST | /api/vehicles | Создать новое ТС |
|
|||
|
|
| PUT | /api/vehicles/{id} | Обновить ТС |
|
|||
|
|
| DELETE | /api/vehicles/{id} | Удалить ТС |
|
|||
|
|
| GET | /api/vehicles/{id}/positions | История позиций ТС |
|
|||
|
|
| POST | /api/ingest/position | Принять новую позицию |
|
|||
|
|
| GET | /api/events | Список событий |
|
|||
|
|
|
|||
|
|
### Типы транспорта
|
|||
|
|
|
|||
|
|
| type | Иконка |
|
|||
|
|
|------|--------|
|
|||
|
|
| `bus` | 🚌 |
|
|||
|
|
| `truck` | 🚚 |
|
|||
|
|
| `car` | 🚗 |
|
|||
|
|
|
|||
|
|
## 📨 WebSocket API
|
|||
|
|
|
|||
|
|
Подключение: `ws://localhost/ws/positions`
|
|||
|
|
|
|||
|
|
### Формат сообщений
|
|||
|
|
|
|||
|
|
**Обновление позиции:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"type": "position_update",
|
|||
|
|
"data": {
|
|||
|
|
"vehicle_id": 1,
|
|||
|
|
"lat": 55.0304,
|
|||
|
|
"lon": 82.9204,
|
|||
|
|
"speed": 45.5,
|
|||
|
|
"heading": 180,
|
|||
|
|
"timestamp": "2025-12-18T12:00:00Z"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Событие:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"type": "event",
|
|||
|
|
"data": {
|
|||
|
|
"id": 1,
|
|||
|
|
"vehicle_id": 1,
|
|||
|
|
"type": "OVERSPEED",
|
|||
|
|
"payload": {"speed": 95, "limit": 60},
|
|||
|
|
"timestamp": "2025-12-18T12:00:00Z"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Типы событий
|
|||
|
|
|
|||
|
|
| Тип | Описание |
|
|||
|
|
|-----|----------|
|
|||
|
|
| `OVERSPEED` | Превышение скорости (> 60 км/ч) |
|
|||
|
|
| `LONG_STOP` | Остановка более 5 минут |
|
|||
|
|
| `CONNECTION_LOST` | Нет данных более 5 минут |
|
|||
|
|
|
|||
|
|
## 🐛 Troubleshooting
|
|||
|
|
|
|||
|
|
### API возвращает 404
|
|||
|
|
```bash
|
|||
|
|
# Проверить что backend запущен
|
|||
|
|
docker-compose ps
|
|||
|
|
|
|||
|
|
# Перезапустить nginx
|
|||
|
|
docker-compose restart nginx
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Нет данных на карте
|
|||
|
|
```bash
|
|||
|
|
# Проверить что симулятор запущен
|
|||
|
|
docker-compose exec backend python -m simulator.run
|
|||
|
|
|
|||
|
|
# Проверить логи backend
|
|||
|
|
docker-compose logs -f backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Ошибка подключения к БД
|
|||
|
|
```bash
|
|||
|
|
# Проверить что postgres запущен
|
|||
|
|
docker-compose ps postgres
|
|||
|
|
|
|||
|
|
# Посмотреть логи postgres
|
|||
|
|
docker-compose logs postgres
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📝 Лицензия
|
|||
|
|
|
|||
|
|
MIT
|