|
1 | 1 | # ============================================================================= |
2 | 2 | # Traefik Dynamic Configuration - Middleware |
3 | 3 | # ============================================================================= |
4 | | -# These middlewares are applied globally or per-route via Docker labels. |
5 | | -# Changes are hot-reloaded (no restart required). |
6 | | -# ============================================================================= |
7 | 4 |
|
8 | 5 | http: |
9 | 6 | middlewares: |
10 | 7 | # ------------------------------------------------------------------------- |
11 | | - # Security Headers (OWASP Recommendations) |
| 8 | + # Security Headers |
12 | 9 | # ------------------------------------------------------------------------- |
13 | 10 | security-headers: |
14 | 11 | headers: |
15 | | - # HSTS - Force HTTPS for 1 year |
16 | 12 | stsSeconds: 31536000 |
17 | 13 | stsIncludeSubdomains: true |
18 | 14 | stsPreload: true |
19 | | - |
20 | | - # Prevent clickjacking |
21 | 15 | frameDeny: true |
22 | | - |
23 | | - # Prevent MIME sniffing |
24 | 16 | contentTypeNosniff: true |
25 | | - |
26 | | - # XSS Protection |
27 | 17 | browserXssFilter: true |
28 | | - |
29 | | - # Referrer Policy |
30 | | - referrerPolicy: 'strict-origin-when-cross-origin' |
31 | | - |
32 | | - # Content Security Policy (adjust as needed) |
33 | | - # contentSecurityPolicy: "default-src 'self'" |
34 | | - |
35 | | - # Permissions Policy |
36 | | - permissionsPolicy: 'camera=(), microphone=(), geolocation=()' |
37 | | - |
38 | | - # Custom headers |
| 18 | + referrerPolicy: "strict-origin-when-cross-origin" |
39 | 19 | customResponseHeaders: |
40 | | - X-Powered-By: '' # Remove server info |
41 | | - Server: '' |
| 20 | + X-Powered-By: "" |
| 21 | + Server: "" |
42 | 22 |
|
43 | 23 | # ------------------------------------------------------------------------- |
44 | | - # Compression (Gzip/Brotli) |
| 24 | + # Compression |
45 | 25 | # ------------------------------------------------------------------------- |
46 | 26 | compress: |
47 | 27 | compress: |
48 | 28 | excludedContentTypes: |
49 | 29 | - text/event-stream |
50 | 30 |
|
51 | 31 | # ------------------------------------------------------------------------- |
52 | | - # Rate Limiting - Global (adjust for your traffic) |
| 32 | + # Rate Limiting - Global |
53 | 33 | # ------------------------------------------------------------------------- |
54 | 34 | rate-limit-global: |
55 | 35 | rateLimit: |
56 | | - average: 100 # Requests per second |
57 | | - burst: 200 # Max burst |
| 36 | + average: 100 |
| 37 | + burst: 200 |
58 | 38 | period: 1s |
59 | | - sourceCriterion: |
60 | | - ipStrategy: |
61 | | - depth: 1 # Use X-Forwarded-For if behind CDN |
62 | 39 |
|
63 | 40 | # ------------------------------------------------------------------------- |
64 | | - # Rate Limiting - API (stricter) |
| 41 | + # Rate Limiting - API |
65 | 42 | # ------------------------------------------------------------------------- |
66 | 43 | rate-limit-api: |
67 | 44 | rateLimit: |
68 | | - average: 50 # 50 req/s per IP |
| 45 | + average: 50 |
69 | 46 | burst: 100 |
70 | 47 | period: 1s |
71 | | - sourceCriterion: |
72 | | - ipStrategy: |
73 | | - depth: 1 |
74 | | - |
75 | | - # ------------------------------------------------------------------------- |
76 | | - # Rate Limiting - Auth endpoints (very strict) |
77 | | - # ------------------------------------------------------------------------- |
78 | | - rate-limit-auth: |
79 | | - rateLimit: |
80 | | - average: 5 # 5 req/s per IP |
81 | | - burst: 10 |
82 | | - period: 1s |
83 | | - sourceCriterion: |
84 | | - ipStrategy: |
85 | | - depth: 1 |
86 | 48 |
|
87 | 49 | # ------------------------------------------------------------------------- |
88 | | - # Retry (for transient failures) |
| 50 | + # Retry |
89 | 51 | # ------------------------------------------------------------------------- |
90 | 52 | retry: |
91 | 53 | retry: |
92 | 54 | attempts: 3 |
93 | 55 | initialInterval: 100ms |
94 | | - |
95 | | - # ------------------------------------------------------------------------- |
96 | | - # Circuit Breaker (prevent cascade failures) |
97 | | - # ------------------------------------------------------------------------- |
98 | | - circuit-breaker: |
99 | | - circuitBreaker: |
100 | | - expression: 'NetworkErrorRatio() > 0.5 || ResponseCodeRatio(500, 600, 0, 600) > 0.5' |
101 | | - |
102 | | - # ------------------------------------------------------------------------- |
103 | | - # In-Flight Requests Limit (prevent overload) |
104 | | - # ------------------------------------------------------------------------- |
105 | | - inflight-limit: |
106 | | - inFlightReq: |
107 | | - amount: 100 # Max concurrent requests per service |
108 | | - sourceCriterion: |
109 | | - ipStrategy: |
110 | | - depth: 1 |
111 | | - |
112 | | - # ------------------------------------------------------------------------- |
113 | | - # Request Buffering (for large uploads) |
114 | | - # ------------------------------------------------------------------------- |
115 | | - buffering: |
116 | | - buffering: |
117 | | - maxRequestBodyBytes: 52428800 # 50MB |
118 | | - memRequestBodyBytes: 2097152 # 2MB in memory |
119 | | - maxResponseBodyBytes: 0 # No limit |
120 | | - retryExpression: 'IsNetworkError() && Attempts() < 2' |
0 commit comments