- Python 97.6%
- HTML 2.2%
- Dockerfile 0.2%
|
Some checks failed
CI / test (push) Has been cancelled
- training_load.py:冲量-响应/EWMA 模型,容量负荷 Σ(次数×有效重量),辅助引体按体重-辅助计 - 页面 /training-load:三曲线 + 每日负荷柱状 + 稳态参考 + 最近28天最疲劳点,首页新增入口 - 测试 test_training_load.py 13 条(口径/递推/稳态/分档/渲染),Dockerfile 补 copy - 版本 0.2.0 |
||
|---|---|---|
| .forgejo | ||
| docs/screenshots | ||
| scripts | ||
| static | ||
| .dockerignore | ||
| .gitignore | ||
| .site_auth.example.json | ||
| app.py | ||
| app_test.py | ||
| CHANGELOG.md | ||
| CONTRIBUTING.md | ||
| database.py | ||
| docker-compose.yml | ||
| Dockerfile | ||
| LICENSE | ||
| product.html | ||
| PRODUCT.md | ||
| README.md | ||
| requirements.txt | ||
| SECURITY.md | ||
| test_metric_panels.py | ||
| test_plotly_local.py | ||
| test_sleep_chart.py | ||
| test_training_load.py | ||
| test_trend_lines.py | ||
| test_view_range.py | ||
| training_load.py | ||
Markov Life
个人健康数据追踪与可视化网页。通过对话录入饮食、饮水、体重、围度、训练、睡眠和身体照片,网页负责趋势图表与时间轴展示。
FastAPI + SQLite 单进程应用,无外部服务依赖,适合在自己的服务器或 NAS 上私有部署。
界面预览
以下截图来自一份完全虚构的演示数据,不含任何真实个人数据;可用
python scripts/generate_demo_db.py自行生成同样的演示库。
身体成分与趋势
体重 / 肌肉量 / 体脂率曲线,叠加趋势线、阶段目标线与预测到达日期。
热量与蛋白质摄入
每日热量摄入、热量缺口与蛋白质柱状图,配图表显示范围控件。
睡眠分期
Apple Health 风格的睡眠时段图:核心睡眠 / 深睡 / REM 分段着色。
力量训练容量
按动作拆分的最大重量与训练总容量趋势。
训练负荷曲线(CTL / ATL / TSB)
独立页面 /training-load,把每次训练当作「冲量」,用指数加权移动平均积分出三条曲线:
- CTL 体能(τ=28 天):长期适应,衰减慢
- ATL 疲劳(τ=7 天):短期疲劳,衰减快
- TSB 状态 = CTL − ATL:今天的余量
来源是 Banister 1975 的冲量-响应(fitness–fatigue)模型,CTL/ATL/TSB 是训练软件界 (TrainingPeaks PMC)把它工程化后的叫法。页面同时给出 28 日均负荷推算的稳态值、 距离稳态还差多少、以及最近 28 天的最疲劳点。它是模型趋势输出,不是实测生理指标。
容量负荷口径:Σ(次数 × 有效重量);辅助引体按 体重 − 辅助配重 计(与训练 App 的
「总重量」一致);有氧不折算入曲线,只单独标记,避免编造 kcal↔kg 换算系数。
功能
- 饮食与营养:食物库 + 计量单位录入,按日汇总蛋白质与热量
- 身体成分:体重、体脂率、肌肉量、围度、内脏脂肪等长期趋势
- 训练记录:按动作/组次/重量记录力量训练,统计最大重量与总容量
- 训练负荷曲线:由训练容量推算 CTL/ATL/TSB,看爬升段、疲劳累积与减载时机
- 睡眠分析:睡眠时长与分期图
- 时间轴明细表:按周/月汇总,环比增减用颜色标注
- 身体照片归档:按类别与角度上传,支持标注
- 访问控制:Basic Auth(PBKDF2-SHA256 加盐哈希,不存明文口令)
- 私有部署:Docker + 单文件 SQLite
隐私说明
本项目默认用于私有部署。数据库、认证配置、上传照片和个人数据不应提交到公开仓库。项目不是医疗诊断工具,体脂秤数据仅适合观察趋势。
本地运行
uv venv
uv pip install -r requirements.txt
cp .site_auth.example.json .site_auth.json
python scripts/create_auth.py .site_auth.json
uv run uvicorn app:app --host 0.0.0.0 --port 8000
首次运行前,请用 scripts/create_auth.py 生成新的 Basic Auth 配置,不要把真实配置提交到 Git。应用启动时若找不到有效的 .site_auth.json 会拒绝启动。
Docker 部署
mkdir -p data
cp .site_auth.example.json data/.site_auth.json
python3 scripts/create_auth.py data/.site_auth.json
MARKOV_LIFE_DATA_DIR=$PWD/data docker compose up -d --build
应用默认监听 8000。data/ 持久化 SQLite 数据库、认证配置和照片;生产环境请再配 HTTPS 反向代理。
容器镜像
docker pull git.formiko.top/formiko/markov-life:0.2.0
镜像包含 app.py、database.py、static/ 与运行依赖,不含数据库、照片和认证配置。运行时挂载一个数据目录到 /data 并放入新生成的 .site_auth.json 即可。
环境变量
MARKOV_LIFE_DATA_DIR:数据目录,默认是项目目录MARKOV_LIFE_DB_PATH:数据库路径,默认$MARKOV_LIFE_DATA_DIR/markov-life.dbMARKOV_LIFE_AUTH_CONFIG:认证 JSON 路径,默认$MARKOV_LIFE_DATA_DIR/.site_auth.jsonMARKOV_LIFE_UPLOAD_DIR:照片目录,默认$MARKOV_LIFE_DATA_DIR/uploads/body_photosMARKOV_LIFE_STATIC_DIR:静态资源目录,默认项目下static/
测试
python -m unittest discover -p 'test_*.py'
备份与迁移
停止写入后复制 data/ 并校验文件,再迁移到另一台机器。不要把个人数据库、照片或认证文件放进源码仓库。给朋友部署时,使用全新的空数据目录和全新的认证配置。
开源边界
仓库只保存通用代码、测试、静态资源和部署文档;一次性个人导入脚本、数据集、照片、数据库和本机认证文件均不属于开源发布内容。
许可证
MIT。版本变更见 CHANGELOG.md,安全问题请按 SECURITY.md 报告,参与开发见 CONTRIBUTING.md。



