docs/deploy-webui-cloud.md
如果你已经把项目部署到云服务器,但不知道在浏览器里输入什么地址才能打开 Web 管理界面,这篇教程就是为你准备的。
其实就两步:让服务监听外网,再在浏览器里输入地址。
用编辑器打开 .env(在项目根目录,即包含 main.py 的目录),找到这一行:
WEBUI_HOST=127.0.0.1
把 127.0.0.1 改成 0.0.0.0:
WEBUI_HOST=0.0.0.0
127.0.0.1表示只有本机能访问,0.0.0.0表示允许任何来源访问。云服务器必须改成0.0.0.0才能从外网打开界面。
注意:
.env里的WEBUI_HOST优先级高于命令行参数。所以即使你在命令里加了--host 0.0.0.0,如果.env里还是127.0.0.1,外网照样访问不了。请务必先改.env。
在项目根目录执行:
# 只启动 Web 界面(不自动执行分析)
python main.py --webui-only
# 或者:启动 Web 界面(启动时执行一次分析;需每日定时分析请加 --schedule 或设 SCHEDULE_ENABLED=true)
python main.py --webui
启动成功后,终端会输出类似:
FastAPI 服务已启动: http://0.0.0.0:8000
如果你想让服务在退出终端后继续运行,可以用 nohup:
nohup python main.py --webui-only > /dev/null 2>&1 &
日志文件会由程序自动写入
logs/目录,用tail -f logs/stock_analysis_*.log查看。
默认端口是 8000。如果想改用其他端口,在 .env 里设置:
WEBUI_PORT=8888
然后重启服务。
项目的 docker/docker-compose.yml 在容器内部已经自动设置了 WEBUI_HOST=0.0.0.0,你不需要在 .env 里再改监听地址,Docker 会自动处理。
在项目根目录执行:
# 同时启动定时分析 + Web 界面(推荐)
docker-compose -f ./docker/docker-compose.yml up -d
# 或者只启动 Web 界面服务
docker-compose -f ./docker/docker-compose.yml up -d server
启动后查看状态:
docker-compose -f ./docker/docker-compose.yml ps
看到 server 服务状态为 running 就说明 Web 界面已经在运行了。
默认端口是 8000。如果想改用其他端口,在 .env 里设置:
API_PORT=8888
然后重新启动容器:
docker-compose -f ./docker/docker-compose.yml down
docker-compose -f ./docker/docker-compose.yml up -d
服务启动后,在浏览器地址栏输入:
http://你的服务器公网IP:8000
例如,如果你的服务器 IP 是 1.2.3.4,就输入:
http://1.2.3.4:8000
如果你的域名已经解析到这台服务器,也可以直接用域名访问:
http://your-domain.com:8000
在哪里查公网 IP? 登录你的云服务器控制台(阿里云/腾讯云/AWS 等),在实例列表里可以看到「公网 IP」或「弹性 IP」。
先区分两件事:
ghcr.io/zhulinsen/daily_stock_analysis:v3.12.0。仓库的 Docker 发布由 .github/workflows/docker-publish.yml 按 v*.*.* Git tag 触发,所以 Docker 版本应以镜像 tag / GitHub Releases 为准。也就是说,“系统设置”里的版本信息更适合判断前端是否重建成功,不等同于 Docker 镜像发布版本。
WebUI 现在会在“系统设置”页展示只读的“版本信息”卡片,包含:
WebUI 版本构建标识构建时间如果 apps/dsa-web/package.json 里的版本号仍是占位值 0.0.0,页面会自动回退展示本次前端构建生成的 构建标识,避免你误把占位版本当成真实发布版本。
当你重新执行 docker-compose -f ./docker/docker-compose.yml up -d --build,或者单独重新执行前端 npm run build 后,可以刷新浏览器并进入“系统设置”,优先确认“构建时间”是否已经变化;若变化,通常就说明当前加载的静态资源已经切换到最新构建。
如果你想确认“我现在到底部署的是哪个正式版本”,优先用下面这些方式:
# 方式 1:看 docker-compose / 部署脚本里的 image tag
image: ghcr.io/zhulinsen/daily_stock_analysis:v3.12.0
# 方式 2:回看你的拉取命令
docker pull ghcr.io/zhulinsen/daily_stock_analysis:v3.12.0
如果你一直使用 latest,建议改成显式版本 tag;否则很难仅凭容器内页面信息判断自己是否已经重复更新到同一版本。
在确认本地前端打包链路时,建议执行以下命令用于本次改动的最小验证闭环:
cd apps/dsa-web
npm ci
npm run lint
npm run build
其中 build 成功后,static 下生成的 index.html/JS/CSS 资源会包含本次构建时间与构建版本信息;刷新后在“版本信息”卡片中应能见到变化。
这是最常见的原因。云服务器默认只开放 22(SSH)端口,需要手动放行 8000(或你改的端口)。
操作方法(以阿里云为例):
8000/8000,授权对象填 0.0.0.0/0,点击「确定」腾讯云、AWS 等云厂商操作类似,找到「安全组」或「防火墙规则」,新增一条允许 TCP 8000 端口的入站规则即可。
如果你的系统开启了 ufw 或 firewalld,也需要放行端口:
# Ubuntu / Debian(ufw)
sudo ufw allow 8000
# CentOS / RHEL(firewalld)
sudo firewall-cmd --permanent --add-port=8000/tcp
sudo firewall-cmd --reload
这是第二常见原因。.env 里默认是 WEBUI_HOST=127.0.0.1,这样服务只监听本机,外网根本连不上。
改法:打开 .env,把 WEBUI_HOST=127.0.0.1 改成 WEBUI_HOST=0.0.0.0,然后重启服务。
Docker 方式不需要改这个,可以跳过。
检查访问地址里的端口是否和 .env / 启动命令里设置的端口一致。
WEBUI_PORT=xxxx 修改API_PORT=xxxx 修改症状:浏览器能访问到 8000 端口,页面有内容,但文字、按钮、卡片尺寸异常大,没有正常布局与配色。
根因:static/index.html 存在但 CSS/JS 资源缺失(static/assets/ 为空或不存在),浏览器加载了 HTML 框架但无法拿到样式与脚本,退化为裸 HTML 渲染。
可先用浏览器开发者工具(F12 → Network 标签页)检查是否有 /assets/index-*.js、/assets/index-*.css 的 404 错误。若有,按以下方式修复:
Docker 用户:
docker-compose -f ./docker/docker-compose.yml down
docker-compose -f ./docker/docker-compose.yml build --no-cache
docker-compose -f ./docker/docker-compose.yml up -d
重建完成后,用 Ctrl+Shift+R 强制刷新浏览器缓存,再访问页面。
直接部署用户:先确保已安装 Node.js 18+(推荐 20+),然后手动构建前端:
cd apps/dsa-web
npm ci
npm run build
cd ../..
python main.py --webui-only
如果你有域名,或者不想在地址里带 :8000,可以用 Nginx 做反向代理,把 80/443 端口流量转发给后端服务。
# Ubuntu / Debian
sudo apt update && sudo apt install -y nginx
# CentOS
sudo yum install -y nginx
新建文件 /etc/nginx/conf.d/stock-analyzer.conf,内容如下(把 your-domain.com 改成你的域名或 IP):
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 支持 WebSocket(Agent 对话页面需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
sudo nginx -t # 检查配置有没有语法错误
sudo systemctl reload nginx
配置成功后,直接用 http://your-domain.com 访问即可,不需要带端口号。
使用 Nginx 后的注意事项:
- 如果你开启了 Web 登录认证(
ADMIN_AUTH_ENABLED=true),建议在.env中把TRUST_X_FORWARDED_FOR=true一并打开,否则系统可能无法正确识别真实 IP。该选项适用于单层可信反向代理(Nginx → App)部署;如果使用多级代理或 CDN(CDN → Nginx → App),登录限流的 key 可能退化为边缘代理 IP 而非真实客户端 IP,需根据实际拓扑评估。- 如需 HTTPS,可以用 Certbot 自动申请免费的 Let's Encrypt 证书。
把 Web 界面暴露到公网之前,强烈建议开启登录密码保护:
在 .env 中设置:
ADMIN_AUTH_ENABLED=true
重启服务后,第一次访问网页时会要求设置初始密码。设置完成后,每次打开设置页面都需要输入密码,可以防止 API Key 等敏感配置被他人看到。
如果忘了密码,可以在服务器上执行:
python -m src.auth reset_password
遇到其他问题?欢迎 提交 Issue。