logo
0
0
WeChat Login
fix: 过滤 Cloudflare 隧道日志中的 api 域名干扰

Run gemma4 on Ollama via CNB

badge

基于腾讯云 CNB 云原生开发环境,一键启动 Ollama 服务运行 Gemma4 大模型。预置模型文件,GPU 加速,零配置即开即用。

项目结构

/workspace/ ├── .bashrc # 工作区 Shell 配置(环境变量、自动启动、快捷别名) ├── .cnb.yml # CNB 编排配置(Ollama 镜像、GPU H20、SSH 服务) ├── cloudflared # Cloudflared 隧道工具(公网穿透) ├── monitor.sh # 监控面板脚本(GPU / API / 系统) ├── cf.log # Cloudflare 隧道地址日志 └── models/ # Ollama 模型存储目录 ├── blobs/ # 模型分片文件 └── manifests/ # 模型清单注册表

内置模型

模型大小说明
gemma4:31b~19 GBGoogle Gemma 4 31B 参数,支持多轮对话与推理

快速开始

1. 启动环境

  1. Fork 本仓库到自己的组织下
  2. 选择分支,点击 云原生开发 启动远程开发环境
  3. 5~9 秒 后进入终端,Ollama 已自动就绪

2. 使用模型

ollama run gemma4:31b # 交互式对话 ollama list # 查看已安装模型

3. 快捷别名

终端已预置以下别名,开箱即用:

别名命令说明
olollama执行任意 ollama 命令
ollistollama list列出已安装模型
olrunollama run运行模型交互

查看隧道与 API 信息

方式一:监控脚本(推荐,信息最全)

./monitor.sh --api # 仅显示 API 地址信息 ./monitor.sh # 显示全部(含 GPU + API + 系统)

输出示例:

═══ 🌐 API 地址信息 ═══ ☁ Cloudflare 隧道(推荐): https://xxx-xxx-xxx.trycloudflare.com API Base: https://xxx-xxx-xxx.trycloudflare.com/v1 优势: 无60秒超时, 无1小时限制 CNB 代理地址: https://xxxxx.cnb.run Model: gemma4:31b API Key: (任意值,如 ollama)

方式二:一键启动脚本(自动检测并输出)

./start.sh # 启动后自动打印完整 API 信息

输出包含:

  • Cloudflare 隧道 URL 及各端点路径
  • CNB 代理地址
  • 连接参数表(Model / API Key / 格式)
  • 本地连通性测试结果

方式三:命令行直接查看

需求命令说明
获取隧道地址grep -oE 'https://[a-zA-Z0-9-]+\.trycloudflare\.com' /workspace/cf.log | grep -v api | tail -1从日志提取公网 URL
查看隧道进程pgrep -a cloudflared确认隧道是否运行
查看完整日志cat /workspace/cf.log包含连接详情和错误记录
查看 Ollama 进程pgrep -a ollama确认服务是否运行
验证模型可用ollama list列出已安装模型
检查模型加载状态ollama ps查看是否已在 GPU 中运行

方式四:环境变量(Shell 内使用)

.bashrc 在启动时自动将隧道地址导出为环境变量:

source ~/.bashrc # 加载配置 echo $CF_URL # 输出隧道地址,如 https://xxx.trycloudflare.com

API 地址汇总

获取到隧道地址后,拼接方式如下:

基础 URL: <CF_URL> ├── API Base: <CF_URL>/v1 ├── 对话补全: <CF_URL>/v1/chat/completions POST ├── 模型列表: <CF_URL>/v1/models GET └── 原生端点: <CF_URL>/api/tags GET (Ollama 原生)

接入客户端时填写:

字段
API Base URL<CF_URL>/v1
Modelgemma4:31b
API Keyollama(任意非空值即可)

公网访问

本项目提供两种公网接入方式:

方式一:Cloudflare 隧道(推荐)

环境启动后自动创建 Cloudflare 隧道,无超时限制:

./monitor.sh --api # 查看隧道地址

或直接读取日志:

cat /workspace/cf.log | grep trycloudflare

方式二:CNB 代理端口

在 CNB 的 PORTS 配置中添加 11434 并开启公网访问即可。

接入 AI 客户端

Ollama 兼容 OpenAI API 格式,可直接接入各类 LLM 客户端:

