cursor-kit-cli 1.2.0-beta → 1.2.0-beta.3
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/bin/cursor-reinstall-instance.sh +102 -0
- package/dist/cli.cjs +366 -69
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +367 -70
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +39 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +33 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/commands/docs.md +5 -3
- package/templates/commands/explain.md +5 -3
- package/templates/commands/fix.md +5 -3
- package/templates/commands/implement.md +5 -3
- package/templates/commands/refactor.md +5 -3
- package/templates/commands/review.md +5 -3
- package/templates/commands/test.md +5 -3
- package/templates/manifest.json +11 -8
- package/templates/rules/git.mdc +0 -2
- package/templates/rules/toc.mdc +17 -9
- package/templates/skills/aesthetic/SKILL.md +121 -0
- package/templates/skills/aesthetic/assets/design-guideline-template.md +163 -0
- package/templates/skills/aesthetic/assets/design-story-template.md +135 -0
- package/templates/skills/aesthetic/references/design-principles.md +62 -0
- package/templates/skills/aesthetic/references/design-resources.md +75 -0
- package/templates/skills/aesthetic/references/micro-interactions.md +53 -0
- package/templates/skills/aesthetic/references/storytelling-design.md +50 -0
- package/templates/skills/backend-development/SKILL.mdc +95 -0
- package/templates/skills/backend-development/references/backend-api-design.md +495 -0
- package/templates/skills/backend-development/references/backend-architecture.md +454 -0
- package/templates/skills/backend-development/references/backend-authentication.md +338 -0
- package/templates/skills/backend-development/references/backend-code-quality.md +659 -0
- package/templates/skills/backend-development/references/backend-debugging.md +904 -0
- package/templates/skills/backend-development/references/backend-devops.md +494 -0
- package/templates/skills/backend-development/references/backend-mindset.md +387 -0
- package/templates/skills/backend-development/references/backend-performance.md +397 -0
- package/templates/skills/backend-development/references/backend-security.md +290 -0
- package/templates/skills/backend-development/references/backend-technologies.md +256 -0
- package/templates/skills/backend-development/references/backend-testing.md +429 -0
- package/templates/skills/frontend-design/SKILL.mdc +41 -0
- package/templates/skills/frontend-design/references/animejs.md +396 -0
- package/templates/skills/frontend-development/SKILL.mdc +399 -0
- package/templates/skills/frontend-development/resources/common-patterns.md +331 -0
- package/templates/skills/frontend-development/resources/complete-examples.md +872 -0
- package/templates/skills/frontend-development/resources/component-patterns.md +502 -0
- package/templates/skills/frontend-development/resources/data-fetching.md +767 -0
- package/templates/skills/frontend-development/resources/file-organization.md +502 -0
- package/templates/skills/frontend-development/resources/loading-and-error-states.md +501 -0
- package/templates/skills/frontend-development/resources/performance.md +406 -0
- package/templates/skills/frontend-development/resources/routing-guide.md +364 -0
- package/templates/skills/frontend-development/resources/styling-guide.md +428 -0
- package/templates/skills/frontend-development/resources/typescript-standards.md +418 -0
- package/templates/skills/problem-solving/SKILL.mdc +96 -0
- package/templates/skills/problem-solving/references/attribution.md +69 -0
- package/templates/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/templates/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/templates/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/templates/skills/problem-solving/references/scale-game.md +95 -0
- package/templates/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/templates/skills/problem-solving/references/when-stuck.md +72 -0
- package/templates/skills/research/SKILL.mdc +168 -0
- package/templates/skills/sequential-thinking/.env.example +8 -0
- package/templates/skills/sequential-thinking/README.md +183 -0
- package/templates/skills/sequential-thinking/SKILL.mdc +94 -0
- package/templates/skills/sequential-thinking/package.json +31 -0
- package/templates/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/templates/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/templates/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/templates/skills/sequential-thinking/references/examples-api.md +88 -0
- package/templates/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/templates/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/templates/skills/sequential-thinking/scripts/format-thought.js +159 -0
- package/templates/skills/sequential-thinking/scripts/process-thought.js +236 -0
- package/templates/skills/sequential-thinking/tests/format-thought.test.js +133 -0
- package/templates/skills/sequential-thinking/tests/process-thought.test.js +215 -0
- package/templates/skills/ui-styling/LICENSE.txt +202 -0
- package/templates/skills/ui-styling/SKILL.mdc +321 -0
- package/templates/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/templates/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/templates/skills/ui-styling/references/shadcn-components.md +424 -0
- package/templates/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/templates/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/templates/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/templates/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/templates/rules/frontend-design.mdc +0 -48
- package/templates/rules/performance.mdc +0 -54
- package/templates/rules/react.mdc +0 -58
- package/templates/rules/security.mdc +0 -50
- package/templates/rules/testing.mdc +0 -54
- package/templates/rules/typescript.mdc +0 -36
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
# Backend DevOps Practices
|
|
2
|
+
|
|
3
|
+
CI/CD pipelines, containerization, deployment strategies, and monitoring (2025).
|
|
4
|
+
|
|
5
|
+
## Deployment Strategies
|
|
6
|
+
|
|
7
|
+
### Blue-Green Deployment
|
|
8
|
+
|
|
9
|
+
**Concept:** Two identical environments (Blue = current, Green = new)
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Production Traffic → Blue (v1.0)
|
|
13
|
+
Green (v2.0) ← Deploy & Test
|
|
14
|
+
|
|
15
|
+
Switch:
|
|
16
|
+
Production Traffic → Green (v2.0)
|
|
17
|
+
Blue (v1.0) ← Instant rollback available
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Pros:**
|
|
21
|
+
- Zero downtime
|
|
22
|
+
- Instant rollback
|
|
23
|
+
- Full environment testing before switch
|
|
24
|
+
|
|
25
|
+
**Cons:**
|
|
26
|
+
- Requires double infrastructure
|
|
27
|
+
- Database migrations complex
|
|
28
|
+
|
|
29
|
+
### Canary Deployment
|
|
30
|
+
|
|
31
|
+
**Concept:** Gradual rollout (1% → 5% → 25% → 100%)
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Kubernetes canary deployment
|
|
35
|
+
kubectl set image deployment/api api=myapp:v2
|
|
36
|
+
kubectl rollout pause deployment/api # Pause at initial replicas
|
|
37
|
+
|
|
38
|
+
# Monitor metrics, then continue
|
|
39
|
+
kubectl rollout resume deployment/api
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Pros:**
|
|
43
|
+
- Risk mitigation
|
|
44
|
+
- Early issue detection
|
|
45
|
+
- Real user feedback
|
|
46
|
+
|
|
47
|
+
**Cons:**
|
|
48
|
+
- Requires monitoring
|
|
49
|
+
- Longer deployment time
|
|
50
|
+
|
|
51
|
+
### Feature Flags (Progressive Delivery)
|
|
52
|
+
|
|
53
|
+
**Impact:** 90% fewer deployment failures when combined with canary
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { LaunchDarkly } from 'launchdarkly-node-server-sdk';
|
|
57
|
+
|
|
58
|
+
const client = LaunchDarkly.init(process.env.LD_SDK_KEY);
|
|
59
|
+
|
|
60
|
+
// Check feature flag
|
|
61
|
+
const showNewCheckout = await client.variation('new-checkout', user, false);
|
|
62
|
+
|
|
63
|
+
if (showNewCheckout) {
|
|
64
|
+
return newCheckoutFlow(req, res);
|
|
65
|
+
} else {
|
|
66
|
+
return oldCheckoutFlow(req, res);
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Use Cases:**
|
|
71
|
+
- Gradual feature rollout
|
|
72
|
+
- A/B testing
|
|
73
|
+
- Kill switch for problematic features
|
|
74
|
+
- Decouple deployment from release
|
|
75
|
+
|
|
76
|
+
## Containerization with Docker
|
|
77
|
+
|
|
78
|
+
### Multi-Stage Builds (Optimize Image Size)
|
|
79
|
+
|
|
80
|
+
```dockerfile
|
|
81
|
+
# Build stage
|
|
82
|
+
FROM node:20-alpine AS builder
|
|
83
|
+
WORKDIR /app
|
|
84
|
+
COPY package*.json ./
|
|
85
|
+
RUN npm ci --only=production
|
|
86
|
+
COPY . .
|
|
87
|
+
RUN npm run build
|
|
88
|
+
|
|
89
|
+
# Production stage
|
|
90
|
+
FROM node:20-alpine
|
|
91
|
+
WORKDIR /app
|
|
92
|
+
|
|
93
|
+
# Copy only necessary files
|
|
94
|
+
COPY --from=builder /app/dist ./dist
|
|
95
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
96
|
+
COPY package.json ./
|
|
97
|
+
|
|
98
|
+
# Security: Run as non-root
|
|
99
|
+
RUN addgroup -g 1001 -S nodejs && \
|
|
100
|
+
adduser -S nodejs -u 1001
|
|
101
|
+
USER nodejs
|
|
102
|
+
|
|
103
|
+
EXPOSE 3000
|
|
104
|
+
CMD ["node", "dist/main.js"]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Benefits:**
|
|
108
|
+
- Smaller image size (50-90% reduction)
|
|
109
|
+
- Faster deployments
|
|
110
|
+
- Reduced attack surface
|
|
111
|
+
|
|
112
|
+
### Docker Compose (Local Development)
|
|
113
|
+
|
|
114
|
+
```yaml
|
|
115
|
+
version: '3.8'
|
|
116
|
+
|
|
117
|
+
services:
|
|
118
|
+
api:
|
|
119
|
+
build: .
|
|
120
|
+
ports:
|
|
121
|
+
- "3000:3000"
|
|
122
|
+
environment:
|
|
123
|
+
- DATABASE_URL=postgresql://postgres:password@db:5432/myapp
|
|
124
|
+
- REDIS_URL=redis://redis:6379
|
|
125
|
+
depends_on:
|
|
126
|
+
- db
|
|
127
|
+
- redis
|
|
128
|
+
|
|
129
|
+
db:
|
|
130
|
+
image: postgres:15-alpine
|
|
131
|
+
environment:
|
|
132
|
+
- POSTGRES_PASSWORD=password
|
|
133
|
+
- POSTGRES_DB=myapp
|
|
134
|
+
volumes:
|
|
135
|
+
- postgres-data:/var/lib/postgresql/data
|
|
136
|
+
|
|
137
|
+
redis:
|
|
138
|
+
image: redis:7-alpine
|
|
139
|
+
ports:
|
|
140
|
+
- "6379:6379"
|
|
141
|
+
|
|
142
|
+
volumes:
|
|
143
|
+
postgres-data:
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Kubernetes Orchestration
|
|
147
|
+
|
|
148
|
+
### Deployment Manifest
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
apiVersion: apps/v1
|
|
152
|
+
kind: Deployment
|
|
153
|
+
metadata:
|
|
154
|
+
name: api-deployment
|
|
155
|
+
spec:
|
|
156
|
+
replicas: 3
|
|
157
|
+
selector:
|
|
158
|
+
matchLabels:
|
|
159
|
+
app: api
|
|
160
|
+
template:
|
|
161
|
+
metadata:
|
|
162
|
+
labels:
|
|
163
|
+
app: api
|
|
164
|
+
spec:
|
|
165
|
+
containers:
|
|
166
|
+
- name: api
|
|
167
|
+
image: myregistry/api:v1.0.0
|
|
168
|
+
ports:
|
|
169
|
+
- containerPort: 3000
|
|
170
|
+
env:
|
|
171
|
+
- name: DATABASE_URL
|
|
172
|
+
valueFrom:
|
|
173
|
+
secretKeyRef:
|
|
174
|
+
name: db-secret
|
|
175
|
+
key: url
|
|
176
|
+
resources:
|
|
177
|
+
requests:
|
|
178
|
+
memory: "256Mi"
|
|
179
|
+
cpu: "250m"
|
|
180
|
+
limits:
|
|
181
|
+
memory: "512Mi"
|
|
182
|
+
cpu: "500m"
|
|
183
|
+
livenessProbe:
|
|
184
|
+
httpGet:
|
|
185
|
+
path: /health
|
|
186
|
+
port: 3000
|
|
187
|
+
initialDelaySeconds: 30
|
|
188
|
+
periodSeconds: 10
|
|
189
|
+
readinessProbe:
|
|
190
|
+
httpGet:
|
|
191
|
+
path: /ready
|
|
192
|
+
port: 3000
|
|
193
|
+
initialDelaySeconds: 5
|
|
194
|
+
periodSeconds: 5
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Horizontal Pod Autoscaling
|
|
198
|
+
|
|
199
|
+
```yaml
|
|
200
|
+
apiVersion: autoscaling/v2
|
|
201
|
+
kind: HorizontalPodAutoscaler
|
|
202
|
+
metadata:
|
|
203
|
+
name: api-hpa
|
|
204
|
+
spec:
|
|
205
|
+
scaleTargetRef:
|
|
206
|
+
apiVersion: apps/v1
|
|
207
|
+
kind: Deployment
|
|
208
|
+
name: api-deployment
|
|
209
|
+
minReplicas: 3
|
|
210
|
+
maxReplicas: 10
|
|
211
|
+
metrics:
|
|
212
|
+
- type: Resource
|
|
213
|
+
resource:
|
|
214
|
+
name: cpu
|
|
215
|
+
target:
|
|
216
|
+
type: Utilization
|
|
217
|
+
averageUtilization: 70
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## CI/CD Pipelines
|
|
221
|
+
|
|
222
|
+
### GitHub Actions (Modern, Integrated)
|
|
223
|
+
|
|
224
|
+
```yaml
|
|
225
|
+
name: CI/CD Pipeline
|
|
226
|
+
|
|
227
|
+
on:
|
|
228
|
+
push:
|
|
229
|
+
branches: [main]
|
|
230
|
+
pull_request:
|
|
231
|
+
branches: [main]
|
|
232
|
+
|
|
233
|
+
jobs:
|
|
234
|
+
test:
|
|
235
|
+
runs-on: ubuntu-latest
|
|
236
|
+
steps:
|
|
237
|
+
- uses: actions/checkout@v3
|
|
238
|
+
|
|
239
|
+
- name: Setup Node.js
|
|
240
|
+
uses: actions/setup-node@v3
|
|
241
|
+
with:
|
|
242
|
+
node-version: '20'
|
|
243
|
+
cache: 'npm'
|
|
244
|
+
|
|
245
|
+
- name: Install dependencies
|
|
246
|
+
run: npm ci
|
|
247
|
+
|
|
248
|
+
- name: Run linter
|
|
249
|
+
run: npm run lint
|
|
250
|
+
|
|
251
|
+
- name: Run tests
|
|
252
|
+
run: npm run test:ci
|
|
253
|
+
|
|
254
|
+
- name: Upload coverage
|
|
255
|
+
uses: codecov/codecov-action@v3
|
|
256
|
+
|
|
257
|
+
security:
|
|
258
|
+
runs-on: ubuntu-latest
|
|
259
|
+
steps:
|
|
260
|
+
- uses: actions/checkout@v3
|
|
261
|
+
|
|
262
|
+
- name: Run Snyk scan
|
|
263
|
+
uses: snyk/actions/node@master
|
|
264
|
+
env:
|
|
265
|
+
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
|
266
|
+
|
|
267
|
+
- name: Container scan
|
|
268
|
+
run: |
|
|
269
|
+
docker build -t myapp:${{ github.sha }} .
|
|
270
|
+
docker scan myapp:${{ github.sha }}
|
|
271
|
+
|
|
272
|
+
deploy:
|
|
273
|
+
needs: [test, security]
|
|
274
|
+
runs-on: ubuntu-latest
|
|
275
|
+
if: github.ref == 'refs/heads/main'
|
|
276
|
+
steps:
|
|
277
|
+
- uses: actions/checkout@v3
|
|
278
|
+
|
|
279
|
+
- name: Build and push Docker image
|
|
280
|
+
run: |
|
|
281
|
+
echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
|
|
282
|
+
docker build -t ghcr.io/${{ github.repository }}:${{ github.sha }} .
|
|
283
|
+
docker push ghcr.io/${{ github.repository }}:${{ github.sha }}
|
|
284
|
+
|
|
285
|
+
- name: Deploy to Kubernetes
|
|
286
|
+
run: |
|
|
287
|
+
kubectl set image deployment/api api=ghcr.io/${{ github.repository }}:${{ github.sha }}
|
|
288
|
+
kubectl rollout status deployment/api
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Monitoring & Observability
|
|
292
|
+
|
|
293
|
+
### Three Pillars of Observability
|
|
294
|
+
|
|
295
|
+
**1. Metrics (Prometheus + Grafana)**
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
import { Counter, Histogram, register } from 'prom-client';
|
|
299
|
+
|
|
300
|
+
// Request counter
|
|
301
|
+
const httpRequestTotal = new Counter({
|
|
302
|
+
name: 'http_requests_total',
|
|
303
|
+
help: 'Total HTTP requests',
|
|
304
|
+
labelNames: ['method', 'route', 'status'],
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// Response time histogram
|
|
308
|
+
const httpRequestDuration = new Histogram({
|
|
309
|
+
name: 'http_request_duration_seconds',
|
|
310
|
+
help: 'HTTP request duration',
|
|
311
|
+
labelNames: ['method', 'route'],
|
|
312
|
+
buckets: [0.1, 0.5, 1, 2, 5],
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// Middleware to track metrics
|
|
316
|
+
app.use((req, res, next) => {
|
|
317
|
+
const start = Date.now();
|
|
318
|
+
|
|
319
|
+
res.on('finish', () => {
|
|
320
|
+
const duration = (Date.now() - start) / 1000;
|
|
321
|
+
httpRequestTotal.inc({ method: req.method, route: req.route?.path, status: res.statusCode });
|
|
322
|
+
httpRequestDuration.observe({ method: req.method, route: req.route?.path }, duration);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
next();
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
// Metrics endpoint
|
|
329
|
+
app.get('/metrics', async (req, res) => {
|
|
330
|
+
res.set('Content-Type', register.contentType);
|
|
331
|
+
res.end(await register.metrics());
|
|
332
|
+
});
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**2. Logs (ELK Stack - Elasticsearch, Logstash, Kibana)**
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
import winston from 'winston';
|
|
339
|
+
import { ElasticsearchTransport } from 'winston-elasticsearch';
|
|
340
|
+
|
|
341
|
+
const logger = winston.createLogger({
|
|
342
|
+
level: 'info',
|
|
343
|
+
format: winston.format.json(),
|
|
344
|
+
transports: [
|
|
345
|
+
new winston.transports.Console(),
|
|
346
|
+
new ElasticsearchTransport({
|
|
347
|
+
level: 'info',
|
|
348
|
+
clientOpts: { node: 'http://localhost:9200' },
|
|
349
|
+
index: 'logs',
|
|
350
|
+
}),
|
|
351
|
+
],
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// Structured logging
|
|
355
|
+
logger.info('User created', {
|
|
356
|
+
userId: user.id,
|
|
357
|
+
email: user.email,
|
|
358
|
+
ipAddress: req.ip,
|
|
359
|
+
userAgent: req.headers['user-agent'],
|
|
360
|
+
});
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**3. Traces (Jaeger/OpenTelemetry)**
|
|
364
|
+
|
|
365
|
+
```typescript
|
|
366
|
+
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
367
|
+
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';
|
|
368
|
+
|
|
369
|
+
const sdk = new NodeSDK({
|
|
370
|
+
traceExporter: new JaegerExporter({
|
|
371
|
+
endpoint: 'http://localhost:14268/api/traces',
|
|
372
|
+
}),
|
|
373
|
+
serviceName: 'api-service',
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
sdk.start();
|
|
377
|
+
|
|
378
|
+
// Traces automatically captured for HTTP requests, database queries, etc.
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Health Checks
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
// Liveness probe - Is the app running?
|
|
385
|
+
app.get('/health/liveness', (req, res) => {
|
|
386
|
+
res.status(200).json({ status: 'ok', timestamp: Date.now() });
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
// Readiness probe - Is the app ready to serve traffic?
|
|
390
|
+
app.get('/health/readiness', async (req, res) => {
|
|
391
|
+
const checks = {
|
|
392
|
+
database: await checkDatabase(),
|
|
393
|
+
redis: await checkRedis(),
|
|
394
|
+
externalAPI: await checkExternalAPI(),
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
const isReady = Object.values(checks).every(Boolean);
|
|
398
|
+
res.status(isReady ? 200 : 503).json({
|
|
399
|
+
status: isReady ? 'ready' : 'not ready',
|
|
400
|
+
checks,
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
async function checkDatabase() {
|
|
405
|
+
try {
|
|
406
|
+
await db.query('SELECT 1');
|
|
407
|
+
return true;
|
|
408
|
+
} catch {
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Secrets Management
|
|
415
|
+
|
|
416
|
+
### HashiCorp Vault
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
# Store secret
|
|
420
|
+
vault kv put secret/myapp/db password=super-secret
|
|
421
|
+
|
|
422
|
+
# Retrieve secret
|
|
423
|
+
vault kv get -field=password secret/myapp/db
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Kubernetes Secrets
|
|
427
|
+
|
|
428
|
+
```yaml
|
|
429
|
+
apiVersion: v1
|
|
430
|
+
kind: Secret
|
|
431
|
+
metadata:
|
|
432
|
+
name: db-secret
|
|
433
|
+
type: Opaque
|
|
434
|
+
stringData:
|
|
435
|
+
url: postgresql://user:pass@host:5432/db
|
|
436
|
+
---
|
|
437
|
+
# Reference in deployment
|
|
438
|
+
env:
|
|
439
|
+
- name: DATABASE_URL
|
|
440
|
+
valueFrom:
|
|
441
|
+
secretKeyRef:
|
|
442
|
+
name: db-secret
|
|
443
|
+
key: url
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
## Infrastructure as Code (Terraform)
|
|
447
|
+
|
|
448
|
+
```hcl
|
|
449
|
+
# main.tf
|
|
450
|
+
resource "aws_db_instance" "main" {
|
|
451
|
+
identifier = "myapp-db"
|
|
452
|
+
engine = "postgres"
|
|
453
|
+
engine_version = "15.3"
|
|
454
|
+
instance_class = "db.t3.micro"
|
|
455
|
+
allocated_storage = 20
|
|
456
|
+
username = "admin"
|
|
457
|
+
password = var.db_password
|
|
458
|
+
|
|
459
|
+
backup_retention_period = 7
|
|
460
|
+
skip_final_snapshot = false
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
resource "aws_elasticache_cluster" "redis" {
|
|
464
|
+
cluster_id = "myapp-redis"
|
|
465
|
+
engine = "redis"
|
|
466
|
+
node_type = "cache.t3.micro"
|
|
467
|
+
num_cache_nodes = 1
|
|
468
|
+
parameter_group_name = "default.redis7"
|
|
469
|
+
}
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
## DevOps Checklist
|
|
473
|
+
|
|
474
|
+
- [ ] CI/CD pipeline configured (GitHub Actions/GitLab CI/Jenkins)
|
|
475
|
+
- [ ] Docker multi-stage builds implemented
|
|
476
|
+
- [ ] Kubernetes deployment manifests created
|
|
477
|
+
- [ ] Blue-green or canary deployment strategy
|
|
478
|
+
- [ ] Feature flags configured (LaunchDarkly/Unleash)
|
|
479
|
+
- [ ] Health checks (liveness + readiness probes)
|
|
480
|
+
- [ ] Monitoring: Prometheus + Grafana
|
|
481
|
+
- [ ] Logging: ELK Stack or similar
|
|
482
|
+
- [ ] Distributed tracing: Jaeger/OpenTelemetry
|
|
483
|
+
- [ ] Secrets management (Vault/AWS Secrets Manager)
|
|
484
|
+
- [ ] Infrastructure as Code (Terraform/CloudFormation)
|
|
485
|
+
- [ ] Autoscaling configured
|
|
486
|
+
- [ ] Backup and disaster recovery plan
|
|
487
|
+
|
|
488
|
+
## Resources
|
|
489
|
+
|
|
490
|
+
- **Kubernetes:** https://kubernetes.io/docs/
|
|
491
|
+
- **Docker:** https://docs.docker.com/
|
|
492
|
+
- **Prometheus:** https://prometheus.io/docs/
|
|
493
|
+
- **OpenTelemetry:** https://opentelemetry.io/docs/
|
|
494
|
+
- **Terraform:** https://www.terraform.io/docs/
|