Sistem big data berbasis pipeline otomatis untuk mengumpulkan, menganalisis, dan memvisualisasikan data dari Twitter/X dan berita lokal (Radar Semarang) terkait isu transportasi umum dan fasilitas umum di Kota Semarang.
Proyek ini membangun sebuah pipeline data end-to-end yang terdiri dari:
- Pengumpulan Data — Scraping tweet dari Twitter/X dan artikel berita dari Radar Semarang secara otomatis dan terjadwal.
- Penyimpanan Data — Data mentah disimpan di MongoDB (data lake), hasil analisis disimpan di PostgreSQL (data warehouse).
- Analisis & Klasifikasi — AI Agent (Groq LLM) menganalisis sentimen tweet dan mengklasifikasikan berita berdasarkan kategori (Banjir, Kecelakaan, Longsor, dll) serta mengekstrak lokasi geografis.
- Visualisasi — Dashboard interaktif di Metabase menampilkan peta lokasi kejadian, distribusi sentimen, dan statistik berita.
- Notifikasi WhatsApp — Laporan otomatis dikirim ke WhatsApp via WAHA + n8n.
Twitter/X ──────────┐
▼
Radar Semarang ──► Scraper API (FastAPI + Playwright) ──► Telegram Notifier
│
▼
MongoDB (Data Lake)
│
▼
n8n Automation Engine
┌────────┴────────┐
▼ ▼
Sentiment Analysis News Analysis & ──► Telegram Notifier
(Groq LLM) Classification (Groq) (mulai & selesai)
│ │
└────────┬────────┘
▼
PostgreSQL (Data Warehouse)
│
▼
Metabase Dashboard
WhatsApp (WAHA) ──► Chatbot AI (n8n + Groq)
│
Query Sentimen & Berita
dari PostgreSQL
| Komponen | Teknologi | Fungsi |
|---|---|---|
| Scraper | FastAPI + Playwright | Scraping Twitter/X & Radar Semarang |
| Data Lake | MongoDB | Penyimpanan data mentah (tweet & berita) |
| Data Warehouse | PostgreSQL | Penyimpanan hasil analisis terstruktur |
| Orchestration | n8n | Automasi pipeline & penjadwalan |
| AI Analysis | Groq (GPT) | Analisis sentimen & klasifikasi berita |
| Visualisasi | Metabase | Dashboard & peta interaktif |
| WhatsApp API | WAHA | Chatbot WhatsApp interaktif |
| Notifikasi | Telegram | Notifikasi hasil scraping |
| Deployment | Docker Compose | Menjalankan seluruh layanan |
| Map Geocoding | Nominatim (OpenStreetMap) | Konversi nama lokasi ke koordinat |
n8n menjalankan dua workflow terjadwal:
- X (Twitter) Scraper — Memanggil
POST /api/twitter/scrapedengan query terkait fasilitas umum dan transportasi Semarang. Hasil disimpan ke MongoDB collectiontweets. - News Scraper — Memanggil
POST /api/news/scrape-autountuk mengambil artikel dari Radar Semarang (kategori: Kecelakaan, Banjir, Gempa, Kebakaran). Hasil disimpan ke MongoDB collectionnews.
n8n workflow Sentimen Analysis berjalan terjadwal:
- Notifikasi Telegram dikirim saat proses dimulai
- Ambil tweet dari MongoDB yang belum dianalisis
- Loop setiap tweet → AI Agent (Groq) mengklasifikasikan sentimen: Positif / Negatif / Netral
- Hasil di-upsert ke tabel
tweetsdi PostgreSQL - Notifikasi Telegram dikirim saat proses selesai
n8n workflow News Analyze and Classification berjalan terjadwal:
- Notifikasi Telegram dikirim saat proses dimulai
- Ambil artikel berita dari MongoDB yang belum diproses
- Loop setiap artikel → AI Agent mengklasifikasikan kategori (Banjir, Kecelakaan, Longsor, dll) dan mengekstrak nama lokasi
- Nominatim API mengkonversi nama lokasi → koordinat (lat/lon)
- Data diinsert ke tabel
newsdi PostgreSQL dengan koordinat lokasi - MongoDB diupdate status
processed = true - Notifikasi Telegram dikirim saat proses selesai
Chatbot WhatsApp berbasis AI yang menjawab pertanyaan pengguna menggunakan data dari database (tweet sentimen & berita). AI Agent pertama menangani kedua jenis query (sentimen & berita). AI Agent kedua berfungsi sebagai fallback error handling apabila Agent pertama terkena rate limit LLM.
Workflow terjadwal untuk memicu scraping Twitter/X dan Radar Semarang secara periodik. Setelah scraping selesai, notifikasi dikirim via Telegram.
Pipeline analisis sentimen tweet dengan Groq LLM. Setiap tweet diloop, dianalisis, lalu di-upsert ke PostgreSQL. Notifikasi Telegram dikirim saat proses mulai dan selesai.
Pipeline klasifikasi berita, ekstraksi lokasi, geocoding via Nominatim, dan penyimpanan ke PostgreSQL. Notifikasi Telegram dikirim saat proses mulai dan selesai.
Dashboard Metabase menampilkan distribusi sentimen tweet yang dikumpulkan (Negatif / Positif / Netral), dibreakdown per kategori utama: Fasilitas Umum (Fasum) dan Transportasi Umum (Transum).
Dashboard peta interaktif menampilkan lokasi kejadian (Kecelakaan, Banjir, Longsor) di wilayah Semarang beserta jumlah artikel per kategori.
Pengguna dapat mengirim pertanyaan ke WhatsApp dan mendapatkan jawaban berdasarkan data sentimen tweet maupun berita terbaru dari database.
big-data/
├── scraper/
│ ├── main.py # FastAPI app + endpoint scraper
│ ├── scraper.py # Logic scraping Twitter/X (Playwright)
│ ├── scraper_news.py # Logic scraping Radar Semarang
│ ├── Dockerfile
│ └── requirements.txt
├── public/
│ ├── fasum.JPG # Gambar kategori fasilitas umum
│ └── transum.jpg # Gambar kategori transportasi umum
├── docs/ # Screenshot workflow & dashboard
├── docker-compose.yml # Definisi seluruh layanan
└── README.md
| Service | Port | Keterangan |
|---|---|---|
| Scraper API | 5000 | FastAPI endpoint scraping |
| n8n | 5678 | Automation engine |
| Metabase | 3000 | Dashboard visualisasi |
| MongoDB | 27017 | Data lake |
| Mongo Express | 8081 | GUI MongoDB |
| PostgreSQL | - | Data warehouse (internal) |
| pgAdmin | 5050 | GUI PostgreSQL |
| WAHA | 3003 | WhatsApp HTTP API |
| Static Server | 8080 | Nginx file server |
Project dijalankan menggunakan Docker Compose.
# Clone repo
git clone https://github.com/lexiiyz/big-data.git
cd big-data
# Setup environment
cp .env.example .env
# Edit .env sesuai konfigurasi
# Jalankan semua service
docker compose up -d
# Cek status
docker compose ps| Variable | Keterangan |
|---|---|
MONGO_USER |
Username MongoDB |
MONGO_PASSWORD |
Password MongoDB |
POSTGRES_USER |
Username PostgreSQL |
POSTGRES_PASSWORD |
Password PostgreSQL |
GROQ_API_KEY |
API key Groq LLM |
WAHA_API_KEY |
API key WAHA |
WAHA_DASHBOARD_USERNAME |
Username dashboard WAHA |
WAHA_DASHBOARD_PASSWORD |
Password dashboard WAHA |
N8N_HOST |
Hostname/IP server n8n |
PGADMIN_EMAIL |
Email login pgAdmin |
PGADMIN_PASSWORD |
Password pgAdmin |
ME_USER |
Username Mongo Express |
ME_PASSWORD |
Password Mongo Express |
| Method | Endpoint | Keterangan |
|---|---|---|
POST |
/api/twitter/scrape |
Trigger scraping Twitter/X |
POST |
/api/news/scrape-auto |
Trigger scraping Radar Semarang |
GET |
/health |
Health check |
POST /api/twitter/scrape
{
"topic": "Analisa Transum & Fasum Indonesia",
"query": "(\"transum\" OR \"transportasi umum\" OR \"fasilitas publik\" OR \"fasilitas umum\") (angkot OR busway OR krl OR mrt OR halte OR stasiun OR trotoar)",
"max_tweets": 50
}POST /api/news/scrape-auto
{
"queries": ["Kecelakaan", "Banjir"],
"max_pages": 5
}





