Files
awoooi/k8s/nginx/awoooi-prod.conf
Your Name a94ddd566e
All checks were successful
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 58s
CD Pipeline / build-and-deploy (push) Successful in 4m27s
CD Pipeline / post-deploy-checks (push) Successful in 1m44s
fix(reboot): harden public maintenance fallback
2026-07-03 04:28:11 +08:00

168 lines
5.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AWOOOI 正式環境 Nginx 路由配置
# 負責人: CIO
# 版本: v1.0
# 日期: 2026-03-20
#
# 部署位置: 192.168.0.188 (Host 直裝)
# 檔案路徑: /etc/nginx/conf.d/awoooi-prod.conf
#
# ⚠️ 域名待確認: awoooi.wooo.work (CEO) vs app.awoooi.wooo.work (Gemini)
# 後端 API 上游 (K3s NodePort)
upstream awoooi_prod_api {
server 192.168.0.120:32334;
server 192.168.0.121:32334;
keepalive 32;
}
# 前端上游 (K3s NodePort)
upstream awoooi_prod_web {
server 192.168.0.120:32335;
server 192.168.0.121:32335;
keepalive 16;
}
server {
listen 443 ssl http2;
# ⚠️ 域名待最終確認
server_name awoooi.wooo.work;
# SSL 憑證
ssl_certificate /etc/nginx/ssl/awoooi.crt;
ssl_certificate_key /etc/nginx/ssl/awoooi.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 系統標識 Header
proxy_set_header X-System "awoooi-prod";
# 共用 Proxy Headers
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;
# L0 public maintenance fallback攔截 upstream 502/503/504
# 避免主機或 K3s rollout 期間把 Nginx raw 5xx 直接給使用者。
proxy_intercept_errors on;
# ============================================
# SSE 串流路由 (AI 思考 / Dashboard 即時更新)
# ⚠️ 關鍵配置: 禁用緩衝 + 長連線
# ============================================
location ~ ^/api/v1/(agent|dashboard)/stream {
proxy_pass http://awoooi_prod_api;
proxy_intercept_errors on;
error_page 502 503 504 =503 /__awoooi-maintenance.html;
# 禁用緩衝 (AI 打字機效果零延遲)
proxy_buffering off;
proxy_cache off;
# 長連線支援 (1 小時)
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 60s;
# HTTP/1.1 長連線
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_set_header X-Accel-Buffering no;
# 分塊傳輸編碼
chunked_transfer_encoding on;
}
# ============================================
# Next.js API Routes (前端處理)
# ⚠️ 必須在 /api/ 之前,否則會被後端攔截
# ============================================
location /api/sentry-tunnel {
proxy_pass http://awoooi_prod_web;
proxy_intercept_errors on;
error_page 502 503 504 =503 /__awoooi-maintenance.html;
proxy_http_version 1.1;
proxy_set_header Connection "keep-alive";
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}
# ============================================
# 一般 API 路由 (FastAPI 後端)
# ============================================
location /api/ {
proxy_pass http://awoooi_prod_api;
proxy_intercept_errors on;
error_page 502 503 504 =503 /__awoooi-maintenance.html;
proxy_http_version 1.1;
proxy_set_header Connection "keep-alive";
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
# ============================================
# 健康檢查 (不經認證)
# ============================================
location /api/health {
proxy_pass http://awoooi_prod_api/health;
proxy_intercept_errors on;
error_page 502 503 504 =503 /__awoooi-maintenance.html;
proxy_read_timeout 5s;
# 允許監控系統存取
allow 192.168.0.0/24;
deny all;
}
# ============================================
# 前端靜態資源
# ============================================
location / {
proxy_pass http://awoooi_prod_web;
proxy_intercept_errors on;
error_page 502 503 504 =503 /__awoooi-maintenance.html;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 靜態資源快取
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
proxy_pass http://awoooi_prod_web;
proxy_intercept_errors on;
error_page 502 503 504 =503 /__awoooi-maintenance.html;
expires 7d;
add_header Cache-Control "public, immutable";
}
}
# ============================================
# Public maintenance fallback
# ============================================
error_page 502 503 504 =503 /__awoooi-maintenance.html;
location = /__awoooi-maintenance.html {
internal;
root /var/www/maintenance;
try_files /maintenance.html =503;
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always;
add_header Retry-After "120" always;
add_header X-AWOOOI-Fallback "local-maintenance" always;
}
# ============================================
# 日誌配置
# ============================================
access_log /var/log/nginx/awoooi-prod-access.log;
error_log /var/log/nginx/awoooi-prod-error.log;
}
# HTTP 重導向至 HTTPS
server {
listen 80;
server_name awoooi.wooo.work;
return 301 https://$server_name$request_uri;
}