上一篇 下一篇 分享链接 返回 返回顶部

AI 工具上线实战:从服务器初始化到 HTTPS、备份与监控全流程命令指南

发布人:慈云数据-客服中心 发布时间:24小时前 阅读量:7

AI工具 生产环境部署指南|附完整命令

随着大模型、智能体、RAG 知识库、AI 编程助手、AI 客服、自动化工作流等场景快速落地,越来越多团队开始将 AI 工具从本地测试环境推进到生产环境。然而,生产环境部署与“能跑起来”完全不是一回事。生产环境更关注稳定性、安全性、可观测性、可扩展性、成本控制、权限隔离、数据安全以及故障恢复能力。

本文将以一个通用的 AI 工具服务为例,系统讲解如何从零开始完成生产环境部署。你可以将它理解为一个基于 Python / Node.js / FastAPI / Flask / LangChain / LlamaIndex / Dify / Open WebUI / 自研 AI Agent 后端等形式的 AI 应用服务。文章会尽量使用通用方案,并附上完整命令,方便直接参考落地。


一、生产环境部署前需要明确什么?

在正式部署之前,建议先确认以下几个问题:

  1. AI 工具是纯 API 服务,还是带前端页面?

    • 纯 API:通常通过 Nginx 反向代理暴露接口。
    • 前后端分离:前端可以部署到 Nginx、对象存储或 CDN。
    • 全栈服务:可以使用 Docker Compose 或 Kubernetes 管理。
  2. 是否依赖大模型?

    • 调用第三方 API,例如 OpenAI、Claude、通义千问、智谱、DeepSeek。
    • 本地部署模型,例如 Qwen、Llama、ChatGLM、Mistral。
    • 混合方案:部分任务走外部 API,部分任务走本地推理。
  3. 是否需要 GPU?

    • 如果只是调用第三方模型 API,通常不需要 GPU。
    • 如果本地部署推理模型,建议使用 NVIDIA GPU,并安装驱动、CUDA、容器运行时。
  4. 是否需要数据库或向量数据库?

    • 关系型数据库:PostgreSQL、MySQL。
    • 缓存:Redis。
    • 向量数据库:Milvus、Qdrant、Weaviate、pgvector、Elasticsearch。
  5. 是否涉及用户数据、企业知识库或隐私信息?

    • 需要 HTTPS。
    • 需要访问控制。
    • 需要日志脱敏。
    • 需要备份和审计。
    • 需要权限隔离。

二、推荐的生产环境架构

一个较为标准的 AI 工具生产部署架构如下:

用户 / 客户端
    |
    | HTTPS
    v
Nginx / API Gateway
    |
    | 反向代理
    v
AI 应用服务
    |
    |---------------------------------
    |                |               |
 PostgreSQL        Redis        向量数据库
    |
    v
对象存储 / 文件存储

AI 应用服务
    |
    | 调用
    v
大模型 API / 本地模型推理服务

如果是单机生产环境,可以使用:

  • Ubuntu Server
  • Docker
  • Docker Compose
  • Nginx
  • PostgreSQL
  • Redis
  • Qdrant / Milvus / pgvector
  • Certbot HTTPS
  • Prometheus + Grafana 可选

如果是中大型生产环境,建议使用:

  • Kubernetes
  • Helm
  • Ingress Nginx
  • Secret 管理
  • HPA 自动扩缩容
  • Prometheus + Grafana
  • Loki / ELK 日志系统
  • 对象存储
  • CI/CD 流水线

本文重点以“单机 Docker Compose 生产部署”为主,因为这是最适合大多数中小团队快速落地的方式。


三、服务器基础准备

1. 推荐服务器配置

如果你的 AI 工具主要调用第三方模型 API,推荐配置:

CPU:4 核以上
内存:8GB 以上
系统盘:80GB 以上
系统:Ubuntu 22.04 LTS
网络:公网 IP

