Skip to content

云端部署指南

本指南将详细介绍如何在各种云平台上部署AnythingLLM,包括容器化部署、无服务器部署和托管服务部署等多种方案。

部署架构概览

基础架构组件

mermaid
graph TB
    A[负载均衡器] --> B[AnythingLLM 实例]
    B --> C[数据库]
    B --> D[向量数据库]
    B --> E[文件存储]
    B --> F[缓存层]
    
    G[CDN] --> A
    H[监控系统] --> B
    I[日志系统] --> B

部署模式选择

单实例部署

适合小型团队和开发环境:

  • 成本低
  • 配置简单
  • 适合轻量级使用

高可用部署

适合生产环境:

  • 多实例负载均衡
  • 数据库集群
  • 自动故障转移

微服务架构

适合大规模企业部署:

  • 服务解耦
  • 独立扩展
  • 容错能力强

AWS 部署

Amazon ECS 部署

基础配置

yaml
# ecs-task-definition.json
{
  "family": "anythingllm",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "1024",
  "memory": "2048",
  "executionRoleArn": "arn:aws:iam::account:role/ecsTaskExecutionRole",
  "taskRoleArn": "arn:aws:iam::account:role/ecsTaskRole",
  "containerDefinitions": [
    {
      "name": "anythingllm",
      "image": "mintplexlabs/anythingllm:latest",
      "portMappings": [
        {
          "containerPort": 3001,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "NODE_ENV",
          "value": "production"
        },
        {
          "name": "DATABASE_URL",
          "value": "postgresql://user:pass@rds-endpoint:5432/anythingllm"
        }
      ],
      "secrets": [
        {
          "name": "OPENAI_API_KEY",
          "valueFrom": "arn:aws:secretsmanager:region:account:secret:openai-key"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/anythingllm",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ]
}

ECS 服务配置

yaml
# ecs-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: anythingllm-service
spec:
  serviceName: anythingllm
  cluster: production-cluster
  taskDefinition: anythingllm:1
  desiredCount: 2
  launchType: FARGATE
  networkConfiguration:
    awsvpcConfiguration:
      subnets:
        - subnet-12345678
        - subnet-87654321
      securityGroups:
        - sg-anythingllm
      assignPublicIp: ENABLED
  loadBalancers:
    - targetGroupArn: arn:aws:elasticloadbalancing:region:account:targetgroup/anythingllm
      containerName: anythingllm
      containerPort: 3001

Amazon EKS 部署

Kubernetes 部署文件

yaml
# k8s-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: anythingllm
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: anythingllm
  template:
    metadata:
      labels:
        app: anythingllm
    spec:
      containers:
      - name: anythingllm
        image: mintplexlabs/anythingllm:latest
        ports:
        - containerPort: 3001
        env:
        - name: NODE_ENV
          value: "production"
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: anythingllm-secrets
              key: database-url
        - name: OPENAI_API_KEY
          valueFrom:
            secretKeyRef:
              name: anythingllm-secrets
              key: openai-api-key
        resources:
          requests:
            memory: "1Gi"
            cpu: "500m"
          limits:
            memory: "2Gi"
            cpu: "1000m"
        livenessProbe:
          httpGet:
            path: /api/health
            port: 3001
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /api/ready
            port: 3001
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: anythingllm-service
  namespace: production
spec:
  selector:
    app: anythingllm
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3001
  type: LoadBalancer

Ingress 配置

yaml
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: anythingllm-ingress
  namespace: production
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - anythingllm.yourdomain.com
    secretName: anythingllm-tls
  rules:
  - host: anythingllm.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: anythingllm-service
            port:
              number: 80

AWS App Runner 部署

App Runner 配置

yaml
# apprunner.yaml
version: 1.0
runtime: docker
build:
  commands:
    build:
      - echo "Building AnythingLLM"
run:
  runtime-version: latest
  command: npm start
  network:
    port: 3001
    env: PORT
  env:
    - name: NODE_ENV
      value: production
    - name: DATABASE_URL
      value: postgresql://user:pass@rds-endpoint:5432/anythingllm

RDS 数据库配置

PostgreSQL 配置

bash
# 创建 RDS 实例
aws rds create-db-instance \
  --db-instance-identifier anythingllm-db \
  --db-instance-class db.t3.medium \
  --engine postgres \
  --engine-version 14.9 \
  --master-username anythingllm \
  --master-user-password your-secure-password \
  --allocated-storage 100 \
  --storage-type gp2 \
  --vpc-security-group-ids sg-12345678 \
  --db-subnet-group-name anythingllm-subnet-group \
  --backup-retention-period 7 \
  --multi-az \
  --storage-encrypted

Google Cloud Platform 部署

Cloud Run 部署

基础部署

bash
# 构建并推送镜像
gcloud builds submit --tag gcr.io/PROJECT_ID/anythingllm

# 部署到 Cloud Run
gcloud run deploy anythingllm \
  --image gcr.io/PROJECT_ID/anythingllm \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated \
  --memory 2Gi \
  --cpu 2 \
  --max-instances 10 \
  --set-env-vars NODE_ENV=production \
  --set-env-vars DATABASE_URL=postgresql://user:pass@db-host:5432/anythingllm

Cloud Run 配置文件

yaml
# cloudrun.yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: anythingllm
  annotations:
    run.googleapis.com/ingress: all
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: "10"
        run.googleapis.com/cpu-throttling: "false"
        run.googleapis.com/memory: "2Gi"
        run.googleapis.com/cpu: "2"
    spec:
      containerConcurrency: 100
      containers:
      - image: gcr.io/PROJECT_ID/anythingllm
        ports:
        - containerPort: 3001
        env:
        - name: NODE_ENV
          value: production
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: anythingllm-secrets
              key: database-url
        resources:
          limits:
            memory: 2Gi
            cpu: 2000m

GKE 部署

集群创建

bash
# 创建 GKE 集群
gcloud container clusters create anythingllm-cluster \
  --zone us-central1-a \
  --num-nodes 3 \
  --machine-type e2-standard-4 \
  --enable-autoscaling \
  --min-nodes 1 \
  --max-nodes 10 \
  --enable-autorepair \
  --enable-autoupgrade

Helm Chart 部署

yaml
# values.yaml
replicaCount: 3

image:
  repository: gcr.io/PROJECT_ID/anythingllm
  tag: latest
  pullPolicy: Always

service:
  type: LoadBalancer
  port: 80
  targetPort: 3001

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.global-static-ip-name: anythingllm-ip
    networking.gke.io/managed-certificates: anythingllm-ssl-cert
  hosts:
    - host: anythingllm.yourdomain.com
      paths:
        - path: /
          pathType: Prefix

resources:
  limits:
    cpu: 1000m
    memory: 2Gi
  requests:
    cpu: 500m
    memory: 1Gi

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70

env:
  - name: NODE_ENV
    value: production
  - name: DATABASE_URL
    valueFrom:
      secretKeyRef:
        name: anythingllm-secrets
        key: database-url

Cloud SQL 配置

bash
# 创建 Cloud SQL 实例
gcloud sql instances create anythingllm-db \
  --database-version POSTGRES_14 \
  --tier db-custom-2-4096 \
  --region us-central1 \
  --backup-start-time 02:00 \
  --enable-bin-log \
  --storage-auto-increase

# 创建数据库
gcloud sql databases create anythingllm --instance anythingllm-db

# 创建用户
gcloud sql users create anythingllm \
  --instance anythingllm-db \
  --password your-secure-password

Microsoft Azure 部署

Azure Container Instances

基础部署

bash
# 创建资源组
az group create --name anythingllm-rg --location eastus

# 部署容器实例
az container create \
  --resource-group anythingllm-rg \
  --name anythingllm \
  --image mintplexlabs/anythingllm:latest \
  --cpu 2 \
  --memory 4 \
  --ports 3001 \
  --dns-name-label anythingllm-unique \
  --environment-variables \
    NODE_ENV=production \
    DATABASE_URL=postgresql://user:pass@db-host:5432/anythingllm \
  --secure-environment-variables \
    OPENAI_API_KEY=your-openai-key

ARM 模板部署

json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerName": {
      "type": "string",
      "defaultValue": "anythingllm"
    },
    "databaseUrl": {
      "type": "securestring"
    },
    "openaiApiKey": {
      "type": "securestring"
    }
  },
  "resources": [
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2021-03-01",
      "name": "[parameters('containerName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "containers": [
          {
            "name": "anythingllm",
            "properties": {
              "image": "mintplexlabs/anythingllm:latest",
              "ports": [
                {
                  "port": 3001,
                  "protocol": "TCP"
                }
              ],
              "environmentVariables": [
                {
                  "name": "NODE_ENV",
                  "value": "production"
                },
                {
                  "name": "DATABASE_URL",
                  "secureValue": "[parameters('databaseUrl')]"
                },
                {
                  "name": "OPENAI_API_KEY",
                  "secureValue": "[parameters('openaiApiKey')]"
                }
              ],
              "resources": {
                "requests": {
                  "cpu": 2,
                  "memoryInGB": 4
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "port": 3001,
              "protocol": "TCP"
            }
          ],
          "dnsNameLabel": "anythingllm-unique"
        }
      }
    }
  ]
}

