Initial commit: breakpilot-core - Shared Infrastructure

Docker Compose with 24+ services:
- PostgreSQL (PostGIS), Valkey, MinIO, Qdrant
- Vault (PKI/TLS), Nginx (Reverse Proxy)
- Backend Core API, Consent Service, Billing Service
- RAG Service, Embedding Service
- Gitea, Woodpecker CI/CD
- Night Scheduler, Health Aggregator
- Jitsi (Web/XMPP/JVB/Jicofo), Mailpit

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Boenisch
2026-02-11 23:47:13 +01:00
commit ad111d5e69
244 changed files with 84288 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
"""
System API endpoints for health checks and system information.
Provides:
- /health - Basic health check
- /api/v1/system/local-ip - Local network IP for QR-code mobile upload
"""
import os
import socket
from fastapi import APIRouter
router = APIRouter(tags=["System"])
@router.get("/health")
async def health_check():
"""
Basic health check endpoint.
Returns healthy status and service name.
"""
return {
"status": "healthy",
"service": "breakpilot-backend-core"
}
@router.get("/api/v1/system/local-ip")
async def get_local_ip():
"""
Return the local network IP address.
Used for QR-code generation for mobile PDF upload.
Mobile devices can't reach localhost, so we need the actual network IP.
Priority:
1. LOCAL_NETWORK_IP environment variable (explicit configuration)
2. Auto-detection via socket connection
3. Fallback to default 192.168.178.157
"""
# Check environment variable first
env_ip = os.getenv("LOCAL_NETWORK_IP")
if env_ip:
return {"ip": env_ip}
# Try to auto-detect
try:
# Create a socket to an external address to determine local IP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(0.1)
# Connect to a public DNS server (doesn't actually send anything)
s.connect(("8.8.8.8", 80))
local_ip = s.getsockname()[0]
s.close()
# Validate it's a private IP
if (local_ip.startswith("192.168.") or
local_ip.startswith("10.") or
(local_ip.startswith("172.") and 16 <= int(local_ip.split('.')[1]) <= 31)):
return {"ip": local_ip}
except Exception:
pass
# Fallback to default
return {"ip": "192.168.178.157"}