☰
NOFX 快速上手:Docker 一键部署 AI 交易终端的完整指南(含密钥安全配置)
2026/11/3 10:27:16 网站建设 项目流程

NOFX 快速上手:Docker 一键部署 AI 交易终端的完整指南(含密钥安全配置)

【免费下载链接】nofxYour AI trading terminal assistant for US stocks, commodities, forex, and crypto.项目地址: https://gitcode.com/gh_mirrors/nof/nofx

想把一个能自动产生交易决策、对接真实交易所账户的 AI 交易终端跑在自己机器上,又怕环境依赖、密钥初始化这些环节踩坑?NOFX 是一个面向美股、大宗商品、外汇与加密市场的 AI 交易终端助手:你用 Docker 一键部署前后端,通过 Web 界面接入 AI 模型和交易所凭证,即可让 AI 绑定账户自动生成并执行交易决策。本文带你走完「环境自检 → 一键启动 → 密钥配置 → AI 模型接入 → 首个交易员上线」全流程,并覆盖安全配置与常见故障排查,让你从零到一个可运行、可监控、密钥强度达标的自托管实例。

两个容器,一条网络:NOFX 的架构长什么样

NOFX 是前后端分离的项目,核心由两个容器协作完成:

  • 后端nofx:Go 编写的 API 与核心业务逻辑(AI 决策、交易所接入、持仓与风控、数据存储),容器名nofx-trading,监听8080,镜像由 docker/Dockerfile.backend 构建(Alpine + Go 多阶段编译,内置 TA-Lib);
  • 前端nofx-frontend:React + Vite 构建的 Web 控制台,容器名nofx-frontend,镜像由 docker/Dockerfile.frontend 构建(Node 构建产物交给 Nginx 托管,容器内80端口映射到宿主机3000)。

两个服务通过 docker-compose.yml 编排进同一个nofx-network网桥。官方推荐部署方式就是 Docker:镜像里已含全部依赖,你不需要本机装 Go、Node 或 TA-Lib。

部署前自检:两条路径的前置条件

按你选择的部署方式核对环境,缺一项先补一项:

路径前置条件说明
Docker 方式(推荐)Docker 20.10+;Docker Compose V2(docker compose子命令)start.sh 同时兼容旧版docker-compose,会自动探测
手动编译方式Go 1.21+;Node.js 18+;TA-Lib 技术指标库macOS:brew install ta-lib;Ubuntu:apt-get install libta-lib0-dev

Docker 路径下你只需要确认一件事:docker version和docker compose version都能正常输出。

一条命令拉起前后端:实际部署命令

先说明一个版本差异,避免被旧文档误导:官方快速开始文档里的示例是cp config.json.example config.json+./scripts/start.sh start --build,但当前仓库的实际结构已经变化——仓库根目录提供的是.env.example环境变量模板,管理脚本位于根目录 start.sh,不再需要手动复制配置文件,脚本会自动完成全部初始化。当前版本的实际部署流程是:

# 1. 获取代码并进入仓库根目录 git clone https://gitcode.com/gh_mirrors/nof/nofx cd nofx # 2. 首次启动(--build 强制构建镜像,首次运行必带) ./start.sh start --build

--build参数会强制重新构建镜像;不加该参数则直接拉起已有镜像。

启动脚本的完整生命周期:首次 start 时它做了什么

.env.example 是唯一需要关注的配置模板。首次执行start时,start.sh 会依次完成四步,全程无需人工干预:

  1. check_docker:校验 Docker 与 Compose 是否安装,并自动探测使用docker compose还是旧版docker-compose;
  2. check_env:若不存在.env,自动从.env.example复制生成;
  3. check_encryption:检查三项核心密钥,缺失则自动生成并写回.env:
    • JWT_SECRET:openssl rand -base64 32生成 JWT 签名密钥;
    • DATA_ENCRYPTION_KEY:openssl rand -base64 32生成 AES-256 数据加密密钥;
    • RSA_PRIVATE_KEY:openssl genrsa 2048生成 RSA 私钥,换行用\n转义为单行,用于浏览器端到服务器的敏感数据加密。
    • 生成后脚本会对.env执行chmod 600,并明确提示不要把它提交到版本控制;
  4. check_database:创建data/数据目录(权限700),持久化 SQLite 数据库(默认data/data.db)。

