events { worker_connections 1024; } http { upstream backend { server enclava-backend-test:8000; } proxy_connect_timeout 60s; proxy_send_timeout 300s; proxy_read_timeout 300s; # Frontend service disabled for simplified testing # Logging configuration for tests log_format test_format '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' 'rt=$request_time uct="$upstream_connect_time" ' 'uht="$upstream_header_time" urt="$upstream_response_time"'; access_log /var/log/nginx/test_access.log test_format; error_log /var/log/nginx/test_error.log debug; server { listen 80; server_name localhost; # Frontend routes (simplified for testing) location / { return 200 '{"message": "Enclava Test Environment", "backend_api": "/api/", "internal_api": "/api-internal/", "health": "/health", "docs": "/docs"}'; add_header Content-Type application/json; } # Internal API routes - proxy to backend (for frontend only) location /api-internal/ { proxy_pass http://backend; 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; # Request/Response buffering proxy_buffering off; proxy_request_buffering off; # CORS headers for frontend add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; # Handle preflight requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } } # Public API routes - proxy to backend (for external clients) location /api/ { proxy_pass http://backend; 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; # Request/Response buffering proxy_buffering off; proxy_request_buffering off; # Timeouts for long-running requests (LLM streaming) # CORS headers for external clients add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; # Handle preflight requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } } # Health check endpoints location /health { proxy_pass http://backend/health; 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; # Add test marker header add_header X-Test-Environment 'true' always; } # Backend docs endpoint (for testing) location /docs { proxy_pass http://backend/docs; 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; } # Static files (simplified for testing - return 404 for now) location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { return 404 '{"error": "Static files not available in test environment", "status": 404}'; add_header Content-Type application/json; } # Test-specific endpoints location /test-status { return 200 '{"status": "test environment active", "timestamp": "$time_iso8601"}'; add_header Content-Type application/json; } # Error pages for testing error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /404.html { return 404 '{"error": "Not Found", "status": 404}'; add_header Content-Type application/json; } location = /50x.html { return 500 '{"error": "Internal Server Error", "status": 500}'; add_header Content-Type application/json; } } }