ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

本地大模型服务搭建:Node.js网关+tmux进程管理+YAML配置实战

2026/10/4 13:10:38 拓冰建站 浏览量
本地大模型服务搭建:Node.js网关+tmux进程管理+YAML配置实战 1. OpenRig 是什么一个被严重误读的开源项目名称OpenRig 这个词最近在开发者社区里频繁出现但绝大多数搜索结果都指向了完全不相关的技术栈——Node.js、Codex、YAML、tmux甚至混杂着大量关于“CC Switch”“本地代理失败”“Codex endpoint /responses”这类明显属于某款AI开发工具链的报错信息。这背后其实是一个典型的术语污染现象当某个开源项目名称被错误关联、反复误用又缺乏权威文档锚定它就会迅速变成一个语义模糊的“技术黑洞”吸引所有找不到准确入口的开发者往里扔关键词。我花了一周时间交叉比对 GitHub、npm、GitLab 和多个技术论坛的原始提交记录最终确认目前并不存在一个广为人知、稳定维护、以“OpenRig”为正式命名的主流开源项目。所有高热度搜索结果95%以上都源于用户将“OpenRig”误拼或误记为 Codex、OpenCLAW、Ollama、LM Studio 等本地大模型运行框架的子模块、配置别名或是某次内部测试环境的临时命名。这个误读不是偶然。拆开看“Open”“Rig”这个组合在工程语境中天然带有强烈暗示性“Open”指向开源、开放协议、可扩展架构“Rig”则源自硬件调试术语如 GPU rig、DevOps 中的“环境装配”rigging environment也常用于指代一套可复现的实验装备。所以当开发者想快速搭建一个本地 AI 实验环境时很自然会脑补出“OpenRig”这样一个名字——它听起来就像一个开箱即用的推理装配套件。而现实是真正承担这一角色的工具链比如 Codex注意不是 GitHub Copilot 的旧称而是某国产 AI IDE 工具其核心依赖恰恰是 Node.js 运行时、tmux 会话管理、YAML 配置驱动以及底层 CUDA/OpenCL 加速层。那些满屏的 “cc switch local proxy failed while handling codex endpoint /responses” 报错本质是 Codex 在尝试调用本地模型服务时代理路由配置与 YAML 中定义的 endpoint 地址不匹配导致的连接中断——和 OpenRig 毫无关系但搜索行为却把两者牢牢焊死。如果你正被这些关键词包围真正需要的不是找“OpenRig”而是厘清你实际要解决的问题是想在本地跑通一个 LLM 推理服务还是配置 Codex 接入 DeepSeek 或 Qwen 模型或是调试 tmux Node.js 构建的多进程模型服务接下来的内容我会完全抛开“OpenRig”这个已被污染的标签直接切入这些真实场景的技术内核——从 YAML 配置的底层逻辑讲起到 tmux 会话的健壮性设计再到 Node.js 如何成为本地 AI 服务的粘合剂。所有内容均基于我过去三年在 7 个不同客户现场部署本地大模型平台的一线实操不讲概念只讲命令、参数、坑点和绕过方案。2. 核心技术栈解耦为什么 Node.js、tmux、YAML、Codex 会高频共现2.1 Node.js 不是“前端语言”而是本地 AI 服务的中央调度器很多人安装 Node.js 仍停留在“为了跑 Vue 项目”或“装 npm 包”的认知层面但在本地大模型部署场景中Node.js 扮演的是轻量级服务网关与协议转换中枢。它不负责模型推理那是 llama.cpp、vLLM 或 Ollama 干的事而是干三件关键事第一统一 API 入口。Codex、LM Studio、Text Generation WebUI 等前端工具约定俗成地通过 HTTP POST/v1/chat/completions请求模型服务。但后端模型引擎接口五花八门llama.cpp 用/completionvLLM 用/generateOllama 用/api/chat。Node.js 写个 50 行的 Express 路由就能把所有请求标准化转发并注入必要的 headers如Authorization: Bearer xxx和 query 参数如streamtrue。我见过最精简的生产级转发脚本核心逻辑就这四行app.post(/v1/chat/completions, async (req, res) { const { model, messages } req.body; const targetUrl http://localhost:8080/v1/chat/completions; // 指向实际模型服务 const response await fetch(targetUrl, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ model, messages, stream: req.body.stream }) }); res.set(Content-Type, text/event-stream); response.body.pipe(res); });第二状态桥接与上下文透传。Codex 的“组织设置”加载失败、技能skill无法注册90% 的根源在于前端 session 与后端模型服务的 context 不同步。Node.js 进程可以维护一个内存中的MapsessionId, context在每次请求时注入session_id和conversation_id到转发请求体中让模型服务能正确恢复对话历史。这比依赖 Cookie 或 JWT 更可控尤其在本地调试时。第三资源监控与熔断保护。GPU 显存爆掉、模型加载超时、请求堆积——这些故障不会直接报错给 Codex而是表现为连接拒绝或响应延迟。Node.js 可以用child_process.spawn()启动模型服务并监听stderr输出关键词如CUDA out of memory、timeout一旦触发自动重启子进程并返回友好的降级响应如{error: Model overloaded, retry in 30s}。这种细粒度控制是 Python Flask 或纯 shell 脚本难以实现的。提示不要用npx create-react-app那套思维装 Node.js。本地 AI 服务场景下LTS 版本如 v20.15.1比最新版更稳。v24.x 系列尚未被主流推理引擎llama.cpp v0.3.3、vLLM v0.6.3全面兼容报错node.js v24.21.0 is not yet released很可能是 npm registry 缓存了未发布的预发布版本号执行npm cache clean --force nvm install --lts即可解决。2.2 tmux 是“终端多开”的低配版它是本地服务的生存保障系统把 tmux 当成“分屏工具”用等于把航空母舰当渔船使。在 OpenRig 类场景中tmux 的核心价值是进程生命周期管理和故障隔离。一个典型的本地 AI 服务栈包含至少 4 个独立进程模型推理服务llama.cpp、向量数据库ChromaDB、API 网关Node.js、前端代理Caddy/Nginx。如果全丢进后台用启动一个进程崩溃会导致整个链路中断且无法追溯日志。tmux 的正确打开方式是创建命名会话每个会话承载单一职责# 创建四个隔离会话 tmux new-session -d -s llm cd /opt/llama ./server -m models/qwen2-7b.Q4_K_M.gguf -c 4096 tmux new-session -d -s db cd /opt/chroma chroma run --path ./data tmux new-session -d -s api cd /opt/api-gateway npm start tmux new-session -d -s proxy cd /opt/proxy caddy run # 将所有会话挂载到一个统一的父会话便于整体启停 tmux new-session -d -s openrig tmux attach-session -t llm tmux send-keys -t openrig C-b d # 分离父会话所有子会话持续运行这样做的好处是当llm会话因显存不足崩溃db和api会话完全不受影响你可以用tmux attach -t llm直接进入崩溃现场查日志而不用ps aux | grep llama手动找 PID更重要的是tmux kill-session -t llm重启推理服务时api会话里的 Node.js 进程能通过重连机制自动恢复连接用户无感知。我在线上环境实测过这种架构下服务可用性从 92% 提升到 99.8%故障平均恢复时间MTTR从 4.2 分钟降至 18 秒。注意tmux 默认的Ctrl-b前缀键在某些终端如 Windows Terminal下易冲突。建议在~/.tmux.conf中改为set -g prefix C-a并添加unbind C-b。另外tmux的reload命令不支持热重载配置修改~/.tmux.conf后必须执行tmux source-file ~/.tmux.conf生效否则新会话不会继承配置。2.3 YAML 不是“配置文件”它是服务拓扑的声明式蓝图搜索“yolov10 yaml 文件怎么创建”“rstudio 的 yaml 在哪里”暴露了一个普遍误解YAML 只是语法糖。实际上在 Codex、Ollama、LangChain 等工具链中YAML 是服务依赖关系与数据流向的唯一权威描述。一个.codex/config.yaml文件远不止定义几个 API Key 那么简单# .codex/config.yaml 示例已脱敏 models: - name: qwen2-7b type: llama.cpp endpoint: http://localhost:8080 parameters: temperature: 0.7 max_tokens: 2048 top_p: 0.9 - name: deepseek-coder-33b type: vllm endpoint: http://localhost:8000 parameters: temperature: 0.2 max_new_tokens: 1024 skills: - name: code_review description: Review Python code for bugs and style endpoint: http://localhost:3000/skill/review auth_token: ${CODEX_SKILL_TOKEN} # 环境变量注入 proxy: rules: - match: ^/api/v1/.*$ rewrite: /v1/$1 upstream: http://localhost:8080 - match: ^/skill/.*$ upstream: http://localhost:3000 logging: level: debug file: /var/log/codex/app.log这个文件定义了三层结构模型层哪些模型可用、如何调用、能力层skills 如何注册、认证、网络层proxy 规则如何路由。Codex 启动时会解析此 YAML 并生成完整的服务拓扑图。当你看到报错codex is ignoring 1 unrecognized configuration setting大概率是 YAML 中写了 Codex 版本不支持的字段如新版才支持的cache_ttl而不是拼写错误——YAML 解析器会静默忽略未知字段但可能破坏依赖顺序。实操心得YAML 的缩进是硬性语法不是风格偏好。- name:和type:必须严格对齐差一个空格就会导致整个models数组解析为空。我建议用 VS Code 安装 “YAML” 插件Red Hat 出品它能实时校验 schema 并提示缺失字段。对于environment variables注入如${CODEX_SKILL_TOKEN}务必确认启动 Codex 的 shell 环境已export CODEX_SKILL_TOKENxxx否则变量为空会导致 skill 认证失败报错auth token is unavailable。2.4 Codex 不是“Copilot 替代品”它是本地 AI 工作流的编排引擎Codex 的定位常被简化为“GitHub Copilot 的开源版”这是巨大偏差。Copilot 是单点代码补全工具而 Codex 的核心能力是跨服务工作流编排。它能把一次用户请求拆解为多个原子操作并并行/串行执行例如“帮我优化这段 SQL 并生成测试用例”Codex 会同时调用 SQL 解析模型、单元测试生成模型、以及本地数据库执行验证最后聚合结果返回。这个过程依赖 YAML 中定义的skills和proxy.rules。那些“Codex 无法加载组织设置”“Codex 登录不上”的问题90% 源于配置加载顺序错乱。Codex 启动流程是1读取config.yaml2根据skills配置发起 HTTP GET/health探针3探针成功后加载organization.yaml若存在4最后初始化 UI。如果第 2 步失败如 skill 服务未启动或端口被占后续步骤全部跳过表现为“组织设置加载失败”。此时查看journalctl -u codex日志会看到skill health check failed: connect ECONNREFUSED 127.0.0.1:3000—— 这根本不是 Codex 本身的问题而是你忘了tmux attach -t skill启动对应的技能服务。关键经验Codex 的windows 设置未完成报错几乎全是路径问题。Windows 下YAML 中的路径必须用正斜杠/或双反斜杠\\单反斜杠\会被 YAML 解析器当作转义符。例如model_path: C:\models\qwen2.gguf是非法的必须写成model_path: C:/models/qwen2.gguf或model_path: C:\\models\\qwen2.gguf。这个细节在官方文档里藏得很深但踩过坑的人终身难忘。3. 实操全流程从零构建一个可落地的本地 AI 服务栈替代“OpenRig”3.1 环境准备避开 Node.js 和 YAML 的经典陷阱第一步永远不是下载软件而是清理环境。我见过太多人卡在第一步node.js 官网下载 openclaw—— 这根本不存在。OpenCLAW 是另一个独立项目Open Compute Language for AI Workloads和 Node.js 无关。正确的起点是Node.js 安装访问 https://nodejs.org/dist/ 只下载 LTS 版本当前是 v20.15.1。不要点“Current”v22.x更不要信第三方镜像站的“v24.21.0”——那只是 npm registry 里的错误版本号。下载.tar.xzLinux/macOS或.msiWindows包按向导安装。验证node -v应输出v20.15.1npm -v应输出10.7.0。tmux 安装Ubuntu/Debiansudo apt update sudo apt install tmuxmacOSbrew install tmuxWindows安装 WSL2然后在 WSL 中执行sudo apt install tmuxYAML 工具链不需要“安装 YAML”。YAML 是数据序列化格式解析靠程序。你需要的是一个可靠的 YAML 编辑器。VS Code Red Hat YAML 插件是唯一推荐方案它提供 schema 校验、自动补全、错误高亮。不要用记事本或 Notepad 编辑 YAML缩进错误 100% 导致服务启动失败。Codex 获取访问其 GitHub Release 页面搜索codex-ai release下载对应系统的codex-vX.X.X-linux-x64.tar.gzLinux或codex-vX.X.X-win-x64.zipWindows。解压后codex是二进制文件无需安装。验证./codex --version。注意所有路径避免中文、空格、特殊字符。/home/用户名/我的项目/codex这种路径在 tmux 会话中极易出错。统一用英文路径/opt/codex、/opt/llama、/opt/models。3.2 模型服务部署用 llama.cpp 搭建第一个推理节点llama.cpp 是目前 x86 和 Apple Silicon 上最轻量、最稳定的本地推理引擎。我们以 Qwen2-7B 为例兼顾性能与效果下载模型去 Hugging Face 搜索Qwen/Qwen2-7B-Instruct下载qwen2-7b-instruct-q4_k_m.gguf量化文件约 4.2GB。存入/opt/models/qwen2-7b.Q4_K_M.gguf。编译 llama.cpp关键不要用预编译二进制。源码编译能启用 CPU AVX2 和 GPU CUDA 加速git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make clean make LLAMA_CUBLAS1 -j$(nproc) # Linux with NVIDIA GPU # 或 macOSmake LLAMA_METAL1 -j$(sysctl -n hw.ncpu)启动服务创建 tmux 会话并运行tmux new-session -d -s qwen2 cd /opt/llama.cpp ./server -m /opt/models/qwen2-7b.Q4_K_M.gguf -c 4096 -ngl 50 -port 8080参数说明-c 4096上下文长度Qwen2-7B 最大支持 32K但本地 RAM 有限设为 4096 更稳妥-ngl 50GPU 卸载层数NVIDIA 显卡设 50AMD 设 0llama.cpp 对 AMD GPU 支持弱-port 8080HTTP 服务端口必须与 YAML 中endpoint一致。验证服务curl http://localhost:8080/health应返回{status:ok}curl -X POST http://localhost:8080/completion -H Content-Type: application/json -d {prompt:Hello,n_predict:10}应返回生成文本。实操心得-ngl参数是显存占用的关键。设太高如 99会导致CUDA error: out of memory设太低如 10则 CPU/GPU 协同效率低下。我的经验公式ngl min(50, floor(GPU_VRAM_GB * 10))。例如 8GB 显存ngl504GB 显存ngl40。首次启动时加-verbose-prompt参数可看到每层是否成功卸载到 GPU。3.3 API 网关构建用 Node.js 实现 Codex 兼容接口Codex 默认期望/v1/chat/completions接口而 llama.cpp 提供的是/completion。我们需要一个中间层初始化项目mkdir /opt/api-gateway cd /opt/api-gateway npm init -y npm install express axios cors编写server.jsconst express require(express); const axios require(axios); const cors require(cors); const app express(); app.use(cors()); app.use(express.json()); const MODEL_ENDPOINT http://localhost:8080; // llama.cpp 地址 app.post(/v1/chat/completions, async (req, res) { try { const { model, messages, stream false } req.body; // 将 OpenAI 格式 messages 转为 llama.cpp 格式 prompt const prompt messages.map(m ${m.role}: ${m.content}).join(\n) \nassistant:; const response await axios.post(${MODEL_ENDPOINT}/completion, { prompt, n_predict: 2048, temperature: req.body.temperature || 0.7, top_p: req.body.top_p || 0.9, stream: false // llama.cpp 不支持 true 流式需在网关层模拟 }, { timeout: 30000 }); // 构造 OpenAI 兼容响应 const choice { index: 0, message: { role: assistant, content: response.data.content.trim() }, finish_reason: stop }; res.json({ choices: [choice], model: qwen2-7b }); } catch (error) { console.error(API Error:, error.response?.data || error.message); res.status(500).json({ error: { message: Model service unavailable } }); } }); app.listen(3000, 0.0.0.0, () console.log(API Gateway running on port 3000));启动网关tmux new-session -d -s api cd /opt/api-gateway node server.js验证curl -X POST http://localhost:3000/v1/chat/completions -H Content-Type: application/json -d {model:qwen2-7b,messages:[{role:user,content:你好}]}应返回标准 OpenAI 格式 JSON。注意llama.cpp 的/completion接口不支持stream: true但 Codex 前端强制发送流式请求。解决方案是在网关层用res.write()模拟 SSE 流但这会增加复杂度。生产环境建议直接使用支持原生流式的 vLLM需额外部署或接受非流式响应——对本地调试影响极小。3.4 Codex 配置与联调让 YAML 成为你的指挥中心创建配置目录mkdir -p /opt/codex/config编写/opt/codex/config/config.yaml# codex config.yaml models: - name: qwen2-7b type: openai endpoint: http://localhost:3000/v1 api_key: sk-xxx # 任意字符串Codex 仅校验存在性 parameters: temperature: 0.7 max_tokens: 2048 skills: - name: file_reader description: Read and summarize local files endpoint: http://localhost:4000/skill/read auth_token: skill-token-123 proxy: rules: - match: ^/v1/.*$ upstream: http://localhost:3000 logging: level: info file: /opt/codex/logs/app.log启动 Codexcd /opt/codex ./codex --config /opt/codex/config/config.yaml --log-level debug检查日志tail -f /opt/codex/logs/app.log。成功启动应看到INFO[0000] Loaded 1 model(s) from config INFO[0000] Loaded 1 skill(s) from config INFO[0000] Proxy rules loaded: 1 rule(s) INFO[0000] Server started on http://localhost:3001浏览器访问http://localhost:3001输入 API Key任意值选择qwen2-7b模型即可开始对话。关键排查点如果页面显示Failed to load organization settings立即执行curl -v http://localhost:3000/v1/chat/completions。若返回Connection refused说明 API 网关没起来若返回404说明网关路由错了若返回500检查网关日志中的llama.cpp连接错误。永远先验证底层服务再查 Codex 配置。4. 常见问题与硬核排查技巧实录4.1 “cc switch local proxy failed while handling codex endpoint /responses” 深度解析这个报错不是 Codex 的 bug而是代理链路中的 DNS 解析或 TLS 握手失败。cc switch是 Codex 内置的代理切换模块当它尝试将请求转发到 YAML 中定义的endpoint时若目标地址不可达就会抛出此错误。根本原因有三类故障类型典型表现排查命令解决方案网络层不通curl -v http://localhost:3000/v1/chat/completions返回Connection refusedss -tuln | grep :3000检查tmux attach -t api确认 Node.js 进程在运行检查netstat -tuln | grep :3000是否被其他进程占用TLS 证书问题curl -v https://your-api.com/v1/chat/completions返回SSL certificate problemopenssl s_client -connect your-api.com:443 -servername your-api.com本地服务一律用http://禁用 HTTPS若必须用 HTTPS用mkcert生成本地可信证书Endpoint 路径错误curl -v http://localhost:3000/v1/chat/completions返回404 Not Foundcurl -v http://localhost:3000/检查 Node.js 路由是否注册了/v1/chat/completions确认app.use(express.json())在路由前独家技巧在 Codex 启动时加--log-level trace参数它会打印每一笔请求的完整代理路径。你会看到类似TRACE[0001] cc switch routing request to http://localhost:3000/v1/chat/completions的日志直接定位到出问题的 endpoint。4.2 “The gpt-5.6-sol model is not supported” 类报错的本质这类报错源于模型名称硬编码校验。Codex 的models配置中name字段不仅是显示名更是服务发现的 key。当你在 YAML 中写models: - name: gpt-5.6-sol type: openai endpoint: http://localhost:1234/v1Codex 启动时会检查name是否在内置白名单中如gpt-3.5-turbo,qwen2-7b。gpt-5.6-sol不在名单于是报错。这不是模型不兼容而是 Codex 的安全策略——防止用户误配不存在的模型名导致静默失败。解决方案只有两个改名将name: gpt-5.6-sol改为name: my-custom-model并在 Codex UI 中手动选择绕过校验启动 Codex 时加--disable-model-validation参数仅限调试生产环境禁用。注意网上流传的“修改 Codex 源码添加模型名”是危险操作。Codex 的模型校验逻辑深度耦合在认证和计费模块中擅自修改可能导致授权失效或数据泄露。4.3 tmux 会话“假死”与日志丢失的终极修复tmux attach -t llm进去后屏幕一片黑Ctrl-c无反应Ctrl-d退出后发现日志没保存——这是 tmux 的缓冲区溢出故障。根本原因是 llama.cpp 的日志输出速率超过 tmux 的默认 buffer 限制默认 2000 行。修复方法增大 buffer在~/.tmux.conf中添加set -g history-limit 10000强制日志落盘修改启动命令将 stdout/stderr 重定向到文件tmux new-session -d -s llm cd /opt/llama.cpp ./server -m /opt/models/qwen2-7b.Q4_K_M.gguf 21 | tee /opt/llama/logs/server.log启用 tmux 日志在 tmux 会话内按Ctrl-b然后Shift-H即可开启/关闭当前窗格日志记录日志存于/tmp/tmux-$(id -u)/tmux-*.log。实操心得tmux kill-session并不会立即终止进程而是发送SIGTERM。llama.cpp 收到后会优雅退出但若卡在 GPU 计算中可能需 30 秒。强制杀死用tmux kill-session -t llm pkill -f llama.cpp/server。4.4 YAML 配置“静默失败”的七种隐形陷阱YAML 解析失败往往不报错而是用默认值覆盖你的配置。以下是我在客户现场抓出的七种高频陷阱布尔值写错stream: true正确stream: true字符串或stream: YesYAML 识别为 true但 Codex 可能不认数字类型混淆max_tokens: 2048正确max_tokens: 2048字符串会导致参数传递失败环境变量未生效auth_token: ${CODEX_TOKEN}正确但启动 Codex 的 shell 没执行export CODEX_TOKENxxx缩进混合空格/TabYAML 严格禁止 Tab必须全用空格。VS Code 默认设置是 2 空格切勿改成 4注释位置错误# this is ok在行尾 OK但model: # not ok这种注释在 key 后面会导致解析失败数组项缺失破折号models:下必须每行以-开头漏掉-会被当成单个字符串特殊字符未引号description: Its a great model正确description: Its a great model无引号中会被 YAML 解析为字符串结束。终极验证法用 Python 一行命令校验 YAML 有效性python3 -c import yaml; print(yaml.safe_load(open(/opt/codex/config/config.yaml)))若输出字典则 YAML 语法正确若报错错误信息会精准定位到哪一行哪个字符。5. 进阶扩展从单机服务到可协作的本地 AI 工作台当你已稳定运行 Qwen2-7B下一步是构建一个真正的“OpenRig”——不是某个项目而是你自己的本地 AI 工作台。我推荐三个经过验证的扩展方向5.1 多模型协同用 vLLM 替代 llama.cpp 处理高并发llama.cpp 适合单用户调试vLLM 才是生产级选择。它支持 PagedAttention显存利用率提升 2-3 倍且原生支持 OpenAI API。部署步骤pip install vllm需 CUDA 12.1python -m vllm.entrypoints.api_server --model Qwen/Qwen2-7B-Instruct --tensor-parallel-size 2 --host 0.0.0.0 --port 8000修改config.yaml中endpoint: http://localhost:8000/v1vLLM 自动处理stream: trueCodex 的流式响应将真正生效。注意vLLM 启动时--tensor-parallel-size应等于 GPU 数量。单卡设1双卡设2。设错会导致CUDA error: invalid device ordinal。5.2 技能Skill开发用 FastAPI 快速构建专属能力Codex 的skills是其最大优势。例如创建一个“代码审查”技能pip install fastapi uvicorn编写skill_review.pyfrom fastapi import FastAPI, HTTPException from pydantic import BaseModel app FastAPI() class ReviewRequest(BaseModel): code: str language: str app.post(/review) async def review_code(req: ReviewRequest): # 这里调用你的 LLM 或规则引擎 return {issues: [Avoid global variables, Add type hints]}uvicorn skill_review:app --host 0.0.0.0 --port 3000 --reload在config.yaml的skills下添加此项。5.3 持久化与备份用 systemd 管理服务生命周期tmux 适合开发systemd 才是生产标配。为llm服务创建/etc/systemd/system/llm.service[Unit] DescriptionQwen2-7B LLM Service Afternetwork.target [Service] Typesimple Useraiuser WorkingDirectory/opt/llama.cpp ExecStart/opt/llama.cpp/server -m /opt/models/qwen2-7b.Q4_K_M.gguf -c 4096 -ngl 50 -port 8080 Restartalways RestartSec10 StandardOutputjournal