ginskill-init 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.wrangler/cache/pages.json +4 -0
- package/.wrangler/cache/wrangler-account.json +6 -0
- package/DEVELOPMENT.md +510 -0
- package/README.md +104 -0
- package/agents/developer.md +56 -0
- package/agents/frontend-design.md +69 -0
- package/agents/mobile-reviewer.md +36 -0
- package/agents/review-code.md +49 -0
- package/agents/security-scanner.md +50 -0
- package/agents/tester.md +72 -0
- package/bin/cli.js +461 -0
- package/landing/ai-build-ai.png +0 -0
- package/landing/index.html +1495 -0
- package/landing/logo.png +0 -0
- package/package.json +37 -0
- package/skills/active-life-dev/SKILL.md +157 -0
- package/skills/active-life-dev/docs/auth.md +187 -0
- package/skills/active-life-dev/docs/customers.md +216 -0
- package/skills/active-life-dev/docs/integrations.md +209 -0
- package/skills/active-life-dev/docs/inventory.md +192 -0
- package/skills/active-life-dev/docs/modules.md +181 -0
- package/skills/active-life-dev/docs/orders.md +180 -0
- package/skills/active-life-dev/docs/patterns.md +319 -0
- package/skills/active-life-dev/docs/products.md +216 -0
- package/skills/active-life-dev/docs/schema.md +502 -0
- package/skills/active-life-dev/docs/setup.md +169 -0
- package/skills/active-life-dev/docs/vouchers.md +144 -0
- package/skills/ai-asset-generator/SKILL.md +247 -0
- package/skills/ai-asset-generator/docs/gen-image.md +274 -0
- package/skills/ai-asset-generator/docs/genvideo.md +341 -0
- package/skills/ai-asset-generator/docs/remove-background.md +19 -0
- package/skills/ai-asset-generator/lib/bg-remove.mjs +34 -0
- package/skills/ai-asset-generator/lib/env.mjs +48 -0
- package/skills/ai-asset-generator/lib/kie-client.mjs +100 -0
- package/skills/ai-build-ai/SKILL.md +127 -0
- package/skills/ai-build-ai/docs/agent-teams.md +293 -0
- package/skills/ai-build-ai/docs/checkpointing.md +161 -0
- package/skills/ai-build-ai/docs/create-agent.md +399 -0
- package/skills/ai-build-ai/docs/create-mcp.md +395 -0
- package/skills/ai-build-ai/docs/create-skill.md +299 -0
- package/skills/ai-build-ai/docs/headless-mode.md +614 -0
- package/skills/ai-build-ai/docs/hooks.md +578 -0
- package/skills/ai-build-ai/docs/memory-claude-md.md +375 -0
- package/skills/ai-build-ai/docs/output-styles.md +208 -0
- package/skills/ai-build-ai/docs/overview.md +162 -0
- package/skills/ai-build-ai/docs/permissions.md +391 -0
- package/skills/ai-build-ai/docs/plugins.md +396 -0
- package/skills/ai-build-ai/docs/sandbox.md +262 -0
- package/skills/ai-build-ai/docs/team-lead-workflow.md +648 -0
- package/skills/ant-design/SKILL.md +323 -0
- package/skills/ant-design/docs/components.md +160 -0
- package/skills/ant-design/docs/data-entry.md +406 -0
- package/skills/ant-design/docs/display.md +594 -0
- package/skills/ant-design/docs/feedback.md +451 -0
- package/skills/ant-design/docs/key-components.md +414 -0
- package/skills/ant-design/docs/navigation.md +310 -0
- package/skills/ant-design/docs/pro-components.md +543 -0
- package/skills/ant-design/docs/setup.md +213 -0
- package/skills/ant-design/docs/theme.md +265 -0
- package/skills/flutter-performance/SKILL.md +803 -0
- package/skills/flutter-performance/references/flutter-patterns.md +595 -0
- package/skills/icon-generator/SKILL.md +270 -0
- package/skills/mobile-app-review/SKILL.md +321 -0
- package/skills/mobile-app-review/references/apple-review.md +132 -0
- package/skills/mobile-app-review/references/google-play-review.md +203 -0
- package/skills/mongodb/SKILL.md +667 -0
- package/skills/mongodb/references/mongoose-patterns.md +368 -0
- package/skills/nestjs-architecture/SKILL.md +1086 -0
- package/skills/nestjs-architecture/references/advanced-patterns.md +590 -0
- package/skills/performance/SKILL.md +509 -0
- package/skills/react-fsd-architecture/SKILL.md +693 -0
- package/skills/react-fsd-architecture/references/fsd-patterns.md +747 -0
- package/skills/react-native-expo/SKILL.md +128 -0
- package/skills/react-native-expo/references/data-layer.md +252 -0
- package/skills/react-native-expo/references/design-system.md +252 -0
- package/skills/react-native-expo/references/navigation.md +199 -0
- package/skills/react-native-expo/references/performance.md +229 -0
- package/skills/react-native-expo/references/platform-services.md +179 -0
- package/skills/react-native-expo/references/state-management.md +209 -0
- package/skills/react-native-expo/references/ui-patterns.md +301 -0
- package/skills/react-query/SKILL.md +685 -0
- package/skills/react-query/references/query-patterns.md +365 -0
- package/skills/review-code/SKILL.md +374 -0
- package/skills/review-code/references/clean-code-principles.md +395 -0
- package/skills/review-code/references/frontend-patterns.md +136 -0
- package/skills/review-code/references/nestjs-patterns.md +184 -0
- package/skills/security-scanner/SKILL.md +366 -0
- package/skills/security-scanner/references/nestjs-security.md +260 -0
- package/skills/security-scanner/references/nextjs-security.md +201 -0
- package/skills/security-scanner/references/react-native-security.md +199 -0
- package/skills/traefik/SKILL.md +105 -0
- package/skills/traefik/docs/advanced-routing.md +186 -0
- package/skills/traefik/docs/auth-providers.md +137 -0
- package/skills/traefik/docs/cicd-devops.md +396 -0
- package/skills/traefik/docs/core-config.md +171 -0
- package/skills/traefik/docs/distributed-config.md +96 -0
- package/skills/traefik/docs/docker-compose.md +182 -0
- package/skills/traefik/docs/ha-performance.md +177 -0
- package/skills/traefik/docs/kubernetes.md +278 -0
- package/skills/traefik/docs/middleware.md +205 -0
- package/skills/traefik/docs/monitoring.md +357 -0
- package/skills/traefik/docs/security.md +391 -0
- package/skills/traefik/docs/tls-acme.md +155 -0
- package/skills/ui-ux-pro-max/SKILL.md +377 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Traefik Docker Compose Patterns
|
|
2
|
+
|
|
3
|
+
## Production Docker Compose
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
services:
|
|
7
|
+
traefik:
|
|
8
|
+
image: traefik:v3.6
|
|
9
|
+
container_name: traefik
|
|
10
|
+
restart: unless-stopped
|
|
11
|
+
security_opt:
|
|
12
|
+
- no-new-privileges:true
|
|
13
|
+
ports:
|
|
14
|
+
- "80:80"
|
|
15
|
+
- "443:443"
|
|
16
|
+
environment:
|
|
17
|
+
- CF_DNS_API_TOKEN_FILE=/run/secrets/cf_api_token
|
|
18
|
+
secrets:
|
|
19
|
+
- cf_api_token
|
|
20
|
+
volumes:
|
|
21
|
+
- /etc/localtime:/etc/localtime:ro
|
|
22
|
+
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
23
|
+
- ./traefik.yml:/etc/traefik/traefik.yml:ro
|
|
24
|
+
- ./dynamic:/etc/traefik/dynamic:ro
|
|
25
|
+
- ./acme.json:/acme.json
|
|
26
|
+
- ./logs:/var/log/traefik
|
|
27
|
+
networks:
|
|
28
|
+
- proxy
|
|
29
|
+
labels:
|
|
30
|
+
- "traefik.enable=true"
|
|
31
|
+
# Dashboard
|
|
32
|
+
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
|
|
33
|
+
- "traefik.http.routers.dashboard.entrypoints=websecure"
|
|
34
|
+
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
|
|
35
|
+
- "traefik.http.routers.dashboard.service=api@internal"
|
|
36
|
+
- "traefik.http.routers.dashboard.middlewares=dashboard-auth"
|
|
37
|
+
- "traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$xyz$$hash"
|
|
38
|
+
|
|
39
|
+
# Backend service example
|
|
40
|
+
app:
|
|
41
|
+
image: myapp:latest
|
|
42
|
+
restart: unless-stopped
|
|
43
|
+
networks:
|
|
44
|
+
- proxy
|
|
45
|
+
labels:
|
|
46
|
+
- "traefik.enable=true"
|
|
47
|
+
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
|
|
48
|
+
- "traefik.http.routers.app.entrypoints=websecure"
|
|
49
|
+
- "traefik.http.routers.app.tls.certresolver=letsencrypt"
|
|
50
|
+
- "traefik.http.services.app.loadbalancer.server.port=8080"
|
|
51
|
+
- "traefik.http.routers.app.middlewares=security-headers@file,rate-limit@file"
|
|
52
|
+
|
|
53
|
+
secrets:
|
|
54
|
+
cf_api_token:
|
|
55
|
+
file: ./secrets/cf_api_token.txt
|
|
56
|
+
|
|
57
|
+
networks:
|
|
58
|
+
proxy:
|
|
59
|
+
external: true # docker network create proxy
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## With Docker Socket Proxy (recommended)
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
services:
|
|
66
|
+
socket-proxy:
|
|
67
|
+
image: tecnativa/docker-socket-proxy
|
|
68
|
+
container_name: socket-proxy
|
|
69
|
+
restart: unless-stopped
|
|
70
|
+
environment:
|
|
71
|
+
CONTAINERS: 1
|
|
72
|
+
SERVICES: 0
|
|
73
|
+
TASKS: 0
|
|
74
|
+
NETWORKS: 0
|
|
75
|
+
NODES: 0
|
|
76
|
+
IMAGES: 0
|
|
77
|
+
VOLUMES: 0
|
|
78
|
+
volumes:
|
|
79
|
+
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
80
|
+
networks:
|
|
81
|
+
- socket-proxy
|
|
82
|
+
|
|
83
|
+
traefik:
|
|
84
|
+
image: traefik:v3.6
|
|
85
|
+
container_name: traefik
|
|
86
|
+
restart: unless-stopped
|
|
87
|
+
security_opt:
|
|
88
|
+
- no-new-privileges:true
|
|
89
|
+
depends_on:
|
|
90
|
+
- socket-proxy
|
|
91
|
+
ports:
|
|
92
|
+
- "80:80"
|
|
93
|
+
- "443:443"
|
|
94
|
+
volumes:
|
|
95
|
+
- ./traefik.yml:/etc/traefik/traefik.yml:ro
|
|
96
|
+
- ./dynamic:/etc/traefik/dynamic:ro
|
|
97
|
+
- ./acme.json:/acme.json
|
|
98
|
+
networks:
|
|
99
|
+
- proxy
|
|
100
|
+
- socket-proxy
|
|
101
|
+
|
|
102
|
+
networks:
|
|
103
|
+
proxy:
|
|
104
|
+
external: true
|
|
105
|
+
socket-proxy:
|
|
106
|
+
internal: true # No external access
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
In `traefik.yml`:
|
|
110
|
+
```yaml
|
|
111
|
+
providers:
|
|
112
|
+
docker:
|
|
113
|
+
endpoint: "tcp://socket-proxy:2375"
|
|
114
|
+
exposedByDefault: false
|
|
115
|
+
network: proxy
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Multiple Services Example
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
services:
|
|
122
|
+
frontend:
|
|
123
|
+
image: frontend:latest
|
|
124
|
+
networks: [proxy]
|
|
125
|
+
labels:
|
|
126
|
+
- "traefik.enable=true"
|
|
127
|
+
- "traefik.http.routers.frontend.rule=Host(`example.com`)"
|
|
128
|
+
- "traefik.http.routers.frontend.entrypoints=websecure"
|
|
129
|
+
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
|
|
130
|
+
- "traefik.http.services.frontend.loadbalancer.server.port=3000"
|
|
131
|
+
|
|
132
|
+
api:
|
|
133
|
+
image: api:latest
|
|
134
|
+
networks: [proxy]
|
|
135
|
+
labels:
|
|
136
|
+
- "traefik.enable=true"
|
|
137
|
+
- "traefik.http.routers.api.rule=Host(`example.com`) && PathPrefix(`/api`)"
|
|
138
|
+
- "traefik.http.routers.api.entrypoints=websecure"
|
|
139
|
+
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
|
|
140
|
+
- "traefik.http.services.api.loadbalancer.server.port=8080"
|
|
141
|
+
- "traefik.http.routers.api.middlewares=strip-api"
|
|
142
|
+
- "traefik.http.middlewares.strip-api.stripprefix.prefixes=/api"
|
|
143
|
+
|
|
144
|
+
admin:
|
|
145
|
+
image: admin:latest
|
|
146
|
+
networks: [proxy]
|
|
147
|
+
labels:
|
|
148
|
+
- "traefik.enable=true"
|
|
149
|
+
- "traefik.http.routers.admin.rule=Host(`admin.example.com`)"
|
|
150
|
+
- "traefik.http.routers.admin.entrypoints=websecure"
|
|
151
|
+
- "traefik.http.routers.admin.tls.certresolver=letsencrypt"
|
|
152
|
+
- "traefik.http.services.admin.loadbalancer.server.port=3001"
|
|
153
|
+
- "traefik.http.routers.admin.middlewares=admin-auth@file"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Key Docker Patterns
|
|
157
|
+
|
|
158
|
+
- **Always** use `exposedByDefault: false` and explicit `traefik.enable=true`
|
|
159
|
+
- **Always** use a shared external network (`docker network create proxy`)
|
|
160
|
+
- Use `$$` to escape `$` in docker-compose labels (for htpasswd hashes)
|
|
161
|
+
- Specify `loadbalancer.server.port` when container exposes multiple ports
|
|
162
|
+
- Mount Docker socket read-only or use socket proxy
|
|
163
|
+
- Use `security_opt: [no-new-privileges:true]` on Traefik container
|
|
164
|
+
- Use Docker secrets for sensitive values, not environment variables
|
|
165
|
+
- Set `restart: unless-stopped` for production reliability
|
|
166
|
+
|
|
167
|
+
## Scaling Services
|
|
168
|
+
|
|
169
|
+
```yaml
|
|
170
|
+
services:
|
|
171
|
+
app:
|
|
172
|
+
image: myapp:latest
|
|
173
|
+
deploy:
|
|
174
|
+
replicas: 3
|
|
175
|
+
networks: [proxy]
|
|
176
|
+
labels:
|
|
177
|
+
- "traefik.enable=true"
|
|
178
|
+
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
|
|
179
|
+
- "traefik.http.services.app.loadbalancer.server.port=8080"
|
|
180
|
+
- "traefik.http.services.app.loadbalancer.healthcheck.path=/health"
|
|
181
|
+
- "traefik.http.services.app.loadbalancer.healthcheck.interval=10s"
|
|
182
|
+
```
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# High Availability & Performance Tuning
|
|
2
|
+
|
|
3
|
+
## High Availability Setup
|
|
4
|
+
|
|
5
|
+
### Multi-Instance Deployment
|
|
6
|
+
- Deploy minimum 3 Traefik instances across different nodes/zones
|
|
7
|
+
- Front with a cloud NLB (AWS NLB, GCP TCP LB) or DNS round-robin
|
|
8
|
+
- Share config via Kubernetes API, Consul, or etcd
|
|
9
|
+
|
|
10
|
+
### Kubernetes HA
|
|
11
|
+
|
|
12
|
+
```yaml
|
|
13
|
+
# Helm values
|
|
14
|
+
deployment:
|
|
15
|
+
replicas: 3
|
|
16
|
+
|
|
17
|
+
affinity:
|
|
18
|
+
podAntiAffinity:
|
|
19
|
+
requiredDuringSchedulingIgnoredDuringExecution:
|
|
20
|
+
- labelSelector:
|
|
21
|
+
matchLabels:
|
|
22
|
+
app.kubernetes.io/name: traefik
|
|
23
|
+
topologyKey: topology.kubernetes.io/zone
|
|
24
|
+
preferredDuringSchedulingIgnoredDuringExecution:
|
|
25
|
+
- weight: 100
|
|
26
|
+
podAffinityTerm:
|
|
27
|
+
labelSelector:
|
|
28
|
+
matchLabels:
|
|
29
|
+
app.kubernetes.io/name: traefik
|
|
30
|
+
topologyKey: kubernetes.io/hostname
|
|
31
|
+
|
|
32
|
+
topologySpreadConstraints:
|
|
33
|
+
- maxSkew: 1
|
|
34
|
+
topologyKey: topology.kubernetes.io/zone
|
|
35
|
+
whenUnsatisfiable: DoNotSchedule
|
|
36
|
+
labelSelector:
|
|
37
|
+
matchLabels:
|
|
38
|
+
app.kubernetes.io/name: traefik
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### ACME in HA
|
|
42
|
+
|
|
43
|
+
Problem: Multiple instances requesting duplicate certificates.
|
|
44
|
+
|
|
45
|
+
Solutions:
|
|
46
|
+
- **Traefik Enterprise**: Built-in distributed ACME
|
|
47
|
+
- **cert-manager**: External cert management (recommended for K8s)
|
|
48
|
+
- **Shared KV store**: Consul/etcd for cert state (community workaround)
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
# Use cert-manager instead of Traefik ACME in HA K8s
|
|
52
|
+
apiVersion: cert-manager.io/v1
|
|
53
|
+
kind: Certificate
|
|
54
|
+
metadata:
|
|
55
|
+
name: wildcard-cert
|
|
56
|
+
spec:
|
|
57
|
+
secretName: wildcard-tls
|
|
58
|
+
issuerRef:
|
|
59
|
+
name: letsencrypt-prod
|
|
60
|
+
kind: ClusterIssuer
|
|
61
|
+
dnsNames:
|
|
62
|
+
- "example.com"
|
|
63
|
+
- "*.example.com"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Reference in IngressRoute:
|
|
67
|
+
```yaml
|
|
68
|
+
tls:
|
|
69
|
+
secretName: wildcard-tls # Instead of certResolver
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Performance Tuning
|
|
73
|
+
|
|
74
|
+
### Connection Pool
|
|
75
|
+
```yaml
|
|
76
|
+
serversTransport:
|
|
77
|
+
maxIdleConnsPerHost: 200 # Default is low; increase for high-throughput
|
|
78
|
+
forwardingTimeouts:
|
|
79
|
+
dialTimeout: 10s
|
|
80
|
+
responseHeaderTimeout: 10s
|
|
81
|
+
idleConnTimeout: 90s
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Resource Allocation
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
resources:
|
|
88
|
+
requests:
|
|
89
|
+
cpu: 500m
|
|
90
|
+
memory: 256Mi
|
|
91
|
+
limits:
|
|
92
|
+
cpu: "2"
|
|
93
|
+
memory: 1Gi
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Traefik is Go-based — benefits from multiple CPU cores via GOMAXPROCS.
|
|
97
|
+
|
|
98
|
+
### Access Log Optimization
|
|
99
|
+
|
|
100
|
+
For high-throughput, buffer or disable access logs:
|
|
101
|
+
```yaml
|
|
102
|
+
accessLog:
|
|
103
|
+
bufferingSize: 100
|
|
104
|
+
filters:
|
|
105
|
+
statusCodes: ["400-599"] # Only log errors
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Or disable entirely for maximum performance:
|
|
109
|
+
```yaml
|
|
110
|
+
# Don't include accessLog section
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Routing Optimization
|
|
114
|
+
|
|
115
|
+
- Minimize regex-heavy routing rules
|
|
116
|
+
- Use exact `Host()` and `Path()` over `HostRegexp()` and `PathRegexp()`
|
|
117
|
+
- Reduce middleware chain depth
|
|
118
|
+
- Use `priority` to short-circuit matching for common routes
|
|
119
|
+
|
|
120
|
+
### Label Cardinality
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
metrics:
|
|
124
|
+
prometheus:
|
|
125
|
+
addEntryPointsLabels: true
|
|
126
|
+
addServicesLabels: true
|
|
127
|
+
addRoutersLabels: false # Disable if too many routers (high cardinality)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### HTTP/3
|
|
131
|
+
|
|
132
|
+
Enable for reduced connection latency:
|
|
133
|
+
```yaml
|
|
134
|
+
entryPoints:
|
|
135
|
+
websecure:
|
|
136
|
+
address: ":443"
|
|
137
|
+
http3: {}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Cloud Provider Integration
|
|
141
|
+
|
|
142
|
+
### AWS
|
|
143
|
+
- Use NLB (Network Load Balancer) for TCP/TLS passthrough
|
|
144
|
+
- Set `service.beta.kubernetes.io/aws-load-balancer-type: nlb`
|
|
145
|
+
- Enable proxy protocol on both NLB and Traefik
|
|
146
|
+
- Use IAM roles for service accounts (IRSA) for Route53 ACME
|
|
147
|
+
|
|
148
|
+
### GCP
|
|
149
|
+
- GKE auto-provisions TCP LB for LoadBalancer Service
|
|
150
|
+
- Integrate Cloud Armor for WAF/DDoS in front of Traefik
|
|
151
|
+
- Use Workload Identity for Cloud DNS ACME
|
|
152
|
+
|
|
153
|
+
### Azure
|
|
154
|
+
- AKS with Azure Load Balancer
|
|
155
|
+
- Static IP: `service.beta.kubernetes.io/azure-load-balancer-resource-group`
|
|
156
|
+
- Azure DNS for cert-manager ACME challenges
|
|
157
|
+
|
|
158
|
+
## Benchmarking
|
|
159
|
+
|
|
160
|
+
Test with:
|
|
161
|
+
```bash
|
|
162
|
+
# wrk
|
|
163
|
+
wrk -t12 -c400 -d30s https://app.example.com/
|
|
164
|
+
|
|
165
|
+
# k6
|
|
166
|
+
k6 run --vus 100 --duration 30s loadtest.js
|
|
167
|
+
|
|
168
|
+
# hey
|
|
169
|
+
hey -n 10000 -c 100 https://app.example.com/
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Key metrics to monitor during load tests:
|
|
173
|
+
- Request latency (P50, P95, P99)
|
|
174
|
+
- Requests per second
|
|
175
|
+
- Error rate
|
|
176
|
+
- CPU/memory usage of Traefik
|
|
177
|
+
- Open connections
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# Traefik Kubernetes CRDs
|
|
2
|
+
|
|
3
|
+
## Installation
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
# Helm
|
|
7
|
+
helm repo add traefik https://traefik.github.io/charts
|
|
8
|
+
helm repo update
|
|
9
|
+
helm install traefik traefik/traefik -n traefik --create-namespace \
|
|
10
|
+
--set "ports.websecure.tls.enabled=true" \
|
|
11
|
+
--set "providers.kubernetesCRD.enabled=true" \
|
|
12
|
+
--set "providers.kubernetesCRD.allowCrossNamespace=true"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## IngressRoute
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
apiVersion: traefik.io/v1alpha1
|
|
19
|
+
kind: IngressRoute
|
|
20
|
+
metadata:
|
|
21
|
+
name: app
|
|
22
|
+
namespace: apps
|
|
23
|
+
spec:
|
|
24
|
+
entryPoints: [websecure]
|
|
25
|
+
routes:
|
|
26
|
+
- kind: Rule
|
|
27
|
+
match: Host(`app.example.com`) && PathPrefix(`/api`)
|
|
28
|
+
priority: 200
|
|
29
|
+
middlewares:
|
|
30
|
+
- name: strip-api
|
|
31
|
+
namespace: apps
|
|
32
|
+
- name: rate-limit
|
|
33
|
+
namespace: traefik
|
|
34
|
+
services:
|
|
35
|
+
- kind: Service
|
|
36
|
+
name: app-backend
|
|
37
|
+
port: 8080
|
|
38
|
+
weight: 100
|
|
39
|
+
passHostHeader: true
|
|
40
|
+
- kind: Rule
|
|
41
|
+
match: Host(`app.example.com`)
|
|
42
|
+
priority: 100
|
|
43
|
+
services:
|
|
44
|
+
- kind: Service
|
|
45
|
+
name: app-frontend
|
|
46
|
+
port: 3000
|
|
47
|
+
tls:
|
|
48
|
+
certResolver: letsencrypt
|
|
49
|
+
domains:
|
|
50
|
+
- main: example.com
|
|
51
|
+
sans: ["*.example.com"]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Middleware CRD
|
|
55
|
+
|
|
56
|
+
```yaml
|
|
57
|
+
apiVersion: traefik.io/v1alpha1
|
|
58
|
+
kind: Middleware
|
|
59
|
+
metadata:
|
|
60
|
+
name: security-headers
|
|
61
|
+
namespace: traefik
|
|
62
|
+
spec:
|
|
63
|
+
headers:
|
|
64
|
+
frameDeny: true
|
|
65
|
+
browserXssFilter: true
|
|
66
|
+
contentTypeNosniff: true
|
|
67
|
+
stsSeconds: 31536000
|
|
68
|
+
stsIncludeSubdomains: true
|
|
69
|
+
stsPreload: true
|
|
70
|
+
---
|
|
71
|
+
apiVersion: traefik.io/v1alpha1
|
|
72
|
+
kind: Middleware
|
|
73
|
+
metadata:
|
|
74
|
+
name: rate-limit
|
|
75
|
+
namespace: traefik
|
|
76
|
+
spec:
|
|
77
|
+
rateLimit:
|
|
78
|
+
average: 100
|
|
79
|
+
burst: 50
|
|
80
|
+
period: 1s
|
|
81
|
+
---
|
|
82
|
+
apiVersion: traefik.io/v1alpha1
|
|
83
|
+
kind: Middleware
|
|
84
|
+
metadata:
|
|
85
|
+
name: strip-api
|
|
86
|
+
namespace: apps
|
|
87
|
+
spec:
|
|
88
|
+
stripPrefix:
|
|
89
|
+
prefixes: [/api]
|
|
90
|
+
---
|
|
91
|
+
apiVersion: traefik.io/v1alpha1
|
|
92
|
+
kind: Middleware
|
|
93
|
+
metadata:
|
|
94
|
+
name: redirect-https
|
|
95
|
+
namespace: traefik
|
|
96
|
+
spec:
|
|
97
|
+
redirectScheme:
|
|
98
|
+
scheme: https
|
|
99
|
+
permanent: true
|
|
100
|
+
---
|
|
101
|
+
# Chain middleware
|
|
102
|
+
apiVersion: traefik.io/v1alpha1
|
|
103
|
+
kind: Middleware
|
|
104
|
+
metadata:
|
|
105
|
+
name: secured
|
|
106
|
+
namespace: traefik
|
|
107
|
+
spec:
|
|
108
|
+
chain:
|
|
109
|
+
middlewares:
|
|
110
|
+
- name: redirect-https
|
|
111
|
+
- name: security-headers
|
|
112
|
+
- name: rate-limit
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## TLSOption CRD
|
|
116
|
+
|
|
117
|
+
```yaml
|
|
118
|
+
apiVersion: traefik.io/v1alpha1
|
|
119
|
+
kind: TLSOption
|
|
120
|
+
metadata:
|
|
121
|
+
name: default # "default" applies globally
|
|
122
|
+
namespace: traefik
|
|
123
|
+
spec:
|
|
124
|
+
minVersion: VersionTLS12
|
|
125
|
+
sniStrict: true
|
|
126
|
+
cipherSuites:
|
|
127
|
+
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
|
|
128
|
+
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
|
|
129
|
+
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
|
|
130
|
+
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## ServersTransport CRD
|
|
134
|
+
|
|
135
|
+
For mTLS or custom TLS to backend services:
|
|
136
|
+
|
|
137
|
+
```yaml
|
|
138
|
+
apiVersion: traefik.io/v1alpha1
|
|
139
|
+
kind: ServersTransport
|
|
140
|
+
metadata:
|
|
141
|
+
name: mtls-backend
|
|
142
|
+
namespace: apps
|
|
143
|
+
spec:
|
|
144
|
+
serverName: "backend.internal"
|
|
145
|
+
insecureSkipVerify: false
|
|
146
|
+
rootCAsSecrets: [backend-ca]
|
|
147
|
+
certificatesSecrets: [client-cert]
|
|
148
|
+
maxIdleConnsPerHost: 10
|
|
149
|
+
forwardingTimeouts:
|
|
150
|
+
dialTimeout: 5s
|
|
151
|
+
responseHeaderTimeout: 10s
|
|
152
|
+
idleConnTimeout: 90s
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## TraefikService (Weighted Round Robin / Mirroring)
|
|
156
|
+
|
|
157
|
+
```yaml
|
|
158
|
+
# Canary deployment
|
|
159
|
+
apiVersion: traefik.io/v1alpha1
|
|
160
|
+
kind: TraefikService
|
|
161
|
+
metadata:
|
|
162
|
+
name: app-canary
|
|
163
|
+
spec:
|
|
164
|
+
weighted:
|
|
165
|
+
services:
|
|
166
|
+
- name: app-stable
|
|
167
|
+
port: 80
|
|
168
|
+
weight: 90
|
|
169
|
+
- name: app-canary
|
|
170
|
+
port: 80
|
|
171
|
+
weight: 10
|
|
172
|
+
---
|
|
173
|
+
# Traffic mirroring
|
|
174
|
+
apiVersion: traefik.io/v1alpha1
|
|
175
|
+
kind: TraefikService
|
|
176
|
+
metadata:
|
|
177
|
+
name: app-mirror
|
|
178
|
+
spec:
|
|
179
|
+
mirroring:
|
|
180
|
+
name: app-main
|
|
181
|
+
port: 80
|
|
182
|
+
mirrors:
|
|
183
|
+
- name: app-shadow
|
|
184
|
+
port: 80
|
|
185
|
+
percent: 20
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## IngressRouteTCP
|
|
189
|
+
|
|
190
|
+
```yaml
|
|
191
|
+
apiVersion: traefik.io/v1alpha1
|
|
192
|
+
kind: IngressRouteTCP
|
|
193
|
+
metadata:
|
|
194
|
+
name: postgres
|
|
195
|
+
namespace: databases
|
|
196
|
+
spec:
|
|
197
|
+
entryPoints: [postgres]
|
|
198
|
+
routes:
|
|
199
|
+
- match: HostSNI(`db.example.com`)
|
|
200
|
+
services:
|
|
201
|
+
- name: postgres
|
|
202
|
+
port: 5432
|
|
203
|
+
tls:
|
|
204
|
+
passthrough: true
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## IngressRouteUDP
|
|
208
|
+
|
|
209
|
+
```yaml
|
|
210
|
+
apiVersion: traefik.io/v1alpha1
|
|
211
|
+
kind: IngressRouteUDP
|
|
212
|
+
metadata:
|
|
213
|
+
name: dns
|
|
214
|
+
spec:
|
|
215
|
+
entryPoints: [dns-udp]
|
|
216
|
+
routes:
|
|
217
|
+
- services:
|
|
218
|
+
- name: coredns
|
|
219
|
+
port: 53
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Helm Values (production)
|
|
223
|
+
|
|
224
|
+
```yaml
|
|
225
|
+
# values.yaml
|
|
226
|
+
deployment:
|
|
227
|
+
replicas: 3
|
|
228
|
+
podAnnotations:
|
|
229
|
+
prometheus.io/scrape: "true"
|
|
230
|
+
prometheus.io/port: "8082"
|
|
231
|
+
|
|
232
|
+
affinity:
|
|
233
|
+
podAntiAffinity:
|
|
234
|
+
preferredDuringSchedulingIgnoredDuringExecution:
|
|
235
|
+
- weight: 100
|
|
236
|
+
podAffinityTerm:
|
|
237
|
+
labelSelector:
|
|
238
|
+
matchLabels:
|
|
239
|
+
app.kubernetes.io/name: traefik
|
|
240
|
+
topologyKey: kubernetes.io/hostname
|
|
241
|
+
|
|
242
|
+
resources:
|
|
243
|
+
requests:
|
|
244
|
+
cpu: 100m
|
|
245
|
+
memory: 128Mi
|
|
246
|
+
limits:
|
|
247
|
+
cpu: "1"
|
|
248
|
+
memory: 512Mi
|
|
249
|
+
|
|
250
|
+
ports:
|
|
251
|
+
web:
|
|
252
|
+
redirections:
|
|
253
|
+
entryPoint:
|
|
254
|
+
to: websecure
|
|
255
|
+
scheme: https
|
|
256
|
+
websecure:
|
|
257
|
+
tls:
|
|
258
|
+
enabled: true
|
|
259
|
+
metrics:
|
|
260
|
+
port: 8082
|
|
261
|
+
expose:
|
|
262
|
+
default: false
|
|
263
|
+
|
|
264
|
+
providers:
|
|
265
|
+
kubernetesCRD:
|
|
266
|
+
enabled: true
|
|
267
|
+
allowCrossNamespace: true
|
|
268
|
+
kubernetesIngress:
|
|
269
|
+
enabled: false
|
|
270
|
+
|
|
271
|
+
metrics:
|
|
272
|
+
prometheus:
|
|
273
|
+
entryPoint: metrics
|
|
274
|
+
|
|
275
|
+
ingressRoute:
|
|
276
|
+
dashboard:
|
|
277
|
+
enabled: false # Create your own with auth
|
|
278
|
+
```
|