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,396 @@
|
|
|
1
|
+
# CI/CD, Deployments & DevOps
|
|
2
|
+
|
|
3
|
+
## Blue-Green Deployments
|
|
4
|
+
|
|
5
|
+
Maintain two environments (blue=current, green=new). Switch traffic instantly.
|
|
6
|
+
|
|
7
|
+
### Docker Compose
|
|
8
|
+
```yaml
|
|
9
|
+
services:
|
|
10
|
+
app-blue:
|
|
11
|
+
image: myapp:1.0.0
|
|
12
|
+
networks: [proxy]
|
|
13
|
+
labels:
|
|
14
|
+
- "traefik.enable=true"
|
|
15
|
+
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
|
|
16
|
+
- "traefik.http.services.app.loadbalancer.server.port=8080"
|
|
17
|
+
|
|
18
|
+
app-green:
|
|
19
|
+
image: myapp:1.1.0
|
|
20
|
+
networks: [proxy]
|
|
21
|
+
labels:
|
|
22
|
+
- "traefik.enable=false" # Toggle to switch
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Switch: change `traefik.enable` labels and restart/recreate containers.
|
|
26
|
+
|
|
27
|
+
### Kubernetes (TraefikService)
|
|
28
|
+
```yaml
|
|
29
|
+
apiVersion: traefik.io/v1alpha1
|
|
30
|
+
kind: TraefikService
|
|
31
|
+
metadata:
|
|
32
|
+
name: app-weighted
|
|
33
|
+
spec:
|
|
34
|
+
weighted:
|
|
35
|
+
services:
|
|
36
|
+
- name: app-blue
|
|
37
|
+
port: 80
|
|
38
|
+
weight: 100 # All traffic to blue
|
|
39
|
+
- name: app-green
|
|
40
|
+
port: 80
|
|
41
|
+
weight: 0 # Change to 100 for cutover
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Canary Releases
|
|
45
|
+
|
|
46
|
+
Gradually shift traffic percentage to new version.
|
|
47
|
+
|
|
48
|
+
```yaml
|
|
49
|
+
apiVersion: traefik.io/v1alpha1
|
|
50
|
+
kind: TraefikService
|
|
51
|
+
metadata:
|
|
52
|
+
name: app-canary
|
|
53
|
+
spec:
|
|
54
|
+
weighted:
|
|
55
|
+
services:
|
|
56
|
+
- name: app-stable
|
|
57
|
+
port: 80
|
|
58
|
+
weight: 95
|
|
59
|
+
- name: app-canary
|
|
60
|
+
port: 80
|
|
61
|
+
weight: 5 # Start small, increase gradually
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Automated with Flagger
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
apiVersion: flagger.app/v1beta1
|
|
68
|
+
kind: Canary
|
|
69
|
+
metadata:
|
|
70
|
+
name: app
|
|
71
|
+
spec:
|
|
72
|
+
provider: traefik
|
|
73
|
+
targetRef:
|
|
74
|
+
apiVersion: apps/v1
|
|
75
|
+
kind: Deployment
|
|
76
|
+
name: app
|
|
77
|
+
service:
|
|
78
|
+
port: 80
|
|
79
|
+
analysis:
|
|
80
|
+
interval: 30s
|
|
81
|
+
threshold: 5 # Max failed checks
|
|
82
|
+
maxWeight: 50 # Max canary traffic %
|
|
83
|
+
stepWeight: 10 # Increment per interval
|
|
84
|
+
metrics:
|
|
85
|
+
- name: request-success-rate
|
|
86
|
+
thresholdRange:
|
|
87
|
+
min: 99
|
|
88
|
+
interval: 30s
|
|
89
|
+
- name: request-duration
|
|
90
|
+
thresholdRange:
|
|
91
|
+
max: 500
|
|
92
|
+
interval: 30s
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## A/B Testing
|
|
96
|
+
|
|
97
|
+
Route based on headers, cookies, or query params:
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
http:
|
|
101
|
+
routers:
|
|
102
|
+
variant-b:
|
|
103
|
+
rule: "Host(`app.example.com`) && Headers(`X-Variant`, `B`)"
|
|
104
|
+
service: app-variant-b
|
|
105
|
+
priority: 200
|
|
106
|
+
|
|
107
|
+
variant-a:
|
|
108
|
+
rule: "Host(`app.example.com`)"
|
|
109
|
+
service: app-variant-a
|
|
110
|
+
priority: 100
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Traffic Mirroring (Shadow Testing)
|
|
114
|
+
|
|
115
|
+
Send copy of production traffic to test environment:
|
|
116
|
+
|
|
117
|
+
```yaml
|
|
118
|
+
apiVersion: traefik.io/v1alpha1
|
|
119
|
+
kind: TraefikService
|
|
120
|
+
metadata:
|
|
121
|
+
name: app-mirror
|
|
122
|
+
spec:
|
|
123
|
+
mirroring:
|
|
124
|
+
name: app-production
|
|
125
|
+
port: 80
|
|
126
|
+
mirrors:
|
|
127
|
+
- name: app-staging
|
|
128
|
+
port: 80
|
|
129
|
+
percent: 20 # Mirror 20% of traffic
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## GitOps with FluxCD
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
# flux/traefik-helmrelease.yaml
|
|
136
|
+
apiVersion: helm.toolkit.fluxcd.io/v2
|
|
137
|
+
kind: HelmRelease
|
|
138
|
+
metadata:
|
|
139
|
+
name: traefik
|
|
140
|
+
namespace: traefik
|
|
141
|
+
spec:
|
|
142
|
+
interval: 5m
|
|
143
|
+
chart:
|
|
144
|
+
spec:
|
|
145
|
+
chart: traefik
|
|
146
|
+
version: ">=34.0.0"
|
|
147
|
+
sourceRef:
|
|
148
|
+
kind: HelmRepository
|
|
149
|
+
name: traefik
|
|
150
|
+
values:
|
|
151
|
+
deployment:
|
|
152
|
+
replicas: 3
|
|
153
|
+
providers:
|
|
154
|
+
kubernetesCRD:
|
|
155
|
+
enabled: true
|
|
156
|
+
---
|
|
157
|
+
apiVersion: source.toolkit.fluxcd.io/v1
|
|
158
|
+
kind: HelmRepository
|
|
159
|
+
metadata:
|
|
160
|
+
name: traefik
|
|
161
|
+
namespace: traefik
|
|
162
|
+
spec:
|
|
163
|
+
interval: 1h
|
|
164
|
+
url: https://traefik.github.io/charts
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## GitOps with ArgoCD
|
|
168
|
+
|
|
169
|
+
```yaml
|
|
170
|
+
apiVersion: argoproj.io/v1alpha1
|
|
171
|
+
kind: Application
|
|
172
|
+
metadata:
|
|
173
|
+
name: traefik
|
|
174
|
+
namespace: argocd
|
|
175
|
+
spec:
|
|
176
|
+
project: infrastructure
|
|
177
|
+
source:
|
|
178
|
+
repoURL: https://traefik.github.io/charts
|
|
179
|
+
chart: traefik
|
|
180
|
+
targetRevision: "34.0.0"
|
|
181
|
+
helm:
|
|
182
|
+
values: |
|
|
183
|
+
deployment:
|
|
184
|
+
replicas: 3
|
|
185
|
+
providers:
|
|
186
|
+
kubernetesCRD:
|
|
187
|
+
enabled: true
|
|
188
|
+
destination:
|
|
189
|
+
server: https://kubernetes.default.svc
|
|
190
|
+
namespace: traefik
|
|
191
|
+
syncPolicy:
|
|
192
|
+
automated:
|
|
193
|
+
prune: true
|
|
194
|
+
selfHeal: true
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Zero-Downtime Deployment Checklist
|
|
198
|
+
|
|
199
|
+
1. Configure health checks on all services
|
|
200
|
+
2. Set `readinessProbe` and `livenessProbe` on pods
|
|
201
|
+
3. Add `lifecycle.preStop` hook for graceful drain:
|
|
202
|
+
```yaml
|
|
203
|
+
lifecycle:
|
|
204
|
+
preStop:
|
|
205
|
+
exec:
|
|
206
|
+
command: ["sh", "-c", "sleep 15"]
|
|
207
|
+
```
|
|
208
|
+
4. Set `terminationGracePeriodSeconds: 30`
|
|
209
|
+
5. Use rolling update strategy with `maxSurge: 1, maxUnavailable: 0`
|
|
210
|
+
6. Enable sticky sessions if stateful
|
|
211
|
+
7. Monitor error rates during rollout
|
|
212
|
+
|
|
213
|
+
## CI/CD Pipeline Example (GitHub Actions)
|
|
214
|
+
|
|
215
|
+
```yaml
|
|
216
|
+
name: Deploy
|
|
217
|
+
on:
|
|
218
|
+
push:
|
|
219
|
+
branches: [main]
|
|
220
|
+
|
|
221
|
+
jobs:
|
|
222
|
+
deploy:
|
|
223
|
+
runs-on: ubuntu-latest
|
|
224
|
+
steps:
|
|
225
|
+
- uses: actions/checkout@v4
|
|
226
|
+
|
|
227
|
+
- name: Build and push image
|
|
228
|
+
run: |
|
|
229
|
+
docker build -t registry.example.com/app:${{ github.sha }} .
|
|
230
|
+
docker push registry.example.com/app:${{ github.sha }}
|
|
231
|
+
|
|
232
|
+
- name: Update deployment
|
|
233
|
+
run: |
|
|
234
|
+
kubectl set image deployment/app app=registry.example.com/app:${{ github.sha }}
|
|
235
|
+
kubectl rollout status deployment/app --timeout=300s
|
|
236
|
+
|
|
237
|
+
- name: Verify health
|
|
238
|
+
run: |
|
|
239
|
+
curl -sf https://app.example.com/health || exit 1
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Multi-Environment Patterns (dev/staging/prod)
|
|
243
|
+
|
|
244
|
+
### Namespace-Based Isolation (Kubernetes)
|
|
245
|
+
```yaml
|
|
246
|
+
# Each environment gets its own namespace + IngressRoute
|
|
247
|
+
apiVersion: traefik.io/v1alpha1
|
|
248
|
+
kind: IngressRoute
|
|
249
|
+
metadata:
|
|
250
|
+
name: app
|
|
251
|
+
namespace: staging
|
|
252
|
+
spec:
|
|
253
|
+
entryPoints: [websecure]
|
|
254
|
+
routes:
|
|
255
|
+
- match: Host(`staging.example.com`)
|
|
256
|
+
kind: Rule
|
|
257
|
+
services:
|
|
258
|
+
- name: app
|
|
259
|
+
port: 80
|
|
260
|
+
tls:
|
|
261
|
+
certResolver: letsencrypt
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Docker Compose Overrides
|
|
265
|
+
```bash
|
|
266
|
+
# Base + environment overlay
|
|
267
|
+
docker compose -f docker-compose.yml -f docker-compose.staging.yml up -d
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
```yaml
|
|
271
|
+
# docker-compose.staging.yml
|
|
272
|
+
services:
|
|
273
|
+
app:
|
|
274
|
+
labels:
|
|
275
|
+
- "traefik.http.routers.app.rule=Host(`staging.example.com`)"
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Environment-Specific Traefik Instances
|
|
279
|
+
- **Dev**: Single instance, self-signed certs, debug logging
|
|
280
|
+
- **Staging**: Mirrors prod config, staging Let's Encrypt
|
|
281
|
+
- **Prod**: HA (3+ replicas), production ACME, strict TLS, WAF
|
|
282
|
+
|
|
283
|
+
## Rollback Strategies
|
|
284
|
+
|
|
285
|
+
### Kubernetes
|
|
286
|
+
```bash
|
|
287
|
+
# Instant rollback to previous revision
|
|
288
|
+
kubectl rollout undo deployment/app
|
|
289
|
+
|
|
290
|
+
# Rollback to specific revision
|
|
291
|
+
kubectl rollout undo deployment/app --to-revision=3
|
|
292
|
+
|
|
293
|
+
# Check history
|
|
294
|
+
kubectl rollout history deployment/app
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Docker Compose
|
|
298
|
+
```bash
|
|
299
|
+
# Pin to previous image tag
|
|
300
|
+
docker compose up -d --no-deps app
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### GitOps Rollback
|
|
304
|
+
```bash
|
|
305
|
+
# Revert the deployment commit
|
|
306
|
+
git revert HEAD
|
|
307
|
+
git push # ArgoCD/Flux auto-syncs
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Traefik-Level Rollback (instant)
|
|
311
|
+
Switch weighted services back to stable:
|
|
312
|
+
```yaml
|
|
313
|
+
# Change weights: canary 0, stable 100
|
|
314
|
+
kubectl patch traefikservice app-canary --type merge -p '
|
|
315
|
+
spec:
|
|
316
|
+
weighted:
|
|
317
|
+
services:
|
|
318
|
+
- name: app-stable
|
|
319
|
+
port: 80
|
|
320
|
+
weight: 100
|
|
321
|
+
- name: app-canary
|
|
322
|
+
port: 80
|
|
323
|
+
weight: 0'
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Infrastructure as Code
|
|
327
|
+
|
|
328
|
+
### Terraform + Traefik on Kubernetes
|
|
329
|
+
```hcl
|
|
330
|
+
resource "helm_release" "traefik" {
|
|
331
|
+
name = "traefik"
|
|
332
|
+
repository = "https://traefik.github.io/charts"
|
|
333
|
+
chart = "traefik"
|
|
334
|
+
version = "34.0.0"
|
|
335
|
+
namespace = "traefik"
|
|
336
|
+
|
|
337
|
+
set {
|
|
338
|
+
name = "deployment.replicas"
|
|
339
|
+
value = "3"
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
set {
|
|
343
|
+
name = "providers.kubernetesCRD.enabled"
|
|
344
|
+
value = "true"
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
set {
|
|
348
|
+
name = "ports.websecure.tls.enabled"
|
|
349
|
+
value = "true"
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Pulumi
|
|
355
|
+
```typescript
|
|
356
|
+
const traefik = new k8s.helm.v3.Chart("traefik", {
|
|
357
|
+
chart: "traefik",
|
|
358
|
+
fetchOpts: { repo: "https://traefik.github.io/charts" },
|
|
359
|
+
version: "34.0.0",
|
|
360
|
+
namespace: "traefik",
|
|
361
|
+
values: {
|
|
362
|
+
deployment: { replicas: 3 },
|
|
363
|
+
providers: { kubernetesCRD: { enabled: true } },
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## Automated Smoke Tests Post-Deploy
|
|
369
|
+
|
|
370
|
+
```yaml
|
|
371
|
+
# GitHub Actions step
|
|
372
|
+
- name: Smoke test
|
|
373
|
+
run: |
|
|
374
|
+
# Wait for rollout
|
|
375
|
+
kubectl rollout status deployment/app --timeout=300s
|
|
376
|
+
|
|
377
|
+
# Test endpoints
|
|
378
|
+
for endpoint in /health /api/v1/status /; do
|
|
379
|
+
status=$(curl -s -o /dev/null -w "%{http_code}" "https://app.example.com${endpoint}")
|
|
380
|
+
if [ "$status" != "200" ]; then
|
|
381
|
+
echo "FAIL: ${endpoint} returned ${status}"
|
|
382
|
+
kubectl rollout undo deployment/app
|
|
383
|
+
exit 1
|
|
384
|
+
fi
|
|
385
|
+
done
|
|
386
|
+
echo "All smoke tests passed"
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## Disaster Recovery
|
|
390
|
+
|
|
391
|
+
- **Config**: All in Git (GitOps). Rollback = `git revert`
|
|
392
|
+
- **Certificates**: Back up `acme.json` / cert secrets regularly
|
|
393
|
+
- **Multi-cluster**: DNS-based failover (Route53, Cloud DNS)
|
|
394
|
+
- **Test**: Regularly validate restore procedures
|
|
395
|
+
- **RTO/RPO**: Config recovery is instant (Git); cert re-issuance takes minutes (ACME rate limits apply)
|
|
396
|
+
- **Runbook**: Document manual failover steps for when automation fails
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Traefik Core Configuration
|
|
2
|
+
|
|
3
|
+
## Static Configuration (traefik.yml)
|
|
4
|
+
|
|
5
|
+
Loaded once at startup. Three ways to set: file, CLI flags, environment variables.
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
# traefik.yml
|
|
9
|
+
global:
|
|
10
|
+
checkNewVersion: false
|
|
11
|
+
sendAnonymousUsage: false
|
|
12
|
+
|
|
13
|
+
api:
|
|
14
|
+
dashboard: true
|
|
15
|
+
insecure: false # NEVER true in production
|
|
16
|
+
|
|
17
|
+
log:
|
|
18
|
+
level: WARN
|
|
19
|
+
filePath: /var/log/traefik/traefik.log
|
|
20
|
+
|
|
21
|
+
accessLog:
|
|
22
|
+
filePath: /var/log/traefik/access.log
|
|
23
|
+
bufferingSize: 100
|
|
24
|
+
format: json
|
|
25
|
+
filters:
|
|
26
|
+
statusCodes: ["400-499", "500-599"]
|
|
27
|
+
|
|
28
|
+
# EntryPoints
|
|
29
|
+
entryPoints:
|
|
30
|
+
web:
|
|
31
|
+
address: ":80"
|
|
32
|
+
http:
|
|
33
|
+
redirections:
|
|
34
|
+
entryPoint:
|
|
35
|
+
to: websecure
|
|
36
|
+
scheme: https
|
|
37
|
+
permanent: true
|
|
38
|
+
forwardedHeaders:
|
|
39
|
+
trustedIPs: ["127.0.0.1/32", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]
|
|
40
|
+
|
|
41
|
+
websecure:
|
|
42
|
+
address: ":443"
|
|
43
|
+
http:
|
|
44
|
+
tls:
|
|
45
|
+
certResolver: letsencrypt
|
|
46
|
+
middlewares:
|
|
47
|
+
- security-headers@file
|
|
48
|
+
http3: {} # Enable HTTP/3
|
|
49
|
+
forwardedHeaders:
|
|
50
|
+
trustedIPs: ["127.0.0.1/32", "10.0.0.0/8"]
|
|
51
|
+
|
|
52
|
+
metrics:
|
|
53
|
+
address: ":8082"
|
|
54
|
+
|
|
55
|
+
# Providers
|
|
56
|
+
providers:
|
|
57
|
+
docker:
|
|
58
|
+
endpoint: "unix:///var/run/docker.sock"
|
|
59
|
+
exposedByDefault: false
|
|
60
|
+
network: proxy
|
|
61
|
+
watch: true
|
|
62
|
+
file:
|
|
63
|
+
directory: /etc/traefik/dynamic
|
|
64
|
+
watch: true
|
|
65
|
+
|
|
66
|
+
# Certificate Resolvers
|
|
67
|
+
certificatesResolvers:
|
|
68
|
+
letsencrypt:
|
|
69
|
+
acme:
|
|
70
|
+
email: admin@example.com
|
|
71
|
+
storage: /acme.json
|
|
72
|
+
caServer: https://acme-v02.api.letsencrypt.org/directory
|
|
73
|
+
dnsChallenge:
|
|
74
|
+
provider: cloudflare
|
|
75
|
+
resolvers: ["1.1.1.1:53", "8.8.8.8:53"]
|
|
76
|
+
delayBeforeCheck: 10s
|
|
77
|
+
|
|
78
|
+
# Health check endpoint
|
|
79
|
+
ping:
|
|
80
|
+
entryPoint: web
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Dynamic Configuration
|
|
84
|
+
|
|
85
|
+
Hot-reloaded. Defines routers, services, middlewares, TLS options.
|
|
86
|
+
|
|
87
|
+
### Routers
|
|
88
|
+
|
|
89
|
+
Match incoming requests and route to services:
|
|
90
|
+
|
|
91
|
+
```yaml
|
|
92
|
+
http:
|
|
93
|
+
routers:
|
|
94
|
+
my-router:
|
|
95
|
+
entryPoints: [websecure]
|
|
96
|
+
rule: "Host(`app.example.com`) && PathPrefix(`/api`)"
|
|
97
|
+
middlewares: [rate-limit, security-headers]
|
|
98
|
+
service: my-service
|
|
99
|
+
tls:
|
|
100
|
+
certResolver: letsencrypt
|
|
101
|
+
priority: 100 # Higher = matched first
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Rule matchers**: `Host()`, `HostRegexp()`, `Path()`, `PathPrefix()`, `PathRegexp()`, `Headers()`, `HeadersRegexp()`, `Method()`, `Query()`, `ClientIP()`.
|
|
105
|
+
|
|
106
|
+
Combine with `&&` (AND), `||` (OR), `!` (NOT).
|
|
107
|
+
|
|
108
|
+
### Services
|
|
109
|
+
|
|
110
|
+
Define backend targets with load balancing:
|
|
111
|
+
|
|
112
|
+
```yaml
|
|
113
|
+
http:
|
|
114
|
+
services:
|
|
115
|
+
my-service:
|
|
116
|
+
loadBalancer:
|
|
117
|
+
servers:
|
|
118
|
+
- url: "http://10.0.0.10:8080"
|
|
119
|
+
- url: "http://10.0.0.11:8080"
|
|
120
|
+
healthCheck:
|
|
121
|
+
path: /health
|
|
122
|
+
interval: 10s
|
|
123
|
+
timeout: 3s
|
|
124
|
+
sticky:
|
|
125
|
+
cookie:
|
|
126
|
+
name: server_id
|
|
127
|
+
secure: true
|
|
128
|
+
httpOnly: true
|
|
129
|
+
passHostHeader: true
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Load Balancing Strategies (v3.6+)
|
|
133
|
+
|
|
134
|
+
| Strategy | Description |
|
|
135
|
+
|----------|-------------|
|
|
136
|
+
| **WRR** (default) | Weighted Round Robin via EDF scheduling |
|
|
137
|
+
| **P2C** | Power of Two Choices — picks 2 random, routes to least busy |
|
|
138
|
+
| **HRW** | Highest Random Weight — consistent hashing by client IP |
|
|
139
|
+
| **LeastTime** | Lowest response time + fewest connections |
|
|
140
|
+
|
|
141
|
+
### Multi-Layer Routing (v3.6+)
|
|
142
|
+
|
|
143
|
+
Advanced routing with prioritized evaluation for blue-green, A/B, canary:
|
|
144
|
+
|
|
145
|
+
```yaml
|
|
146
|
+
http:
|
|
147
|
+
routers:
|
|
148
|
+
canary:
|
|
149
|
+
rule: "Host(`app.example.com`) && Headers(`X-Canary`, `true`)"
|
|
150
|
+
service: app-canary
|
|
151
|
+
priority: 200
|
|
152
|
+
default:
|
|
153
|
+
rule: "Host(`app.example.com`)"
|
|
154
|
+
service: app-stable
|
|
155
|
+
priority: 100
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Providers Reference
|
|
159
|
+
|
|
160
|
+
| Provider | Config Key | Use Case |
|
|
161
|
+
|----------|-----------|----------|
|
|
162
|
+
| Docker | `providers.docker` | Container-based routing via labels |
|
|
163
|
+
| Kubernetes CRD | `providers.kubernetesCRD` | Native K8s with IngressRoute |
|
|
164
|
+
| Kubernetes Ingress | `providers.kubernetesIngress` | Standard K8s Ingress resources |
|
|
165
|
+
| File | `providers.file` | Static file-based routing |
|
|
166
|
+
| Consul Catalog | `providers.consulCatalog` | HashiCorp Consul service discovery |
|
|
167
|
+
| Consul | `providers.consul` | Consul KV store |
|
|
168
|
+
| etcd | `providers.etcd` | etcd KV store |
|
|
169
|
+
| Redis | `providers.redis` | Redis KV store |
|
|
170
|
+
| Amazon ECS | `providers.ecs` | AWS ECS task discovery |
|
|
171
|
+
| Nomad | `providers.nomad` | HashiCorp Nomad |
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Distributed Configuration (Redis, Consul, etcd)
|
|
2
|
+
|
|
3
|
+
## Redis Provider
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
# traefik.yml
|
|
7
|
+
providers:
|
|
8
|
+
redis:
|
|
9
|
+
endpoints: ["redis:6379"]
|
|
10
|
+
rootKey: "traefik"
|
|
11
|
+
password: "secretpassword"
|
|
12
|
+
tls:
|
|
13
|
+
ca: /certs/ca.pem
|
|
14
|
+
cert: /certs/cert.pem
|
|
15
|
+
key: /certs/key.pem
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Store config:
|
|
19
|
+
```bash
|
|
20
|
+
redis-cli SET "traefik/http/routers/my-router/rule" "Host(\`app.example.com\`)"
|
|
21
|
+
redis-cli SET "traefik/http/routers/my-router/service" "my-service"
|
|
22
|
+
redis-cli SET "traefik/http/routers/my-router/entryPoints/0" "websecure"
|
|
23
|
+
redis-cli SET "traefik/http/services/my-service/loadBalancer/servers/0/url" "http://10.0.0.10:8080"
|
|
24
|
+
redis-cli SET "traefik/http/services/my-service/loadBalancer/servers/1/url" "http://10.0.0.11:8080"
|
|
25
|
+
redis-cli SET "traefik/http/middlewares/my-headers/headers/browserXssFilter" "true"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Consul Provider
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
providers:
|
|
32
|
+
consul:
|
|
33
|
+
endpoints: ["consul:8500"]
|
|
34
|
+
rootKey: "traefik"
|
|
35
|
+
token: "consul-acl-token"
|
|
36
|
+
tls:
|
|
37
|
+
ca: /certs/ca.pem
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## etcd Provider
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
providers:
|
|
44
|
+
etcd:
|
|
45
|
+
endpoints: ["etcd1:2379", "etcd2:2379", "etcd3:2379"]
|
|
46
|
+
rootKey: "traefik"
|
|
47
|
+
username: "traefik"
|
|
48
|
+
password: "secretpassword"
|
|
49
|
+
tls:
|
|
50
|
+
ca: /certs/ca.pem
|
|
51
|
+
cert: /certs/cert.pem
|
|
52
|
+
key: /certs/key.pem
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Store config:
|
|
56
|
+
```bash
|
|
57
|
+
etcdctl put "traefik/http/routers/my-router/rule" "Host(\`app.example.com\`)"
|
|
58
|
+
etcdctl put "traefik/http/routers/my-router/service" "my-service"
|
|
59
|
+
etcdctl put "traefik/http/services/my-service/loadBalancer/servers/0/url" "http://10.0.0.10:8080"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Key Path Structure
|
|
63
|
+
|
|
64
|
+
All KV providers use the same path structure under `rootKey`:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
traefik/
|
|
68
|
+
http/
|
|
69
|
+
routers/<name>/
|
|
70
|
+
rule → "Host(`...`)"
|
|
71
|
+
service → "service-name"
|
|
72
|
+
entryPoints/0 → "websecure"
|
|
73
|
+
middlewares/0 → "middleware-name"
|
|
74
|
+
tls/certResolver → "letsencrypt"
|
|
75
|
+
services/<name>/
|
|
76
|
+
loadBalancer/servers/0/url → "http://..."
|
|
77
|
+
loadBalancer/healthCheck/path → "/health"
|
|
78
|
+
middlewares/<name>/
|
|
79
|
+
headers/browserXssFilter → "true"
|
|
80
|
+
rateLimit/average → "100"
|
|
81
|
+
tcp/
|
|
82
|
+
routers/...
|
|
83
|
+
services/...
|
|
84
|
+
tls/
|
|
85
|
+
options/...
|
|
86
|
+
certificates/...
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
All KV providers support dynamic watching — Traefik auto-detects changes without restart.
|
|
90
|
+
|
|
91
|
+
## Use Cases
|
|
92
|
+
|
|
93
|
+
- **Multi-instance sync**: All Traefik instances read from same KV store
|
|
94
|
+
- **Dynamic backend registration**: Services register themselves in KV store
|
|
95
|
+
- **API-driven config**: Update routing via KV store API
|
|
96
|
+
- **Service discovery**: Combine with Consul Catalog for automatic service registration
|