Self-hosted приложения для отслеживания местоположения
Сравнение Traccar, Dawarich, OwnTracks и Home Assistant для контроля перемещений. Узнайте, как выбрать решение для истории поездок или мониторинга устройств в реальном времени.
Какое приложение для отслеживания местоположения выбрать для self-hosted
Выбор self-hosted решения для отслеживания местоположения зависит от одного вопроса: вы сохраняете историю для себя или следите за текущим положением группы людей? Dawarich подходит для первого варианта. Это self-hosted аналог Google Maps Timeline, который позволяет импортировать уже имеющуюся историю перемещений. Traccar предназначен для второго варианта. Он создавался для GPS-оборудования и управления автопарками, поэтому рассматривает телефон как еще один трекер. OwnTracks выступает в роли мобильного приложения и формата сообщений для обоих решений. Home Assistant уже умеет определять местоположение вашего телефона, если он запущен, но по умолчанию удаляет историю перемещений через 10 дней.
Выбирайте решение в зависимости от того, что вы хотите увидеть в следующем месяце:
- Карту всех ваших перемещений за прошлый март с указанием мест и поездок: Dawarich.
- Карту с текущим положением нескольких устройств, геозонами и правилами событий: Traccar.
- Один телефон, отправляющий данные о местоположении в уже используемую вами систему: OwnTracks в режиме HTTP.
- Автоматизацию сценариев «дома» и «вне дома» без необходимости хранения истории: Home Assistant в чистом виде.
Ни одно из этих решений не будет работать, пока телефон не получит доступ к HTTPS-эндпоинту под вашим управлением, поэтому серверная часть вынесена в отдельный раздел ниже. Если вы еще определяетесь с тем, что стоит разместить на сервере, общий список сервисов, которые стоит развернуть самостоятельно в этом году, поможет понять место трекера среди других приложений.
Traccar: GPS-оборудование, автопарки и отслеживание в реальном времени
Traccar — это сервер для GPS-мониторинга. Он поддерживает протоколы, используемые специализированными GPS-трекерами, каждый из которых ожидает данные на своем TCP или UDP порту в диапазоне от 5000 до 5150. Система предоставляет интерактивную карту, геозоны, правила обработки событий и отчеты. Веб-интерфейс по умолчанию работает на порту 8082.
Для смартфонов доступно приложение Traccar Client (Android и iOS). Оно передает данные по протоколу OsmAnd, который по умолчанию использует порт 5055. Настройки приложения определяют время автономной работы устройства и количество записей в базе данных. Distance задает отправку обновлений через каждые N метров при движении. Interval включает передачу данных по времени, если дистанция равна 0. Angle инициирует обновление при изменении направления движения на заданное количество градусов. Stationary Heartbeat определяет поведение устройства, когда оно находится в состоянии покоя. Согласно документации Traccar, точный результат для этих параметров не гарантируется, так как решение об отправке принимает операционная система телефона.
Traccar поставляется со встроенной базой данных H2, что позволяет запустить сервер без дополнительной настройки, однако разработчики не рекомендуют использовать H2 в промышленной эксплуатации. Для небольших серверов рекомендуется MySQL или MariaDB, а для крупных — PostgreSQL, при необходимости с расширением TimescaleDB. Перенесите базу данных до того, как накопится история перемещений, так как конвертация файла H2 в дальнейшем потребует ручной работы, для которой нет официальных инструментов.
В каких случаях Traccar подходит меньше всего: это консоль для наблюдения за объектами в текущий момент времени. Отчеты ориентированы на автопарки: поездки, остановки и сводные данные. Поэтому история ваших личных перемещений за год будет выглядеть как результат поискового запроса, а не как хронологическая лента.
OwnTracks: мобильное приложение и эндпоинт, ничего лишнего
OwnTracks — это минималистичная классическая конфигурация. Приложение отправляет небольшой JSON-пакет каждый раз, когда определяет, что устройство переместилось. Передача данных возможна по протоколу MQTT (message queuing telemetry transport) или через обычный HTTP. В режиме HTTP эндпоинт представляет собой URL вида http[s]://[user[:password]@]host[:port]/path с аутентификацией HTTP Basic; разработчики проекта настоятельно рекомендуют использовать схему https://. Для работы с OwnTracks Recorder используется путь /pub.
Режим мониторинга важнее любых настроек сервера. Режим Quiet отправляет данные только по запросу. Manual добавляет мониторинг зон и запрос геопозиции с низким энергопотреблением. Significant — это стандартный автоматический режим. Режим Move отправляет данные, как только устройство преодолело locatorDisplacement метров или прошло locatorInterval секунд (в зависимости от того, что наступит раньше); значения по умолчанию составляют 100 метров и 300 секунд. В документации OwnTracks указано, что режим Move расходует заряд аккумулятора на уровне навигационных приложений, поэтому его рекомендуют использовать во время поездок или при подключении к зарядке, а не в качестве повседневной настройки.
OwnTracks Recorder сохраняет поступающие данные и отображает простую карту. Многие пользователи не устанавливают его, так как формат пакета данных идентичен независимо от того, куда направляет их приложение: в Recorder, Dawarich или Home Assistant. Именно поэтому стоит начать с этого решения: приложение является стабильным и предсказуемым источником данных, а выбор потребителя можно изменить в любой момент.
Dawarich: self-hosted аналог Google Maps Timeline
Dawarich распространяется по лицензии AGPL-3.0 и запускается с помощью Docker Compose. Рабочая инсталляция состоит из четырех контейнеров: приложения на Rails, воркера Sidekiq для фоновых задач, PostgreSQL и Redis. Приложение работает на порту 3000. Источники для импорта включают Google Maps Timeline, OwnTracks, Strava, Immich, файлы GPX и GeoJSON, а также EXIF-данные ваших фотографий. Именно этот список источников превращает систему в полноценную временную шкалу, а не просто в карту реального времени, так как она способна обработать историю, предшествующую запуску сервера.
Прием данных осуществляется через HTTP-эндпоинт, который требует передачи API-ключа со страницы вашего аккаунта. OwnTracks отправляет данные на /api/v1/owntracks/points?api_key=..., а Overland — на /api/v1/overland/batches?api_key=.... GPSLogger использует тот же эндпоинт, что и OwnTracks.
Обратите внимание на то, как передается этот ключ. Он находится в строке запроса, а стандартный формат логов Nginx записывает полную строку запроса, поэтому ключ попадает в /var/log/nginx/access.log в открытом виде при каждой отправке точки. Относитесь к этому логу как к секретным данным, обновляйте ключ при отправке логов в централизованные системы хранения и никогда не вставляйте рабочие URL в ветки обсуждений технической поддержки.
Информацию о файле compose, томах и политике перезапуска см. в разделе механика запуска контейнеров через compose на VPS. На этом данная страница завершается.
Home Assistant: эффективен для определения присутствия, но не подходит для истории
Если вы уже используете Home Assistant, у вас уже настроено отслеживание устройств. Сопутствующее приложение передает данные о местоположении, а интеграция OwnTracks предоставляет URL вебхука и ключ шифрования, которые необходимо вставить в приложение. При настроенном MQTT эта интеграция ожидает сообщения MQTT вместо HTTP.
Ограничение заключается в хранении данных. Для компонента recorder в Home Assistant по умолчанию установлено значение purge_keep_days: 10, а автоматическая очистка запускается каждую ночь в 04:12 по местному времени, чтобы база данных не разрасталась бесконечно. Это значение по умолчанию подходит для базы данных домашней автоматизации, но не подходит для архива перемещений. Home Assistant отвечает на вопрос «есть ли кто-нибудь дома». Он не ответит на вопрос «где я был 14 марта», если вы не будете отправлять тот же поток данных в систему, которая их сохраняет.
Постоянное отслеживание или эпизодический обмен данными?
Постоянное отслеживание означает, что приложение публикует данные в течение всего дня, независимо от того, находитесь ли вы в движении. Создаваемый архив является основной целью использования. Эпизодический обмен данными означает, что пользователи наблюдают друг за другом только во время поездки, а архив является побочным эффектом, который обычно не требуется. Одно и то же программное обеспечение поддерживает оба сценария с помощью различных настроек.
Для постоянного отслеживания отдавайте предпочтение передаче данных на основе перемещения, а не по короткому таймеру. Храните базу данных на носителе, который вы регулярно копируете, и определите политику хранения данных в первый же день, а не тогда, когда диск окажется переполнен. Для эпизодического обмена данными увеличивайте частоту передачи только на время необходимости, после чего возвращайте телефон в режим энергосбережения. В OwnTracks это реализовано через настройки приложения, а в Traccar Client — через поля дистанции и интервала.
Если вам нужна ссылка для обмена данными на два часа для одной поездки, изучите примечания к выпуску (release notes) выбранного сервера перед началом работы. Эта функция чаще всего меняется между версиями и является наиболее слабым местом в каждом из представленных решений.
Нужен ли вам MQTT-брокер вообще?
Начните работу без него. Режим HTTP использует URL, пароль и TLS (transport layer security), и каждый из упомянутых выше серверов поддерживает его. Брокер становится необходим, когда один и тот же поток данных требуется нескольким потребителям одновременно, например, когда Home Assistant реагирует на изменение зоны, в то время как регистратор записывает историю, или когда члены семьи отслеживают местоположение друг друга.
MQTT — это протокол публикации и подписки, а Mosquitto является стандартным брокером для него. Он ожидает соединений на порту 1883 для открытого текста и 8883 для TLS, при этом вам следует использовать только 8883. Контроль доступа осуществляется на уровне топиков, поэтому одной учетной записи можно разрешить публикацию в owntracks/alice/phone и запретить чтение любых других данных. Это основной аргумент в пользу MQTT для домашних систем: кто и что видит, определяется брокером на уровне ниже приложения, поэтому ошибка в коде приложения не приведет к расширению прав доступа.
Цена этого решения — еще один сервис со своим сертификатом, своим списком пользователей и своим сценарием сбоев. Если брокер перестает принимать соединения, это выглядит так же, как телефон без сигнала сети, и ни один из них не сообщит вам о причине проблемы.
Сколько строк позиций создаст один телефон?
Приведенные ниже цифры являются арифметическими расчетами, а не результатами измерений. Они предполагают фиксированный интервал отправки отчетов, одну строку на отчет и отсутствие других факторов.
The data behind this chart
[
{
"label": "Every 30 seconds",
"points_30d": "86,400",
"points_365d": "1,051,200"
},
{
"label": "Every 60 seconds",
"points_30d": "43,200",
"points_365d": "525,600"
},
{
"label": "Every 5 minutes",
"points_30d": "8,640",
"points_365d": "105,120"
},
{
"label": "Every 15 minutes",
"points_30d": "2,880",
"points_365d": "35,040"
}
]Телефон, отправляющий отчеты раз в минуту, записывает 43,200 строк в месяц и 525,600 строк в год. Если увеличить интервал до пятнадцати минут, то за год получится 35,040 строк. Реальные приложения работают иначе, так как они отправляют отчеты не только по времени, но и при перемещении, а также переходят в режим ожидания, когда телефон неподвижен. Поэтому воспринимайте верхнее значение как максимально возможный предел, а не как точный прогноз.
Полмиллиона строк в год — это незначительный объем для PostgreSQL. Основная проблема возникает при их визуализации: если запросить отрисовку годовой истории точек в полном разрешении, браузер зависнет задолго до того, как база данных почувствует нагрузку. Именно поэтому такие приложения агрегируют историю в поездки и места. Измерьте реальное количество данных на своем сервере, вместо того чтобы доверять цифрам из статьи:
SELECT pg_size_pretty(pg_total_relation_size('tc_positions'));Это таблица позиций Traccar в PostgreSQL. Выполните аналогичный запрос для используемого вами сервера после месяца обычной эксплуатации, а затем умножьте результат на двенадцать. Ни один из этих серверов не удаляет старые точки автоматически. Они хранят все полученные данные до тех пор, пока вы их не удалите. Поэтому определите политику хранения данных, пока таблица еще невелика, и убедитесь, что резервное копирование охватывает базу данных, а не только конфигурацию, так как историю перемещений невозможно восстановить из других источников.
Расход заряда аккумулятора зависит от настроек телефона, а не сервера
Это аспект, который self-hosting не меняет. Операционная система решает, когда активировать GPS, как долго фоновое приложение может работать и будет ли оно активно ночью. Система управления питанием Android агрессивно приостанавливает фоновые процессы, а iOS предоставляет данные о значительных изменениях местоположения вместо непрерывного потока. Ваш сервер не влияет на эти процессы, поэтому установка короткого интервала отправки данных в приложении — это лишь запрос, на который телефон отвечает по своему усмотрению.
Вы управляете настройками на самом телефоне: предоставьте разрешение на доступ к местоположению в фоновом режиме «всегда», исключите приложение для трекинга из списка оптимизации аккумулятора и выбирайте режим отправки данных в соответствии с текущими задачами. Режим постоянного перемещения (Move mode) в течение всей недели приведет к тому, что телефон разрядится к четырем часам дня.
На стороне сервера это проявляется как пакетная загрузка записей со старыми временными метками. И Traccar Client, и OwnTracks кэшируют точки при отсутствии сети и отправляют их при восстановлении соединения, поэтому время записи в базу и время фиксации координат различаются. Если на карте отображается прямая линия через весь город, это означает наличие разрыва в данных, а не реальный маршрут.
Серверная часть: TLS и путь аутентифицированного приема данных
Телефону требуется имя хоста, которое он может разрешить, и сертификат, которому он доверяет. Самоподписанный сертификат — самая частая причина, по которой свежая установка не получает никаких данных: приложение прерывает TLS-рукопожатие и завершает работу, а лог сервера остается пустым, так как запрос не был завершен. Пустой лог выглядит как проблема на стороне телефона, хотя это не так.
Существует два надежных пути. Завершить TLS в nginx с помощью реального сертификата, что описано в сертификате Let's Encrypt перед nginx, и открыть только 443 порт. Либо не открывать входящие порты вовсе, используя туннель Cloudflare, чтобы на публичном IP ничего не прослушивалось, что подходит для Dawarich и OwnTracks, так как их прием данных осуществляется по обычному HTTP.
Одно ограничение для варианта с туннелем. Протокол OsmAnd для Traccar — это HTTP, поэтому мобильный клиент проходит через обратный прокси или туннель без проблем. Бинарные протоколы, которые используют специализированные GPS-устройства, работают через «сырой» TCP на собственных портах. Для них требуется реально открытый порт, настроенный как на брандмауэре VPS, так и на внешнем сетевом брандмауэре провайдера (это отдельная панель управления у большинства хостинг-провайдеров).
Как только сервер начнет отвечать, проверьте путь одним запросом, вместо того чтобы пытаться угадать причину ошибки в приложении:
curl -si -u alice:secret -H 'Content-Type: application/json' \
-d '{"_type":"location","lat":51.5,"lon":-0.12,"tst":1788480000}' \
https://track.example.com/pub | head -1Рабочая конечная точка отвечает статусом 2xx. Код 401 означает, что учетные данные неверны, но транспорт работает корректно. Ошибка curl до получения строки статуса указывает на проблемы с DNS или TLS, поэтому исправьте сертификат, прежде чем переходить к настройке приложения.
Открытая точка приема данных раскрывает ваше местоположение
URL-адрес для приема данных без аутентификации передает ваши координаты любому, кто его обнаружит, а их обязательно обнаружат.
- Любой, у кого есть этот URL, может записывать точки в вашу историю. Ложные данные трудно заметить и утомительно удалять.
- URL не является секретом. Он хранится в настройках приложения на телефоне, в access log вашего reverse proxy, в истории браузера, если вы когда-либо открывали его во вкладке, и на любом скриншоте, который вы приложите, когда будете просить о помощи.
- Конечная точка, отвечающая на неавторизованные GET-запросы, выдаст ваше последнее местоположение любому сканеру, который угадал путь.
- Имя хоста публично, что бы вы ни делали. Новый сертификат появляется в логах certificate transparency в течение нескольких минут, поэтому адрес, который вы никогда не публиковали, все равно можно найти.
Используйте HTTP Basic поверх TLS для OwnTracks, API-ключ для Dawarich и модель учетных записей Traccar с уникальным идентификатором устройства. Разместите интерфейс администратора за той же аутентификацией, что и путь приема данных, так как именно в интерфейсе доступна для чтения вся история перемещений. Затем посмотрите, кто пытался подключиться спустя первую неделю:
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20IP-адреса мобильного оператора вашего телефона должны доминировать в этом списке. Любой другой адрес с большим количеством запросов заслуживает внимания, а настройка rate limit для пути приема данных в Nginx не требует никаких затрат.
Трекер также может незаметно выйти из строя. Контейнер остановится, телефон продолжит накапливать данные в буфере, а вы узнаете об этом спустя недели, когда обнаружите отсутствие данных о поездке. Настройте health check контейнера или systemd OnFailure= на ваш собственный ntfy сервер, чтобы уведомления о сбоях приходили на тот же телефон, который отправляет данные.
Кто еще может видеть историю перемещений и как это контролируется
Traccar управляет доступом с помощью пользователей и прав на устройства: учетная запись видит только те устройства, к которым администратор предоставил доступ, а API использует сессии или токены. OwnTracks через MQTT реализует контроль на уровне брокера с помощью ACL для топиков. Это наиболее надежный метод, так как учетная запись, не имеющая прав на подписку к топику, не сможет прочитать данные независимо от действий приложения. OwnTracks через HTTP не имеет аналогичного уровня защиты, поэтому вся безопасность доступа зависит исключительно от того, что находится за конечной точкой. Dawarich спроектирован для просмотра истории одним пользователем, поэтому для отслеживания нескольких человек в реальном времени лучше подходят Traccar или брокер сообщений.
Семейное отслеживание — это не только технический, но и этический вопрос согласия. Каждый человек, чей телефон передает данные, должен знать об этом и понимать, как отключить передачу. Трекер, который невозможно выключить, не является инструментом для семьи.
Что self-hosting не исправляет
- Операционная система телефона определяет, когда активируется GPS, поэтому разряд батареи и пропуски в треке — это результат работы ОС, а не вашего сервера.
- Google изменила формат экспорта данных Timeline. Ознакомьтесь с актуальной документацией по импорту в Dawarich перед планированием миграции, так как файл, который Google предоставляет сейчас, отличается от того, который пользователи импортировали два года назад.
- Ваш endpoint видит ваш мобильный IP-адрес при каждом запросе, как и любая сеть на пути следования пакетов. Self-hosting меняет лишь того, кто хранит эту запись. Он не удаляет саму запись.
- История перемещений незаменима. Создавайте резервные копии базы данных, выполните восстановление хотя бы раз, чтобы убедиться в работоспособности бэкапа, и храните копию в зашифрованном виде, так как это самый конфиденциальный файл на сервере.
FAQ
Какое self-hosted приложение заменяет Google Maps Timeline?
Dawarich. Оно создано как self-hosted альтернатива Google Timeline. Приложение импортирует данные экспорта Google Maps Timeline, а также данные из OwnTracks, Strava, Immich, файлы GPX, GeoJSON и EXIF-данные фотографий. История отображается в виде списка мест и поездок, а не в виде карты в реальном времени. Traccar может хранить те же точки, но его интерфейс ориентирован на управление автопарком, а отчеты — на транспортные задачи. Перед планированием миграции ознакомьтесь с документацией по импорту в Dawarich, чтобы узнать требуемый формат данных, так как формат экспорта Google изменился.
Можно ли использовать OwnTracks без MQTT-брокера?
Да. Переключите приложение в режим HTTP и укажите URL вида http[s]://[user[:password]@]host[:port]/path, который для OwnTracks Recorder выглядит как /pub. Приложение отправляет те же JSON-данные с аутентификацией через HTTP Basic. OwnTracks настоятельно рекомендует использовать схему https://. Брокер можно добавить позже, когда одному потоку данных потребуется несколько потребителей одновременно или когда возникнет необходимость в управлении доступом на уровне топиков, чтобы брокер определял, кто имеет право видеть данные.
Сколько места на диске нужно для хранения истории перемещений за год?
Планируйте объем исходя из количества записей, а не гигабайт. При отправке одного отчета в минуту получается 525,600 записей в год на одно устройство, а при отправке раз в пятнадцать минут — 35,040. Для PostgreSQL это незначительный объем. Практическое ограничение связано с отрисовкой такого количества точек в браузере на одной карте, поэтому приложения используют агрегацию данных. Оцените размер таблицы через месяц работы с помощью pg_total_relation_size и умножьте результат на двенадцать.
Почему в истории перемещений есть пропуски?
Операционная система телефона сама решает, когда активировать GPS и когда остановить фоновое приложение, поэтому большинство пропусков возникают именно по этой причине. Предоставьте приложению разрешение на доступ к геопозиции в фоновом режиме «всегда», исключите его из оптимизации расхода батареи и проверьте режим отправки данных. В OwnTracks режим Move публикует данные каждые locatorDisplacement метров или locatorInterval секунд (по умолчанию 100 метров и 300 секунд), что расходует заряд батареи на уровне навигационных приложений. Если записи приходят с задержкой и содержат старые временные метки, это означает, что сработал буфер офлайн-режима: данные были записаны, но их отправка была отложена.
Достаточно ли секретного URL для защиты точки приема данных?
Нет. Незащищенный эндпоинт для приема данных позволяет любому, кто узнает URL, записывать ложные точки в вашу историю. URL не является секретом: он хранится в настройках приложения, в access logs вашего reverse proxy, в истории браузера и на любых скриншотах, которыми вы делитесь. Имя хоста легко обнаружить, так как новый сертификат появляется в логах прозрачности сертификатов (certificate transparency logs) вскоре после выпуска. Используйте HTTP Basic поверх TLS или API-ключ, ограничьте частоту запросов (rate limit) для пути приема данных и защитите интерфейс администратора тем же методом аутентификации.