如果需要本地模型推理,推荐配置:

CPU:8 核以上
内存:32GB 以上
GPU:NVIDIA 显卡,显存 16GB 以上
系统盘:200GB 以上
数据盘:按模型和知识库大小规划
系统:Ubuntu 22.04 LTS

2. 更新系统

登录服务器:

ssh root@你的服务器IP

更新系统软件包:

apt update && apt upgrade -y

安装常用工具:

apt install -y \
  curl \
  wget \
  git \
  vim \
  htop \
  unzip \
  ca-certificates \
  gnupg \
  lsb-release \
  ufw \
  net-tools

设置服务器时区:

timedatectl set-timezone Asia/Shanghai
timedatectl

四、创建部署用户

生产环境不建议长期使用 root 用户运行应用。可以创建一个专门的部署用户。

adduser deploy

给 deploy 用户添加 sudo 权限:

usermod -aG sudo deploy

切换到 deploy 用户:

su - deploy

创建项目目录:

mkdir -p ~/apps/ai-tool
cd ~/apps/ai-tool

五、安装 Docker 与 Docker Compose

1. 安装 Docker

切回 root 或使用 sudo 执行:

sudo apt update
sudo apt install -y ca-certificates curl gnupg

添加 Docker 官方 GPG Key:

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

添加 Docker 软件源:

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker:

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动 Docker:

sudo systemctl enable docker
sudo systemctl start docker

查看版本:

docker version
docker compose version

将 deploy 用户加入 docker 组:

sudo usermod -aG docker deploy

重新登录 deploy 用户后验证:

docker ps

如果可以正常执行,说明 Docker 安装成功。


六、配置防火墙

生产环境必须限制开放端口。常见端口:

22:SSH
80:HTTP
443:HTTPS

如果数据库、Redis、向量数据库只给内部容器访问,不应该直接暴露到公网。

启用 UFW:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

查看状态:

sudo ufw status

如果你的 SSH 端口不是 22,比如改成了 2222:

sudo ufw allow 2222/tcp
sudo ufw delete allow OpenSSH
sudo ufw status

七、准备 AI 工具项目结构

进入项目目录:

cd ~/apps/ai-tool

推荐目录结构如下:

ai-tool/
├── app/
│   ├── main.py
│   ├── requirements.txt
│   └── Dockerfile
├── nginx/
│   └── ai-tool.conf
├── data/
│   ├── postgres/
│   ├── redis/
│   └── qdrant/
├── logs/
├── .env
└── docker-compose.yml

创建目录:

mkdir -p app nginx data/postgres data/redis data/qdrant logs

八、示例 AI 应用代码

这里使用 FastAPI 作为示例。如果你已有自己的项目,可以跳过本节。

创建 app/main.py

cat > app/main.py <<'EOF'
from fastapi import FastAPI
from pydantic import BaseModel
import os
import time

app = FastAPI(title="AI Tool API", version="1.0.0")

class ChatRequest(BaseModel):
    message: str

@app.get("/health")
def health():
    return {
        "status": "ok",
        "timestamp": int(time.time())
    }

@app.post("/api/chat")
def chat(req: ChatRequest):
    model_provider = os.getenv("MODEL_PROVIDER", "demo")
    return {
        "provider": model_provider,
        "reply": f"这是生产环境 AI 工具的示例回复:{req.message}"
    }
EOF

创建 app/requirements.txt

cat > app/requirements.txt <<'EOF'
fastapi==0.115.0
uvicorn[standard]==0.30.6
pydantic==2.8.2
EOF

创建 app/Dockerfile

cat > app/Dockerfile <<'EOF'
FROM python:3.11-slim

WORKDIR /app

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

RUN apt update && apt install -y --no-install-recommends \
    curl \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir -r /app/requirements.txt

COPY . /app

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]
EOF

九、编写环境变量配置

创建 .env 文件:

cat > .env <<'EOF'
APP_ENV=production
APP_PORT=8000

