
Трекер теневого флота Балтийского моря с открытым исходным кодом. 1200+ судов, живые данные AIS, оповещения о приближении к кабелям. Никаких облаков, никакой подписки, работает локально.
Мониторинг теневого флота Балтийского моря через живые данные AIS. Отслеживает 1200+ судов из каталога War&Sanctions ГУР Украины через WebSocket-канал AISStream, отображает позиции на самообновляющейся карте, отмечает близость к подводным кабелям и обнаруживает паттерны перевалки грузов Россия↔Запад.
Бесплатно, с открытым исходным кодом, работает локально. Никакого облака, подписка не требуется, кроме бесплатного API-ключа AISStream.
Часть инструментария суверенной разведки Former Lab.
Shadow Fleet Tracker Light создан и поддерживается командой Former Lab — суверенные вычисления, создание открытых инструментов, ориентированных на конфиденциальность, на старом оборудовании, без венчурного финансирования.
Если этот инструмент оказался вам полезен, подумайте о поддержке на Patreon. Доступен бесплатный тариф с 7-дневной пробной версией платных тарифов. Всегда поддерживайте Украину!
Статья в блоге о трекере, скриншоты и подробности: https://www.patreon.com/posts/153285871
git clone https://github.com/FormerLab/shadow-fleet-tracker-light.git
cd shadow-fleet-tracker-light
pip install -r requirements.txt
export AISSTREAM_API_KEY=your_key_here # бесплатно на aisstream.io
python shadow_tracker.py &
uvicorn webserver:app --host 0.0.0.0 --port 8000
Откройте http://localhost:8000 — карта доступна по адресу /map.
Пользователи Windows: см. раздел Настройка для синтаксиса переменных окружения в PowerShell/cmd.
Пользователи Linux / macOS могут использовать start.sh. Пользователи Windows — start.bat или start.ps1 — оба скрипта открывают трекер и панель в отдельных окнах и запускают браузер автоматически.
Vessels1.db)filtered_cables.kml)Тёмная базовая карта CartoDB с наложенными кабельными маршрутами зелёным цветом. Маркеры судов обновляются каждые 3 минуты с живым обратным отсчётом до следующего обновления — страница перезагружается автоматически. Всплывающие окна показывают MMSI, IMO, флаг, скорость, курс, пункт назначения и глубокие ссылки на MarineTraffic, VesselFinder и War&Sanctions. Статус санкций OpenSanctions отображается, если настроен API-ключ.
Известные названия судов из Vessels1.db отображаются сразу при первом появлении, без ожидания статического сообщения AIS.
При запуске карта заполняется данными за последние 24 часа из журнала позиций. Суда, ещё не замеченные в текущем сеансе, отображаются серыми маркерами с пометкой «последний раз видели Xh назад» — они переходят в живой цвет по мере поступления новых пингов.
shadow_tracker.py Основной процесс — потребитель WS, рендеринг карты, запись в БД
loitering_module.py Обнаружение длительного нахождения и аннотация карты
transshipment_module.py Обнаружение заходов в порты и маркировка перевалки Россия↔Запад
webserver.py Панель управления FastAPI
gur_scrape.py Одноразовый скрапер — построение отображения IMO→GUR-ID + полный каталог судов
check.py Предстартовые проверки — версия Python, зависимости, API-ключ, сеть
start.sh Запускатор для Linux / macOS
start.bat Запускатор для Windows (Command Prompt)
start.ps1 Запускатор для Windows (PowerShell)
requirements.txt Зависимости
Vessels1.db Список наблюдения — 1200+ судов (MMSI + IMO + название, где известно)
vessel_data_log.db Журнал позиций — во время выполнения, только добавление
vessel_static.db Кэш статических данных AIS (название, пункт назначения, история флага)
transshipment.db Журнал заходов в порты и событий перевалки
loitering_events.db События длительного нахождения
filtered_cables.kml Геометрия подводных кабелей Балтийского моря
cables.kml Полный набор данных о кабелях (исходный источник до фильтрации)
gur_mapping.json Отображение IMO→GUR-ID (создаётся gur_scrape.py, опционально)
gur_vessels_full.json Полный каталог ГУР — GUR-ID→{imo, mmsi, name, flag} (создаётся gur_scrape.py)
Vessels1.db — канонический список отслеживаемых судов. Более 1200 записей из каталога War&Sanctions ГУР Украины, охватывающих танкеры и грузовые суда, идентифицированные как часть российского теневого флота или причастные к гибридной деятельности в Балтийском море.
Список включает суда, недавно захваченные или перехваченные балтийскими властями:
| Судно | IMO | Событие |
|---|---|---|
| EAGLE S | 9329760 | Захвачено Финляндией, дек. 2024 — саботаж кабеля Estlink-2, найдено шпионское оборудование |
| EVENTIN | 9308065 | Захвачено Германией, янв.–мар. 2025 — дрейфовал у Рюгена, конфисковано 100 000 т российской нефти |
| KIWALA | 9332810 | Задержано Эстонией, апр. 2025 — без флага, под санкциями ЕС/Великобритании |
| JAGUAR | 9293002 | Перехвачено Эстонией, май 2025 — Россия подняла Су-35 для эскорта |
| KIRA K | 9346720 | Экипаж Wagner/ГРУ подтверждён на борту, дек. 2025 |
| QENDIL | 9310525 | Экипаж Wagner/ГРУ, сен. 2025 — удар украинского дрона, дек. 2025 |
| FITBURG | 9250397 | Захвачено Финляндией, 31 дек. 2025 — саботаж кабеля Хельсинки–Таллин |
| CAFFA | 9143611 | Захвачено Швецией, 6 мар. 2026 — украденное украинское зерно, ложный флаг |
| SEA OWL I | 9321172 | Захвачено Швецией, 12 мар. 2026 — под санкциями ЕС, ложный флаг Коморских островов |
MMSI скорректированы по текущим данным AIS — суда теневого флота часто меняют флаг. Файл update_vessels_2026_03.sql документирует все изменения с указанием источников.
Список наблюдения намеренно открыт. Добавляйте суда напрямую в Vessels1.db во время работы трекера — они будут подхвачены в течение 5 минут без перезапуска.
Linux / macOS:
sqlite3 Vessels1.db "INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'НАЗВАНИЕ СУДНА');"
Windows (без CLI sqlite3):
import sqlite3
conn = sqlite3.connect("Vessels1.db")
conn.execute("INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'НАЗВАНИЕ СУДНА')")
conn.commit()
conn.close()
Vessels1.db — список наблюдения
vessels(mmsi TEXT PK, imo TEXT, name TEXT, destination TEXT)
vessel_data_log.db — журнал позиций
vessel_data_log(timestamp, mmsi, name, imo, destination, speed, heading, latitude, longitude, cable_alert)
Только добавление. Записывается при каждом цикле рендеринга карты.