
2026/03/21 6:04
**Show HN:** *バルト海シャドウ艦隊トラッカー – ライブAISとケーブル近接アラート*
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
## Summary Shadow Fleet Tracker Light は、オープンソースでセルフホスト型のシステムです。ウクライナのGUR戦争・制裁カタログに収載されている 1,200 障船以上をリアルタイムで監視します。 AISStream WebSocket を介して AIS データを取得し、Folium/Leaflet マップ上にライブ位置をプロット(3 分ごとに自動更新)し、すべての観測結果をローカル SQLite データベースにログとして保存します。 主なアラートは次の通りです: - **10 km** 以内にある海底ケーブルに接近する船舶 - 待機検知(速度 < 0.5 ノット、時間 ≥ 1200 秒、半径 ≤ 0.5 km) - ロシア ↔ 西側のトランスシャーピングパターン(21 日間ウィンドウ内で、港呼び出し時の速度 < 1.5 ノット、ゾーン内で最低 2 回の ping) ダッシュボードは以下のエンドポイントを公開します:`/`, `/map`, `/analyze`, `/timeline`, `/vessel/<mmsi>`, `/loitering`, `/transshipment`。CSV / 生ログのダウンロードも可能です。 **インストール & 実行** ```bash git clone https://github.com/FormerLab/shadow_tracker_light.git cd shadow_tracker_light pip install -r requirements.txt export AISSTREAM_API_KEY=your_key_here python shadow_tracker.py & uvicorn webserver:app --host 0.0.0.0 --port 8000
(便利な
start.sh / start.bat / start.ps1 スクリプトも付属しています。)
設定可能項目(
shadow_tracker.py 内):
- バウンディングボックス、ケーブルアラート半径、マップ描画間隔
- ウォッチリスト再読み込み間隔、ウォームリスタート時間、再接続遅延
任意の OpenSanctions 統合 –
OPENSANCTIONS_API_KEY を設定するとポップアップに制裁状況を表示します。設定しなくてもツールは動作します。
システムは AISStream の無料 API キーのみで構成され、クラウドサービスは必要ありません。NGO、政府機関、あるいは民間のセキュリティチームが、コスト効果的にローカルで海上脅威と制裁遵守を監視しつつ、重要なケーブルインフラを保護するために設計されています。
本文
バルト海シャドウ艦隊トラッカー(ライト)
ウクライナGUR戦争・制裁カタログから1200 +の船舶をAISStreamのWebSocketフィードで監視する、無料かつオープンソースのツールです。リアルタイム位置を自動更新マップにプロットし、海底ケーブルへの接近をフラグ付け、ロシア↔西側の輸送パターンを検知します。
主な機能
| 機能 | 説明 |
|---|---|
| ライブAIS | AISStream WebSocket経由でバルト海境界ボックスを購読。 |
| ウォッチリスト | ウクライナGURカタログから取得した1200+件の船舶MMSI()。 |
| マップ | Folium/Leaflet を使い、ダークCartoDBベースマップ。3 分ごとに更新し、自動リロードとカウントダウン付き。 |
| ケーブルアラート | 船舶が10 km以内に近づいたらフラグ()。 |
| ロイタリング検知 | 20 分以上同一地点で低速・停止している船舶を検出。 |
| トランスシャップメント検知 | 船舶がロシア港と西側ハブ(または逆)に21日以内に停泊したパターンを検出。 |
| ログ | 位置データをSQLite () に記録し、オフライン解析用。 |
| ウォームリスタート | 起動時に直近24時間分のログを読み込み、空白マップ待ちなしで即表示。 |
| ダッシュボード | FastAPI アプリでログ閲覧、船舶分析、GPXエクスポート、トランスシャップメントレビュー、インタラクティブルート再生が可能。 |
クイックスタート
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ユーザー向け
start.bat、start.ps1 を使うか、以下の手順で手動設定してください。
手動セットアップ
-
クローン&依存関係インストール
git clone https://github.com/FormerLab/shadow-fleet-tracker-light.git cd shadow-fleet-tracker-light pip install -r requirements.txt -
APIキー設定
# Linux / macOS export AISSTREAM_API_KEY=your_key_here export OPENSANCTIONS_API_KEY=your_key_here # 任意 # Windows (Command Prompt) set AISSTREAM_API_KEY=your_key_here set OPENSANCTIONS_API_KEY=your_key_here # Windows (PowerShell) $env:AISSTREAM_API_KEY = "your_key_here" $env:OPENSANCTIONS_API_KEY = "your_key_here" -
トラッカー&ダッシュボード起動
# ターミナル1 – AISフィード消費者 python shadow_tracker.py # ターミナル2 – FastAPI ダッシュボード uvicorn webserver:app --host 0.0.0.0 --port 8000 -
にアクセスしてダッシュボードを開く。http://localhost:8000
スタートスクリプト(全OS)
| プラットフォーム | スクリプト |
|---|---|
| Linux / macOS | |
| Windows PowerShell | |
| Windows コマンドプロンプト | |
スクリプトは
check.py で前処理チェックを行い、トラッカーとダッシュボードを起動します。
ファイル構成
- shadow_tracker.py – メインプロセス:WS消費者、マップ描画、DB書き込み。
- loitering_module.py – ロイタリング検知&マップ注釈。
- transshipment_module.py – 港呼び出し検知・ロシア↔西側トランスシャップメントフラグ。
- webserver.py – FastAPI ダッシュボード。
- gur_scrape.py – IMO→GUR-ID マッピングと船舶カタログを構築するワンショットスクレイパー。
- check.py – 前処理チェック(Pythonバージョン、依存関係、APIキー、ネットワーク)。
- start.sh / start.bat / start.ps1 – OSごとの起動スクリプト。
- requirements.txt – Python 依存ライブラリ。
データベースファイル:
| ファイル | 用途 |
|---|---|
| ウォッチリスト(1200+船舶)。 |
| 位置ログ(実行時、追記のみ)。 |
| AIS 静的データキャッシュ。 |
| 港呼び出しとトランスシャップメントイベント。 |
| ロイタリングイベント。 |
| バルト海の海底ケーブルジオメトリ。 |
ウォッチリスト
Vessels1.db はウクライナGUR戦争・制裁カタログから取得した追跡対象船舶の公式リストです。実行中に船舶を追加するには:
-- Linux / macOS sqlite3 Vessels1.db "INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'VESSEL NAME');" -- Windows (Python) import sqlite3 conn = sqlite3.connect("Vessels1.db") conn.execute("INSERT OR IGNORE INTO vessels (mmsi, imo, name) VALUES ('123456789', '9999999', 'VESSEL NAME');") conn.commit() conn.close()
データモデル
| テーブル | カラム |
|---|---|
| mmsi TEXT PK, imo TEXT, name TEXT, destination TEXT |
| timestamp, mmsi, name, imo, destination, speed, heading, latitude, longitude, cable_alert |
| mmsi TEXT PK, name TEXT, imo TEXT, destination TEXT, flag TEXT |
| id, mmsi, flag, timestamp |
| id, mmsi, timestamp, latitude, longitude, near_cable |
| id, mmsi, name, port, port_type, entry_ts, exit_ts, min_speed |
| id, mmsi, name, direction, from_port, from_exit_ts, to_port, to_entry_ts, days_between, detected_ts |
設定
すべてのチューナブルは shadow_tracker.py の先頭にあります。
| 定数 | デフォルト | 説明 |
|---|---|---|
| | AISStream 購読境界ボックス |
| | ケーブル近接閾値(km) |
| | マップリフレッシュ間隔 |
| | DB からウォッチリストを再読み込みする間隔 |
| | 起動時にロードする位置履歴時間(h) |
| | WebSocket 再接続バックオフ |
環境変数:
| 変数 | 必須 | 説明 |
|---|---|---|
| Yes | AISStream WebSocket API キー |
| No | マップポップアップで制裁情報を有効化(任意) |
ロイタリング閾値 (loitering_module.py
)
loitering_module.py| 定数 | デフォルト | 説明 |
|---|---|---|
| | これ以下で停止とみなす |
| | フラグ付け前の持続時間 |
| | 同一地点と見なす最大漂移距離 |
トランスシャップメント設定 (transshipment_module.py
)
transshipment_module.py| 定数 | デフォルト | 説明 |
|---|---|---|
| | 港ゾーン内でこの速度以下を呼び出しとみなす |
| | 呼び出しとして記録する最小ピン数 |
| | ポート呼び出し間の最大日数(トランスシャップメント判定) |
カバーされる港ゾーン:
- ロシア輸出ターミナル – ウスト・ルガ、プリモスク、サンクトペテルブルク、ヴィボー
- 西側トランスシャップメントハブ – スカウ/スカゲン、ゴータウン、キール、コペンハーゲン、オーフス
ダッシュボードルート
| パス | 説明 |
|---|---|
| ライブログビューア(60 秒ごとに自動更新) |
| 最新マップ(iframe 互換) |
| フィルタ可能な船舶レコード表、CSVエクスポート |
| 活動概要 – 各船舶のカードを最終確認時刻で並べ替え |
| 船舶ごとの履歴:AISブラックアウト、ケーブル接近、旗変更、GPXエクスポート |
| GPX トラックエクスポート(QGIS, OSM, GPSBabel で開く) |
| ケーブル付近フラグ付きロイタリングイベント、船舶別サマリー、CSVエクスポート |
| ロシア↔西側港呼び出しパターン – RU→WEST と WEST→RU イベント、CSVエクスポート |
| 生ログファイルダウンロード |
船舶別ページのハイライト
- ルート再生 – Leaflet マップで再生/一時停止/リセット・速度制御付き。
- サマリー – 最初/最後の確認、総ピン数、ケーブルアラート件数、AISギャップ数、観測された目的地。
- AISブラックアウト – 60 分以上のギャップを開始/終了タイムスタンプと期間でフラグ付け。
- ケーブル接近 – ケーブルアラートが有効だったピンの割合。
- 静的データ漂移 – 名前変更、旗変更(日付付き)、目的地履歴。
- GPXエクスポート – タイムスタンプ付き全トラック。
トランスシャップメントページ
2 つの推定パターンを表示します:
- RU→WEST – 船舶がロシア港で停泊後、21日以内に西側ハブへ。
- WEST→RU – 船舶が西側ハブで停泊後、21日以内にロシア港へ。
ポート呼び出しは位置ピンから推定され、外部 API は不要です。
ケーブルデータ
filtered_cables.kml はオープンソースデータセットから派生したもので近似値です。10 km アラート閾値はこの余裕を考慮しています。ケーブルジオメトリの改善に貢献していただけると幸いです。
アーキテクチャ概要
- WebSocket ストリーム上で単一の非同期ループ。
- メモリ内状態(
,vessel_info
)は各描画サイクルで SQLite にフラッシュ。static_cache - マップは
で原子書き込み。os.replace - ウォームリスタートは起動時に直近24時間のログを読み込み、WebSocket 接続前にマップをプリロード。
- ウォッチリストと GUR マッピングは5分ごとに再読込;トラッカー再起動不要で船舶追加・再スクレイピングが可能。
- FastAPI ダッシュボードはステートレス、SQLite から直接読み込み。
現在の状態
| コンポーネント | 状態 |
|---|---|
| AIS ストリーム消費者 | 動作中 |
| ウォッチリスト | 1200+船舶(完全 GUR カタログ) |
| ケーブル接近アラート | 動作中 |
| ロイタリング検知 | 動作中 |
| トランスシャップメント検知 | 動作中 |
| マップ描画 | 動作中(3 分周期、カウントダウン付き自動リロード) |
| ウォームリスタート | 動作中(直近24時間ログをプリロード) |
| 船舶ポップアップ | MarineTraffic + VesselFinder + War&Sanctions リンク (1337船舶マッピング) |
| OpenSanctions 制裁ステータス | 任意(API キー必要) |
| 旗変更検知 | 動作中( にログ保存) |
| ダッシュボード – ログ、船舶、CSV エクスポート | 動作中 |
| ダッシュボード – タイムラインビュー | 動作中 |
| ダッシュボード – 船舶履歴+GPX | 動作中 |
| ダッシュボード – ルート再生 | 動作中(再生/一時停止/リセット、速度制御、ケーブルアラートハイライト) |
| ダッシュボード – ロイタリングパネル | 動作中 |
| ダッシュボード – トランスシャップメントパネル | 動作中 |
Former Lab をサポートする
Shadow Fleet Tracker Light は Former Lab チームによって構築・保守されている、古いハードウェアで VC なしに運営されるオープンソースのプライバシー重視ツールです。
お役立ちいただけましたら Patreon(patreon.com/FormerLab)でサポートを検討してください。無料 tier が利用可能で、有料 tier では 7 日間トライアルと新ツールへの早期アクセスが付与されます。