Речь пойдет про свободную платформу “Traccar”. О том, как развернуть серверную часть на своем железе или на VPS,
как всегда, с помощью Docker
. Установим на смартфон 2 приложения: административное и GPS трекер. Настроим уведомления
в телеграм на события въезда или выезда из заранее размеченной геозоны.
Вступление и мотивация
Для кого это все
Функционал отслеживания местоположения чего бы то ни было может понадобиться многим:
- Родители хотят отслеживать местоположение своего ребенка через смартфон.
- Путешественники хотят записывать маршруты, проделанные пешком или на любом другом транспорте.
- Владельцы малого бизнеса по грузоперевозкам хотят мониторить автопарк.
- Беспокойные владельцы автомобиля, мотоцикла, самоката, велосипеда и другого транспорта хотят быть уверенными, что их техника не покинула пределы гаража или парковочного места. А в случае кражи (угона) хотят знать ее местоположение.
Применения подобному функционалу можно придумать множество, и в данной статье речь пойдет о том, как это реализовать на практике. Т.е. настроить сервер и клиентские части.
О Traccar
Все вышеперечисленные хотелки с лихвой покроет Traccar - современная платформа для GPS слежения.
Достоинства:
- Open source, открытый исходный код (GPL-3.0, Apache-2.0)
- Self-hosted, т.е. возможность размещения серверной части продукта на своем сервере
- Огромный список поддерживаемых протоколов и устройств gps трекеров различных поставщиков, от недорогих и до высококачественных брендов
- Предоставляет для работы настольный административный веб интерфейс, мобильные приложения ios, android, а также отдельные мобильные приложения ios и android для использования в качестве GPS-трекеров
- Просмотр в режиме реального времени местоположения устройств
- Позволяет гибко настраивать уведомления по Email, SMS,
Telegram
о различных событиях, произошедших в системе, таких как вход или выход в обозначенную геозону, статусы онлайн/офлайн, движение, скорость. А для профессиональных устройств более детальные оповещения, вроде уровня топлива, зажигания, и много других вещей, больше скорее предназначенных для мониторинга автопарка - Предоставляет API интерфейсы для интеграции со сторонними системами
- Построение графиков и отчетов о проделанных поездках, отображение на карте и воспроизведение записанных маршрутов
Разработчики проекта монетизируют его за счет продажи хостинга под него и оказания профессиональной поддержки.
Компоненты
Используем только свободные решения
Безусловно, для личных нужд можно купить одно из готовых устройств GPS-трекеров, представленных на рынке. Для большинства производителем будет предоставлена готовая проприетарная серверная часть, куда устройство с завода настроено слать координаты, и откуда пользователь эти данные должен просматривать. Возможно это удобно, но это не наш путь. Координаты наших детей, близких, характер передвижения нашего транспорта и нас самих будет предоставляться третьим лицам. Эта информация владельцами сервиса может быть использована недобросовестно. Например, может быть перепродана. С их серверов могут произойти утечки. Владельцы могут наложить санкции, заблокировав доступ по принципу местоположения. Бизнес может обанкротиться, сервера отключат. Или на сервере спустя время обновится ПО, внезапно перестав поддерживать ваше оборудование, вынуждая купить новую модель.
Чтобы избежать всех вышеперечисленных рисков, необходимо такие чувствительные данные как местоположение хранить на своих серверах. Поэтому из аналогов рассматриваем только open source и self-hosted продукты.
Аналоги
- OwnTracks https://owntracks.org. Достойное решение,
больше предназначенное для отслеживания местоположения близких и друзей через их смартфоны. Если вы ищете безопасный
функционал для мониторинга местоположения своего ребенка, то стоит рассмотреть именно его. В свою очередь
Traccar
поддерживает прием данных из клиентского приложенияOwnTracks
. В экосистеме есть серверная часть (хранилище), а такжеFrontend
(веб интерфейс на VueJs),Ios
,Android
. - μlogger. Клиент на android +
серверная часть. Решение в виде приложения только для
android
, которое пишет координаты на заданныйсервер
. Просто и незамысловато. Сервер монолитно и хранит данные, и предоставляет веб интерфейс. - GPSLogger for Android https://gpslogger.app. Только клиентское приложение и только
для
android
. Приложение пишет координаты локально на устройство, может выгружать дамп в облако, поftp
, а также можно настроить отправку координат на любой адрес поhttp
, что позволяет быстро подружить его при желаниисо своим бэкендом
.
Настройка сервера
Для развертывания серверной части нам потребуется машина с дистрибутивом на базе linux на борту.
Подойдет любой современный дистрибутив с относительно свежим ядром, чтобы можно было установить docker
.
Это может быть как арендованный VPS, так и например ваш собственный домашний сервер. Подойдет даже
Raspberry Pi с ее arm
архитектурой.
Я же в качестве примера буду использовать арендованный VPS с Ubuntu 20.04.5 LTS
на борту, и далее все примеры
будут адаптированы именно к ubuntu.
Арендовать недорогой и надежный VPS для личных нужд можно тут.
Установка Docker
Следуем инструкциям по установке на сайте докера для своего дистрибутива, после чего выполняем пост инсталляционные действия.
Далее следует установить docker-compose
либо из пакетного менеджера вашего дистрибутива,
либо по инструкции с официального сайта.
В моем случае на убунте удобнее поставить из пакетного менеджера:
sudo apt install docker-compose -y
Установка Traccar
Подготовка директорий под конфиги
На нашем сервере необходимо выделить директорию, где мы будем хранить конфигурационные файлы docker
.
Я обычно в домашней директории текущего пользователя создаю директорию ~/docker
, в которой уже создаю отдельную директорию
под каждое разворачиваемое на сервере решение, для порядка. В нашем случае конечная директория будет ~/docker/traccar
.
Также нам понадобятся директории для монтирования внутрь контейнера под конфиги ~/docker/traccar/conf
и под логи ~/docker/traccar/logs
. Создадим все директории одной командой:
mkdir -p ~/docker/traccar/{conf,logs}
docker-compose.yml
Запускать Traccar
мы будем из официального докер образа (ссылки:
Github,
Docker hub). По умолчанию
контейнер настроен на работу с H2 Database
, но для боевой эксплуатации
рекомендовано использовать связку с Mysql
.
Для этого нам необходимо запустить рядом с Traccar
контейнером еще контейнер mysql:8.0.31
. Именно версии
mysql:8.0.31, т.к. тут уже есть поддержка arm
архитектуры, т.е. будет работать на Raspberry PI
.
Создадим ~/docker/traccar/docker-compose.yml
со следующим содержимым:
---
version: '3'
services:
traccar:
image: traccar/traccar:latest
restart: unless-stopped
depends_on:
- mysql
ports:
- '80:8082'
- '5000-5150:5000-5150'
- '5000-5150:5000-5150/udp'
volumes:
- ./data/logs:/opt/traccar/logs:rw
- ./conf/traccar.xml:/opt/traccar/conf/traccar.xml:ro
mysql:
image: mysql:8.0.31
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
environment:
MYSQL_USER: mysqlUser
MYSQL_PASSWORD: mySecretPassword
MYSQL_DATABASE: traccar
MYSQL_RANDOM_ROOT_PASSWORD: 1
volumes:
- traccar-mysql-volume:/var/lib/mysql
volumes:
traccar-mysql-volume:
В нем мы описали сервис traccar
, который будет запущен из официального образа. Внутрь монтируется пустая директория
под логи, и xml файл с конфигом, который создадим на следующем шаге. Также прокидываем ряд портов:
80
порт хостовой машины прокидываем на порт8082
контейнера, на котором находится веб интерфейсtcp
иudp
порты5000-5150
с хостовой машины прокидываем как есть внутрь контейнера. Все эти порты нужны для поддержки всего зоопарка устройств, которые могут делиться своими координатами
Далее мы описали сервис mysql
, в который примонтировали ниже описанный том, названный нами traccar-mysql-volume
в
директорию /var/lib/mysql
. Здесь mysql хранит свое состояние, и данное монтирование обеспечит нам его сохранение
при перезапуске контейнера. Порт 3306
, на котором работает mysql, мы намеренно не будем расшаривать на хостовую машину
потому, что описанные контейнеры будут находиться друг с другом в одной docker сети. Контейнер traccar
итак беспрепятственно может обращаться к контейнеру mysql
по алиасу сервиса.
Конфиг
Создадим файл конфига ~/docker/traccar/conf/traccar.xml
со следующим содержимым:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE properties SYSTEM 'http://java.sun.com/dtd/properties.dtd'>
<properties>
<entry key='config.default'>./conf/default.xml</entry>
<!-- настройки подключения к базе данных mysql -->
<entry key='database.driver'>com.mysql.cj.jdbc.Driver</entry>
<entry key='database.url'>jdbc:mysql://mysql:3306/traccar?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8&sessionVariables=sql_mode=''</entry>
<entry key='database.user'>mysqlUser</entry>
<entry key='database.password'>mySecretPassword</entry>
<!-- настройки telegram -->
<entry key='notificator.types'>telegram</entry>
<entry key='notificator.telegram.key'>token</entry>
<entry key='notificator.telegram.chatId'>userId</entry>
</properties>
Как переключить дефолтный конфиг на работу с mysql описано тут.
К настройкам telegram
вернемся чуть позже.
Хоть порт mysql и не торчит наружу, оставаясь лишь доступным внутри docker сети,
рекомендую заменить пароль в обоих файлах демонстрационный mySecretPassword
на безопасный, сложный пароль.
Запуск
Все готово, можно запускать:
docker-compose up -d
Далее проверим, все ли корректно запустилось командой:
docker-compose ps
У обоих контейнеров в колонке STATUS
должен быть статус running
.
Запустим веб интерфейс, введя в браузере ip адрес вашего сервера http://ip-адрес-сервера
.
Должен открыться веб интерфейс. Вводим логин admin
и пароль admin
, входим.
Первым делом сменим пароль администратора на надежный в разделе Настройки -> Аккаунт
.
Настройка клиентов
Настройка клиента трекера
Трекером, т.е. устройством, которое сообщает о своих координатах на сервер, может выступать любой девайс из огромного списка поддерживаемых устройств. Мы же настроим официальное мобильное приложение под android. Есть также приложение под ios, а также скрытое приложение под android.
Установим Traccar Client из Google play.
Нас интересуют в первую очередь настройки:
URL сервера
, вводимhttp://ip-адрес-вашего-сервера:5055
. Порт5055
открыт на сервере, и ожидает, что туда будут прилетать координаты с клиента.Идентификатор устройства
уже любезно сгенерирован, на скриншоте520794
. Необходимо его будет далее зарегистрировать на сервере, чтобы сервер о нем знал и записывал присылаемые координаты. При желании id на клиенте можно изменить на собственный.
Устанавливаем переключатель состояния сервиса в активное положение, после чего приложение начинает периодически отправлять координаты на сервер. Частоту отправки и другие настройки можно настроить по желанию.
Регистрация девайса
Для добавления девайса на сервере перейдем на веб интерфейс Настройки -> Устройства -> Добавить устройство
.
Зададим удобное для отображения Имя
устройства, а в поле Идентификатор
внесем
Идентификатор устройства
, ранее полученный в мобильном приложении клиента:
Теперь сервер принимает и записывает координаты от известного ему устройства, и мы можем увидеть на карте свое местоположение:
По прошествии времени можно строить отчеты в веб интерфейсе о проделанных маршрутах:
Есть и альтернативные клиенты, настраиваемые аналогичным образом.
Настройка клиента менеджера
Существуют мобильные приложения под android и ios c функционалом веб интерфейса. По сути это и есть веб интерфейс, завернутый в мобильное приложение.
Установим Traccar Manager из Google play.
На старте приложение попросит ввести адрес вашего сервера, которым оно будет управлять. Вводим http://ip-адрес-сервера
,
далее логин и пароль администратора. Увидим уже знакомый интерфейс в миниатюре:
Нотификации в телеграм по гео зонам
Добавление геозоны
Для начала разметим на карте геозону, т.е. местность, по входу в которую и/или
выходя из которой мы хотим получать уведомление, в нашем случае в телеграм. Перейдем в
Настройки -> Геозоны
, разметим интересующую нас область и сохраним.
Добавление уведомлений
Далее нужно создать нотификации. Зайдем в Настройки -> Уведомления
, и добавим следующие нотификации:
- Тип уведомления: Вход в геозону, Канал: Telegram
- Тип уведомления: Выход из геозоны, Канал: Telegram
Привязка к устройству
Привяжем к устройству ранее созданную геозону и уведомления. Для этого зайдем в
Редактирование устройства -> Соединения
. В геозонах выберем нашу геозону, и в
уведомлениях выберем оба события вход/выход.
Со стороны Traccar
все готово к отправке уведомлений. Тригеры входа девайса в зону и выхода из обозначенной зоны
работают, осталось внести настройки в конфиг для получения уведомлений в телеграм.
Настройка телеграм бота
Создание бота
Необходимо создать телеграм бота, от имени которого Traccar
будет отправлять нам уведомления. Делается
это через сервисный аккаунт телеграма по созданию ботов @botfather.
Там все интуитивно понятно, надо выбрать создание нового бота, выбрать ему имя, никнейм, пошагово все, что попросит
бот по созданию ботов. В конце будет выдан токен для взаимодействия с ботом вида:
4839574812:AAFD39kkdpWt3ywyRZergyOLMaJhac60qc
По итогу нужно зайти в чат с созданным ботом, и нажать кнопку Start. После этого бот физически сможет отправлять уведомления.
Получение своего telegram id
Чтобы бот отправлял сообщения нам, необходимо знать наш Telegram id. Быстро и просто его узнать можно написав например боту @my_id_bot, который в ответном сообщении в чате отправит нам наш целочисленный Telegram id.
Редактирование конфига
Токен и Telegram id необходимо добавить в конфиг traccar
. Для этого откроем для редактирования файл
конфига ~/docker/traccar/conf/traccar.xml
, и изменим значения в строках:
<entry key='notificator.telegram.key'>СюдаКопируемТокен</entry>
<entry key='notificator.telegram.chatId'>СюдаКопируемTelegramId</entry>
Сохраняем файл, переходим в директорию cd ~/docker/traccar
и перезапускаем контейнеры:
docker-compose stop
docker-compose up -d
После чего Traccar
наконец сможет уведомлять нас о событиях в Telegram
:
Заключение
Итак, мы познакомились с отличным, свободным инструментом для геотрекинга, возможности которого пощупали лишь отчасти. Благодаря опенсорсу мы имеем невиданное разнообразие полезных продуктов, доступных каждому. Со своей стороны я рад поделиться данной инструкцией к достойному решению, которое использую сам.
Комментарии
Любые обсуждения по теме приветствуются под постом данной статьи в телеграм канале.