I just deployed my first SOC (Security Operations Center) backend to a live VPS and exposed it via a domain.
Stack:
- Node.js (Express API)
- Elasticsearch (Winlogbeat logs)
- Nginx (reverse proxy)
- PM2 (process manager)
What I built:
- Detection APIs for failed logins (Event ID 4625)
- Aggregations for top attackers (IP / username)
- Timeline analysis for brute-force patterns
- Alerting via Telegram & Email
Real challenges I faced (and solved):
- Elasticsearch 401 authentication issues
- PM2 vs manual Node process conflicts
- Nginx 502 / connection refused errors
- “Cannot GET /” → missing root route
- HTTP 500 → caused by unhandled ES failures
- Empty results → due to wrong event codes (4624 vs 4625)
- Missing attacker IPs → logs were local (IpAddress = “-“)
Key lessons: A working backend is not enough — real SOC systems depend heavily on data quality and log context.
🌐 Live API:http://api.mydomain
Debugging a SOC Pipeline: What Broke and Why
Building detection logic is one thing. Making it work in production is another.
Here are the real issues I hit while building my SOC API:
❌ Problem 1: Empty detection results👉 Cause: I was querying Event ID 4625, but only had 4624 (successful logins)
❌ Problem 2: Top attacker IPs were empty👉 Cause: All logs had IpAddress = “-” (local logins, not remote attacks)
❌ Problem 3: HTTP 500 on root route👉 Cause: Elasticsearch errors not handled properly (no fallback)
❌ Problem 4: “Cannot GET /”👉 Cause: Missing root endpoint
❌ Problem 5: Nginx 502 / refused connection👉 Cause: backend not reachable or wrong proxy config
❌ Problem 6: Syntax errors (must_not)👉 Cause: wrong Elasticsearch query structure (not inside a bool)
What I learned:
- Detection ≠ Code → Detection = Code + Data + Context
- Always wrap ES queries in try/catch
- Always return safe fallback (res.json([]))
- Validate your logs before building logic
Biggest insight: If your logs are wrong, your SOC is blind.