Azure Kubernetes Service (AKS)

集群创建

bash
# 创建 AKS 集群
az aks create \
  --resource-group anythingllm-rg \
  --name anythingllm-aks \
  --node-count 3 \
  --node-vm-size Standard_D2s_v3 \
  --enable-addons monitoring \
  --enable-cluster-autoscaler \
  --min-count 1 \
  --max-count 10 \
  --generate-ssh-keys

Azure App Service

配置文件

yaml
# azure-pipelines.yml
trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

variables:
  dockerRegistryServiceConnection: 'anythingllm-acr'
  imageRepository: 'anythingllm'
  containerRegistry: 'anythingllmacr.azurecr.io'
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

stages:
- stage: Build
  displayName: Build and push stage
  jobs:
  - job: Build
    displayName: Build
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
          latest

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy
    environment: 'production'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: AzureWebAppContainer@1
            displayName: 'Azure Web App on Container Deploy'
            inputs:
              azureSubscription: 'anythingllm-subscription'
              appName: 'anythingllm-app'
              containers: '$(containerRegistry)/$(imageRepository):$(tag)'

DigitalOcean 部署

App Platform 部署

配置文件

yaml
# .do/app.yaml
name: anythingllm
services:
- name: web
  source_dir: /
  github:
    repo: your-username/anythingllm
    branch: main
  run_command: npm start
  environment_slug: node-js
  instance_count: 2
  instance_size_slug: basic-xxs
  http_port: 3001
  health_check:
    http_path: /api/health
  env:
  - key: NODE_ENV
    value: production
  - key: DATABASE_URL
    value: ${db.DATABASE_URL}
    type: SECRET
  - key: OPENAI_API_KEY
    value: your-openai-key
    type: SECRET

