ollama2api 非 Docker 部署记录:venv 跑通 → systemd 常驻 → Nginx 反代

这篇是我自己折腾 ollama2api 的笔记:不走 Docker,直接在宿主机用 Python 虚拟环境跑起来,然后再做成 systemd 常驻服务。最后补一段 Nginx 反代(可选)。

写出来主要是怕自己过两个月忘了……照着这篇抄,基本就能复现。


先讲清楚:这个项目到底干啥的?

一句话:它是个 FastAPI 服务(入口 main.py),对外提供 OpenAI 兼容接口:

  • /v1/chat/completions
  • /v1/models

后端连的是 Ollama(可以一个,也可以多个),还带管理后台(/admin)和健康检查(/health)。


不使用 Docker 的部署方式有哪些?

我实际用下来,核心就三段:

  1. 方式 A:本机/虚拟环境直接跑(python + uvicorn)——先跑通最重要
  2. 方式 B:在 A 的基础上做成 systemd 常驻服务——上线长期跑
  3. 方式 C(可选):Nginx 反代到域名 + 认证——需要外网访问后台时再上

方式 A:本机直接运行(最简单,适合先跑通)

1)准备 Python(要求 3.10+)

apt update -y
apt install -y python3 python3-venv python3-pip git
python3 --version

2)拉代码

cd /root
git clone https://github.com/xiaolajiaoyyds/ollama2api
cd ollama2api

3)创建虚拟环境并安装依赖

python3 -m venv venv
source venv/bin/activate

pip install -U pip
pip install -r requirements.txt

依赖都在 requirements.txt 里:fastapi、uvicorn、aiohttp、pydantic、pyyaml 等。项目在 Linux 下如果检测到 uvloop 会启用(Windows 就不会用)。

4)启动(前台跑,便于看日志)

默认端口是 8001。我习惯先只监听本机回环,安全一点:

uvicorn main:app --host 127.0.0.1 --port 8001

验证(本机):

curl -sS http://127.0.0.1:8001/health | jq .
curl -sS http://127.0.0.1:8001/v1/models | jq .

管理后台入口(本机):

  • http://127.0.0.1:8001/admin

(项目里根路径 / 会跳转到 /admin/login。)

4.1)管理员默认账号/密码是什么?(非常重要)

这个项目的管理员账号密码来自两处(按优先级):

  1. 环境变量ADMIN_USERNAME / ADMIN_PASSWORD
  2. 首次启动写入的配置文件data/config.json

默认值(没改任何东西时):

  • 账号:admin
  • 密码:changeme

建议:你只要能登进去第一件事就是改掉,别把默认密码放到公网环境里。

4.2)怎么修改管理员密码?

我常用两种方式,任选其一:

方式 A:直接改配置文件(最直观)

# 停服务(如果你是 systemd 常驻)
systemctl stop ollama2api

# 编辑配置
nano /root/ollama2api/data/config.json

# 找到并修改:
#   "admin_username": "admin"
#   "admin_password": "你的新密码"

# 再启动
systemctl start ollama2api

方式 B:用环境变量覆盖(适合写进 systemd)

前台临时跑可以这样(只对本次进程生效):

ADMIN_USERNAME=admin ADMIN_PASSWORD='你的强密码' 
uvicorn main:app --host 127.0.0.1 --port 8001

如果你是 systemd,推荐在 service 里加:

Environment=ADMIN_USERNAME=admin
Environment=ADMIN_PASSWORD=你的强密码

5)怎么接入 Ollama(最直观的办法)

我一般不先搞什么扫描发现,直接在后台 /admin 里添加后端(backends):

  • 同机:http://127.0.0.1:11434
  • 内网:http://192.168.x.x:11434

加完再回到终端看 /v1/models 是否能看到模型就行。


方式 B:systemd 常驻(最推荐,掉了自动拉起)

1)先确认方式 A 跑通

确保下面三行能正常启动,访问 health 也能通:

cd /root/ollama2api
source venv/bin/activate
uvicorn main:app --host 127.0.0.1 --port 8001

确认 OK 后 Ctrl+C 退出。

2)写 systemd 服务文件

创建文件:

  • /etc/systemd/system/ollama2api.service

内容如下(整段复制):

[Unit]
Description=ollama2api (Ollama to OpenAI compatible API)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=/root/ollama2api
ExecStart=/root/ollama2api/venv/bin/python -m uvicorn main:app --host 127.0.0.1 --port 8001

Restart=always
RestartSec=2

# 日志(可选):也可以只用 journalctl
StandardOutput=append:/root/ollama2api/logs/stdout.log
StandardError=append:/root/ollama2api/logs/stderr.log

NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

3)启动并设置开机自启

systemctl daemon-reload
systemctl enable --now ollama2api

systemctl status ollama2api --no-pager
ss -ltnp | grep 8001

日志查看:

journalctl -u ollama2api -n 100 --no-pager

# 或者看你指定的文件日志:
tail -n 50 /root/ollama2api/logs/stdout.log
tail -n 50 /root/ollama2api/logs/stderr.log

方式 C:反代到域名(可选,但建议加认证)

如果你要外网访问后台/接口,我的原则是:服务继续只监听 127.0.0.1:8001,外网只放 Nginx 的 80/443。

Nginx 反代示例:

location / {
  auth_basic "ollama2api";
  auth_basic_user_file /path/to/htpasswd;

  proxy_pass http://127.0.0.1:8001;
}

常见问题(我自己最常遇到的)

  1. 端口冲突ss -ltnp | grep 8001 看谁占了,改端口即可。
  2. /v1/models 为空:通常是还没在后台添加 Ollama 后端,或者 Ollama 地址填错/网络不通。
  3. 要不要装 masscan / xray?不做扫描、不走代理的话,都不需要。它们属于可选增强。

最后

这套跑通后,基本就是:ollama2api 把 Ollama 包装成 OpenAI API,然后你就可以拿它去接 OpenClaw / Cursor / 各种 OpenAI 兼容客户端了。

如果我后面又踩坑(比如证书、反代、鉴权、模型映射),我再补一篇续集。