juicebox-deploy-integration

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Juicebox 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
undefined
bash
undefined

Store API key

Store API key

aws secretsmanager create-secret
--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"}'

```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
undefined
bash
undefined

Store 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
undefined
dockerfile
undefined

Dockerfile

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"]

```yaml
ENV JUICEBOX_API_KEY=""
CMD ["node", "dist/index.js"]

```yaml

docker-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
undefined
version: '3.8' services: app: build: . environment: - JUICEBOX_API_KEY=${JUICEBOX_API_KEY} secrets: - juicebox_api_key
secrets: juicebox_api_key: external: true
undefined

Kubernetes Deployment

Kubernetes 部署

yaml
undefined
yaml
undefined

k8s/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"
undefined
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"
undefined

Step 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/bash
bash
#!/bin/bash

scripts/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
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

Wait for rollout

Wait for rollout

kubectl rollout status deployment/juicebox-app --namespace $ENVIRONMENT
echo "Deployment complete"
undefined
kubectl rollout status deployment/juicebox-app --namespace $ENVIRONMENT
echo "Deployment complete"
undefined

Output

输出内容

  • Secret management configuration
  • Docker/Kubernetes manifests
  • Health check endpoints
  • Deployment scripts
  • 密钥管理配置
  • Docker/Kubernetes清单文件
  • 健康检查端点
  • 部署脚本

Error Handling

错误处理

IssueCauseSolution
Secret not foundIAM permissionsGrant access to secret
Health check failsAPI connectivityCheck network policies
Rollout stuckResource limitsAdjust resource requests
问题原因解决方案
未找到密钥IAM权限不足授予密钥访问权限
健康检查失败API连接问题检查网络策略
发布停滞资源限制不足调整资源请求配置

Resources

参考资源

Next Steps

后续步骤

After deployment, see
juicebox-webhooks-events
for event handling.
部署完成后,请查看
juicebox-webhooks-events
了解事件处理相关内容。