Article
用甲骨文免费 ARM 服务器搭建自己的 AI 终端

Oracle Cloud 的永久免费套餐里有一台 4 核 24GB 内存的 ARM 机器,大多数人申请了之后就放那儿跑个 Nginx 代理,其实拿来跑 Ollama + OpenWebUI 相当够用。折腾完之后的效果是:打开自己的域名,一个跟 ChatGPT 长得差不多的聊天页面,后端是跑在本地的开源模型,完全不依赖任何商业 API。
这台机器没有 GPU,所以别想着跑 70B 的大模型,但 4B 到 8B 量化版日常用完全没问题,Qwen3 的 4B 中文效果已经挺不错了。
整体链路很简单:浏览器请求打进来,Nginx 做 HTTPS 反代,转到 OpenWebUI,OpenWebUI 再调 Ollama,Ollama 把结果吐回来。
准备工作
开始之前你需要:一台已经装好 Debian 13 的 Oracle Cloud ARM 实例,一个域名解析到这台机器的公网 IP,以及在云控制台的安全列表里放行 22、80、443 端口。这最后一步经常被忽略,后面出问题十有八九是这里没开。
装系统依赖
SSH 进去之后先把系统更新一遍,然后把后面会用到的东西一次装完:
apt update && apt upgrade -y
apt install -y \
curl wget git nano htop ufw \
ca-certificates gnupg lsb-release \
nginx certbot python3-certbot-nginx \
openssl
启动 Nginx:
systemctl enable nginx && systemctl start nginx
防火墙这边放行需要的端口:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
装 Docker
Debian 仓库里自带的 docker.io 版本比较旧,建议用 Docker 官方源:
# 清掉旧包
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt remove -y $pkg; done
# 加 GPG key 和官方源
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
> /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable docker && systemctl start docker
跑一下 docker run hello-world 确认安装没问题。
配置 OpenWebUI + Ollama
建一个目录放所有相关文件:
mkdir -p /opt/ai-stack/open-webui /opt/ai-stack/ollama
cd /opt/ai-stack
生成一个随机密钥写进环境变量文件:
echo "WEBUI_SECRET_KEY=$(openssl rand -hex 32)" > .env
然后写 docker-compose.yml:
nano docker-compose.yml
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: ai-open-webui
restart: unless-stopped
depends_on:
- ollama
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
- ENABLE_SIGNUP=true
volumes:
- ./open-webui:/app/backend/data
ports:
- "127.0.0.1:3000:8080"
networks:
- ai-net
ollama:
image: ollama/ollama:latest
container_name: ai-ollama
restart: unless-stopped
volumes:
- ./ollama:/root/.ollama
ports:
- "127.0.0.1:11434:11434"
networks:
- ai-net
networks:
ai-net:
driver: bridge
注意 127.0.0.1:3000:8080 这里的写法,OpenWebUI 只监听本机,不直接对外暴露,外部流量必须经过 Nginx。
启动服务:
docker compose pull && docker compose up -d
用 curl -v http://127.0.0.1:3000 确认 OpenWebUI 已经跑起来了。
配置 Nginx 和 HTTPS
创建站点配置,把下面的 ai.example.com 替换成你自己的域名:
nano /etc/nginx/sites-available/ai.example.com
server {
listen 80;
server_name ai.example.com;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:3000;
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;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
}
启用配置,去掉默认站点:
ln -sf /etc/nginx/sites-available/ai.example.com /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
先用 HTTP 访问一下确认反代没问题,再申请证书:
certbot --nginx -d ai.example.com
按提示走,建议选择自动重定向 HTTP 到 HTTPS。完成后跑一次 certbot renew --dry-run 测试自动续期正常。
下载模型
这台机器没 GPU,跑模型靠 CPU,所以别贪心。日常用 qwen3:4b 就够了,偶尔需要质量更高的回答可以调 8B 量化版,但速度会慢一些:
# 主力中文模型,性价比最高
docker exec -it ai-ollama ollama pull qwen3:4b
# 要质量的时候用,速度换质量
docker exec -it ai-ollama ollama pull qwen3:8b-q4_K_M
# 轻量备用,响应最快
docker exec -it ai-ollama ollama pull qwen3:1.7b
# 知识库检索用的 embedding 模型
docker exec -it ai-ollama ollama pull bge-m3
拉完用 docker exec -it ai-ollama ollama list 确认一下。
第一次登录
打开 https://ai.example.com,系统会让你注册账号,第一个注册的就是管理员。如果登进去看不到模型,重启一下容器再刷新页面:
docker restart ai-open-webui
账号建好后,建议关掉公开注册,不然域名被人发现就能随便进来蹭算力。编辑 docker-compose.yml,把 ENABLE_SIGNUP=true 改成 false,然后:
docker compose up -d && docker restart ai-open-webui
关于 Qwen3 的思考模式
Qwen3 支持在对话里手动切换思考模式,前面加 /think 就会展开推理过程,加 /no_think 就直接给答案。如果想在 OpenWebUI 模型列表里直接看到这两个选项,可以创建两个别名模型。
先写一个 Modelfile:
cat > /opt/ai-stack/Modelfile.qwen3-8b-think << 'EOF'
FROM qwen3:8b-q4_K_M
SYSTEM """
/think
你是一个严谨的中文 AI 助手。遇到复杂问题时先分析,再给出清晰结论。
"""
EOF
cat > /opt/ai-stack/Modelfile.qwen3-8b-fast << 'EOF'
FROM qwen3:8b-q4_K_M
SYSTEM """
/no_think
你是一个高效、直接的中文 AI 助手。请直接回答问题,不要输出思考过程。
"""
EOF
然后复制进容器里创建模型:
docker cp /opt/ai-stack/Modelfile.qwen3-8b-think ai-ollama:/tmp/
docker cp /opt/ai-stack/Modelfile.qwen3-8b-fast ai-ollama:/tmp/
docker exec -it ai-ollama ollama create qwen3-8b-think -f /tmp/Modelfile.qwen3-8b-think
docker exec -it ai-ollama ollama create qwen3-8b-fast -f /tmp/Modelfile.qwen3-8b-fast
docker restart ai-open-webui
刷新页面后模型列表里就会多出这两个。
日常维护备忘
# 查看运行状态
cd /opt/ai-stack && docker compose ps
# 看日志(Ctrl+C 退出)
docker compose logs -f
# 更新到最新镜像
docker compose pull && docker compose up -d
# 查看资源占用
docker stats
# 备份(不含模型文件)
cd /opt && tar --exclude='ai-stack/ollama' -czvf ai-stack-backup-$(date +%F).tar.gz ai-stack
如果哪天网页打不开,先查容器状态,再查 Nginx 错误日志 tail -f /var/log/nginx/error.log,通常问题不难定位。