1. 购买与初始化 VPS
目标:获得一台有公网 IP 的 Linux 服务器,能通过 SSH 登录。
推荐云厂商(海外访问友好):
- DigitalOcean – 基础 $6/月,新用户送 $200 免费额度(需绑卡)
- Vultr – 最低 $2.5/月(共享 CPU),东京/新加坡节点低延迟
- Linode(Akamai) – 最低 $5/月,稳定性好
国内用户(需备案):
- 阿里云 – 轻量应用服务器 2C2G 约 80 元/月
- 腾讯云 – 同配置类似价格,新用户 3 年 200 元
- 华为云 – 适合企业级,弹性 IP 按量计费
选购要点:
- 运行 AI 推理(如 Ollama + 7B 模型):建议 4 核 8G 起,20GB 以上磁盘。
- 运行 WebUI + 代理:2C2G 也能跑,但推理慢。
- 系统镜像:选择 Ubuntu 22.04 LTS 或 Debian 12(官方支持好,命令通用)。
购买后获取:
- 公网 IP(如
123.123.123.123) - root 密码 或 SSH 密钥
首次登录(示例,替换 IP):
ssh root@123.123.123.123若用密钥:
ssh -i ~/.ssh/your_key root@123.123.123.1232. 基础安全加固
创建非 root 用户(后续所有操作在该用户下,降低风险):
adduser deployer # 创建用户,按提示设置密码
usermod -aG sudo deployer # 赋予 sudo 权限
su - deployer # 切换到新用户更新系统并安装必需组件:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git ufw fail2ban配置防火墙(只放行 SSH、HTTP、HTTPS):
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw status verbose # 检查状态加固 SSH(可选,推荐):
sudo sed -i 's/^#Port 22/Port 22/' /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd⚠️ 修改前确保当前用户有 sudo 权限且能通过密钥登录,否则可能被锁。
3. 安装 Docker 与 Docker Compose
Docker 用于容器化 AI 服务,隔离依赖。Docker Compose 便于管理多容器(如 WebUI + 模型引擎)。
安装 Docker(官方脚本,加镜像加速):
curl -fsSL https://get.docker.com | sudo bash
sudo usermod -aG docker $USER # 当前用户免 sudo 执行 docker
newgrp docker # 刷新组为国内用户配置镜像加速(否则拉镜像慢):
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker验证:
docker --version
docker run hello-world安装 Docker Compose(独立二进制,非 plugin):
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version4. 部署 AI 服务(以 Ollama + Open WebUI 为例)
AI 服务形态多样,这里选择最流行的本地 LLM 方案:
- Ollama – 轻量级 LLM 推理引擎,支持多种开源模型。
- Open WebUI – 类 ChatGPT 界面,支持对话、文件上传、RAG。
创建项目目录:
mkdir -p ~/ai-stack && cd ~/ai-stack编写 docker-compose.yml:
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./ollama_data:/root/.ollama
environment:
- OLLAMA_KEEP_ALIVE=24h # 保持模型加载
- OLLAMA_HOST=0.0.0.0
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu] # 如果有 NVIDIA GPU 可去掉注释
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- ./openwebui_data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=your_secret_change_me # 替换为随机字符串
depends_on:
- ollama启动服务:
docker-compose up -d验证:
curl http://localhost:11434/api/tags
# 应返回空列表(未拉模型)拉取模型(以 qwen2.5:7b 为例,约 4.7GB):
docker exec -it ollama ollama pull qwen2.5:7b
# 进度条走完即可。中国用户若慢,可先用国内镜像:ollama.1ms.run临时测试:
curl -X POST http://localhost:11434/api/generate -d '{
"model": "qwen2.5:7b",
"prompt": "Hello, who are you?",
"stream": false
}'现在可通过 http://你的VPS公网IP:3000 访问 Open WebUI 界面。注册第一个用户即管理员。
5. 配置域名与 SSL(Nginx + Certbot)
直接暴露端口不安全且无加密。通过 Nginx 反向代理 + Let's Encrypt SSL。
安装 Nginx:
sudo apt install -y nginx
sudo systemctl enable nginx配置反向代理(编辑 /etc/nginx/sites-available/ai.yourdomain.com):
server {
listen 80;
server_name ai.yourdomain.com; # 替换为你的域名
# 自动重定向到 HTTPS(稍后配置后取消注释)
# return 301 https://$host$request_uri;
location / {
proxy_pass http://127.0.0.1:3000;
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;
# WebSocket 支持(Open WebUI 用到)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}启用站点:
sudo ln -s /etc/nginx/sites-available/ai.yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx安装 SSL 证书(使用 Certbot 和 ACME):
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d ai.yourdomain.com # 按提示输入邮箱,同意条款Certbot 会自动修改 Nginx 配置并启用 HTTPS。续期自动(systemd timer):
sudo systemctl list-timers | grep certbot最终 Nginx 配置(Certbot 生成,示例如下):
server {
listen 443 ssl;
server_name ai.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/ai.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ai.yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://127.0.0.1:3000;
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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
# 拒绝非域名访问
if ($host != "ai.yourdomain.com") {
return 403;
}
}
server {
listen 80;
server_name ai.yourdomain.com;
return 301 https://$server_name$request_uri;
}DNS 解析:前往域名控制台添加 A 记录,指向 VPS 公网 IP。等待生效(通常 30 秒–2 分钟)。
6. 维护与监控
查看服务状态:
docker-compose ps
docker-compose logs -f # 实时日志重启单个服务:
docker-compose restart ollama更新镜像:
docker-compose pull
docker-compose up -d监控资源:
htop(需安装:sudo apt install htop)docker stats- 若担心磁盘爆满,配置日志轮转(默认
/var/lib/docker/containers/会增长):
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"registry-mirrors": [
"https://docker.1ms.run"
]
}
EOF
sudo systemctl restart docker备份(定期备份 ~/ai-stack/ollama_data 和 ~/ai-stack/openwebui_data):
tar -czf ai-backup-$(date +%Y%m%d).tar.gz ~/ai-stack7. 常见问题
Q:无法拉取模型(Ollama pull 超时)
国内用户使用代理:
export HTTP_PROXY=http://your-proxy:port
export HTTPS_PROXY=http://your-proxy:port
docker exec -it ollama ollama pull qwen2.5:7b或者改用国内镜像源(如 ollama.1ms.run):
docker exec -it ollama ollama pull qwen2.5:7b --mirror https://ollama.1ms.runQ:Open WebUI 登录后显示“Ollama 连接失败”
检查 docker-compose.yml 中的 OLLAMA_BASE_URL 是否指向 http://ollama:11434(容器内通信),并确认 ollama 容器运行正常。
Q:Nginx 返回 502 Bad Gateway
- 确保 Open WebUI 容器的端口
3000:8080映射正确。 - 可以临时用
curl http://127.0.0.1:3000测试本地连通性。 - 查看 Nginx 日志:
sudo tail -f /var/log/nginx/error.log
Q:端口被占(如 3000 已用)
修改 docker-compose.yml 中 ports 映射,例如 "3001:8080",然后更新 Nginx 的 proxy_pass 到 http://127.0.0.1:3001。
8. 总结
完成以上步骤,你已拥有一个:
- 运行在 VPS 上的 AI 服务(Ollama + Open WebUI)
- 通过域名 + HTTPS 安全访问
- 基础防火墙、Fail2ban 防护
- Docker 容器化管理,易于更新和迁移
后续可扩展:挂载额外的模型(如 llama3.1、deepseek)、接入 RAG 知识库、配置反向代理缓存、或使用 GPU 推理(需安装 nvidia-docker2 及 NVIDIA 驱动)。