AI 工具上线实战:从服务器初始化到 HTTPS、备份与监控全流程命令指南
AI工具 生产环境部署指南|附完整命令
随着大模型、智能体、RAG 知识库、AI 编程助手、AI 客服、自动化工作流等场景快速落地,越来越多团队开始将 AI 工具从本地测试环境推进到生产环境。然而,生产环境部署与“能跑起来”完全不是一回事。生产环境更关注稳定性、安全性、可观测性、可扩展性、成本控制、权限隔离、数据安全以及故障恢复能力。
本文将以一个通用的 AI 工具服务为例,系统讲解如何从零开始完成生产环境部署。你可以将它理解为一个基于 Python / Node.js / FastAPI / Flask / LangChain / LlamaIndex / Dify / Open WebUI / 自研 AI Agent 后端等形式的 AI 应用服务。文章会尽量使用通用方案,并附上完整命令,方便直接参考落地。
一、生产环境部署前需要明确什么?
在正式部署之前,建议先确认以下几个问题:
-
AI 工具是纯 API 服务,还是带前端页面?
- 纯 API:通常通过 Nginx 反向代理暴露接口。
- 前后端分离:前端可以部署到 Nginx、对象存储或 CDN。
- 全栈服务:可以使用 Docker Compose 或 Kubernetes 管理。
-
是否依赖大模型?
- 调用第三方 API,例如 OpenAI、Claude、通义千问、智谱、DeepSeek。
- 本地部署模型,例如 Qwen、Llama、ChatGLM、Mistral。
- 混合方案:部分任务走外部 API,部分任务走本地推理。
-
是否需要 GPU?
- 如果只是调用第三方模型 API,通常不需要 GPU。
- 如果本地部署推理模型,建议使用 NVIDIA GPU,并安装驱动、CUDA、容器运行时。
-
是否需要数据库或向量数据库?
- 关系型数据库:PostgreSQL、MySQL。
- 缓存:Redis。
- 向量数据库:Milvus、Qdrant、Weaviate、pgvector、Elasticsearch。
-
是否涉及用户数据、企业知识库或隐私信息?
- 需要 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。 - 密码不要使用
123456、password、公司名、项目名。 - 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 泄露。建议:
- 不要把 Key 写死在代码中。
- 不要把
.env提交到 Git 仓库。 - 不要在前端暴露模型 API Key。
- 不要在日志中打印完整 Key。
- 定期轮换 Key。
- 给不同环境使用不同 Key。
- 给不同团队或租户分配不同 Key。
- 如果支持额度限制,务必开启预算上限。
可以用下面命令检查项目中是否误提交密钥:
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
二十二、上线发布流程
生产环境不建议直接手动改代码后重启,建议采用固定流程:
- 本地开发完成。
- 提交 Git。
- 测试环境验证。
- 构建 Docker 镜像。
- 推送镜像仓库。
- 生产环境拉取镜像。
- 滚动更新或短暂停机更新。
- 健康检查。
- 日志观察。
- 异常回滚。
如果是当前 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、服务网格、分布式日志、全链路追踪和多区域容灾。这样既能快速上线,也能避免后期因为架构混乱而付出高昂的迁移成本。