POSTGRES_DB=aitool
POSTGRES_USER=aitool
POSTGRES_PASSWORD=请替换为强密码

REDIS_PASSWORD=请替换为Redis强密码

MODEL_PROVIDER=openai
OPENAI_API_KEY=请替换为你的API_KEY
OPENAI_BASE_URL=https://api.openai.com/v1

QDRANT_API_KEY=请替换为Qdrant强密钥
EOF

修改权限:

chmod 600 .env

生产环境注意:

  • 不要把 .env 提交到 Git。
  • 密码不要使用 123456password、公司名、项目名。
  • API Key 建议定期轮换。
  • 如果使用 CI/CD,建议将密钥放在平台 Secret 中。

十、编写 Docker Compose 文件

创建 docker-compose.yml

cat > docker-compose.yml <<'EOF'
services:
  ai-app:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: ai-app
    restart: always
    env_file:
      - .env
    depends_on:
      - postgres
      - redis
      - qdrant
    networks:
      - ai-net
    expose:
      - "8000"
    volumes:
      - ./logs:/app/logs

  postgres:
    image: postgres:16
    container_name: ai-postgres
    restart: always
    env_file:
      - .env
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    networks:
      - ai-net
    expose:
      - "5432"

  redis:
    image: redis:7
    container_name: ai-redis
    restart: always
    command: >
      redis-server
      --appendonly yes
      --requirepass ${REDIS_PASSWORD}
    volumes:
      - ./data/redis:/data
    networks:
      - ai-net
    expose:
      - "6379"

  qdrant:
    image: qdrant/qdrant:v1.11.3
    container_name: ai-qdrant
    restart: always
    environment:
      QDRANT__SERVICE__API_KEY: ${QDRANT_API_KEY}
    volumes:
      - ./data/qdrant:/qdrant/storage
    networks:
      - ai-net
    expose:
      - "6333"

  nginx:
    image: nginx:1.27
    container_name: ai-nginx
    restart: always
    depends_on:
      - ai-app
    ports:
      - "80:80"
    volumes:
      - ./nginx/ai-tool.conf:/etc/nginx/conf.d/default.conf:ro
      - ./logs/nginx:/var/log/nginx
    networks:
      - ai-net

networks:
  ai-net:
    driver: bridge
EOF

这个 Compose 文件包含:

  • ai-app:AI 应用服务
  • postgres:业务数据库
  • redis:缓存与任务队列
  • qdrant:向量数据库
  • nginx:反向代理

注意:PostgreSQL、Redis、Qdrant 没有直接暴露到公网,只通过内部网络访问,这是生产环境比较安全的做法。


十一、配置 Nginx 反向代理

创建 Nginx 配置:

cat > nginx/ai-tool.conf <<'EOF'
server {
    listen 80;
    server_name _;

    client_max_body_size 50M;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /health {
        proxy_pass http://ai-app:8000/health;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        proxy_pass http://ai-app:8000;
        proxy_http_version 1.1;

        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        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;
    }
}
EOF

AI 应用经常会出现长响应,例如大模型推理、知识库检索、文件解析,所以这里适当增大了超时时间。


十二、启动服务

构建并启动:

docker compose up -d --build

查看容器状态:

docker compose ps

查看应用日志:

docker compose logs -f ai-app

查看 Nginx 日志:

docker compose logs -f nginx

测试健康检查:

curl http://127.0.0.1/health

如果返回类似内容,说明部署成功:

{
  "status": "ok",
  "timestamp": 1720000000
}

测试聊天接口:

curl -X POST http://127.0.0.1/api/chat \
  -H "Content-Type: application/json" \
  -d '{"message":"你好,请介绍一下你自己"}'

十三、绑定域名

假设你的域名是:

ai.example.com

请到域名服务商后台添加 DNS 解析:

类型:A
主机记录:ai
记录值:你的服务器公网IP
TTL:默认

等待解析生效后,在服务器上测试:

ping ai.example.com

如果能解析到服务器 IP,即可修改 Nginx 配置。

编辑配置:

vim nginx/ai-tool.conf

将:

server_name _;

改为:

server_name ai.example.com;

重启 Nginx 容器:

docker compose restart nginx

测试:

curl http://ai.example.com/health

十四、配置 HTTPS 证书

生产环境必须启用 HTTPS,尤其是 AI 工具通常涉及用户输入、企业知识库、上传文件和 API Key。

这里推荐使用宿主机安装 Certbot,然后将证书挂载到 Nginx 容器中。

安装 Certbot:

sudo apt install -y certbot

先停止占用 80 端口的 Nginx 容器:

docker compose stop nginx

申请证书:

sudo certbot certonly --standalone -d ai.example.com

证书位置通常是:

/etc/letsencrypt/live/ai.example.com/fullchain.pem
/etc/letsencrypt/live/ai.example.com/privkey.pem

修改 docker-compose.yml,给 nginx 增加证书挂载和 443 端口:

  nginx:
    image: nginx:1.27
    container_name: ai-nginx
    restart: always
    depends_on:
      - ai-app
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/ai-tool.conf:/etc/nginx/conf.d/default.conf:ro
      - ./logs/nginx:/var/log/nginx
      - /etc/letsencrypt:/etc/letsencrypt:ro
    networks:
      - ai-net

重新写入 Nginx HTTPS 配置:

cat > nginx/ai-tool.conf <<'EOF'
server {
    listen 80;
    server_name ai.example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name ai.example.com;

    ssl_certificate /etc/letsencrypt/live/ai.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ai.example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    client_max_body_size 50M;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /health {
        proxy_pass http://ai-app:8000/health;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        proxy_pass http://ai-app:8000;
        proxy_http_version 1.1;

        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        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 https;
    }
}
EOF

启动服务:

docker compose up -d

测试 HTTPS:

curl https://ai.example.com/health

设置证书自动续期:

sudo crontab -e

添加:

0 3 * * * certbot renew --quiet && cd /home/deploy/apps/ai-tool && docker compose restart nginx

十五、生产环境日志管理

AI 应用日志非常重要,但也要避免日志无限膨胀。可以给 Docker 配置日志轮转。

创建 Docker daemon 配置:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}
EOF

重启 Docker:

sudo systemctl restart docker

重新启动项目:

cd ~/apps/ai-tool
docker compose up -d

查看容器日志占用:

docker system df

清理无用镜像和构建缓存:

docker system prune -f
docker builder prune -f

如果你需要保留更多日志,建议接入:

  • Loki + Grafana
  • ELK / EFK
  • 阿里云 SLS
  • 腾讯云 CLS
  • AWS CloudWatch

十六、数据库备份与恢复

生产环境一定要定期备份数据库。尤其是 AI 工具往往包含:

  • 用户信息
  • 对话历史
  • 知识库索引
  • 文档元数据
  • 任务执行记录
  • 配置信息

1. PostgreSQL 手动备份

创建备份目录:

mkdir -p ~/apps/ai-tool/backups/postgres

执行备份:

docker exec ai-postgres pg_dump \
  -U aitool \
  -d aitool \
  > ~/apps/ai-tool/backups/postgres/aitool_$(date +%F_%H-%M-%S).sql

查看备份文件:

ls -lh ~/apps/ai-tool/backups/postgres

2. PostgreSQL 自动备份

创建脚本:

cat > ~/apps/ai-tool/backup_postgres.sh <<'EOF'
#!/usr/bin/env bash
set -e

BACKUP_DIR="/home/deploy/apps/ai-tool/backups/postgres"
DATE=$(date +%F_%H-%M-%S)

mkdir -p $BACKUP_DIR

docker exec ai-postgres pg_dump \
  -U aitool \
  -d aitool \
  > $BACKUP_DIR/aitool_$DATE.sql

