server { listen 80; location ^~ /.well-known/acme-challenge/ { root /var/www/acme; } server_name _; # First-boot clock bootstrap only. The response is authenticated by TIME1. location = /api/v1/device/time-challenges { limit_except POST { deny all; } client_max_body_size 8k; resolver 127.0.0.11 ipv6=off valid=10s; set $clock_backend http://api:8080; proxy_pass $clock_backend; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto http; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_buffering off; } location / { return 301 https://82.157.201.114$request_uri; } } server { listen 443 ssl; server_name 82.157.201.114; server_tokens off; client_max_body_size 256m; ssl_certificate /etc/letsencrypt/live/82.157.201.114/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/82.157.201.114/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; add_header Strict-Transport-Security "max-age=31536000" always; resolver 127.0.0.11 ipv6=off valid=10s; set $api_backend http://api:8080; set $callbacks_backend http://callbacks:8081; set $keycloak_backend http://keycloak:8080; set $minio_backend http://minio:9000; set $web_backend http://web:8080; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location /api/ { proxy_pass $api_backend; proxy_buffering off; proxy_read_timeout 3600s; } location /device/ { proxy_pass $api_backend; proxy_buffering off; } location /f/ { proxy_pass $api_backend; proxy_buffering off; proxy_request_buffering off; proxy_read_timeout 15m; send_timeout 15m; access_log off; } # The voice provider can call only this signed, conversation-scoped tool. # Do not expose the rest of the /internal namespace. location = /internal/v1/tools/memory-search { proxy_pass $api_backend; proxy_buffering off; proxy_request_buffering off; } location /callbacks/ { proxy_pass $callbacks_backend; proxy_buffering off; } location /realms/ { proxy_pass $keycloak_backend; } location /resources/ { proxy_pass $keycloak_backend; } location /private-exports/ { proxy_pass $minio_backend; proxy_request_buffering off; proxy_buffering off; } # Dify workflow console; authenticated by its own console session. location = /dify { return 302 /apps; } # Keep Dify session refresh separate from the platform OIDC callback. location = /auth/refresh { proxy_pass http://story-dify-nginx:80; proxy_buffering off; proxy_read_timeout 900s; } location ~ ^/(?:apps|app|signin|init|install|reset-password|activate|datasets|tools|plugins|explore|snippets|agents|_next|logo|images|vs|marketplace|in-site-message|screenshots|education)(?:/|$) { proxy_pass http://story-dify-nginx:80; proxy_buffering off; proxy_read_timeout 900s; } location ^~ /console/api { proxy_pass http://story-dify-nginx:80; proxy_buffering off; proxy_read_timeout 900s; } location ^~ /v1/ { proxy_pass http://story-dify-nginx:80; proxy_buffering off; proxy_read_timeout 900s; } location / { proxy_pass $web_backend; } }