
オープンソースのバルト海シャドーフリートトラッカー。1200隻以上の船舶、ライブAIS、ケーブル接近アラート。クラウド不要、サブスクリプション不要、ローカルで動作。
バルト海の影の艦隊(Shadow Fleet)を、リアルタイムAISデータで監視します。ウクライナGUR(国防省情報総局)の戦争・制裁カタログに掲載された1200隻以上の船舶を、AISStream WebSocketフィードと照合し、自己更新地図上に位置をプロット。海底ケーブルへの接近を警告し、ロシア↔西側のトランシップメント(積替え)パターンを検出します。
無料・オープンソース、ローカルで動作します。クラウド不要、無料のAISStream APIキー以外にサブスクリプションは不要です。
Former Lab 主権インテリジェンスツールチェーンの一部です。
Shadow Fleet Tracker Light は Former Lab チームによって構築・維持されています — 主権的コンピューティング、古いハードウェア上でオープンでプライバシー第一のツールを、VCの支援なしで構築しています。
このツールが役に立つなら、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)から取得した1200隻以上の船舶MMSIのウォッチリストとストリームを照合filtered_cables.kml から)から10km以内に接近した場合に警告ダークCartoDBベースマップに海底ケーブルルートを緑色で重ね表示。船舶マーカーは3分ごとに更新され、次の更新までのライブカウントダウン表示 — ページは自動リロードされます。ポップアップではMMSI、IMO、船籍国、速度、針路、目的地、MarineTraffic・VesselFinder・War&Sanctionsへのディープリンクを表示。OpenSanctions APIキーが設定されている場合は制裁ステータスも表示。
Vessels1.db に既知の船名がある場合、AIS静的情報メッセージを待たずに最初の出現時に即座に表示されます。
起動時、地図は過去24時間分の位置ログから事前投入されます。現在のセッションでまだ見られていない船舶は灰色のマーカーと「最終確認 X時間前」のラベルで表示 — 新しいpingが届くとライブカラーに遷移します。
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 Linux / macOS用ランチャー
start.bat Windows用ランチャー(コマンドプロンプト)
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カタログ — GUR-ID→{imo, mmsi, name, flag}(gur_scrape.pyで生成)
Vessels1.db は追跡対象船舶の標準リストです。1200以上のエントリがウクライナGUR戦争・制裁カタログから取得されており、ロシアの影の艦隊の一部として特定されたタンカーや貨物船、またはバルト海でのハイブリッド活動に関与した船舶をカバーしています。
リストには、バルト諸国が最近拿捕または阻止した船舶も含まれます:
| 船舶名 | IMO | 出来事 |
|---|---|---|
| EAGLE S | 9329760 | 2024年12月フィンランドが拿捕 — Estlink-2ケーブル妨害、スパイ機器発見 |
| EVENTIN | 9308065 | 2025年1月~3月ドイツが押収 — リューゲン島沖で漂流、10万トンのロシア原油を没収 |
| KIWALA | 9332810 | 2025年4月エストニアが拘留 — 船籍なし、EU/英国制裁対象 |
| JAGUAR | 9293002 | 2025年5月エストニアが阻止 — ロシアがSu-35をスクランブルして護衛 |
| KIRA K | 9346720 | 2025年12月、ワグナー/GRU乗組員確認 |
| QENDIL | 9310525 | 2025年9月ワグナー/GRU乗組員 — 2025年12月ウクライナドローン攻撃 |
| FITBURG | 9250397 | 2025年12月31日フィンランドが拿捕 — ヘルシンキ-タリン間ケーブル妨害 |
| CAFFA | 9143611 | 2026年3月6日スウェーデンが拿捕 — 盗難ウクライナ穀物、偽旗 |
| SEA OWL I | 9321172 | 2026年3月12日スウェーデンが拿捕 — EU制裁対象、偽のコモロ船籍 |
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', 'VESSEL NAME');"
Windows(sqlite3 CLI不要):
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()
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)
追記専用。地図レンダリングサイクルごとに書き込まれます。
vessel_static.db — AIS静的情報キャッシュ
vessel_static(mmsi TEXT PK, name TEXT, imo TEXT, destination TEXT, flag TEXT)
flag_history(id, mmsi, flag, timestamp)
ライブの ShipStaticData AISメッセージから取り込まれます。受信後は Vessels1.db の船名より優先されます。flag_history は船籍変更ごとにタイムスタンプとともに記録 — 船籍変更イベントはログに記録され、船舶個別ページに表示されます。
loitering_events.db — 滞留ログ (実行時に作成)
loitering_events(id, mmsi, timestamp, latitude, longitude, near_cable)
transshipment.db — 寄港・トランシップメントログ (実行時に作成)
port_calls(id, mmsi, name, port, port_type, entry_ts, exit_ts, min_speed)
transshipment_events(id, mmsi, name, direction, from_port, from_exit_ts,
to_port, to_entry_ts, days_between, detected_ts)
requirements.txt の依存関係トラッカーを最も簡単に実行する方法。各スクリプトは依存関係のインストール、事前チェックの実行、両方のプロセスの起動を行います。
Linux / macOS:
chmod +x start.sh
export AISSTREAM_API_KEY=your_key_here
./start.sh
Windows(PowerShell):
$env:AISSTREAM_API_KEY = "your_key_here"
.\start.ps1
Windows(コマンドプロンプト):
set AISSTREAM_API_KEY=your_key_here
start.bat
3つのスクリプトはすべて最初に check.py を実行します — Pythonバージョン、依存関係、データファイル、APIキー、ネットワーク到達可能性を検証し、不足があれば明確なエラーメッセージを表示します。
事前チェックは単独でもいつでも実行できます:
python check.py
1. リポジトリのクローンと依存関係のインストール
git clone https://github.com/FormerLab/shadow-fleet-tracker-light.git
cd shadow-fleet-tracker-light
pip install -r requirements.txt
Ubuntu 22.04+ や Debian 12+ では、pipから「externally managed environment」エラーが発生する場合があります。起動スクリプトは仮想環境を作成して自動的に処理します — start.sh を実行するだけです。手動でインストールする場合は、事前にvenvを作成してください:
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows
pip install -r requirements.txt
2. AISStream APIキーの設定
Linux / macOS:
export AISSTREAM_API_KEY=your_key_here
export OPENSANCTIONS_API_KEY=your_key_here # 任意
Windows(コマンドプロンプト):
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"
3. トラッカーとダッシュボードを2つのターミナルで実行
ターミナル1 — AISフィードコンシューマー:
python shadow_tracker.py
ターミナル2 — Webダッシュボード:
uvicorn webserver:app --host 0.0.0.0 --port 8000
4. ダッシュボードを開く
http://localhost:8000
ライブ地図は http://localhost:8000/map にあり、3分ごとに更新されます。初回実行時は、データベース内の位置履歴から即座に地図がレンダリングされます — 白紙待機なし。
| サービス | 必須 | 無料枠 | リンク |
|---|---|---|---|
| AISStream | はい | はい — 非商用は無制限 | aisstream.io |
| OpenSanctions | いいえ | はい — 非商用利用 | opensanctions.org/api |
OPENSANCTIONS_API_KEY がなくてもトラッカーは正常に動作します — 制裁バッジが地図ポップアップに表示されないだけです。
すべての調整可能な定数は shadow_tracker.py の先頭にあります: