[教程/BUG修复] Docker (飞牛NAS等) 完美避坑部署流程 & 彻底解决 v1.0.1 默认账号密码错误的终极方案
标题
[教程/BUG修复] Docker (飞牛NAS等) 完美避坑部署流程 & 彻底解决 v1.0.1 默认账号密码错误的终极方案
问题概述
在最新的 v1.0.1 版本中,很多使用 NAS (如飞牛) 或纯 Docker 环境部署的用户,遇到了以下几个连环坑:
docker-compose up -d触发本地编译,导致拉取依赖(yarn/pip)超时或报错。- 镜像拉取提示
hsliup/tradingagents-backend:v1.0.1 not found。 - 最致命的痛点: 部署成功并运行建号脚本后,网页端登录依然提示 “用户名或密码错误” (HTTP 401)。
密码错误的核心原因:
官方提供的离线离线脚本(如 create_default_admin.py 或 import_config_and_create_user.py)写入数据库的密码是 SHA-256 加密。但是,最新版 FastAPI 后端登录接口已经升级验证 bcrypt(带随机盐)加密。这就导致数据库里的密文和后端校验永远对不上!
以下是经过实战验证的100% 纯净避坑安装流程以及原生 bcrypt 密码注入方案。
第一阶段:避坑纯净安装流程 (防本地编译报错)
为了防止 NAS 孱弱的性能和网络导致本地 build 失败,我们需要强行砍掉编译逻辑,直接拉取官方最新的成品镜像。
1. 下载官方包并解压
下载官方的 TradingAgents-CN-1.0.1.zip,解压到你的服务器/NAS 目录中。
2. 核心修改 docker-compose.hub.nginx.yml**
打开该文件,进行以下几处极其重要**的修改:
- 端口防冲突: 将 Nginx 的
80:80改为3000:80(防止 NAS 默认的 80 端口被占用)。 - 修正镜像标签: 官方可能漏传了
v1.0.1标签,把tradingagents-backend:v1.0.1和frontend:v1.0.1全局替换为:latest。 - 物理阉割本地编译: 找到文件里的
build:、context: .、dockerfile: ...配置,整行删除!不给它任何本地自爆的机会。
修改后的服务块类似这样:
backend:
image: hsliup/tradingagents-backend:latest
container_name: tradingagents-backend
ports:
- "8000:8000"
# 删除了 build 相关内容...
frontend:
image: hsliup/tradingagents-frontend:latest
container_name: tradingagents-frontend
ports:
- "3000:80" # 改为 3000
# 删除了 build 相关内容...
3. 一键启动
拷贝 .env.docker 为 .env。然后在终端执行:
# 1. 直接拉取官方成品镜像(速度极快)
docker compose -f docker-compose.hub.nginx.yml pull
# 2. 启动全套系统
docker compose -f docker-compose.hub.nginx.yml up -d
第二阶段:终极无双 —— 解决密码错误的必杀技
等容器启动(约 15 秒)后,不要使用官方的建号脚本!
我们直接在宿主机运行一段“自适应”脚本,绕过有 Bug 的离线脚本,直接调用后端程序内部的 UserService 服务来创建账号。它自己生出来的账号,绝对会使用和登录验证一模一样的 bcrypt 算法加密!
请在 SSH 终端里,直接复制执行这一整段命令(1秒内完成):
docker exec -it tradingagents-backend python -c "
import asyncio
import inspect
from app.services.user_service import UserService
async def main():
service = UserService()
# 1. 同步删除已存在的旧 SHA-256 错误密码账号(因为 PyMongo 是同步的)
try:
service.db.users.delete_many({'username': 'admin'})
print(' 已清空旧的错误密码账号')
except Exception as e:
print('⚠️ 清理旧账号出错:', e)
# 2. 动态检测系统的 create_admin_user 方法是同步还是异步
is_async = inspect.iscoroutinefunction(service.create_admin_user)
try:
if is_async:
user = await service.create_admin_user('admin', 'admin123')
else:
user = service.create_admin_user('admin', 'admin123')
if user:
print('✅ 【终极绝杀】用系统内部原生 bcrypt 算法创建 admin 账号成功!')
else:
print('❌ 创建失败')
except Exception as e:
print('❌ 创建过程中报错:', e)
service.close()
# 动态启动
try:
asyncio.run(main())
except Exception:
import sys
print('⚠️ 降级到同步模式执行...')
service = UserService()
service.db.users.delete_many({'username': 'admin'})
user = service.create_admin_user('admin', 'admin123')
if user:
print('✅ 【同步降级】用系统内部原生 bcrypt 算法创建 admin 账号成功!')
service.close()
"
第三阶段:见证登录
执行完上面的脚本后,你会在终端看到 ✅ 【终极绝杀】用系统内部原生 bcrypt 算法创建 admin 账号成功!。
- 打开浏览器访问:
http://你的IP:3000 - ⚠️ 极其重要: 狂按
Ctrl + F5强制清空浏览器缓存(洗掉之前的错误登录状态)。 - 输入账号:
admin,密码:admin123 - 完美登入量化控制台!
希望能帮到同样卡在这一步的兄弟们,也希望官方能在下个版本统一密码哈希算法。
Source: hsliuping/TradingAgents-CN