{ "configs": [ { "comparison": { "drift_detected": null, "note": "尚未提供 live conf 匯出檔;本階段不 SSH、不讀 live、不 reload。", "status": "repo_only_no_live_evidence" }, "config_id": "host188_all_sites", "control_tier": "C0", "host": "192.168.0.188", "live_input": { "path": null, "provided": false, "summary": null }, "live_path": "/etc/nginx/sites-enabled/all-sites.conf", "owner_gate": "public_gateway_owner_response_required", "repo_source": { "line_count": 268, "normalized_sha256": "175e13f1a66b349d188f054a5232b9dc3ebf801e25f4a2d3879e34248a787e2a", "parsed": { "acme_routes": [ { "auth_basic": [], "path": "/.well-known/acme-challenge/", "proxy_passes": [], "roots": [ "/var/www/html" ], "server_names": [ "stock.wooo.work" ] }, { "auth_basic": [], "path": "/.well-known/acme-challenge/", "proxy_passes": [], "roots": [ "/var/www/html" ], "server_names": [ "vtuber.wooo.work" ] } ], "admin_routes": [ { "auth_basic": [], "path": "= /admin", "proxy_passes": [], "roots": [], "server_names": [ "stock.wooo.work" ] }, { "auth_basic": [ "off" ], "path": "/admin/", "proxy_passes": [ "http://192.168.0.110:31235" ], "roots": [], "server_names": [ "stock.wooo.work" ] } ], "listens": [ "443 ssl", "443 ssl http2", "80" ], "proxy_passes": [ "http://127.0.0.1:3000", "http://127.0.0.1:3301", "http://127.0.0.1:5003", "http://192.168.0.110:3003", "http://192.168.0.110:31235", "http://192.168.0.110:8929", "http://192.168.0.125:32334/api/", "http://192.168.0.125:32334/api/v1/ws", "http://192.168.0.125:32335", "https://192.168.0.110" ], "server_block_count": 15, "server_names": [ "aiops.wooo.work", "bitan.wooo.work", "gitlab.wooo.work", "mo.wooo.work", "signoz.wooo.work", "stock.wooo.work", "tsenyang.com", "vtuber.wooo.work", "www.tsenyang.com" ], "servers": [ { "has_tls": false, "index": 1, "listens": [ "80" ], "locations": [], "proxy_passes": [], "server_names": [ "aiops.wooo.work" ], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": true, "index": 2, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/api/", "proxy_passes": [ "http://192.168.0.125:32334/api/" ], "roots": [], "websocket_upgrade": false }, { "auth_basic": [], "path": "/api/v1/ws", "proxy_passes": [ "http://192.168.0.125:32334/api/v1/ws" ], "roots": [], "websocket_upgrade": true }, { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.125:32335" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://192.168.0.125:32334/api/", "http://192.168.0.125:32334/api/v1/ws", "http://192.168.0.125:32335" ], "server_names": [ "aiops.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/aiops.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/aiops.wooo.work/fullchain.pem" ] }, { "has_tls": false, "index": 3, "listens": [ "80" ], "locations": [], "proxy_passes": [], "server_names": [ "gitlab.wooo.work" ], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": true, "index": 4, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:8929" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://192.168.0.110:8929" ], "server_names": [ "gitlab.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/gitlab.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/gitlab.wooo.work/fullchain.pem" ] }, { "has_tls": false, "index": 5, "listens": [ "80" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://127.0.0.1:3301" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://127.0.0.1:3301" ], "server_names": [ "signoz.wooo.work" ], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": false, "index": 6, "listens": [ "80" ], "locations": [], "proxy_passes": [], "server_names": [ "www.tsenyang.com", "tsenyang.com" ], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": true, "index": 7, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://127.0.0.1:3000" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://127.0.0.1:3000" ], "server_names": [ "www.tsenyang.com", "tsenyang.com" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/www.tsenyang.com/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/www.tsenyang.com/fullchain.pem" ] }, { "has_tls": false, "index": 8, "listens": [ "80" ], "locations": [ { "auth_basic": [], "path": "/.well-known/acme-challenge/", "proxy_passes": [], "roots": [ "/var/www/html" ], "websocket_upgrade": false }, { "auth_basic": [], "path": "/", "proxy_passes": [], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [], "server_names": [ "stock.wooo.work" ], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": true, "index": 9, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "= /admin", "proxy_passes": [], "roots": [], "websocket_upgrade": false }, { "auth_basic": [ "off" ], "path": "/admin/", "proxy_passes": [ "http://192.168.0.110:31235" ], "roots": [], "websocket_upgrade": true }, { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:31235" ], "roots": [], "websocket_upgrade": true } ], "proxy_passes": [ "http://192.168.0.110:31235", "http://192.168.0.110:31235" ], "server_names": [ "stock.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/stock.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/stock.wooo.work/fullchain.pem" ] }, { "has_tls": false, "index": 10, "listens": [ "80" ], "locations": [], "proxy_passes": [], "server_names": [ "mo.wooo.work" ], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": true, "index": 11, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://127.0.0.1:5003" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://127.0.0.1:5003" ], "server_names": [ "mo.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/mo.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/mo.wooo.work/fullchain.pem" ] }, { "has_tls": false, "index": 12, "listens": [ "80" ], "locations": [], "proxy_passes": [], "server_names": [ "bitan.wooo.work" ], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": true, "index": 13, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:3003" ], "roots": [], "websocket_upgrade": true } ], "proxy_passes": [ "http://192.168.0.110:3003" ], "server_names": [ "bitan.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/bitan.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/bitan.wooo.work/fullchain.pem" ] }, { "has_tls": true, "index": 14, "listens": [ "443 ssl" ], "locations": [ { "auth_basic": [], "path": "/.well-known/acme-challenge/", "proxy_passes": [], "roots": [ "/var/www/html" ], "websocket_upgrade": false }, { "auth_basic": [], "path": "/", "proxy_passes": [ "https://192.168.0.110" ], "roots": [], "websocket_upgrade": true } ], "proxy_passes": [ "https://192.168.0.110" ], "server_names": [ "vtuber.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/vtuber.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/vtuber.wooo.work/fullchain.pem" ] }, { "has_tls": false, "index": 15, "listens": [ "80" ], "locations": [], "proxy_passes": [], "server_names": [ "vtuber.wooo.work" ], "ssl_certificate_keys": [], "ssl_certificates": [] } ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/aiops.wooo.work/privkey.pem", "/etc/letsencrypt/live/bitan.wooo.work/privkey.pem", "/etc/letsencrypt/live/gitlab.wooo.work/privkey.pem", "/etc/letsencrypt/live/mo.wooo.work/privkey.pem", "/etc/letsencrypt/live/stock.wooo.work/privkey.pem", "/etc/letsencrypt/live/vtuber.wooo.work/privkey.pem", "/etc/letsencrypt/live/www.tsenyang.com/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/aiops.wooo.work/fullchain.pem", "/etc/letsencrypt/live/bitan.wooo.work/fullchain.pem", "/etc/letsencrypt/live/gitlab.wooo.work/fullchain.pem", "/etc/letsencrypt/live/mo.wooo.work/fullchain.pem", "/etc/letsencrypt/live/stock.wooo.work/fullchain.pem", "/etc/letsencrypt/live/vtuber.wooo.work/fullchain.pem", "/etc/letsencrypt/live/www.tsenyang.com/fullchain.pem" ], "websocket_routes": [ { "auth_basic": [], "path": "/api/v1/ws", "proxy_passes": [ "http://192.168.0.125:32334/api/v1/ws" ], "roots": [], "server_names": [ "aiops.wooo.work" ] }, { "auth_basic": [ "off" ], "path": "/admin/", "proxy_passes": [ "http://192.168.0.110:31235" ], "roots": [], "server_names": [ "stock.wooo.work" ] }, { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:31235" ], "roots": [], "server_names": [ "stock.wooo.work" ] }, { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:3003" ], "roots": [], "server_names": [ "bitan.wooo.work" ] }, { "auth_basic": [], "path": "/", "proxy_passes": [ "https://192.168.0.110" ], "roots": [], "server_names": [ "vtuber.wooo.work" ] } ] }, "raw_sha256": "6fec2bde00cc0935296738ff6bc4564528fe53e7794d518d1a5dbc57feb5c498" }, "repo_source_path": "infra/ansible/roles/nginx/templates/188-all-sites.conf.j2", "role": "public_gateway_all_sites" }, { "comparison": { "drift_detected": null, "note": "尚未提供 live conf 匯出檔;本階段不 SSH、不讀 live、不 reload。", "status": "repo_only_no_live_evidence" }, "config_id": "host188_internal_tools_https", "control_tier": "C0", "host": "192.168.0.188", "live_input": { "path": null, "provided": false, "summary": null }, "live_path": "owner_confirmation_required", "owner_gate": "public_tools_owner_response_required", "repo_source": { "line_count": 149, "normalized_sha256": "0b67241536252c0da30198be88ccb9a2f283073ad5e1e3ff2cbc4ebea3ff30d4", "parsed": { "acme_routes": [ { "auth_basic": [], "path": "/.well-known/acme-challenge/", "proxy_passes": [], "roots": [ "/var/www/certbot" ], "server_names": [ "gitea.wooo.work", "sentry.wooo.work", "langfuse.wooo.work", "harbor.wooo.work", "registry.wooo.work", "stock.wooo.work" ] } ], "admin_routes": [], "listens": [ "443 ssl http2", "80" ], "proxy_passes": [ "http://127.0.0.1:3301", "http://192.168.0.110:3001", "http://192.168.0.110:3100", "http://192.168.0.110:31235", "http://192.168.0.110:5000", "http://192.168.0.110:9000" ], "server_block_count": 8, "server_names": [ "gitea.wooo.work", "harbor.wooo.work", "langfuse.wooo.work", "registry.wooo.work", "sentry.wooo.work", "signoz.wooo.work", "stock.wooo.work" ], "servers": [ { "has_tls": false, "index": 1, "listens": [ "80" ], "locations": [ { "auth_basic": [], "path": "/.well-known/acme-challenge/", "proxy_passes": [], "roots": [ "/var/www/certbot" ], "websocket_upgrade": false }, { "auth_basic": [], "path": "/", "proxy_passes": [], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [], "server_names": [ "gitea.wooo.work", "sentry.wooo.work", "langfuse.wooo.work", "harbor.wooo.work", "registry.wooo.work", "stock.wooo.work" ], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": true, "index": 2, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://127.0.0.1:3301" ], "roots": [], "websocket_upgrade": true } ], "proxy_passes": [ "http://127.0.0.1:3301" ], "server_names": [ "signoz.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/sentry.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/sentry.wooo.work/fullchain.pem" ] }, { "has_tls": true, "index": 3, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:31235" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://192.168.0.110:31235" ], "server_names": [ "stock.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/stock.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/stock.wooo.work/fullchain.pem" ] }, { "has_tls": true, "index": 4, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:9000" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://192.168.0.110:9000" ], "server_names": [ "sentry.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/sentry.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/sentry.wooo.work/fullchain.pem" ] }, { "has_tls": true, "index": 5, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:3001" ], "roots": [], "websocket_upgrade": true } ], "proxy_passes": [ "http://192.168.0.110:3001" ], "server_names": [ "gitea.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/sentry.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/sentry.wooo.work/fullchain.pem" ] }, { "has_tls": true, "index": 6, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:3100" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://192.168.0.110:3100" ], "server_names": [ "langfuse.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/sentry.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/sentry.wooo.work/fullchain.pem" ] }, { "has_tls": true, "index": 7, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:5000" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://192.168.0.110:5000" ], "server_names": [ "harbor.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/harbor.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/harbor.wooo.work/fullchain.pem" ] }, { "has_tls": true, "index": 8, "listens": [ "443 ssl http2" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:5000" ], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://192.168.0.110:5000" ], "server_names": [ "registry.wooo.work" ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/registry.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/registry.wooo.work/fullchain.pem" ] } ], "ssl_certificate_keys": [ "/etc/letsencrypt/live/harbor.wooo.work/privkey.pem", "/etc/letsencrypt/live/registry.wooo.work/privkey.pem", "/etc/letsencrypt/live/sentry.wooo.work/privkey.pem", "/etc/letsencrypt/live/stock.wooo.work/privkey.pem" ], "ssl_certificates": [ "/etc/letsencrypt/live/harbor.wooo.work/fullchain.pem", "/etc/letsencrypt/live/registry.wooo.work/fullchain.pem", "/etc/letsencrypt/live/sentry.wooo.work/fullchain.pem", "/etc/letsencrypt/live/stock.wooo.work/fullchain.pem" ], "websocket_routes": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://127.0.0.1:3301" ], "roots": [], "server_names": [ "signoz.wooo.work" ] }, { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.110:3001" ], "roots": [], "server_names": [ "gitea.wooo.work" ] } ] }, "raw_sha256": "791ac846869e03d3ad3052f1068fc30905f00e7a4975228e055b42827b1956b8" }, "repo_source_path": "infra/ansible/roles/nginx/templates/188-internal-tools-https.conf.j2", "role": "public_internal_tools_https" }, { "comparison": { "drift_detected": null, "note": "尚未提供 live conf 匯出檔;本階段不 SSH、不讀 live、不 reload。", "status": "repo_only_no_live_evidence" }, "config_id": "host110_ollama_proxy", "control_tier": "C1", "host": "192.168.0.110", "live_input": { "path": null, "provided": false, "summary": null }, "live_path": "/etc/nginx/sites-enabled/110-ollama-proxy.conf", "owner_gate": "ai_provider_proxy_owner_response_required", "repo_source": { "line_count": 104, "normalized_sha256": "8f065c79659c76cbfc1dff497546de30977f07dd32751376504a73efd5f48277", "parsed": { "acme_routes": [], "admin_routes": [], "listens": [ "11435", "11436", "11437", "[::]:11435", "[::]:11436", "[::]:11437" ], "proxy_passes": [ "http://192.168.0.111:11434", "http://34.143.170.20:11434", "http://34.21.145.224:11434" ], "server_block_count": 3, "server_names": [], "servers": [ { "has_tls": false, "index": 1, "listens": [ "11435", "[::]:11435" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://34.143.170.20:11434" ], "roots": [], "websocket_upgrade": false }, { "auth_basic": [], "path": "/nginx-health", "proxy_passes": [], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://34.143.170.20:11434" ], "server_names": [], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": false, "index": 2, "listens": [ "11436", "[::]:11436" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://34.21.145.224:11434" ], "roots": [], "websocket_upgrade": false }, { "auth_basic": [], "path": "/nginx-health", "proxy_passes": [], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://34.21.145.224:11434" ], "server_names": [], "ssl_certificate_keys": [], "ssl_certificates": [] }, { "has_tls": false, "index": 3, "listens": [ "11437", "[::]:11437" ], "locations": [ { "auth_basic": [], "path": "/", "proxy_passes": [ "http://192.168.0.111:11434" ], "roots": [], "websocket_upgrade": false }, { "auth_basic": [], "path": "/nginx-health", "proxy_passes": [], "roots": [], "websocket_upgrade": false } ], "proxy_passes": [ "http://192.168.0.111:11434" ], "server_names": [], "ssl_certificate_keys": [], "ssl_certificates": [] } ], "ssl_certificate_keys": [], "ssl_certificates": [], "websocket_routes": [] }, "raw_sha256": "46332f8e3172027c98e5dbe804af5cffe12b4b0b256ceb24b5c5ec31129a42d3" }, "repo_source_path": "infra/ansible/roles/nginx/templates/110-ollama-proxy.conf.j2", "role": "ollama_proxy_gateway" } ], "execution_boundaries": { "host_write_executed": false, "nginx_reload_executed": false, "nginx_test_executed": false, "runtime_gate_opened": false, "secret_value_collected": false, "ssh_executed": false }, "generated_at": "2026-06-11T12:00:00+08:00", "git_commit": "eca53646", "mode": "repo_only", "next_steps": [ "由 owner 提供脫敏 live conf 匯出檔後重跑比較模式。", "若偵測 drift,只建立 evidence 與 owner decision,不自動覆寫 live。", "任何 Nginx reload 仍需 maintenance window、rollback owner、nginx -t 與 route smoke。" ], "schema_version": "nginx_config_drift_detector_v1", "summary": { "drift_detected_count": 0, "live_evidence_collected": false, "live_input_count": 0, "repo_source_inventory_complete": true, "source_config_count": 3 } }