articles
Alur terdistribusi pengisian tabel PostgreSQL articles dan indeks Elasticsearch articles—mulai dari perayapan otonom B1 berbasis Google News, penyimpanan MinIO & auto-discovery target, pembersihan C1, deduplikasi vektor C2, hingga ekstraksi AI SPOK D1.
Pipeline Data: articles (Master Berita Siber)
Pipeline ini bertanggung jawab untuk menghimpun, menyaring, membersihkan, dan memperkaya dokumen berita siber pada tabel PostgreSQL articles (sebagai Single Source of Truth OLTP) dan indeks Elasticsearch articles (sebagai mesin pencarian teks cepat dan agregasi visualisasi intelijen).
Arsitektur Scraping Otonom (Autonomous B1 Engine)
Worker B1 beroperasi secara mandiri (autonomous) menggunakan penyedia berita terpadu Google News (NEWS_PROVIDER=google). B1 mengambil kata kunci aktif langsung dari PostgreSQL, merayap berita nasional/daerah secara agregatif tanpa ketergantungan pesan berkala A1 di antrian Kafka queue-job, dan secara otomatis mendaftarkan domain-domain media baru ke tabel scraping_targets.
1. Ringkasan Arsitektur Alur
[taxonomy_keywords] (PostgreSQL: Kata Kunci Leksikon Aktif)
│
▼ (Autonomous Ticker Loop: scrape_interval / default 1h)
[B1 - Autonomous Google News Scraper]
│
├──────────────────────────────────────┐
▼ ▼
[MinIO: Raw S3 Storage] [Auto-Discovery Targets]
(source/news.google.com/*.json) (PostgreSQL: scraping_targets)
│
▼ Antrian Kafka: queue-raw-data-site
[C1 - HTML Cleaner & Normalizer] ──► Antrian Kafka: queue-normalize-data
│
▼
[C2 - Vector Deduplication] (Qdrant Cosine Similarity < 0.90)
│
▼ (Artikel Unik) ──► Antrian Kafka: queue-ai-inference
[nexa-d1 - AI Worker] (SPOK, NER, Sentimen, Hierarki Polri via AIOS)
│
├────────────────────────────────────┐
▼ ▼
[PostgreSQL: articles] [Elasticsearch: articles]
(Master Transaksional) (Pencarian Cepat & Dashboard)2. Tahap 1: Pengambilan Berita Otonom & Auto-Discovery (B1)
Worker B1 Scraper Service menjalankan penjadwalan internal (autonomous ticker loop) secara berkala:
- Sinkronisasi Kata Kunci Taksonomi Langsung dari Database:
B1 mengeksekusi fungsi
FetchActiveKeywordske tabeltaxonomy_keywordsPostgreSQL untuk mengambil seluruh kata kunci leksikon aktif (L1–L5) lengkap dengan hierarki taksonomi (ancestry path). - Agregasi Feed Google News RSS:
Untuk setiap kata kunci aktif, B1 menghubungi endpoint pencarian Google News RSS (
https://news.google.com/rss/search?q={keyword}&hl=id&gl=ID&ceid=ID:id). - Penyaringan Lapis 1 (Jendela Waktu & Kuota Kandidat):
- Hanya memproses berita yang dipublikasikan dalam 24 jam terakhir (
dropped_older_24h). - Membatasi kuota evaluasi kandidat awal (default: 10 artikel per leksikon) untuk efisiensi komputasi.
- Hanya memproses berita yang dipublikasikan dalam 24 jam terakhir (
- Penyaringan Lapis 2 (Fetch Konten Penuh, Dedup, & Guardrail Karakter):
- Menghubungi URL sumber berita asli untuk mengunduh konten teks lengkap.
- Memverifikasi riwayat URL menggunakan mekanisme deduplikasi in-memory/Redis.
- Menerapkan batas maksimal karakter (3.500 karakter); artikel investigasi atau agregasi yang melebihi batas ini dibuang (
filtered_too_long) guna menjaga kualitas dan efisiensi inferensi model AI di hilir.
- Penyimpanan Dokumen Mentah (MinIO) & Auto-Discovery Media:
- Seluruh kumpulan artikel yang lolos disimpan ke bucket MinIO sebagai berkas JSON (
source/news.google.com/{uuid}.json). - Setiap domain media baru yang berhasil dirayap otomatis didaftarkan ke tabel
scraping_targetsdengan status draf (is_active = false,org_type = 'unassigned') agar dapat dikurasi dan diverifikasi oleh admin melalui antarmuka frontend.
- Seluruh kumpulan artikel yang lolos disimpan ke bucket MinIO sebagai berkas JSON (
- Publikasi Pointer ke Kafka:
B1 menerbitkan event pointer berukuran ringan ke antrian
queue-raw-data-siteyang merujuk padaraw_refMinIO.
Alur Kerja B1 Autonomous Scraper (Google News Ingestion)
Penjadwalan mandiri, penarikan kata kunci PostgreSQL, agregasi Google News RSS, MinIO storage, auto-discovery target, dan emisi pointer Kafka
Penjadwal internal B1 mengambil kata kunci leksikon aktif (L1–L5) langsung dari PostgreSQL tanpa pesan perantara A1 atau queue-job.
Perayapan feed RSS pencarian Google News per kata kunci. Memfilter berita di luar jendela waktu 24 jam dan membatasi kuota kandidat per leksikon.
Mengunduh teks utuh artikel via HTTP, verifikasi deduplikasi URL (Redis/In-Memory), serta membuang artikel yang melebihi batas (> 3.500 karakter).
Menyimpan berkas JSON mentah per batch keyword (source/news.google.com/{uuid}.json).
Pendaftaran otomatis domain media baru ke tabel scraping_targets (status is_active = false) untuk kurasi admin.
Memancarkan event pointer berisi ID dokumen, referensi objek MinIO, dan silsilah taksonomi ke C1 Cleaner untuk normalisasi.
3. Tahap 2: Pembersihan Teks & Normalisasi Waktu (C1)
Worker C1 Cleaner mengonsumsi pointer event dari queue-raw-data-site dan mengunduh berkas mentah dari MinIO:
- Pembersihan DOM & Boilerplate: Membuang elemen iklan, widget media sosial, navigasi, dan tracker JavaScript.
- Normalisasi Temporal: Mengonversi beragam format tanggal lokal media siber Indonesia ke format standar ISO-8601 UTC.
- Publikasi ke Hilir: Memancarkan teks berita bersih ke antrian Kafka
queue-normalize-data.
Alur Data C1 Processor & Cleaner
Sanitasi DOM HTML, ekstraksi teks bersih, dedup hash Redis, dan emisi normalisasi (+ DLQ)
Diterbitkan oleh b1-scrapper-site-process memuat pointer key MinIO.
Pembersihan tag HTML/iklan/tracker & normalisasi multi-tipe (berita, lelang, komoditas, sekolah).
Artikel bersih dikonsumsi oleh C2 Dedup & D1 AI Worker.
Payload rusak/gagal parsing diisolasi dengan anotasi alasan error.
4. Tahap 3: Deduplikasi Semantik Vektor (C2)
Worker C2 mengubah judul dan pembukaan berita menjadi representasi vektor numerik (embeddings) dan membandingkannya ke koleksi Qdrant Vector DB:
- Skor Kemiripan $\ge$ 0.90 (Duplikat / Sindikasi Portal): Ditolak dari proses inferensi AI untuk menghemat komputasi GPU/token, lalu dialihkan ke pencatatan klaster tren berita.
- Skor Kemiripan < 0.90 (Artikel Unik / Baru): Dipancarkan ke antrian Kafka
queue-ai-inferenceuntuk dianalisis oleh modul AI kognitif.
Alur C2 Deduplication Worker
Deduplikasi semantik berbasis embedding vector dan pengelompokan cluster berita
Mengambil metadata artikel dari Kafka dan menarik konten teks lengkap dari MinIO.
Vektorisasi judul dan ringkasan artikel menjadi dense vector embedding 384 dimensi.
Query pencarian ANN pada collection Qdrant untuk mendeteksi kesamaan konten berita.
Tautkan ke cluster ID existing & increment dupe count.
Simpan vector ke Qdrant & teruskan ke antrian AI D1.
5. Tahap 4: Ekstraksi Kognitif & Dual-Sink Persistence (D1)
Worker nexa-d1 mengonsumsi event dari queue-ai-inference dan berkolaborasi dengan engine AIOS:
- Ekstraksi Sintaksis SPOK: Mengidentifikasi Subjek, Predikat, Objek, dan Keterangan dari kalimat inti berita.
- Polri Hierarchy Resolver: Memetakan entitas kepolisian yang disebut ke dalam hierarki resmi: Mabes Polri $\rightarrow$ Polda $\rightarrow$ Polres $\rightarrow$ Polsek.
- Sentimen & Skor Risiko: Menentukan sentimen publik (Positif, Netral, Negatif) dan skor urgensi kamtibmas (Level 1–5).
- Penyimpanan Ganda (Dual-Sink):
- PostgreSQL (
articles): Menyimpan relasi entitas, ID taksonomi, dan data transaksi relasional. - Elasticsearch (
articles): Menyediakan pengindeksan teks penuh, pencarian cepat, serta agregasi data analitik pada dashboard pimpinan.
- PostgreSQL (
Alur D1 AI Worker (Berita)
Inferensi LLM terdistribusi untuk sentimen, entitas, ringkasan, dan dual-sink
Menerima payload artikel bersih pasca-deduplikasi untuk diproses secara batch asinkron.
Ekstraksi simultan: Sentimen (-1 s/d +1), NER (Tokoh, Organisasi, Lokasi), Ringkasan 3-kalimat, & Relevansi Taksonomi.
Collection: articles_clean_v2 (dokumen lengkap beranotasi NLP).
Index: news_search_index (indeks pencarian teks penuh & faset).
Memicu aggregation worker & decision worker untuk kalkulasi tren dan scoring ancaman otomatis.
6. Spesifikasi Payload Transmisi Antar-Worker
Berikut adalah representasi skema payload data yang ditransmisikan pada setiap titik jabat tangan (handshake) antar-komponen:
Payload pointer yang dipancarkan oleh B1 ke Kafka setelah batch artikel tersimpan di MinIO:
{
"topic": "queue-raw-data-site",
"source_id": "news.google.com",
"type": "berita",
"external_id": "https://nasional.kompas.com/read/2026/10/15/sidak-beras-bulog",
"keyword": "cadangan beras pemerintah",
"keyword_id": "c7b76ff8-2641-4a77-9104-e6ca43eb76f7",
"raw_ref": "source/news.google.com/fb712084-fe65-4f11-bc60-d88448634870.json",
"trace_id": "a6ceb215372a0415381fcb95"
}Phone Farm
Arsitektur pemanenan media sosial berbasis perangkat keras fisik (Hardware Phone Farm Swarm / b3-scrapper-social-process), cron 15 menit scraping trending topic di platform X, pemrosesan AI taksonomi, load balancing 20 unit Samsung S10, hingga Direct Dual Sink ke PostgreSQL, Elasticsearch, dan MinIO S3.
postings
Alur pengumpulan data media sosial bersiklus 15 menit via B3 Scraper di Phone Farm, ekstraksi X/Twitter trending, pencocokan taksonomi/pilar, snapshots PostgreSQL, pemanenan multichannel (X, FB, IG, TikTok), dan persistensi langsung ke tabel PostgreSQL & indeks Elasticsearch postings dan post_author.