Back to Guides

AnythingMCP auf Google Kubernetes Engine (GKE) bereitstellen

Stellen Sie AnythingMCP auf GKE mit Kubernetes-Manifesten, Ingress für HTTPS und Cloud SQL für PostgreSQL bereit. Skalierbare Bereitstellung auf Enterprise-Niveau.

Überblick

Dies ist die fortgeschrittenste Bereitstellungsoption, gedacht für Teams, die Skalierbarkeit auf Enterprise-Niveau und verwaltete Infrastruktur benötigen. Sie erstellen Kubernetes-Manifeste und verwenden Cloud SQL oder ein clusterinternes PostgreSQL.

Voraussetzungen

  • Ein GCP-Konto mit aktivierter Abrechnung
  • gcloud und kubectl installiert
  • Docker lokal installiert
  • Ein Domainname
gcloud services enable container.googleapis.com \
  artifactregistry.googleapis.com \
  sqladmin.googleapis.com

Einen GKE-Cluster erstellen

gcloud container clusters create anythingmcp-cluster \
  --region us-central1 \
  --num-nodes 2 \
  --machine-type e2-standard-2 \
  --enable-autoscaling --min-nodes 1 --max-nodes 5

gcloud container clusters get-credentials anythingmcp-cluster \
  --region us-central1

Image erstellen und pushen

gcloud artifacts repositories create anythingmcp \
  --repository-format docker \
  --location us-central1

gcloud auth configure-docker us-central1-docker.pkg.dev

git clone https://github.com/HelpCode-ai/anythingmcp.git
cd anythingmcp

docker build -t us-central1-docker.pkg.dev/YOUR_PROJECT_ID/anythingmcp/app:latest .
docker push us-central1-docker.pkg.dev/YOUR_PROJECT_ID/anythingmcp/app:latest

Kubernetes Secrets erstellen

kubectl create secret generic anythingmcp-secrets \
  --from-literal=JWT_SECRET=$(openssl rand -hex 32) \
  --from-literal=ENCRYPTION_KEY=$(openssl rand -hex 16) \
  --from-literal=NEXTAUTH_SECRET=$(openssl rand -hex 32) \
  --from-literal=POSTGRES_PASSWORD=$(openssl rand -hex 16)

PostgreSQL bereitstellen

Einfaches clusterinternes StatefulSet (für Produktion empfiehlt sich stattdessen Cloud SQL):

# postgres.yaml
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  clusterIP: None
  selector:
    app: postgres
  ports:
    - port: 5432
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:17-alpine
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: anythingmcp
            - name: POSTGRES_USER
              value: amcp
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: anythingmcp-secrets
                  key: POSTGRES_PASSWORD
          volumeMounts:
            - name: data
              mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 10Gi
kubectl apply -f postgres.yaml

AnythingMCP bereitstellen

# anythingmcp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: anythingmcp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: anythingmcp
  template:
    metadata:
      labels:
        app: anythingmcp
    spec:
      containers:
        - name: anythingmcp
          image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/anythingmcp/app:latest
          ports:
            - containerPort: 3000
            - containerPort: 4000
          env:
            - name: NODE_ENV
              value: production
            - name: PORT
              value: "4000"
            - name: MCP_AUTH_MODE
              value: oauth2
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: anythingmcp-secrets
                  key: POSTGRES_PASSWORD
            - name: DATABASE_URL
              value: postgresql://amcp:$(POSTGRES_PASSWORD)@postgres:5432/anythingmcp
            - name: JWT_SECRET
              valueFrom:
                secretKeyRef:
                  name: anythingmcp-secrets
                  key: JWT_SECRET
            - name: ENCRYPTION_KEY
              valueFrom:
                secretKeyRef:
                  name: anythingmcp-secrets
                  key: ENCRYPTION_KEY
            - name: NEXTAUTH_SECRET
              valueFrom:
                secretKeyRef:
                  name: anythingmcp-secrets
                  key: NEXTAUTH_SECRET
          readinessProbe:
            httpGet:
              path: /health
              port: 4000
            initialDelaySeconds: 10
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /health
              port: 4000
            initialDelaySeconds: 30
            periodSeconds: 10
          resources:
            requests:
              cpu: 250m
              memory: 256Mi
            limits:
              cpu: "1"
              memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
  name: anythingmcp
spec:
  selector:
    app: anythingmcp
  ports:
    - name: frontend
      port: 3000
      targetPort: 3000
    - name: backend
      port: 4000
      targetPort: 4000
  type: ClusterIP
kubectl apply -f anythingmcp.yaml

Mit Ingress freigeben (HTTPS)

# ingress.yaml
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: anythingmcp-cert
spec:
  domains:
    - mcp.example.com
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: anythingmcp-ingress
  annotations:
    networking.gke.io/managed-certificates: anythingmcp-cert
    kubernetes.io/ingress.class: gce
spec:
  rules:
    - host: mcp.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: anythingmcp
                port:
                  number: 3000
kubectl apply -f ingress.yaml

# Externe IP abrufen (kann einige Minuten dauern)
kubectl get ingress anythingmcp-ingress

Richten Sie den A-Eintrag Ihrer Domain auf die externe IP. Das verwaltete Zertifikat wird automatisch bereitgestellt, sobald sich der DNS-Eintrag verbreitet hat.

Überprüfung & nächste Schritte

kubectl get pods
curl https://mcp.example.com/health

Der erste Benutzer, der sich registriert, wird zum Administrator.

Produktionsempfehlungen:

  • Verwenden Sie Cloud SQL anstelle des clusterinternen StatefulSets für Backups und Hochverfügbarkeit
  • Aktivieren Sie den Horizontal Pod Autoscaler: kubectl autoscale deployment anythingmcp --min=2 --max=10 --cpu-percent=70
  • Verwenden Sie Workload Identity für den Cloud-SQL-Zugriff