ShareSim 是部署在我本人博客 guyivip.top 下的一个“附加模块”。它既要像普通静态页面一样能从博客导航直达,又要具备用户注册登录、持仓、交易流水、行情查询等动态能力。
为了让它在你的服务器上长期稳定运行,同时最大化复用你现有站点环境(宝塔 Nginx、HTTPS、静态站点结构),整体采用“静态主站 + 子路径反向代理 + 轻量后端”的组合架构。
127.0.0.1:8080/share/,不影响主站静态页面。
我本人博客主站是静态网站,稳定性很好;ShareSim 作为附属功能,不应该引入复杂的前端工程化或数据库运维。架构决策围绕三个目标: 最小侵入、低成本运维、上线可靠。
/share/,主站其他路径继续走静态站点逻辑。127.0.0.1,外网无法直接访问 8080,降低安全风险。app.db。guyivip.top/
└── share/
├── app.py # Flask 入口(create_app 工厂模式)
├── price_provider.py # Tushare 行情(实时/历史)
├── app.db # SQLite 数据库(用户/持仓/流水)
├── requirements.txt # Python 依赖
├── start.sh # 一键启动(venv + gunicorn)
└── static/
├── login.html
├── dashboard.html
├── trade.html
├── portfolio.html
├── transactions.html
├── styles.css
└── js/
├── common.js # 子路径适配、API 封装、鉴权跳转
├── auth.js
├── dashboard.js
├── trade.js
├── portfolio.js
└── transactions.js
后端使用 create_app() 工厂函数提供 Flask 实例,由 Gunicorn 以 app:create_app() 启动。
工厂模式的优势是启动入口清晰、初始化集中、部署与测试更稳定。
./venv/bin/gunicorn -w 2 -b 127.0.0.1:8080 'app:create_app()'
API 设计遵循“页面走 HTML、数据走 JSON”的方式:页面访问 /share/login.html,数据请求走 /share/api/*。
ShareSim 对行情的需求分为两块:下单前查价(实时)与图表展示(日 K、历史)。实时链路优先使用实时接口;历史数据需要 token。
export TUSHARE_TOKEN=你的token
export TUSHARE_PROXY=http://你的代理:端口/
生产环境下强烈建议把这些环境变量写进 systemd 或 shell profile,否则你用 nohup 重启服务时可能丢失 token,导致行情不可用。
模块部署在 /share/ 下,前端通过 common.js 统一处理路径拼接、鉴权跳转与 API 请求,避免“登录后跳转 404”这类子路径问题。
页面之间跳转使用固定的 *.html 文件名,保证可读性与运维排查效率(看到 URL 就知道对应哪个页面)。
典型部署顺序是:先确保 Gunicorn 本机可访问,再让 Nginx 把 /share/ 代理给它。
curl -I http://127.0.0.1:8080/login.html
curl -I https://guyivip.top/share/login.html
Nginx 反代配置示例:
location ^~ /share/ {
proxy_pass http://127.0.0.1:8080/;
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;
}