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 会依次完成四步,全程无需人工干预:
check_docker:校验 Docker 与 Compose 是否安装,并自动探测使用docker compose还是旧版docker-compose;check_env:若不存在.env,自动从.env.example复制生成;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,并明确提示不要把它提交到版本控制;
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 update | git 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_SECRET | JWT 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 步:在
config.json中设置两个字段:{ "admin_mode": true, "jwt_secret": "YOUR_JWT_SECRET" }第 2 步:设置环境变量
NOFX_ADMIN_PASSWORD——管理员密码(明文,启动时会被哈希处理;Docker Compose 已接线该变量)。第 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 的四个硬性要点:
custom_api_url只填Base URL,系统自动追加/chat/completions;- 若端点已包含完整路径,在 URL 末尾加
#强制使用完整地址(#会被自动去除); - 端点必须支持
Authorization: Bearer {api_key}认证并返回标准 OpenAI 响应格式; - 默认超时 120 秒,慢速模型注意调整。
完整配置字段说明与多 AI 对比交易示例见 docs/getting-started/custom-api.md。
跑通第一个交易员:四步落地路线
服务起来后按顺序推进,每步都在 Web 界面(http://localhost:3000)完成:
- 配置 AI 模型→ 在设置中添加内置提供商或自定义 API;
- 设置交易所→ 添加 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; - 创建交易员→ 将 AI 模型与交易所绑定,设置初始资金与扫描间隔;
- 开始交易→ 在仪表板中监控持仓、收益曲线与交易日志。
交易前风控清单 + 故障速查
风控:先读这四条再放真金
- 先在测试网充分验证策略;
- 从小金额开始;
- 充分了解交易风险,阅读 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),仅供参考