启动完成后,脚本会输出 Web 控制台地址(默认http://localhost:3000)、日志与停止命令,并提示接下来的三个动作:注册并配置 AI 模型、添加交易所、可选配置 Telegram Bot。

命令速查:日常运维只需这八条

命令作用
./start.sh start [--build]启动服务(--build表示重建镜像)
./start.sh stop停止服务
./start.sh restart重启服务
./start.sh logs [backend\|frontend]跟踪日志,可指定服务名
./start.sh status查看容器状态,并请求http://localhost:8080/api/health做健康检查(返回 JSON 即后端存活)
./start.sh clean删除所有容器和数据(破坏性操作,需输入yes确认)
./start.sh updategit pull拉取最新代码并重建镜像
./start.sh regenerate-keys重新生成全部加密密钥(破坏性操作,已有加密数据将不可读)

编排与健康检查:服务挂了谁负责恢复

docker-compose.yml 定义了完整的容错行为:

  • 重启策略:两个服务均restart: unless-stopped,配合健康检查实现故障自动恢复;
  • 健康检查:后端每 30 秒探测/api/health(超时 10 秒、重试 3 次、start_period: 60s);前端每 30 秒探测自身/health;
  • 优雅停机:后端stop_grace_period: 30s;
  • 端口绑定:${NOFX_BIND_ADDRESS:-127.0.0.1},默认只绑定本机回环地址。.env.example中的注释也建议:远程访问请走带认证的 TLS 反向代理,而不是直接把端口暴露出去;
  • 卷挂载:.env绑定挂载进容器(便于初学者引导流程把钱包信息写回宿主机文件)、./data持久化数据库、/etc/localtime只读挂载保持时区一致。

安全专题:哪些是硬要求,哪些是可选

所有运行配置都通过.env注入,模板见 .env.example。安全相关的配置分两档,部署前必须分清。

硬要求:三项认证密钥,缺一项都别上线

变量用途要求
JWT_SECRETJWT HS256 签名密钥至少 32 字节随机串(openssl rand -base64 32),且不得等于历史默认值
DATA_ENCRYPTION_KEY数据库敏感字段(API 密钥等)的 AES-256 加密Base64 编码的 32 字节密钥
RSA_PRIVATE_KEY浏览器到服务器端到端加密敏感数据PEM 格式,换行用\n转义为单行

JWT 密钥强度是硬性校验,不是建议。config/config.go 中的initConfig()会拒绝启动(MustInit直接 panic)在以下任一情况:JWT_SECRET缺失、等于历史默认值default-jwt-secret-change-in-production、或长度不足 32 字节(minJWTSecretLength = 32)。这是防止服务用可被暴力破解的弱密钥静默签发令牌。

可选:服务、时区与数据库

  • NOFX_BACKEND_PORT(默认8080)与NOFX_FRONTEND_PORT(默认3000):宿主机端口映射,冲突时在此修改;
  • NOFX_TIMEZONE(默认Asia/Shanghai):容器时区;
  • 数据库默认 SQLite(DB_TYPE=sqlite、DB_PATH=data/data.db),.env.example同时给出了 PostgreSQL 选项(DB_TYPE=postgres+DB_HOST/DB_PORT/DB_USER/DB_PASSWORD/DB_NAME/DB_SSLMODE)。

传输加密:一个容易配反的开关

TRANSPORT_ENCRYPTION(默认false):开启后浏览器会用 Web Crypto API 在发送前加密 API 密钥,但它只在 HTTPS 或 localhost 环境生效;如果你通过 IP + HTTP 访问,必须保持false,否则前端加密链路不可用。

认证链路:登录之后发生了什么

从 auth/auth.go 可以看到完整实现:密码用 bcrypt 哈希校验;登录成功后签发 HS256 JWT,Claims携带UserID、Email,24 小时过期;退出登录的令牌进入内存黑名单,超过 10 万条时自动清理过期项。存储层方面,API 密钥在数据库中经DATA_ENCRYPTION_KEY加密(实现见 crypto/crypto.go 与 store/ 目录),两层加密把凭据泄露的爆炸半径压到最小。

单用户自托管:三步开启 Admin 模式

单租户场景可以开启严格管理员专属访问:启用后,未认证用户无法访问一切非必要端点。

  1. 第 1 步:在config.json中设置两个字段:

    { "admin_mode": true, "jwt_secret": "YOUR_JWT_SECRET" }
  2. 第 2 步:设置环境变量NOFX_ADMIN_PASSWORD——管理员密码(明文,启动时会被哈希处理;Docker Compose 已接线该变量)。

  3. 第 3 步:在/login页面使用管理员密码登录。

从 api/server.go 的路由设计可以看到,Admin 登录是公开路由(// Admin login (used in admin mode, public)),GET /api/config等系统配置接口同样无需认证——它们的作用是让前端在登录前判定当前是否处于 Admin 模式与注册状态。管理员账号由 store/user.go 的EnsureAdmin()保证存在(ID 固定admin,邮箱admin@localhost),密码在启动时由NOFX_ADMIN_PASSWORD经 bcrypt 哈希后写入。

AI 模型接入:内置提供商 + 任意 OpenAI 兼容 API

当前版本所有 AI 与交易员配置都通过 Web 界面完成(config.json仅保留基础设置,早期在配置文件中直接声明 trader 的方式已弃用)。

  • 内置提供商:可直接配置 DeepSeek、Qwen 等。仓库 mcp/provider/ 目录下提供了 Claude、DeepSeek、Gemini、Grok、Kimi、MiniMax、OpenAI、Qwen 的客户端实现,模型接入通过 mcp/registry.go 注册与路由——你在 Web 界面看到的模型能力清单就来自这些实现;
  • 自定义 API:支持任何 OpenAI Chat Completions 兼容端点,包括 OpenAI 官方 API、OpenRouter(可访问 Anthropic Claude、Meta Llama 等多种模型)、本地部署模型(Ollama、LM Studio)、Azure OpenAI 及其他兼容服务。

自定义 API 的四个硬性要点:

  1. custom_api_url只填Base URL,系统自动追加/chat/completions;
  2. 若端点已包含完整路径,在 URL 末尾加#强制使用完整地址(#会被自动去除);
  3. 端点必须支持Authorization: Bearer {api_key}认证并返回标准 OpenAI 响应格式;
  4. 默认超时 120 秒,慢速模型注意调整。

完整配置字段说明与多 AI 对比交易示例见 docs/getting-started/custom-api.md。

跑通第一个交易员:四步落地路线

服务起来后按顺序推进,每步都在 Web 界面(http://localhost:3000)完成:

  1. 配置 AI 模型→ 在设置中添加内置提供商或自定义 API;
  2. 设置交易所→ 添加 Binance / Hyperliquid / OKX / Bybit / Aster 等凭证,各交易所的凭证申请指南见 docs/getting-started/ 下的binance-api.md、hyperliquid-agent-wallet.md、okx-api.md、bybit-api.md、aster-api-wallet.md;
  3. 创建交易员→ 将 AI 模型与交易所绑定,设置初始资金与扫描间隔;
  4. 开始交易→ 在仪表板中监控持仓、收益曲线与交易日志。

交易前风控清单 + 故障速查

风控:先读这四条再放真金

  • 先在测试网充分验证策略;
  • 从小金额开始;
  • 充分了解交易风险,阅读 SECURITY.md 安全策略;
  • API 密钥管理:绝不提交到 git(.env已被脚本强制chmod 600且不在版本控制中)、优先用环境变量注入、在交易所侧限制 IP 白名单、为交易所账户启用 2FA。

症状 → 解决:五类常见问题

症状解决
Docker 构建失败确认 Docker 升级到 20.10+,并安装 Docker Compose V2
找不到 TA-Lib(仅手动部署)macOS:brew install ta-lib;Ubuntu:apt-get install libta-lib0-dev
端口 8080 被占用修改.env中的NOFX_BACKEND_PORT(前端同理改NOFX_FRONTEND_PORT),再./start.sh start --build
前端无法连接后端./start.sh status观察健康检查,或curl http://localhost:8080/api/health确认后端存活
启动即报 JWT 错误按 config/config.go 的校验规则,为JWT_SECRET设置至少 32 字节的随机值,如openssl rand -base64 48

更多问题见 docs/guides/faq.zh-CN.md 与 docs/guides/TROUBLESHOOTING.zh-CN.md。

回顾与延伸阅读

回到起点:./start.sh start --build一条命令背后,脚本替你完成了「复制.env→ 生成三项密钥 → 建data/目录 → 拉起前后端 → 健康检查」的全链路;而强 JWT 校验、bcrypt 哈希、AES/RSA 双层加密则把安全底线内建到了部署环节本身。

进一步深挖:

  • 快速开始文档(中英双语):docs/getting-started/README.md、docs/getting-started/README.zh-CN.md
  • 自定义 AI API 完整指南:docs/getting-started/custom-api.md
  • 部署脚本:start.sh;服务编排:docker-compose.yml
  • 配置加载与校验:config/config.go;认证实现:auth/auth.go;加密实现:crypto/crypto.go
  • 文档首页:docs/README.md

【免费下载链接】nofxYour AI trading terminal assistant for US stocks, commodities, forex, and crypto.项目地址: https://gitcode.com/gh_mirrors/nof/nofx

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询