63be005c6f
M3 library.py: categories POST/PATCH/DELETE + facets POST 를 get_current_user→require_admin (공유 분류 CRUD 를 17주체→admin 한정, news/digest 패턴 정합). M1 documents.py: update_document PATCH 에 edit_url validate_feed_url 가드 — 내부/메타데이터 주소 후속 fetch(fulltext_worker) latent SSRF 차단(API 레이어 무방비 해소, news.py 동형). Caddyfile: 보안 헤더(nosniff·X-Frame SAMEORIGIN·Referrer-Policy·-Server). HSTS 는 edge 소관. compose: caddy 8080:80 0.0.0.0→127.0.0.1 (LAN 우회 차단, 실 ingress=home-caddy→caddy:80 도커망). scripts: 하드코딩 죽은 DB 비번 → os.environ (1차 감사 누락분, .env 한정 점검이 놓침). 별도(DB): test-% 계정 12개 비활성화 (공유풀 주체 17→5, 랜덤해시라 비번노출 아님·위생). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
69 lines
2.1 KiB
Caddyfile
69 lines
2.1 KiB
Caddyfile
{
|
|
auto_https off
|
|
# home-caddy (docker bridge 사설망) 가 TLS 를 종단하고 X-Forwarded-Proto: https
|
|
# 를 전달. trusted_proxies 없으면 Caddy 가 incoming scheme (http) 로 덮어써
|
|
# FastAPI 307 redirect 의 Location 헤더가 http:// 로 나가 mixed-content block.
|
|
servers {
|
|
trusted_proxies static private_ranges
|
|
}
|
|
}
|
|
|
|
http://document.hyungi.net {
|
|
# 명시 Content-Type match — 기본 match 의 text/* 는 text/event-stream 까지 포함해
|
|
# SSE(/api/eid/chat)의 첫 ~512B 를 gzip 버퍼링함. SSE 제외, 기존 압축 대상은 보존.
|
|
# (응답 매처는 header <필드> <값> 한 쌍씩 — 여러 줄 = OR. 한 줄 다중 값은 파싱 에러)
|
|
# 2026-06-20 보안 헤더 (M: 클릭재킹·MIME 스니핑 방어). HSTS 는 TLS 종단 edge(home-caddy) 소관.
|
|
header {
|
|
X-Content-Type-Options nosniff
|
|
X-Frame-Options SAMEORIGIN
|
|
Referrer-Policy strict-origin-when-cross-origin
|
|
-Server
|
|
}
|
|
encode {
|
|
gzip
|
|
match {
|
|
header Content-Type text/html*
|
|
header Content-Type text/css*
|
|
header Content-Type text/plain*
|
|
header Content-Type text/xml*
|
|
header Content-Type text/javascript*
|
|
header Content-Type application/json*
|
|
header Content-Type application/javascript*
|
|
header Content-Type application/xml*
|
|
header Content-Type image/svg+xml*
|
|
}
|
|
}
|
|
|
|
# API + 문서 → FastAPI
|
|
handle /api/* {
|
|
reverse_proxy fastapi:8000
|
|
}
|
|
handle /docs {
|
|
reverse_proxy fastapi:8000
|
|
}
|
|
handle /openapi.json {
|
|
reverse_proxy fastapi:8000
|
|
}
|
|
handle /health {
|
|
reverse_proxy fastapi:8000
|
|
}
|
|
handle /setup {
|
|
reverse_proxy fastapi:8000
|
|
}
|
|
|
|
# 프론트엔드
|
|
handle {
|
|
reverse_proxy frontend:3000
|
|
}
|
|
}
|
|
|
|
# Synology Office 프록시
|
|
http://office.hyungi.net {
|
|
reverse_proxy https://ds1525.hyungi.net:5001 {
|
|
header_up Host {upstream_hostport}
|
|
transport http {
|
|
tls_insecure_skip_verify
|
|
}
|
|
}
|
|
}
|