find $BACKUP_DIR -type f -name "*.sql" -mtime +14 -delete
EOF

添加执行权限:

chmod +x ~/apps/ai-tool/backup_postgres.sh

配置定时任务:

crontab -e

添加:

30 2 * * * /home/deploy/apps/ai-tool/backup_postgres.sh >> /home/deploy/apps/ai-tool/logs/backup.log 2>&1

3. PostgreSQL 恢复

假设备份文件是:

aitool_2025-01-01_02-30-00.sql

恢复命令:

cat ~/apps/ai-tool/backups/postgres/aitool_2025-01-01_02-30-00.sql | \
docker exec -i ai-postgres psql -U aitool -d aitool

十七、向量数据库数据备份

如果使用 Qdrant,可以直接备份数据目录:

mkdir -p ~/apps/ai-tool/backups/qdrant

先停止 Qdrant:

docker compose stop qdrant

压缩备份:

tar -czvf ~/apps/ai-tool/backups/qdrant/qdrant_$(date +%F_%H-%M-%S).tar.gz \
  -C ~/apps/ai-tool/data qdrant

重新启动:

docker compose start qdrant

删除 14 天前备份:

find ~/apps/ai-tool/backups/qdrant -type f -name "*.tar.gz" -mtime +14 -delete

恢复时:

docker compose stop qdrant
rm -rf ~/apps/ai-tool/data/qdrant
tar -xzvf ~/apps/ai-tool/backups/qdrant/qdrant_2025-01-01_02-30-00.tar.gz \
  -C ~/apps/ai-tool/data
docker compose start qdrant

十八、生产环境安全加固

1. 禁止数据库端口公网访问

检查 Docker Compose 中是否存在类似配置:

ports:
  - "5432:5432"

如果有,生产环境建议删除,改为:

expose:
  - "5432"

Redis、Qdrant 同理。

2. SSH 安全加固

编辑 SSH 配置:

sudo vim /etc/ssh/sshd_config

建议配置:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 2222

重启 SSH:

sudo systemctl restart ssh

放行新端口:

sudo ufw allow 2222/tcp
sudo ufw reload

确认新端口可登录后,再关闭旧端口:

sudo ufw delete allow 22/tcp

3. API 鉴权

生产环境不建议裸奔接口。至少应该加入:

  • API Key
  • JWT
  • OAuth2
  • 企业 SSO
  • IP 白名单
  • 请求签名

如果只做简单保护,可以在 Nginx 层添加 Basic Auth。

安装工具:

sudo apt install -y apache2-utils

生成账号密码文件:

mkdir -p ~/apps/ai-tool/nginx/auth
htpasswd -c ~/apps/ai-tool/nginx/auth/.htpasswd admin

修改 docker-compose,为 nginx 挂载认证文件:

      - ./nginx/auth/.htpasswd:/etc/nginx/.htpasswd:ro

在 Nginx location / 中增加:

auth_basic "AI Tool";
auth_basic_user_file /etc/nginx/.htpasswd;

重启:

docker compose restart nginx

十九、模型 API Key 管理建议

AI 工具最容易出现的安全问题之一是 API Key 泄露。建议:

  1. 不要把 Key 写死在代码中。
  2. 不要把 .env 提交到 Git 仓库。
  3. 不要在前端暴露模型 API Key。
  4. 不要在日志中打印完整 Key。
  5. 定期轮换 Key。
  6. 给不同环境使用不同 Key。
  7. 给不同团队或租户分配不同 Key。
  8. 如果支持额度限制,务必开启预算上限。

可以用下面命令检查项目中是否误提交密钥:

grep -R "sk-" . --exclude-dir=.git
grep -R "OPENAI_API_KEY" . --exclude-dir=.git

如果已经提交过密钥,应立即吊销旧 Key,并生成新 Key。


二十、性能优化建议

