Arsitektur 1 Dashboard, 1 Port (:8000)
AIS Suite mengonsolidasikan 3 penyedia AIS terkemuka (MarineTraffic, MyShipTracking, AISStream) ke dalam satu port tunggal (default :8000). Seluruh komunikasi data antar engine dan dashboard menggunakan direct database access via SQLAlchemy pool, meniadakan latensi dan risiko kegagalan proxy HTTP internal.
Spesifikasi Layanan
| Komponen | Keterangan |
|---|---|
| Port Layanan | http://0.0.0.0:8000 (Env: APP_PORT) |
| Dashboard UI | / atau /dashboard |
| Tile Server URL | /tiles/{z}/{x}/{y}.png?provider={provider} |
| RESTful API | /api/v1/* |
| Interactive Docs | /docs (Swagger UI) & /docs/manual |
Katalog Provider Data
Parameter provider dapat disematkan di seluruh endpoint tiles dan API:
| Nilai Provider | Sumber Data | Metode Penarikan | Warna Indikator |
|---|---|---|---|
all (default) | Multi-Source Agregat | Dedup realtime dari ketiga DB | β Biru Terang |
mt | MarineTraffic | Playwright Scraper + Chrome CDP :9222 | β Biru Laut |
mst | MyShipTracking | HTTP Requests (TSV Bounding Box) | β Oranye |
stream | AISStream | WebSocket Live (stream.aisstream.io) | β Hijau Emerald |
Integrasi Tileserver (Slippy Map Standard)
Tileserver menghasilkan PNG 256x256 Web Mercator transparan. Simbol kapal otomatis dirotasi sesuai
heading / course dan diberi warna sesuai tipe kapal.
1. Pemasangan di Leaflet JS
// Inisialisasi peta Leaflet
const map = L.map('map').setView([-2.5, 118.0], 6);
// 1. Basemap peta dasar (Dark matter)
L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', {
attribution: '© CartoDB', maxZoom: 19
}).addTo(map);
// 2. AIS Suite Tile Layer armada kapal
const aisLayer = L.tileLayer('http://localhost:8000/tiles/{z}/{x}/{y}.png?provider=all&shiptype=7', {
maxZoom: 18,
tileSize: 256,
attribution: '© AIS Suite Indonesia'
}).addTo(map);
2. Pemasangan di MapLibre GL / Mapbox GL
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [118.0, -2.5],
zoom: 5
});
map.on('load', () => {
// Tambahkan raster source untuk tile AIS
map.addSource('ais-fleet-tiles', {
type: 'raster',
tiles: ['http://localhost:8000/tiles/{z}/{x}/{y}.png?provider=all'],
tileSize: 256
});
map.addLayer({
id: 'ais-fleet-layer',
type: 'raster',
source: 'ais-fleet-tiles',
minzoom: 0,
maxzoom: 20
});
});
RESTful API Data Kapal
GET /api/v1/ships
Mengambil daftar kapal dalam format JSON terstruktur dengan opsi paginasi dan filter spasial.
| Parameter | Tipe | Deskripsi |
|---|---|---|
provider | string | mt | mst | stream | all (default: all) |
region | string | west | central | east |
shiptype | string | 7 (Cargo), 8 (Tanker), 2 (Fishing), dll. |
flag | string | Kode bendera negara (contoh: ID, SG, PA) |
lat, lon, radius_km | float | Pencarian kapal dalam radius N km dari titik koordinat |
limit, offset | int | Limit per halaman (default: 100, maks: 2000) |
GET /api/v1/ships/map
Menghasilkan GeoJSON FeatureCollection lengkap dengan properti kapal untuk visualisasi langsung di client-side renderer.
curl -s "http://localhost:8000/api/v1/ships/map?provider=mt®ion=west" | jq .
GET /api/v1/ships/search
Pencarian kapal berdasarkan substring nama kapal atau kecocokan nomor MMSI.
curl -s "http://localhost:8000/api/v1/ships/search?q=PERTAMINA&provider=all" | jq .
Endpoint Perbandingan (Backward-Compatible)
Endpoint yang mendukung perbandingan multi-source side-by-side:
GET /api/sources: Status dan jumlah kapal aktif dari MT, MST, dan AISStream.GET /api/ship?id={mmsi}: Menampilkan data telemetri kapal yang sama di ketiga database secara berdampingan.GET /api/search?q={name}: Pencarian yang dikelompokkan per provider.GET /api/track?id={mmsi}&source={provider}: Riwayat koordinat perjalanan dari sumber tertentu.