databases:
- name: db
  engine: PG
  version: "14"
  size: basic-xs
  num_nodes: 1

Droplet 部署

初始化脚本

bash
#!/bin/bash
# droplet-init.sh

# 更新系统
apt update && apt upgrade -y

# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

# 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 创建应用目录
mkdir -p /opt/anythingllm
cd /opt/anythingllm

# 创建 docker-compose.yml
cat > docker-compose.yml << EOF
version: '3.8'
services:
  anythingllm:
    image: mintplexlabs/anythingllm:latest
    ports:
      - "80:3001"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://anythingllm:password@db:5432/anythingllm
      - OPENAI_API_KEY=your-openai-key
    depends_on:
      - db
    restart: unless-stopped
    volumes:
      - anythingllm_data:/app/storage

  db:
    image: postgres:14
    environment:
      - POSTGRES_DB=anythingllm
      - POSTGRES_USER=anythingllm
      - POSTGRES_PASSWORD=password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  anythingllm_data:
  postgres_data:
EOF

# 启动服务
docker-compose up -d

# 设置防火墙
ufw allow 22
ufw allow 80
ufw allow 443
ufw --force enable

Vercel 部署

配置文件

json
{
  "version": 2,
  "builds": [
    {
      "src": "server/index.js",
      "use": "@vercel/node"
    },
    {
      "src": "frontend/package.json",
      "use": "@vercel/static-build",
      "config": {
        "distDir": "dist"
      }
    }
  ],
  "routes": [
    {
      "src": "/api/(.*)",
      "dest": "/server/index.js"
    },
    {
      "src": "/(.*)",
      "dest": "/frontend/dist/$1"
    }
  ],
  "env": {
    "NODE_ENV": "production",
    "DATABASE_URL": "@database-url",
    "OPENAI_API_KEY": "@openai-api-key"
  },
  "functions": {
    "server/index.js": {
      "maxDuration": 30
    }
  }
}

Railway 部署

配置文件