AI 工具的性能瓶颈通常不只在后端服务本身,还包括模型调用、向量检索、文件解析、数据库查询、网络延迟和并发控制。

1. 应用层优化

如果使用 Uvicorn,可以根据 CPU 核心数调整 workers:

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]

如果请求是长连接或流式输出,不能盲目增加 worker,需要结合内存和并发测试。

2. Nginx 超时设置

大模型响应时间可能较长,建议配置:

proxy_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;

如果使用流式输出,还可以增加:

proxy_buffering off;

3. Redis 缓存

适合缓存:

  • 用户会话
  • 热门问题结果
  • 模型响应片段
  • 知识库检索结果
  • 限流计数器
  • 异步任务状态

4. 数据库索引

如果有大量对话记录和任务记录,需要给常用查询字段建索引,例如:

CREATE INDEX idx_messages_user_id ON messages(user_id);
CREATE INDEX idx_messages_created_at ON messages(created_at);
CREATE INDEX idx_tasks_status ON tasks(status);

二十一、健康检查与自动重启

Docker Compose 中已经设置:

restart: always

但更推荐增加健康检查。例如给 ai-app 增加:

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 30s

修改后重启:

docker compose up -d

查看健康状态:

docker ps

二十二、上线发布流程

生产环境不建议直接手动改代码后重启,建议采用固定流程:

  1. 本地开发完成。
  2. 提交 Git。
  3. 测试环境验证。
  4. 构建 Docker 镜像。
  5. 推送镜像仓库。
  6. 生产环境拉取镜像。
  7. 滚动更新或短暂停机更新。
  8. 健康检查。
  9. 日志观察。
  10. 异常回滚。

如果是当前 Compose 方式,可以这样更新:

cd ~/apps/ai-tool
git pull
docker compose build ai-app
docker compose up -d ai-app
docker compose logs -f ai-app

如果需要完全重启:

docker compose down
docker compose up -d --build

如果更新失败,可以回滚到上一个 Git 版本:

git log --oneline
git checkout 上一个commit_id
docker compose up -d --build

二十三、接入本地大模型的部署方式

如果你要本地部署模型,可以增加一个推理服务,例如 Ollama。

1. 安装 Ollama Docker 服务

docker-compose.yml 中增加:

  ollama:
    image: ollama/ollama:latest
    container_name: ai-ollama
    restart: always
    volumes:
      - ./data/ollama:/root/.ollama
    networks:
      - ai-net
    expose:
      - "11434"

启动:

docker compose up -d ollama

下载模型:

docker exec -it ai-ollama ollama pull qwen2.5:7b

测试模型:

docker exec -it ai-ollama ollama run qwen2.5:7b

在应用中访问:

http://ollama:11434

2. GPU 环境说明

如果需要 GPU 推理,需要安装 NVIDIA 驱动和 NVIDIA Container Toolkit。

安装驱动:

sudo apt install -y ubuntu-drivers-common
ubuntu-drivers devices
sudo ubuntu-drivers autoinstall
sudo reboot

重启后验证:

nvidia-smi

安装 NVIDIA Container Toolkit:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

添加源:

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

安装:

sudo apt update
sudo apt install -y nvidia-container-toolkit

配置 Docker:

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

验证容器访问 GPU:

docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi

Ollama 使用 GPU 时,可以这样配置:

  ollama:
    image: ollama/ollama:latest
    container_name: ai-ollama
    restart: always
    volumes:
      - ./data/ollama:/root/.ollama
    networks:
      - ai-net
    expose:
      - "11434"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

二十四、监控与告警

生产环境至少要监控:

  • CPU 使用率
  • 内存使用率
  • 磁盘使用率
  • 容器状态
  • 请求错误率
  • 接口延迟
  • 模型调用失败率
  • Token 消耗
  • 数据库连接数
  • Redis 内存
  • 向量数据库状态

可以先用简单命令排查:

