juicebox-deploy-integration
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseJuicebox Deploy Integration
Juicebox 集成部署指南
Overview
概述
Deploy Juicebox integrations to production cloud environments.
将Juicebox集成部署到生产云环境中。
Prerequisites
前置条件
- CI pipeline configured
- Cloud provider account (AWS, GCP, or Azure)
- Production API key secured
- 已配置CI流水线
- 拥有云服务商账户(AWS、GCP或Azure)
- 已妥善保管生产环境API密钥
Instructions
操作步骤
Step 1: Configure Secret Management
步骤1:配置密钥管理
AWS Secrets Manager
AWS Secrets Manager
bash
undefinedbash
undefinedStore API key
Store API key
aws secretsmanager create-secret
--name juicebox/api-key
--secret-string '{"apiKey":"jb_prod_xxxx"}'
--name juicebox/api-key
--secret-string '{"apiKey":"jb_prod_xxxx"}'
```typescript
// lib/secrets.ts
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
export async function getJuiceboxApiKey(): Promise<string> {
const client = new SecretsManager({ region: process.env.AWS_REGION });
const result = await client.getSecretValue({
SecretId: 'juicebox/api-key'
});
return JSON.parse(result.SecretString!).apiKey;
}aws secretsmanager create-secret
--name juicebox/api-key
--secret-string '{"apiKey":"jb_prod_xxxx"}'
--name juicebox/api-key
--secret-string '{"apiKey":"jb_prod_xxxx"}'
```typescript
// lib/secrets.ts
import { SecretsManager } from '@aws-sdk/client-secrets-manager';
export async function getJuiceboxApiKey(): Promise<string> {
const client = new SecretsManager({ region: process.env.AWS_REGION });
const result = await client.getSecretValue({
SecretId: 'juicebox/api-key'
});
return JSON.parse(result.SecretString!).apiKey;
}Google Secret Manager
Google Secret Manager
bash
undefinedbash
undefinedStore API key
Store API key
echo -n "jb_prod_xxxx" | gcloud secrets create juicebox-api-key --data-file=-
```typescript
// lib/secrets.ts
import { SecretManagerServiceClient } from '@google-cloud/secret-manager';
export async function getJuiceboxApiKey(): Promise<string> {
const client = new SecretManagerServiceClient();
const [version] = await client.accessSecretVersion({
name: `projects/${process.env.GOOGLE_CLOUD_PROJECT}/secrets/juicebox-api-key/versions/latest`
});
return version.payload!.data!.toString();
}echo -n "jb_prod_xxxx" | gcloud secrets create juicebox-api-key --data-file=-
```typescript
// lib/secrets.ts
import { SecretManagerServiceClient } from '@google-cloud/secret-manager';
export async function getJuiceboxApiKey(): Promise<string> {
const client = new SecretManagerServiceClient();
const [version] = await client.accessSecretVersion({
name: `projects/${process.env.GOOGLE_CLOUD_PROJECT}/secrets/juicebox-api-key/versions/latest`
});
return version.payload!.data!.toString();
}Step 2: Create Deployment Configuration
步骤2:创建部署配置
Docker Deployment
Docker 部署
dockerfile
undefineddockerfile
undefinedDockerfile
Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY dist/ ./dist/
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY dist/ ./dist/
Don't include secrets in image
Don't include secrets in image
ENV JUICEBOX_API_KEY=""
CMD ["node", "dist/index.js"]
```yamlENV JUICEBOX_API_KEY=""
CMD ["node", "dist/index.js"]
```yamldocker-compose.yml
docker-compose.yml
version: '3.8'
services:
app:
build: .
environment:
- JUICEBOX_API_KEY=${JUICEBOX_API_KEY}
secrets:
- juicebox_api_key
secrets:
juicebox_api_key:
external: true
undefinedversion: '3.8'
services:
app:
build: .
environment:
- JUICEBOX_API_KEY=${JUICEBOX_API_KEY}
secrets:
- juicebox_api_key
secrets:
juicebox_api_key:
external: true
undefinedKubernetes Deployment
Kubernetes 部署
yaml
undefinedyaml
undefinedk8s/deployment.yaml
k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: juicebox-app
spec:
replicas: 3
selector:
matchLabels:
app: juicebox-app
template:
metadata:
labels:
app: juicebox-app
spec:
containers:
- name: app
image: your-registry/juicebox-app:latest
env:
- name: JUICEBOX_API_KEY
valueFrom:
secretKeyRef:
name: juicebox-secrets
key: api-key
resources:
limits:
memory: "256Mi"
cpu: "500m"
undefinedapiVersion: apps/v1
kind: Deployment
metadata:
name: juicebox-app
spec:
replicas: 3
selector:
matchLabels:
app: juicebox-app
template:
metadata:
labels:
app: juicebox-app
spec:
containers:
- name: app
image: your-registry/juicebox-app:latest
env:
- name: JUICEBOX_API_KEY
valueFrom:
secretKeyRef:
name: juicebox-secrets
key: api-key
resources:
limits:
memory: "256Mi"
cpu: "500m"
undefinedStep 3: Configure Health Checks
步骤3:配置健康检查
typescript
// routes/health.ts
import { Router } from 'express';
import { JuiceboxClient } from '@juicebox/sdk';
const router = Router();
router.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
router.get('/health/ready', async (req, res) => {
try {
const client = new JuiceboxClient({
apiKey: process.env.JUICEBOX_API_KEY!
});
await client.auth.me();
res.json({ status: 'ready', juicebox: 'connected' });
} catch (error) {
res.status(503).json({ status: 'not ready', error: error.message });
}
});
export default router;typescript
// routes/health.ts
import { Router } from 'express';
import { JuiceboxClient } from '@juicebox/sdk';
const router = Router();
router.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
router.get('/health/ready', async (req, res) => {
try {
const client = new JuiceboxClient({
apiKey: process.env.JUICEBOX_API_KEY!
});
await client.auth.me();
res.json({ status: 'ready', juicebox: 'connected' });
} catch (error) {
res.status(503).json({ status: 'not ready', error: error.message });
}
});
export default router;Step 4: Deployment Script
步骤4:部署脚本
bash
#!/bin/bashbash
#!/bin/bashscripts/deploy.sh
scripts/deploy.sh
set -e
ENVIRONMENT=${1:-staging}
VERSION=$(git rev-parse --short HEAD)
echo "Deploying version $VERSION to $ENVIRONMENT"
set -e
ENVIRONMENT=${1:-staging}
VERSION=$(git rev-parse --short HEAD)
echo "Deploying version $VERSION to $ENVIRONMENT"
Build
Build
npm run build
docker build -t juicebox-app:$VERSION .
npm run build
docker build -t juicebox-app:$VERSION .
Push to registry
Push to registry
docker tag juicebox-app:$VERSION your-registry/juicebox-app:$VERSION
docker push your-registry/juicebox-app:$VERSION
docker tag juicebox-app:$VERSION your-registry/juicebox-app:$VERSION
docker push your-registry/juicebox-app:$VERSION
Deploy
Deploy
if [ "$ENVIRONMENT" == "production" ]; then
kubectl set image deployment/juicebox-app
app=your-registry/juicebox-app:$VERSION
--namespace production else kubectl set image deployment/juicebox-app
app=your-registry/juicebox-app:$VERSION
--namespace staging fi
app=your-registry/juicebox-app:$VERSION
--namespace production else kubectl set image deployment/juicebox-app
app=your-registry/juicebox-app:$VERSION
--namespace staging fi
if [ "$ENVIRONMENT" == "production" ]; then
kubectl set image deployment/juicebox-app
app=your-registry/juicebox-app:$VERSION
--namespace production else kubectl set image deployment/juicebox-app
app=your-registry/juicebox-app:$VERSION
--namespace staging fi
app=your-registry/juicebox-app:$VERSION
--namespace production else kubectl set image deployment/juicebox-app
app=your-registry/juicebox-app:$VERSION
--namespace staging fi
Wait for rollout
Wait for rollout
kubectl rollout status deployment/juicebox-app --namespace $ENVIRONMENT
echo "Deployment complete"
undefinedkubectl rollout status deployment/juicebox-app --namespace $ENVIRONMENT
echo "Deployment complete"
undefinedOutput
输出内容
- Secret management configuration
- Docker/Kubernetes manifests
- Health check endpoints
- Deployment scripts
- 密钥管理配置
- Docker/Kubernetes清单文件
- 健康检查端点
- 部署脚本
Error Handling
错误处理
| Issue | Cause | Solution |
|---|---|---|
| Secret not found | IAM permissions | Grant access to secret |
| Health check fails | API connectivity | Check network policies |
| Rollout stuck | Resource limits | Adjust resource requests |
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 未找到密钥 | IAM权限不足 | 授予密钥访问权限 |
| 健康检查失败 | API连接问题 | 检查网络策略 |
| 发布停滞 | 资源限制不足 | 调整资源请求配置 |
Resources
参考资源
Next Steps
后续步骤
After deployment, see for event handling.
juicebox-webhooks-events部署完成后,请查看了解事件处理相关内容。
juicebox-webhooks-events