toml
# railway.toml
[build]
builder = "DOCKERFILE"
dockerfilePath = "Dockerfile"

[deploy]
startCommand = "npm start"
healthcheckPath = "/api/health"
healthcheckTimeout = 100
restartPolicyType = "ON_FAILURE"
restartPolicyMaxRetries = 10

[[deploy.environmentVariables]]
name = "NODE_ENV"
value = "production"

[[deploy.environmentVariables]]
name = "PORT"
value = "3001"

监控和日志

Prometheus 监控

配置文件

yaml
# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'anythingllm'
    static_configs:
      - targets: ['anythingllm:3001']
    metrics_path: '/api/metrics'
    scrape_interval: 30s

  - job_name: 'postgres'
    static_configs:
      - targets: ['postgres-exporter:9187']

  - job_name: 'redis'
    static_configs:
      - targets: ['redis-exporter:9121']

Grafana 仪表板

仪表板配置

json
{
  "dashboard": {
    "title": "AnythingLLM Monitoring",
    "panels": [
      {
        "title": "Request Rate",
        "type": "graph",
        "targets": [
          {
            "expr": "rate(http_requests_total[5m])",
            "legendFormat": "{{method}} {{status}}"
          }
        ]
      },
      {
        "title": "Response Time",
        "type": "graph",
        "targets": [
          {
            "expr": "histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))",
            "legendFormat": "95th percentile"
          }
        ]
      },
      {
        "title": "Memory Usage",
        "type": "graph",
        "targets": [
          {
            "expr": "process_resident_memory_bytes",
            "legendFormat": "Memory"
          }
        ]
      }
    ]
  }
}

日志聚合

ELK Stack 配置

yaml
# docker-compose.logging.yml
version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.8.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ports:
      - "9200:9200"

  logstash:
    image: docker.elastic.co/logstash/logstash:8.8.0
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    ports:
      - "5044:5044"

  kibana:
    image: docker.elastic.co/kibana/kibana:8.8.0
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - "5601:5601"

  filebeat:
    image: docker.elastic.co/beats/filebeat:8.8.0
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
    command: filebeat -e -strict.perms=false

自动扩展

Kubernetes HPA

yaml
# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: anythingllm-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: anythingllm
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Percent
        value: 50
        periodSeconds: 60

AWS Auto Scaling

json
{
  "AutoScalingGroupName": "anythingllm-asg",
  "MinSize": 2,
  "MaxSize": 10,
  "DesiredCapacity": 2,
  "DefaultCooldown": 300,
  "HealthCheckType": "ELB",
  "HealthCheckGracePeriod": 300,
  "LaunchTemplate": {
    "LaunchTemplateName": "anythingllm-template",
    "Version": "$Latest"
  },
  "TargetGroupARNs": [
    "arn:aws:elasticloadbalancing:region:account:targetgroup/anythingllm"
  ],
  "Tags": [
    {
      "Key": "Name",
      "Value": "anythingllm-instance",
      "PropagateAtLaunch": true
    }
  ]
}

备份策略

数据库备份

自动备份脚本

bash
#!/bin/bash
# backup.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups"
DB_NAME="anythingllm"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 数据库备份
pg_dump $DATABASE_URL > $BACKUP_DIR/db_backup_$DATE.sql

# 压缩备份
gzip $BACKUP_DIR/db_backup_$DATE.sql

# 上传到 S3
aws s3 cp $BACKUP_DIR/db_backup_$DATE.sql.gz s3://anythingllm-backups/

# 清理本地备份 (保留7天)
find $BACKUP_DIR -name "db_backup_*.sql.gz" -mtime +7 -delete

echo "Backup completed: db_backup_$DATE.sql.gz"

Kubernetes CronJob 备份

yaml
# backup-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: database-backup
spec:
  schedule: "0 2 * * *"  # 每天凌晨2点
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: postgres:14
            command:
            - /bin/bash
            - -c
            - |
              DATE=$(date +%Y%m%d_%H%M%S)
              pg_dump $DATABASE_URL | gzip > /backup/db_backup_$DATE.sql.gz
              aws s3 cp /backup/db_backup_$DATE.sql.gz s3://anythingllm-backups/
            env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: anythingllm-secrets
                  key: database-url
            volumeMounts:
            - name: backup-storage
              mountPath: /backup
          volumes:
          - name: backup-storage
            emptyDir: {}
          restartPolicy: OnFailure

安全配置

