πŸ“‚ solution-1.0

← θΏ”ε›žδΈŠηΊ§
# assistant.rosicky.top β†’ WebChat (8765 WS + 8766 API)
# HTTP β†’ HTTPS 跳转
server {
    listen 80;
    server_name assistant.rosicky.top;
    return 301 https://$host$request_uri;
}

# HTTPS
server {
    listen 443 ssl;
    server_name assistant.rosicky.top;
    charset utf-8;
    access_log /var/log/nginx/hermes-access.log;
    error_log /var/log/nginx/hermes-error.log;

    ssl_certificate /root/.acme.sh/org.rosicky.top_ecc/fullchain.cer;
    ssl_certificate_key /root/.acme.sh/org.rosicky.top_ecc/org.rosicky.top.key;

    # WebSocket
    location /ws/ {
        proxy_pass http://127.0.0.1:8765/;
        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_read_timeout 86400s;
        proxy_buffering off;
    }
    location = /ws {
        return 301 /ws/;
    }

    # API β€” εŽ»ζŽ‰ /api/ ε‰ηΌ€οΌŒεŽη«―θ·―η”±ζ˜― /chat/tasks η­‰
    location /api/ {
        rewrite ^/api/(.*) /$1 break;
        proxy_pass http://127.0.0.1:8766;
        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_read_timeout 30s;
    }

    # Wiki ζ–‡ζ‘£ β€” δ»£η†εˆ° obsidian-web 服劑
    location /doc/ {
        proxy_pass http://127.0.0.1:8080;
        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_read_timeout 30s;
    }
    location = /doc { return 302 /doc/; }

    # 静态文仢
    location / {
        root /var/www/webchat;
        index index.html;
        try_files $uri $uri/ /index.html;
        add_header Cache-Control "no-cache, no-store, must-revalidate";
    }
}