worker_processes 1; error_log /tmp/nginx-error.log warn; pid /tmp/nginx.pid; events { worker_connections 512; } http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log /tmp/nginx-access.log; sendfile on; keepalive_timeout 65; # Upstream services (all internal) upstream frontend { server 127.0.0.1:3000; } upstream backend { server 127.0.0.1:8000; } upstream neo4j_browser { server 127.0.0.1:7474; } server { listen 7860; server_name _; client_max_body_size 20M; # ── FastAPI backend ──────────────────────────────────────────────── # Routes: /api/*, /docs, /openapi.json, /health, /seed, /setup location /api/ { proxy_pass http://backend/api/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 120s; } location ~ ^/(docs|openapi\.json|redoc|health|seed|setup|ingest_patient|match_trials|enrich_graph|rag_query|setup_sample_data) { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 120s; } # ── Neo4j Browser (admin only — /neo4j/) ────────────────────────── location /neo4j/ { proxy_pass http://neo4j_browser/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # ── Next.js frontend (catch-all) ─────────────────────────────────── location / { proxy_pass http://frontend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 60s; } } }