
बाल्टिक सागर की छाया बेड़े का ओपन सोर्स ट्रैकर। 1200+ जहाज, लाइव AIS, केबल निकटता अलर्ट। कोई क्लाउड नहीं, कोई सब्सक्रिप्शन नहीं, स्थानीय रूप से चलता है।
बाल्टिक सागर शैडो फ्लीट निगरानी लाइव AIS डेटा के माध्यम से। यूक्रेनी GUR युद्ध और प्रतिबंध सूची के 1200+ जहाजों को AISStream वेबसॉकेट फीड के विरुद्ध देखता है, एक स्व-अपडेटिंग मानचित्र पर स्थिति दर्शाता है, पनडुब्बी केबलों से निकटता को चिह्नित करता है, और रूस↔पश्चिम अंतरण पैटर्न का पता लगाता है।
मुफ़्त, ओपन सोर्स, स्थानीय रूप से चलता है। कोई क्लाउड नहीं, मुफ़्त AISStream API कुंजी के अलावा कोई सब्सक्रिप्शन नहीं।
फॉर्मर लैब संप्रभु खुफिया टूलचेन का हिस्सा।
शैडो फ्लीट ट्रैकर लाइट फॉर्मर लैब टीम द्वारा बनाया और संचालित किया गया है — संप्रभु कंप्यूटिंग, पुराने हार्डवेयर पर बिना VC बैकिंग के खुले, गोपनीयता-प्रथम उपकरण बनाना।
यदि यह उपकरण आपके लिए उपयोगी है, तो कृपया Patreon पर समर्थन करने पर विचार करें। एक मुफ़्त स्तर उपलब्ध है, जिसमें भुगतान स्तरों पर 7-दिन का परीक्षण शामिल है। हमेशा यूक्रेन का समर्थन करें!
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 पर है।
विंडोज़ उपयोगकर्ता: पर्यावरण चर सिंटैक्स के लिए सेटअप अनुभाग देखें।
Linux / macOS उपयोगकर्ता start.sh का उपयोग कर सकते हैं। विंडोज़ उपयोगकर्ता start.bat या start.ps1 का उपयोग कर सकते हैं — दोनों ट्रैकर और डैशबोर्ड को अलग-अलग विंडो में खोलते हैं और ब्राउज़र को स्वचालित रूप से लॉन्च करते हैं।
Vessels1.db) से प्राप्त 1200+ जहाज MMSI की वॉचलिस्ट के विरुद्ध स्ट्रीम को फ़िल्टर करता हैfiltered_cables.kml से) के 10 किमी के भीतर आता है तो अलर्ट करता हैडार्क CartoDB बेसमैप जिसमें केबल रूट हरे रंग में ओवरले हैं। जहाज मार्कर हर 3 मिनट में अपडेट होते हैं और अगले रिफ्रेश के लिए लाइव काउंटडाउन होता है — पेज स्वचालित रूप से रीलोड होता है। पॉपअप MMSI, IMO, ध्वज, गति, हेडिंग, गंतव्य, और MarineTraffic, VesselFinder, और War&Sanctions के लिए डीप लिंक दिखाते हैं। यदि API कुंजी कॉन्फ़िगर की गई है तो OpenSanctions प्रतिबंध स्थिति दिखाई जाती है।
Vessels1.db से ज्ञात जहाज के नाम AIS स्थैतिक संदेश की प्रतीक्षा किए बिना पहली उपस्थिति पर तुरंत दिखाए जाते हैं।
स्टार्टअप पर मानचित्र पिछले 24 घंटों के स्थिति लॉग से पूर्व-जनसंख्या होता है। वर्तमान सत्र में अभी तक नहीं देखे गए जहाजों को "पिछली बार X घंटे पहले देखा गया" लेबल के साथ ग्रे मार्कर के रूप में दिखाया जाता है — नए पिंग आने पर वे लाइव रंग में बदल जाते हैं।
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 विंडोज़ के लिए लॉन्चर (कमांड प्रॉम्प्ट)
start.ps1 विंडोज़ के लिए लॉन्चर (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 ट्रैक किए गए जहाजों की विहित सूची है। यूक्रेनी GUR युद्ध और प्रतिबंध सूची से 1200+ प्रविष्टियाँ, जिनमें टैंकर और कार्गो जहाज शामिल हैं जिन्हें रूसी शैडो फ्लीट के हिस्से के रूप में पहचाना गया है या बाल्टिक हाइब्रिड गतिविधि में शामिल पाया गया है।
सूची में हाल ही में बाल्टिक अधिकारियों द्वारा जब्त या रोके गए जहाज शामिल हैं:
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');"
विंडोज़ (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
विंडोज़ (PowerShell):
$env:AISSTREAM_API_KEY = "your_key_here"
.\start.ps1
विंडोज़ (कमांड प्रॉम्प्ट):
set AISSTREAM_API_KEY=your_key_here
start.bat
तीनों स्क्रिप्ट पहले 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 # विंडोज़
pip install -r requirements.txt
2. अपनी AISStream API कुंजी सेट करें
Linux / macOS:
export AISSTREAM_API_KEY=your_key_here
export OPENSANCTIONS_API_KEY=your_key_here # वैकल्पिक
विंडोज़ (कमांड प्रॉम्प्ट):
set AISSTREAM_API_KEY=your_key_here
set OPENSANCTIONS_API_KEY=your_key_here
विंडोज़ (PowerShell):
$env:AISSTREAM_API_KEY = "your_key_here"
$env:OPENSANCTIONS_API_KEY = "your_key_here"
3. ट्रैकर और डैशबोर्ड को दो अलग-अलग टर्मिनलों में चलाएँ
टर्मिनल 1 — AIS फ़ीड उपभोक्ता:
python shadow_tracker.py
टर्मिनल 2 — वेब डैशबोर्ड:
uvicorn webserver:app --host 0.0.0.0 --port 8000
4. डैशबोर्ड खोलें
http://localhost:8000
लाइव मानचित्र http://localhost:8000/map पर है और हर 3 मिनट में अपडेट होता है। पहली बार चलाने पर मानचित्र तुरंत डेटाबेस में पहले से मौजूद किसी भी स्थिति इतिहास से रेंडर होता है — कोई खाली कैनवास प्रतीक्षा नहीं।
| सेवा | आवश्यक | मुफ़्त स्तर | लिंक |
|---|---|---|---|
| AISStream | हाँ | हाँ — गैर-वाणिज्यिक के लिए असीमित | aisstream.io |
OPENSANCTIONS_API_KEY के बिना ट्रैकर सामान्य रूप से चलता है — प्रतिबंध बैज मानचित्र पॉपअप से हटा दिए जाते हैं।
सभी ट्यून करने योग्य मान shadow_tracker.py के शीर्ष पर हैं:
पर्यावरण चर:
| चर | आवश्यक | विवरण |
|---|---|---|
AISSTREAM_API_KEY | हाँ | AISStream वेबसॉकेट API कुंजी |
OPENSANCTIONS_API_KEY | नहीं | मानचित्र पॉपअप में प्रतिबंध लुकअप सक्षम करता है |
OpenSanctions गैर-वाणिज्यिक उपयोग के लिए मुफ़्त है — opensanctions.org/api पर पंजीकरण करें। कुंजी के बिना ट्रैकर सामान्य रूप से चलता है; प्रतिबंध फ़ील्ड पॉपअप से हटा दिए जाते हैं।
war-sanctions.gur.gov.ua यूक्रेनी GUR की शैडो फ्लीट और प्रतिबंधित जहाजों की सार्वजनिक सूची है। प्रत्येक जहाज का पोर्ट कॉल इतिहास, मानचित्र और प्रतिबंध विवरण के साथ एक क्रमांकित पृष्ठ होता है।
gur_scrape.py सूची को एक बार क्रॉल करके एक स्थानीय IMO→GUR-ID मैपिंग बनाता है:
python gur_scrape.py
यह gur_mapping.json उत्पन्न करता है। ट्रैकर इसे स्टार्टअप पर लोड करता है और उपलब्ध होने पर मानचित्र पॉपअप में प्रत्यक्ष डीप-लिंक (/en/transport/ships/{id}) का उपयोग करता है, सूची में अभी तक नहीं आए जहाजों के लिए Google साइट-सर्च पर वापस आ जाता है।
क्रॉल ~1600 प्रविष्टियों को 1.5 s/अनुरोध (~40 मिनट) पर कवर करता है। सूची बढ़ने पर कभी-कभी पुनः चलाएँ — किसी विशिष्ट ID से फिर से शुरू करने के लिए --start का उपयोग करें:
python gur_scrape.py --start 1580
एक पृष्ठ को डीबग करने के लिए:
python gur_scrape.py --probe 1517
gur_mapping.json वॉचलिस्ट के साथ हर 5 मिनट में स्वचालित रूप से पुनः लोड होता है — पुनः क्रॉल के बाद ट्रैकर पुनरारंभ की आवश्यकता नहीं है।
loitering_module.py में लॉटरिंग थ्रेशोल्ड:
| स्थिरांक | डिफ़ॉल्ट | विवरण |
|---|---|---|
SPEED_THRESHOLD_KN |
transshipment_module.py में अंतरण सेटिंग्स:
| स्थिरांक | डिफ़ॉल्ट | विवरण |
|---|---|---|
SPEED_THRESHOLD_KN |
कवर किए गए पोर्ट ज़ोन:
| बंदरगाह | प्रकार |
|---|---|
| Ust-Luga, Primorsk, St Petersburg, Vyborg | रूसी निर्यात टर्मिनल |
| Skaw/Skagen, Gothenburg, Kiel, Copenhagen, Aarhus | पश्चिमी अंतरण केंद्र |
प्रत्येक जहाज पृष्ठ (/vessel/<mmsi>) दिखाता है:
दो पैटर्न को स्थिति डेटा से अनुमानित करता है:
पोर्ट कॉल का अनुमान स्थिति पिंग से लगाया जाता है — किसी बाहरी API की आवश्यकता नहीं है। एक जहाज को कॉल दर्ज करने के लिए कम से कम 2 पिंगों के लिए <1.5 kn पर पोर्ट ज़ोन के अंदर होना चाहिए। यह एक पैटर्न दिखाता है, फैसला नहीं।
filtered_cables.kml ओपन-सोर्स डेटासेट से प्राप्त किया गया है और अनुमानित है — सटीक निकटता गणना के लिए उपयुक्त नहीं है। 10 किमी अलर्ट थ्रेशोल्ड इस मार्जिन को ध्यान में रखता है। बेहतर केबल ज्यामिति के योगदान का स्वागत है।
ट्रैकर वेबसॉकेट स्ट्रीम पर एक एकल async लूप चलाता है। स्थिति मेमोरी में रखी जाती है (vessel_info, static_cache) और प्रत्येक रेंडर चक्र पर SQLite में फ्लश की जाती है। मानचित्र को आंशिक फ़ाइल परोसने से बचने के लिए os.replace के माध्यम से परमाणु रूप से लिखा जाता है।
स्टार्टअप पर, warm_restart() vessel_data_log.db से पिछले WARM_RESTART_HOURS घंटे पढ़ता है और वेबसॉकेट कनेक्ट होने से पहले vessel_info को पूर्व-जनसंख्या करता है। प्रारंभिक मानचित्र तुरंत रेंडर होता है। पुरानी स्थितियों को दृश्य रूप से अलग किया जाता है (ग्रे मार्कर, मंद ट्रेल) और नए पिंग आने पर लाइव रंग में बदल जाते हैं।
वॉचलिस्ट और gur_mapping.json हर 5 मिनट में डिस्क से पुनः लोड होते हैं — ट्रैकर चलने के दौरान जहाज जोड़े जा सकते हैं और GUR मैपिंग को पुनः क्रॉल किया जा सकता है, बिना पुनरारंभ के।
वेबसर्वर स्टेटलेस है और सीधे SQLite फ़ाइलों से पढ़ता है — ट्रैकर प्रक्रिया के साथ कोई साझा मेमोरी नहीं।
| जहाज | IMO | घटना |
|---|
| EAGLE S | 9329760 | फ़िनलैंड द्वारा दिसंबर 2024 में जब्त — Estlink-2 केबल तोड़फोड़, जासूसी उपकरण मिले |
| EVENTIN | 9308065 | जर्मनी द्वारा जनवरी-मार्च 2025 में जब्त — Rügen से बहकर, 100,000t रूसी कच्चा तेल जब्त |
| KIWALA | 9332810 | एस्टोनिया द्वारा अप्रैल 2025 में हिरासत में लिया गया — ध्वजहीन, EU/UK प्रतिबंधित |
| JAGUAR | 9293002 | एस्टोनिया द्वारा मई 2025 में रोका गया — रूस ने इसे एस्कॉर्ट करने के लिए Su-35 भेजा |
| KIRA K | 9346720 | दिसंबर 2025 में वैगनर/GRU चालक दल की पुष्टि |
| QENDIL | 9310525 | सितंबर 2025 में वैगनर/GRU चालक दल — दिसंबर 2025 में यूक्रेनी ड्रोन हमला |
| FITBURG | 9250397 | फ़िनलैंड द्वारा 31 दिसंबर 2025 को जब्त — हेलसिंकी-टालिन केबल तोड़फोड़ |
| CAFFA | 9143611 | स्वीडन द्वारा 6 मार्च 2026 को जब्त — चुराया गया यूक्रेनी अनाज, झूठा ध्वज |
| SEA OWL I | 9321172 | स्वीडन द्वारा 12 मार्च 2026 को जब्त — EU प्रतिबंधित, झूठा कोमोरोस ध्वज |
| OpenSanctions | नहीं | हाँ — गैर-वाणिज्यिक उपयोग | opensanctions.org/api |
| स्थिरांक | डिफ़ॉल्ट | विवरण |
|---|
BALTIC_BBOX | 52.65–66°N, 9–30°E | AISStream सदस्यता बाउंडिंग बॉक्स |
CABLE_ALERT_KM | 10 | केबल निकटता सीमा |
MAP_RENDER_INTERVAL | 180 s | मानचित्र रिफ़्रेश दर |
MMSI_RELOAD_INTERVAL | 300 s | DB से वॉचलिस्ट पुनः लोड |
WARM_RESTART_HOURS | 24 | स्टार्टअप पर लोड करने के लिए स्थिति इतिहास के घंटे |
RECONNECT_DELAY | 10 s | WS पुनः कनेक्ट बैकऑफ़ |
| 0.5 kn |
| इससे नीचे रुका हुआ माना जाता है |
TIME_THRESHOLD_S | 1200 s | लॉटरिंग चिह्नित होने से पहले की अवधि |
RADIUS_THRESHOLD_KM | 0.5 km | उसी स्थान के रूप में गिने जाने के लिए अधिकतम बहाव |
| 1.5 kn |
| पोर्ट ज़ोन के अंदर इससे नीचे कॉल माना जाता है |
MIN_PINGS_IN_ZONE | 2 | पोर्ट कॉल रिकॉर्ड करने से पहले न्यूनतम पिंग |
WINDOW_DAYS | 21 | अंतरण चिह्नित करने के लिए पोर्ट कॉल के बीच अधिकतम दिन |
| रूट | विवरण |
|---|
/ | लाइव लॉग व्यूअर, हर 60 s में ऑटो-रिफ़्रेश होता है |
/map | नवीनतम रेंडर किया गया मानचित्र (iframe-अनुकूल) |
/analyze | CSV निर्यात के साथ फ़िल्टर करने योग्य जहाज रिकॉर्ड तालिका |
/timeline | गतिविधि अवलोकन — प्रति ट्रैक किए गए जहाज एक कार्ड, अंतिम बार देखे जाने के अनुसार क्रमबद्ध |
/vessel/<mmsi> | प्रति-जहाज इतिहास: AIS ब्लैकआउट, केबल निकटता, ध्वज परिवर्तन, GPX निर्यात |
/vessel/<mmsi>/gpx | GPX ट्रैक निर्यात — QGIS, OpenStreetMap, GPSBabel में खोलता है |
/loitering | लॉटरिंग घटनाएँ निकट-केबल फ़्लैग, प्रति-जहाज सारांश, CSV निर्यात के साथ |
/transshipment | रूस↔पश्चिम पोर्ट कॉल पैटर्न — RU→WEST और WEST→RU घटनाएँ, CSV निर्यात |
/log/download | कच्ची लॉग फ़ाइल डाउनलोड |
| घटक | स्थिति |
|---|
| AIS स्ट्रीम उपभोक्ता | काम कर रहा है |
| वॉचलिस्ट | 1200+ जहाज (पूर्ण GUR सूची) |
| केबल निकटता अलर्ट | काम कर रहा है |
| लॉटरिंग का पता लगाना | काम कर रहा है |
| अंतरण का पता लगाना | काम कर रहा है — पोर्ट कॉल स्थिति से अनुमानित, 21-दिन की खिड़की |
| मानचित्र रेंडरिंग | काम कर रहा है — 3 मिनट की दर, लाइव काउंटडाउन, ऑटो-रीलोड |
| वार्म रीस्टार्ट | काम कर रहा है — स्टार्टअप पर पिछले 24 घंटों के लॉग से मानचित्र पूर्व-जनसंख्या करता है |
| जहाज पॉपअप | MarineTraffic + VesselFinder + War&Sanctions डायरेक्ट लिंक (1337 जहाज मैप किए गए) |
| जहाज पॉपअप | OpenSanctions प्रतिबंध स्थिति (वैकल्पिक, API कुंजी आवश्यक) |
| ध्वज परिवर्तन का पता लगाना | काम कर रहा है — परिवर्तन लॉग करता है, flag_history में संग्रहीत |
| डैशबोर्ड — लॉग, जहाज, CSV निर्यात | काम कर रहा है |
| डैशबोर्ड — टाइमलाइन व्यू | काम कर रहा है |
| डैशबोर्ड — प्रति-जहाज इतिहास + GPX | काम कर रहा है |
| डैशबोर्ड — रूट रीप्ले | काम कर रहा है — प्ले/पॉज़/रीसेट, स्पीड कंट्रोल, केबल अलर्ट हाइलाइटिंग |
| डैशबोर्ड — लॉटरिंग पैनल | काम कर रहा है |
| डैशबोर्ड — अंतरण पैनल | काम कर रहा है |