Caddyfile 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. {
  2. # Global options - HTTP only (SSL терминируется на Synology)
  3. admin off
  4. http_port 80
  5. }
  6. # API subdomain - проксирует на backend + MinIO S3 API
  7. api.{$DOMAIN} {
  8. # MinIO S3 API: /s3/* -> minio:9000
  9. @s3 {
  10. path /s3/*
  11. }
  12. reverse_proxy @s3 minio:9000 {
  13. header_up Host {host}
  14. header_up X-Real-IP {remote}
  15. header_up X-Forwarded-For {remote}
  16. header_up X-Forwarded-Proto {scheme}
  17. }
  18. # Backend API: всё остальное -> backend:8080
  19. reverse_proxy backend:8080 {
  20. header_up Host {host}
  21. header_up X-Real-IP {remote}
  22. header_up X-Forwarded-For {remote}
  23. header_up X-Forwarded-Proto {scheme}
  24. }
  25. # Security headers (HSTS на Synology, здесь — остальное)
  26. header {
  27. X-Content-Type-Options "nosniff"
  28. X-Frame-Options "DENY"
  29. Referrer-Policy "strict-origin-when-cross-origin"
  30. Permissions-Policy "geolocation=(), microphone=(), camera=()"
  31. }
  32. # Rate limiting at proxy level (backup to app-level)
  33. @auth {
  34. path /api/v1/auth/*
  35. }
  36. rate_limit @auth {
  37. zone auth
  38. rate 10/minute
  39. key {remote}
  40. }
  41. }
  42. # Frontend main domain
  43. {$DOMAIN} {
  44. reverse_proxy frontend:3000 {
  45. header_up Host {host}
  46. header_up X-Real-IP {remote}
  47. header_up X-Forwarded-For {remote}
  48. header_up X-Forwarded-Proto {scheme}
  49. }
  50. # Security headers
  51. header {
  52. X-Content-Type-Options "nosniff"
  53. X-Frame-Options "DENY"
  54. Referrer-Policy "strict-origin-when-cross-origin"
  55. Permissions-Policy "geolocation=(), microphone=(), camera=()"
  56. Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://api-maps.yandex.ru; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self' wss: https://api.{$DOMAIN} https://api-maps.yandex.ru; frame-ancestors 'none';"
  57. }
  58. # Static assets caching
  59. @static {
  60. path /_next/static/*
  61. path /static/*
  62. path /images/*
  63. path /favicon.ico
  64. }
  65. header @static Cache-Control "public, max-age=31536000, immutable"
  66. # Compression
  67. encode zstd gzip
  68. }
  69. # MinIO Console (9001) — ТОЛЬКО внутри Docker сети, доступ через SSH туннель
  70. # Никакого внешнего доступа, никакого minio.{$DOMAIN}