参数
API Base URL<公网地址>/v1
Modelgemma4:31b
API Key任意值(如 ollama

支持端点:

  • POST /v1/chat/completions — 对话补全
  • GET /v1/models — 模型列表

兼容客户端举例:OpenClawWorkbuddyChatGPT-Next-Web 等。

SSH 远程连接

环境自动启动 SSH 服务,可用于远程连接或端口转发:

参数
主机CNB 分配的公网 IP
用户root
密码cnb_ollama2026
ssh root@<cnb-host>

监控面板

内置 monitor.sh 一键查看系统状态:

./monitor.sh # 全部信息(GPU + API + 系统) ./monitor.sh --gpu # 仅显示 GPU / 显存状态 ./monitor.sh --api # 仅显示 API 地址信息 ./monitor.sh --watch # 持续刷新模式(每 3 秒,Ctrl+C 退出)

监控内容:

模块信息
🎮 GPU / 显存显卡型号、显存使用/总量/空闲、利用率、功耗、温度、活跃进程
🌐 API 地址Cloudflare 隧道地址、CNB 代理地址、Model 名称、API Key
💻 系统资源CPU 使用率、内存占用、磁盘用量

技术规格

  • 基础镜像ollama/ollama:latest
  • GPU:NVIDIA H20 (CNB gpu:H20 标签)
  • 架构:amd64
  • Ollama 监听0.0.0.0:11434
  • 模型目录/workspace/models

一键启动脚本

环境内置 start.sh 自动化脚本,可一键完成全部初始化:

./start.sh # 正常启动(跳过已运行的服务) ./start.sh --restart # 强制重启所有服务(Ollama + 隧道) ./start.sh --no-tunnel # 仅启动 Ollama,不创建隧道

脚本自动执行以下步骤:

  1. 设置环境变量 (OLLAMA_MODELS, OLLAMA_HOST, OLLAMA_ORIGINS)
  2. 启动 Ollama 服务并等待就绪
  3. 验证 gemma4:31b 模型可用性
  4. 创建 Cloudflare 公网隧道
  5. 输出完整 API 连接信息
  6. 执行本地连通性测试

常见问题处理

Q1: 执行 ollama 命令报错 ollama: not found

原因:当前 Shell 未加载工作区配置,PATH 或别名未生效。

解决方案

# 方式一:手动加载配置(推荐) source ~/.bashrc # 或 . ~/.bashrc # 方式二:使用绝对路径 /usr/bin/ollama list # 方式三:使用预置别名 ollist # 等同于 ollama list olrun gemma4:31b # 等同于 ollama run gemma4:31b

说明.bashrc 中包含 OLLAMA_MODELS=/workspace/modelsOLLAMA_HOST=0.0.0.0 等关键环境变量。如果未加载,Ollama 将找不到模型目录或无法绑定端口。


Q2: Ollama 服务未运行或端口 11434 未监听

原因:Ollama 进程未启动或已崩溃。

排查步骤

# 1. 检查进程是否存在 pgrep -a ollama # 2. 检查日志 tail -20 /tmp/ollama.log # 3. 手动重启服务 export OLLAMA_MODELS=/workspace/models OLLAMA_HOST=0.0.0.0 nohup ollama serve > /tmp/ollama.log 2>&1 & sleep 3 ollama list # 验证是否正常

一键修复

./start.sh --restart

Q3: Cloudflare 隧道创建失败

常见错误信息

  • failed to request quick Tunnel: ... EOF — 网络连接中断
  • tunnel address is empty — 隧道地址未成功获取

解决方案

# 1. 重启隧道即可(最常用) pkill -f cloudflared sleep 2 rm -f /workspace/cf.log nohup /workspace/cloudflared tunnel --url http://127.0.0.1:11434 > /workspace/cf.log 2>&1 & sleep 10 grep "trycloudflare" /workspace/cf.log | tail -3 # 2. 使用一键脚本(推荐) ./start.sh --restart

验证隧道状态

# 查看进程 pgrep -a cloudflared # 获取地址(过滤掉 api.trycloudflare.com 的干扰匹配) grep -oE 'https://[a-zA-Z0-9-]+\.trycloudflare\.com' /workspace/cf.log | grep -v api | tail -1

Q4: API 调用超时或无响应

症状原因解决方案
本地调用慢模型首次加载到 GPU 显存等待 30~60 秒,首次加载后后续请求会很快
外部调用超时CNB 代理有 60s/1h 限制切换到 Cloudflare 隧道地址
隧道访问不通隧道未建立或已断开运行 ./start.sh --restart
报 404 错误URL 路径错误确认使用 /v1/chat/completions(非 /api/chat

快速诊断命令

# 检查模型是否已加载到 GPU(有输出表示已加载) ollama ps # 测试本地 API(需要 python3) python3 -c " import urllib.request, json req = urllib.request.Request('http://127.0.0.1:11434/v1/chat/completions', data=json.dumps({'model':'gemma4:31b','messages':[{'role':'user','content':'hi'}],'stream':False}).encode(), headers={'Content-Type':'application/json'}) resp = urllib.request.urlopen(req, timeout=120) print(resp.read().decode()) "

Q5: GPU 显存不足或模型无法加载

现象说明
gemma4:31b 占用 ~72GB 显存正常现象,H20 有 96GB 显存
ollama ps 无输出模型未加载,首次请求会触发自动加载

查看显存状态

./monitor.sh --gpu # 可视化显存占用 nvidia-smi # NVIDIA 官方工具

如果显存被其他进程占满:

# 查看 GPU 进程占用 nvidia-smi pmon # 重启 Ollama 释放显存 ./start.sh --restart

Q6: Shell 提示 shopt: not found 或语法错误

原因:当前终端使用的是 sh 而非 bash,部分 bash 特有语法不支持。

解决:切换到 bash 环境:

bash # 进入 bash Shell source ~/.bashrc # 加载配置 ollist # 使用别名

此问题不影响 Ollama 核心功能,仅影响 .bashrc 中的个别高级特性。


Q7: 环境重启后所有服务丢失

原因:容器重启后后台进程不会自动恢复。

解决方案 — 在每次进入终端后执行:

./start.sh --restart # 一键恢复全部服务

如需完全自动化,可将以下内容追加到 /root/.bashrc(末尾):

# 每次登录时自动启动全部服务 if [ -f /workspace/start.sh ]; then /workspace/start.sh >/dev/null 2>&1 & fi

问题速查表

命令用途
./start.sh --restart一键重启全部服务(首选方案)
pgrep -a ollama | pgrep -a cloudflared检查服务进程状态
ollama list验证模型可用性
ollama ps查看模型是否已加载到 GPU
tail -20 /tmp/ollama.log查看 Ollama 日志
tail -10 /workspace/cf.log查看隧道日志和地址
./monitor.sh --watch实时监控系统状态