Zum Inhalt

πŸš€ API Deployment (Cloudflare Workers)

Unified Contract API auf Cloudflare Workers

πŸ” Security Setup erforderlich

Vor API Deployment: Cloudflare Access konfigurieren!

πŸ“˜ Guide: Security Setup

Staging Environment MUSS geschΓΌtzt sein:

  • api-staging.g100.dev β†’ Cloudflare Access Policy
  • NDA Team Members only
  • One-Time PIN Authentication
  • 24h Session Duration fΓΌr Developers

πŸ“‹ Übersicht

MkDocs (Static)     β†’ Cloudflare Pages
API (Dynamic)       β†’ Cloudflare Workers
Database            β†’ Cloudflare D1
Cache               β†’ Cloudflare KV
Files/Images        β†’ Cloudflare R2 (optional)

πŸ—οΈ Projekt-Struktur

contractplattform-api/
β”œβ”€β”€ wrangler.toml              ← Cloudflare Config
β”œβ”€β”€ package.json
β”œβ”€β”€ tsconfig.json
β”œβ”€β”€ .env.example               ← Lokale Development
β”œβ”€β”€ .gitignore
β”‚
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ index.ts               ← Main Worker Entry
β”‚   β”œβ”€β”€ router.ts              ← Hono Router
β”‚   β”‚
β”‚   β”œβ”€β”€ routes/
β”‚   β”‚   β”œβ”€β”€ contracts.ts       ← POST /v1/contracts
β”‚   β”‚   β”œβ”€β”€ auth.ts            ← POST /v1/auth/login
β”‚   β”‚   β”œβ”€β”€ webhooks.ts        ← POST /webhooks/*
β”‚   β”‚   └── health.ts          ← GET /health
β”‚   β”‚
β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”œβ”€β”€ adobe.ts           ← Adobe Express Integration
β”‚   β”‚   β”œβ”€β”€ microsoft.ts       ← MS Graph Integration
β”‚   β”‚   β”œβ”€β”€ salesforce.ts      ← Salesforce Integration
β”‚   β”‚   β”œβ”€β”€ sevdesk.ts         ← sevDesk Integration
β”‚   β”‚   β”œβ”€β”€ stripe.ts          ← Stripe Integration
β”‚   β”‚   └── blockchain.ts      ← Polygon/NFT Integration
β”‚   β”‚
β”‚   β”œβ”€β”€ db/
β”‚   β”‚   β”œβ”€β”€ schema.sql         ← D1 Schema
β”‚   β”‚   └── queries.ts         ← SQL Queries
β”‚   β”‚
β”‚   └── types/
β”‚       β”œβ”€β”€ contract.ts
β”‚       β”œβ”€β”€ user.ts
β”‚       └── env.ts             ← Environment Types
β”‚
└── migrations/
    β”œβ”€β”€ 0001_init.sql
    └── 0002_add_nft_fields.sql

πŸ“„ wrangler.toml Template

name = "contractplattform-api"
main = "src/index.ts"
compatibility_date = "2024-01-15"

# Account ID (deine Cloudflare Account ID)
account_id = "edeaf72f08c3145711f257893d9ddab1"

# Workers AI (optional - fΓΌr AI Features)
# [ai]
# binding = "AI"

# D1 Database
[[d1_databases]]
binding = "DB"
database_name = "contractplattform-prod"
database_id = "" # ← Wird nach 'wrangler d1 create' ausgefΓΌllt

# KV Namespace (Cache)
[[kv_namespaces]]
binding = "CACHE"
id = "" # ← Wird nach 'wrangler kv:namespace create' ausgefΓΌllt

# R2 Bucket (File Storage - optional)
# [[r2_buckets]]
# binding = "FILES"
# bucket_name = "contractplattform-files"

# Durable Objects (Sessions - optional)
# [[durable_objects.bindings]]
# name = "SESSIONS"
# class_name = "SessionStore"

# Environment Variables (PUBLIC - nicht sensitiv)
[vars]
ENVIRONMENT = "production"
API_VERSION = "v1"
INSTANCE_ID = "master"

# Secrets werden NICHT hier gespeichert!
# Verwende: wrangler secret put SECRET_NAME
# Oder: Cloudflare Dashboard β†’ Workers β†’ Settings β†’ Variables

# ---
# Preview Environment (fΓΌr Branches)
# ---
[env.preview]
name = "contractplattform-api-preview"

[[env.preview.d1_databases]]
binding = "DB"
database_name = "contractplattform-preview"
database_id = "" # ← Separate Preview DB

[[env.preview.kv_namespaces]]
binding = "CACHE"
id = "" # ← Separate Preview KV

[env.preview.vars]
ENVIRONMENT = "preview"

# ---
# Development Environment (lokal)
# ---
[env.dev]
name = "contractplattform-api-dev"

[[env.dev.d1_databases]]
binding = "DB"
database_name = "contractplattform-dev"
database_id = "" # ← Lokale DB

[[env.dev.kv_namespaces]]
binding = "CACHE"
id = "" # ← Dev KV

[env.dev.vars]
ENVIRONMENT = "development"

πŸš€ Setup Guide

1. Cloudflare Account vorbereiten

# Wrangler CLI installieren
npm install -g wrangler

# Login
wrangler login

# Account ID verifizieren
wrangler whoami
# βœ… Account ID: edeaf72f08c3145711f257893d9ddab1

2. D1 Database erstellen

# Production Database
wrangler d1 create contractplattform-prod

# Output kopieren:
# βœ… Successfully created DB 'contractplattform-prod'
# [[d1_databases]]
# binding = "DB"
# database_name = "contractplattform-prod"
# database_id = "abc123-def456-ghi789"

# Preview Database
wrangler d1 create contractplattform-preview

# Dev Database (lokal)
wrangler d1 create contractplattform-dev

Database IDs in wrangler.toml eintragen!

3. KV Namespace erstellen

# Production KV
wrangler kv:namespace create CACHE

# Output kopieren:
# βœ… Successfully created KV namespace
# [[kv_namespaces]]
# binding = "CACHE"
# id = "xyz123abc456"

# Preview KV
wrangler kv:namespace create CACHE --preview

# Dev KV
wrangler kv:namespace create CACHE --env dev

Namespace IDs in wrangler.toml eintragen!

4. Database Schema anwenden

# Production
wrangler d1 migrations apply contractplattform-prod --remote

# Preview
wrangler d1 migrations apply contractplattform-preview --remote

# Dev (lokal)
wrangler d1 migrations apply contractplattform-dev --local

5. Secrets hinzufΓΌgen

Option A: Via CLI

# Adobe
wrangler secret put ADOBE_CLIENT_ID
wrangler secret put ADOBE_CLIENT_SECRET
wrangler secret put ADOBE_API_KEY

# Microsoft
wrangler secret put MS_CLIENT_ID
wrangler secret put MS_CLIENT_SECRET
wrangler secret put MS_TENANT_ID

# Salesforce
wrangler secret put SALESFORCE_CLIENT_ID
wrangler secret put SALESFORCE_CLIENT_SECRET
wrangler secret put SALESFORCE_USERNAME
wrangler secret put SALESFORCE_PASSWORD
wrangler secret put SALESFORCE_SECURITY_TOKEN

# sevDesk
wrangler secret put SEVDESK_API_TOKEN

# Stripe
wrangler secret put STRIPE_SECRET_KEY
wrangler secret put STRIPE_WEBHOOK_SECRET

# Blockchain
wrangler secret put POLYGON_RPC_URL
wrangler secret put POLYGON_PRIVATE_KEY

# IPFS
wrangler secret put PINATA_API_KEY
wrangler secret put PINATA_SECRET_KEY

# JWT
wrangler secret put JWT_SECRET

# Plane.so
wrangler secret put PLANE_API_KEY

Option B: Via Dashboard (empfohlen!)

  1. https://dash.cloudflare.com/edeaf72f08c3145711f257893d9ddab1/workers
  2. Workers β†’ contractplattform-api β†’ Settings β†’ Variables
  3. Add Variable β†’ Select "Encrypt" β†’ Save

πŸ“ TypeScript Environment Types

// src/types/env.ts

export interface Env {
  // Bindings
  DB: D1Database;
  CACHE: KVNamespace;
  // FILES: R2Bucket; // optional

  // Public Variables
  ENVIRONMENT: 'production' | 'preview' | 'development';
  API_VERSION: string;
  INSTANCE_ID: string;

  // Secrets (encrypted)
  ADOBE_CLIENT_ID: string;
  ADOBE_CLIENT_SECRET: string;
  ADOBE_API_KEY: string;

  MS_CLIENT_ID: string;
  MS_CLIENT_SECRET: string;
  MS_TENANT_ID: string;

  SALESFORCE_CLIENT_ID: string;
  SALESFORCE_CLIENT_SECRET: string;
  SALESFORCE_USERNAME: string;
  SALESFORCE_PASSWORD: string;
  SALESFORCE_SECURITY_TOKEN: string;

  SEVDESK_API_TOKEN: string;

  STRIPE_SECRET_KEY: string;
  STRIPE_WEBHOOK_SECRET: string;

  POLYGON_RPC_URL: string;
  POLYGON_PRIVATE_KEY: string;

  PINATA_API_KEY: string;
  PINATA_SECRET_KEY: string;

  JWT_SECRET: string;

  PLANE_API_KEY: string;
}

πŸ§ͺ Lokale Development

.env fΓΌr lokale Tests

# .env (im Root-Verzeichnis)

# Adobe
ADOBE_CLIENT_ID=your_dev_client_id
ADOBE_CLIENT_SECRET=your_dev_secret
ADOBE_API_KEY=your_dev_api_key

# Microsoft
MS_CLIENT_ID=your_dev_client_id
MS_CLIENT_SECRET=your_dev_secret
MS_TENANT_ID=your_dev_tenant_id

# Salesforce
SALESFORCE_CLIENT_ID=your_dev_consumer_key
SALESFORCE_CLIENT_SECRET=your_dev_consumer_secret
SALESFORCE_USERNAME=dev@example.com
SALESFORCE_PASSWORD=your_dev_password
SALESFORCE_SECURITY_TOKEN=your_dev_token

# sevDesk
SEVDESK_API_TOKEN=your_dev_token

# Stripe (TEST KEYS!)
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_test_...

# Polygon (TESTNET!)
POLYGON_RPC_URL=https://polygon-mumbai.g.alchemy.com/v2/YOUR_KEY
POLYGON_PRIVATE_KEY=0xYOUR_TESTNET_PRIVATE_KEY

# IPFS
PINATA_API_KEY=your_dev_key
PINATA_SECRET_KEY=your_dev_secret

# JWT
JWT_SECRET=dev_secret_min_32_chars_long

# Plane.so
PLANE_API_KEY=your_dev_token

Dev Server starten

# Install dependencies
npm install

# Start dev server (with .env)
npm run dev

# Or with wrangler
wrangler dev --local --persist

Dev Server lΓ€uft auf: http://localhost:8787


πŸš€ Deployment

Deploy to Production

# Build & Deploy
wrangler deploy

# Output:
# βœ… Uploaded contractplattform-api
# βœ… Published contractplattform-api
# 🌍 https://contractplattform-api.YOUR_SUBDOMAIN.workers.dev

Deploy to Preview

wrangler deploy --env preview

# Output:
# βœ… Published contractplattform-api-preview
# 🌍 https://contractplattform-api-preview.YOUR_SUBDOMAIN.workers.dev

Custom Domain

# Via CLI
wrangler routes add "api.contractplattform.dev/*" contractplattform-api

# Oder im Dashboard:
# Workers β†’ contractplattform-api β†’ Triggers β†’ Custom Domains
# Add: api.contractplattform.dev

DNS wird automatisch konfiguriert!


πŸ“Š Monitoring

Cloudflare Dashboard

  1. Analytics:
    Workers β†’ contractplattform-api β†’ Analytics
    
  2. Requests/Minute
  3. Error Rate
  4. CPU Time
  5. Success Rate

  6. Logs (Tail):

    wrangler tail
    
    # Or in Dashboard:
    Workers β†’ contractplattform-api β†’ Logs β†’ Begin log stream
    

  7. Logpush (fΓΌr Production):

  8. Workers β†’ Logpush
  9. Export zu: S3, R2, Datadog, etc.

πŸ” Testing

Health Check

curl https://api.contractplattform.dev/health

# Response:
{
  "status": "ok",
  "version": "v1",
  "environment": "production",
  "timestamp": "2026-01-15T15:30:00Z"
}

Contract API Test

curl -X POST https://api.contractplattform.dev/v1/contracts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "instance_id": "morelo",
    "type": "kfz_kaufvertrag",
    "party_a": { ... },
    "party_b": { ... },
    "asset": { ... },
    "financials": { ... }
  }'

βœ… Deployment Checklist

Pre-Deployment

  • [ ] wrangler.toml konfiguriert
  • [ ] D1 Database erstellt
  • [ ] KV Namespace erstellt
  • [ ] Secrets hinzugefΓΌgt
  • [ ] Migrations angewendet
  • [ ] Lokale Tests erfolgreich

Deployment

  • [ ] wrangler deploy erfolgreich
  • [ ] Custom Domain konfiguriert
  • [ ] SSL Zertifikat aktiv
  • [ ] Health Check OK

Post-Deployment

  • [ ] API Endpoints testen
  • [ ] Monitoring aktiviert
  • [ ] Error Tracking (Sentry) konfiguriert
  • [ ] Logs ΓΌberprΓΌfen

πŸ“ž Support URLs

Resource URL
Cloudflare Dashboard https://dash.cloudflare.com/edeaf72f08c3145711f257893d9ddab1
Workers & Pages https://dash.cloudflare.com/edeaf72f08c3145711f257893d9ddab1/workers
D1 Databases https://dash.cloudflare.com/edeaf72f08c3145711f257893d9ddab1/d1
Wrangler Docs https://developers.cloudflare.com/workers/wrangler/
D1 Docs https://developers.cloudflare.com/d1/

Next: Secrets Configuration β†’