File size: 5,067 Bytes
9e1edfd
 
2b68a06
9e1edfd
 
 
 
 
 
 
 
 
2b68a06
 
9e1edfd
 
 
 
 
 
 
 
 
 
e4c8301
9e1edfd
 
 
e4c8301
9e1edfd
 
c9732a0
 
 
 
6bd4abe
 
 
 
 
 
 
 
9e1edfd
 
 
 
2b68a06
 
 
 
 
 
eb469ad
 
 
9e1edfd
 
 
 
 
 
eb469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70cbf15
 
 
 
 
 
 
 
 
be5ad7c
eaaa414
 
 
 
be5ad7c
d11db8f
 
be5ad7c
 
 
 
22ba1d6
 
 
 
 
 
 
be5ad7c
 
eaaa414
 
 
 
 
c9732a0
 
1ba240e
c9732a0
 
 
 
 
 
6bd4abe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eb469ad
9e1edfd
 
 
 
 
 
9290463
9e1edfd
2b68a06
9e1edfd
 
 
 
9290463
 
 
 
9e1edfd
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
worker_processes 1;
pid /tmp/nginx.pid;
error_log stderr info; # Log to stderr to see errors in HF Space Logs

events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # HF Space runs as non-root, use /tmp for everything
    access_log /dev/stdout;
    client_body_temp_path /tmp/client_temp;
    proxy_temp_path       /tmp/proxy_temp;
    fastcgi_temp_path     /tmp/fastcgi_temp;
    uwsgi_temp_path       /tmp/uwsgi_temp;
    scgi_temp_path        /tmp/scgi_temp;

    sendfile        on;
    keepalive_timeout  65;

    upstream streamlit {
        server 127.0.0.1:8501;
    }

    upstream fastapi {
        server 127.0.0.1:8000;
    }

    upstream prometheus {
        server 127.0.0.1:9090;
    }

    upstream alertmanager {
        server 127.0.0.1:9093;
    }

    upstream pushgateway {
        server 127.0.0.1:9091;
    }

    server {
        listen 7860;
        server_name localhost;

        # Health endpoint for HF readiness check
        location /health {
            proxy_pass http://fastapi/health;
            proxy_set_header Host $host;
        }

        # FastAPI Documentation
        location /docs {
            proxy_pass http://fastapi/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;
        }

        location /redoc {
            proxy_pass http://fastapi/redoc;
            proxy_set_header Host $host;
        }

        location /openapi.json {
            proxy_pass http://fastapi/openapi.json;
            proxy_set_header Host $host;
        }

        # FastAPI API Endpoints
        location /predict {
            proxy_pass http://fastapi/predict;
            proxy_set_header Host $host;
        }

        location /predictions {
            proxy_pass http://fastapi/predictions;
            proxy_set_header Host $host;
        }

        # FastAPI Metrics endpoint for Prometheus
        location /metrics {
            proxy_pass http://fastapi/metrics;
            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;
        }

        # Grafana
        location = /grafana {
            return 301 /grafana/;
        }

        location /grafana/ {
            # Do NOT strip the path. explicit serve_from_sub_path=true in Grafana needs the prefix.
            proxy_pass http://127.0.0.1:3000;
            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_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

        # Prometheus UI
        location = /prometheus {
            return 301 /prometheus/;
        }

        # Prometheus UI
        location /prometheus/ {
            proxy_pass http://127.0.0.1:9090/prometheus/;
            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;
        }

        # Alertmanager UI
        location /alertmanager/ {
            proxy_pass http://alertmanager;
            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;
        }

        # Pushgateway UI
        location /pushgateway/ {
            proxy_pass http://pushgateway;
            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;
        }

        # Streamlit (Catch-all)
        location / {
            proxy_pass http://streamlit;
            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_set_header X-Forwarded-Host $host;
            
            # WebSocket support for Streamlit
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 86400;
            
            # Prevent 502 if Streamlit is slow
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
        }
    }
}