-
Docker and Docker Compose installed
docker --version docker compose version
-
GitHub Personal Access Token in
.envfileGITHUB_TOKEN=your_token_hereIn production, use a secrets management system (AWS Secrets Manager, Vault, etc.).
-
Java 21 (only needed for local development, not for Docker)
docker compose build
docker compose updocker compose up -d
# Follow all service logs
docker compose logs -f
# Follow a specific service
docker compose logs -f ingestor_service
docker compose logs -f processor_service# Infrastructure only
docker compose up zookeeper kafka kafdrop redis postgres
# Infrastructure + ingestor only (no processor)
docker compose up zookeeper kafka kafdrop redis postgres ingestor_service
# Everything
docker compose up| Service | Port | Description |
|---|---|---|
| Zookeeper | 2181 | Required by Kafka |
| Kafka | 9092 | Event streaming backbone |
| Kafdrop | 9000 | Kafka web UI for inspecting topics and messages |
| Redis | 6379 | Real-time trending leaderboard (sorted sets) |
| PostgreSQL | 5432 | Repository metadata, viral milestones, user watches |
| Ingestor Service | 8080 | Polls GitHub API, sends events to Kafka |
| Processor Service | 8081 | Consumes Kafka events, updates Redis + PostgreSQL |
GitHub API
│ (polled every 1 second, 100 events per page)
▼
┌─────────────────┐
│ Ingestor Service│ ──► Kafka (raw-github-events)
│ (port 8080) │
└─────────────────┘
│
▼
┌──────────────────┐
│ Processor Service│
│ (port 8081) │
└──────┬───────────┘
│
┌───────────┴───────────┐
▼ ▼
┌──────────┐ ┌────────────┐
│ Redis │ │ PostgreSQL │
│ (scores) │ │ (metadata) │
└──────────┘ └────────────┘
Ingestor Service polls GitHub's /events API every second, filters for high-value events
(WatchEvent, ForkEvent, PullRequestEvent, IssuesEvent), and publishes them to Kafka.
Processor Service consumes events from Kafka and:
- Updates the Redis leaderboard with weighted scores
- Fetches and stores repository metadata in PostgreSQL (on first sighting)
- Records viral milestones when a repo crosses score thresholds (50, 100, 500, 1000, 5000)
docker compose ps# Ingestor service
curl http://localhost:8080/actuator/health
# Processor service
curl http://localhost:8081/actuator/healthExpected: {"status":"UP"}
Open http://localhost:9000 in your browser.
- Look for the
raw-github-eventstopic - Click into the topic to see messages flowing
# Connect to Redis and view top trending repos
docker compose exec redis redis-cli ZREVRANGE trending:repos 0 9 WITHSCORES# Connect to PostgreSQL
docker compose exec postgres psql -U user -d trend_radar
# View stored repository metadata
SELECT repo_name, primary_language, license, owner FROM repository_metadata LIMIT 10;
# View viral milestones
SELECT repo_name, score_threshold, reached_at FROM viral_milestones ORDER BY reached_at DESC LIMIT 10;
# Exit
\q# Ingestor: should show events being fetched and sent to Kafka
docker compose logs -f ingestor_service
# Processor: should show events being scored and milestones being recorded
docker compose logs -f processor_service# Stop all services
docker compose down
# Stop and remove all data (Redis, PostgreSQL volumes)
docker compose down -vThe ingestor filters for WatchEvent, ForkEvent, PullRequestEvent, and IssuesEvent. These are less frequent than PushEvents. Check the logs to verify events are being fetched:
docker compose logs -f ingestor_service | grep "High value"# Check processor logs for errors
docker compose logs processor_service
# Verify Kafka topic has messages via Kafdrop
# Open http://localhost:9000 and check "raw-github-events" topic# Check the failing service logs
docker compose logs <service_name>
# Common issues:
# - Missing GITHUB_TOKEN in .env file
# - Port conflict (another process using 8080, 8081, 9092, etc.)
# - Kafka not ready yet (wait for healthcheck)# Check PostgreSQL is running
docker compose ps postgres
# Check PostgreSQL logs
docker compose logs postgres
# Verify tables were created
docker compose exec postgres psql -U user -d trend_radar -c "\dt"