SSL/TLS 配置

Let's Encrypt 证书

bash
# 安装 Certbot
apt install certbot python3-certbot-nginx

# 获取证书
certbot --nginx -d anythingllm.yourdomain.com

# 自动续期
echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -

Nginx 配置

nginx
# nginx.conf
server {
    listen 80;
    server_name anythingllm.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name anythingllm.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/anythingllm.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/anythingllm.yourdomain.com/privkey.pem;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;

    location / {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

网络安全

防火墙配置

bash
# UFW 配置
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 80
ufw allow 443
ufw enable

# 限制 SSH 访问
ufw limit ssh

安全组配置 (AWS)

json
{
  "GroupName": "anythingllm-sg",
  "Description": "Security group for AnythingLLM",
  "SecurityGroupRules": [
    {
      "IpPermissions": [
        {
          "IpProtocol": "tcp",
          "FromPort": 80,
          "ToPort": 80,
          "IpRanges": [{"CidrIp": "0.0.0.0/0"}]
        },
        {
          "IpProtocol": "tcp",
          "FromPort": 443,
          "ToPort": 443,
          "IpRanges": [{"CidrIp": "0.0.0.0/0"}]
        },
        {
          "IpProtocol": "tcp",
          "FromPort": 22,
          "ToPort": 22,
          "IpRanges": [{"CidrIp": "YOUR_IP/32"}]
        }
      ]
    }
  ]
}

故障排除

常见问题

容器启动失败

bash
# 检查容器日志
docker logs anythingllm

# 检查资源使用
docker stats anythingllm

# 检查网络连接
docker exec anythingllm curl -I http://localhost:3001/api/health

数据库连接问题

bash
# 测试数据库连接
psql $DATABASE_URL -c "SELECT 1;"

# 检查数据库状态
kubectl get pods -l app=postgres
kubectl logs postgres-pod-name

性能问题

bash
# 检查资源使用
kubectl top pods
kubectl top nodes

# 检查 HPA 状态
kubectl get hpa
kubectl describe hpa anythingllm-hpa

调试工具

健康检查脚本

bash
#!/bin/bash
# health-check.sh

echo "Checking AnythingLLM health..."

# 检查应用健康
if curl -f http://localhost:3001/api/health > /dev/null 2>&1; then
    echo "✓ Application is healthy"
else
    echo "✗ Application health check failed"
    exit 1
fi

# 检查数据库连接
if psql $DATABASE_URL -c "SELECT 1;" > /dev/null 2>&1; then
    echo "✓ Database connection is healthy"
else
    echo "✗ Database connection failed"
    exit 1
fi

# 检查磁盘空间
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -lt 90 ]; then
    echo "✓ Disk usage is normal ($DISK_USAGE%)"
else
    echo "⚠ Disk usage is high ($DISK_USAGE%)"
fi

echo "Health check completed"

最佳实践

部署检查清单

部署前检查

  • [ ] 选择合适的云平台和服务
  • [ ] 配置环境变量和密钥
  • [ ] 设置数据库和存储
  • [ ] 配置网络和安全组
  • [ ] 准备监控和日志系统
  • [ ] 制定备份策略
  • [ ] 测试部署流程

部署后验证

  • [ ] 应用健康检查通过
  • [ ] 数据库连接正常
  • [ ] API 端点可访问
  • [ ] 监控指标正常
  • [ ] 日志收集工作
  • [ ] 备份任务运行
  • [ ] 安全配置生效

性能优化建议

应用层优化

  • 启用应用缓存
  • 优化数据库查询
  • 使用 CDN 加速静态资源
  • 实施负载均衡
  • 配置合适的资源限制

基础设施优化

  • 选择合适的实例类型
  • 配置自动扩展
  • 使用多可用区部署
  • 优化网络配置
  • 实施缓存策略

成本控制

成本优化策略

  • 使用预留实例或节约计划
  • 实施自动扩展减少闲置资源
  • 选择合适的存储类型
  • 监控和优化数据传输成本
  • 定期审查和清理未使用资源

通过遵循本指南,您可以在各种云平台上成功部署AnythingLLM,并确保其在生产环境中的稳定运行。记住要根据具体的业务需求和预算选择最适合的部署方案。

AnythingLLM 是一个功能强大的开源 AI 知识管理平台,支持多种 LLM 模型,让您轻松构建智能对话系统和知识库。