htop
df -h
free -h
docker stats
docker compose ps

查看磁盘大文件:

sudo du -h --max-depth=1 /var/lib/docker | sort -hr
du -h --max-depth=1 ~/apps/ai-tool | sort -hr

如果需要更完整的监控,可以部署 Prometheus 和 Grafana。对于中小型项目,即使暂时不上完整监控,也建议至少配置:

  • 云厂商主机监控
  • 磁盘告警
  • 服务不可用告警
  • HTTPS 证书过期告警
  • 模型 API 额度告警

二十五、常见故障排查

1. 容器启动失败

查看状态:

docker compose ps

查看日志:

docker compose logs -f ai-app

重新构建:

docker compose build --no-cache ai-app
docker compose up -d

2. 端口被占用

查看 80 端口:

sudo lsof -i :80

查看 443 端口:

sudo lsof -i :443

停止占用服务:

sudo systemctl stop nginx
sudo systemctl disable nginx

或者停止对应容器:

docker ps
docker stop 容器ID

3. 域名无法访问

检查 DNS:

nslookup ai.example.com

检查防火墙:

sudo ufw status

检查 Nginx 日志:

docker compose logs -f nginx

检查服务是否监听:

curl http://127.0.0.1/health

4. HTTPS 证书申请失败

常见原因:

  • 域名没有解析到服务器。
  • 80 端口没有开放。
  • 80 端口被其他服务占用。
  • 云厂商安全组没有放行 80。
  • Certbot 申请频率过高。

排查命令:

sudo ufw status
sudo lsof -i :80
curl http://ai.example.com

5. 磁盘空间不足

查看磁盘:

df -h

清理 Docker:

docker system prune -a
docker builder prune -a

清理日志:

sudo journalctl --vacuum-time=7d

查看项目目录占用:

du -h --max-depth=1 ~/apps/ai-tool | sort -hr

二十六、生产部署检查清单

上线前建议逐项确认:

  • [ ] 应用通过 Docker 或 Kubernetes 部署。
  • [ ] 数据库、Redis、向量数据库未暴露公网。
  • [ ] 已启用 HTTPS。
  • [ ] .env 权限已限制。
  • [ ] API Key 未提交到 Git。
  • [ ] 已配置防火墙。
  • [ ] SSH 已禁用 root 登录或至少使用密钥登录。
  • [ ] 已配置数据库备份。
  • [ ] 已验证备份可恢复。
  • [ ] 已配置日志轮转。
  • [ ] 已配置健康检查。
  • [ ] 已设置服务自动重启。
  • [ ] 已配置基础监控和告警。
  • [ ] 已进行接口压测。
  • [ ] 已准备回滚方案。
  • [ ] 已限制上传文件大小。
  • [ ] 已对用户输入、文件内容和日志做安全处理。
  • [ ] 已设置模型调用额度和限流策略。

二十七、总结

AI 工具的生产环境部署,核心不是把服务启动起来,而是让它在真实业务流量、复杂网络环境、模型调用波动、数据持续增长和安全风险中稳定运行。对于大多数团队来说,Docker Compose 是一个非常实用的生产起步方案:部署简单、可维护性强、迁移成本低,也方便后续平滑演进到 Kubernetes。

本文给出了一套完整的单机生产部署流程,包括服务器初始化、Docker 安装、防火墙配置、应用容器化、Nginx 反向代理、HTTPS 证书、数据库和向量数据库、日志管理、备份恢复、安全加固、本地模型接入、GPU 配置、监控告警和故障排查。

如果你的 AI 工具还处于早期阶段,建议先按照本文方案搭建一套稳定、可备份、可恢复、可监控的生产环境。等业务规模增长后,再逐步引入镜像仓库、CI/CD、Kubernetes、服务网格、分布式日志、全链路追踪和多区域容灾。这样既能快速上线,也能避免后期因为架构混乱而付出高昂的迁移成本。

目录结构
全文