Some checks failed
Two marks (M and R) side by side, EN + DE, with the site-header and real 16 px favicon context for each. Votes go to ops/poll/pollsvc.py, a stdlib Python service behind nginx at /api/poll/ (SQLite, systemd DynamicUser, rate-limited). Devices are counted once via a salted hash of IP + user agent; the privacy pages document it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MScAinbyMdeNc7H2BZdnnG
55 lines
1.3 KiB
Text
55 lines
1.3 KiB
Text
server {
|
|
listen 80;
|
|
listen [::]:80;
|
|
server_name furtka.org www.furtka.org;
|
|
|
|
root /var/www/furtka.org;
|
|
index index.html;
|
|
|
|
charset utf-8;
|
|
|
|
gzip on;
|
|
gzip_vary on;
|
|
gzip_min_length 1024;
|
|
gzip_comp_level 6;
|
|
gzip_types
|
|
text/css
|
|
text/plain
|
|
text/xml
|
|
application/javascript
|
|
application/json
|
|
application/xml
|
|
application/rss+xml
|
|
application/atom+xml
|
|
image/svg+xml
|
|
font/woff
|
|
font/woff2;
|
|
|
|
location / {
|
|
try_files $uri $uri/ $uri.html =404;
|
|
}
|
|
|
|
# Poll counter (ops/poll/pollsvc.py) — cookie-free, rate-limited.
|
|
location /api/poll/ {
|
|
limit_req zone=poll burst=10 nodelay;
|
|
proxy_pass http://127.0.0.1:8090/;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header User-Agent $http_user_agent;
|
|
proxy_read_timeout 5s;
|
|
}
|
|
|
|
location = /favicon.svg {
|
|
access_log off;
|
|
log_not_found off;
|
|
expires 7d;
|
|
}
|
|
|
|
location ~* \.(css|js|svg|woff2?|png|jpg|jpeg|webp|avif)$ {
|
|
access_log off;
|
|
expires 30d;
|
|
add_header Cache-Control "public, immutable";
|
|
}
|
|
|
|
error_page 404 /404.html;
|
|
}
|