# AO3 Mirror v5 - Caddy 配置
# 前端负载均衡 + TLS 终止 + Cloudflare CDN 集成 + Service Worker

agento3.miscs.dev {
	# 全局头
	header {
		Strict-Transport-Security "max-age=31536000; includeSubDomains"
		X-Content-Type-Options "nosniff"
		X-Frame-Options "SAMEORIGIN"
		X-XSS-Protection "1; mode=block"
		Referrer-Policy "strict-origin-when-cross-origin"
		Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none'; object-src 'none'"
		-Server
		-X-Powered-By
	}

	# 日志
	log {
		output file /var/log/ao3-mirror/access.log {
			roll_size 100mb
			roll_keep 7
			roll_keep_for 720h
		}
		format json
	}

	# 压缩
	encode gzip

	# Service Worker routes — versioned + redirect
	route /sw-* {
		reverse_proxy 127.0.0.1:8081 127.0.0.1:8082 {
			lb_policy round_robin
			health_uri /health
			health_interval 10s
			health_timeout 5s
			transport http {
				read_timeout 60s
				write_timeout 60s
				dial_timeout 5s
			}
		}
		header {
			Cache-Control "public, max-age=86400, immutable"
		}
	}

	# SW redirect
	route /sw.js {
		reverse_proxy 127.0.0.1:8081 127.0.0.1:8082 {
			lb_policy round_robin
			health_uri /health
			health_interval 10s
			health_timeout 5s
			transport http {
				read_timeout 60s
				write_timeout 60s
				dial_timeout 5s
			}
		}
		header {
			Cache-Control "no-store"
		}
	}

	# Mirror domains JSON
	route /mirror-domains.json {
		reverse_proxy 127.0.0.1:8081 127.0.0.1:8082 {
			lb_policy round_robin
			health_uri /health
			health_interval 10s
			health_timeout 5s
			transport http {
				read_timeout 60s
				write_timeout 60s
				dial_timeout 5s
			}
		}
		header {
			Cache-Control "public, max-age=3600"
		}
	}

	# 后端负载均衡 (轮询) - 2 workers on 2-core machine
	reverse_proxy 127.0.0.1:8081 127.0.0.1:8082 {
		lb_policy round_robin

		health_uri /health
		health_interval 10s
		health_timeout 5s

		# 超时配置 — 代理可能需要更长时间
		transport http {
			read_timeout 30s
			write_timeout 30s
			dial_timeout 5s
		}

		header_up X-Forwarded-For {remote_host}
		header_up X-Forwarded-Proto {scheme}
		header_up X-Real-IP {remote_host}
	}
}

# 统计子域名 - 监控面板和指标
stats.agento3.miscs.dev {
	# 安全头
	header {
		Strict-Transport-Security "max-age=31536000; includeSubDomains"
		X-Content-Type-Options "nosniff"
		X-Frame-Options "SAMEORIGIN"
		Referrer-Policy "strict-origin-when-cross-origin"
		Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none'; object-src 'none'"
		-Server
		-X-Powered-By
	}

	# 日志
	log {
		output file /var/log/ao3-mirror/stats-access.log {
			roll_size 100mb
			roll_keep 7
			roll_keep_for 720h
		}
		format json
	}

	# 压缩
	encode gzip

	# 路由规则 - 只暴露 /stats, /metrics, /health, /sw
	route {
		# /stats 页面
		reverse_proxy /stats* 127.0.0.1:8081 127.0.0.1:8082 {
			lb_policy round_robin
			health_uri /health
			health_interval 10s
			health_timeout 5s
			transport http {
				read_timeout 60s
				write_timeout 60s
				dial_timeout 5s
			}
			header_up X-Forwarded-For {remote_host}
			header_up X-Forwarded-Proto {scheme}
			header_up X-Real-IP {remote_host}
		}

		# /metrics 指标
		reverse_proxy /metrics* 127.0.0.1:8081 127.0.0.1:8082 {
			lb_policy round_robin
			health_uri /health
			health_interval 10s
			health_timeout 5s
			transport http {
				read_timeout 60s
				write_timeout 60s
				dial_timeout 5s
			}
			header_up X-Forwarded-For {remote_host}
			header_up X-Forwarded-Proto {scheme}
			header_up X-Real-IP {remote_host}
		}

		# Service Worker
		reverse_proxy /sw* 127.0.0.1:8081 127.0.0.1:8082 {
			lb_policy round_robin
			health_uri /health
			health_interval 10s
			health_timeout 5s
			transport http {
				read_timeout 60s
				write_timeout 60s
				dial_timeout 5s
			}
			header_up X-Forwarded-For {remote_host}
			header_up X-Forwarded-Proto {scheme}
			header_up X-Real-IP {remote_host}
		}

		# Mirror domains
		reverse_proxy /mirror-domains* 127.0.0.1:8081 127.0.0.1:8082 {
			lb_policy round_robin
			health_uri /health
			health_interval 10s
			health_timeout 5s
			transport http {
				read_timeout 60s
				write_timeout 60s
				dial_timeout 5s
			}
			header_up X-Forwarded-For {remote_host}
			header_up X-Forwarded-Proto {scheme}
			header_up X-Real-IP {remote_host}
		}

		# 健康检查
		respond /health* 200 {
			body `{"status":"ok"}`
		}

		# 其他路径返回 404
		respond * 404
	}
}
