个人健康数据追踪与可视化:饮食/训练/睡眠/身体成分录入与趋势图。FastAPI + SQLite,可私有部署。
  • Python 97.6%
  • HTML 2.2%
  • Dockerfile 0.2%
Find a file
Markov Life User 0cbe29bb92
Some checks failed
CI / test (push) Has been cancelled
feat: 新增训练负荷曲线页(CTL/ATL/TSB)
- training_load.py:冲量-响应/EWMA 模型,容量负荷 Σ(次数×有效重量),辅助引体按体重-辅助计
- 页面 /training-load:三曲线 + 每日负荷柱状 + 稳态参考 + 最近28天最疲劳点,首页新增入口
- 测试 test_training_load.py 13 条(口径/递推/稳态/分档/渲染),Dockerfile 补 copy
- 版本 0.2.0
2026-09-14 01:06:55 +08:00
.forgejo docs: 加界面截图、Issue/PR 模板与 CI 工作流 2026-09-10 18:38:48 +08:00
docs/screenshots docs: 加界面截图、Issue/PR 模板与 CI 工作流 2026-09-10 18:38:48 +08:00
scripts docs: 补充容器镜像拉取方式,附演示数据生成脚本 2026-09-10 18:48:54 +08:00
static chore: prepare portable private deployment 2026-09-07 11:08:10 +08:00
.dockerignore fix: keep required static asset in image build 2026-09-08 00:07:57 +08:00
.gitignore chore: tighten open-source repository boundary 2026-09-08 00:00:18 +08:00
.site_auth.example.json chore: prepare portable private deployment 2026-09-07 11:08:10 +08:00
app.py feat: 新增训练负荷曲线页(CTL/ATL/TSB) 2026-09-14 01:06:55 +08:00
app_test.py chore: tighten open-source repository boundary 2026-09-08 00:00:18 +08:00
CHANGELOG.md feat: 新增训练负荷曲线页(CTL/ATL/TSB) 2026-09-14 01:06:55 +08:00
CONTRIBUTING.md chore: tighten open-source repository boundary 2026-09-08 00:00:18 +08:00
database.py chore: prepare portable private deployment 2026-09-07 11:08:10 +08:00
docker-compose.yml chore: prepare portable private deployment 2026-09-07 11:08:10 +08:00
Dockerfile feat: 新增训练负荷曲线页(CTL/ATL/TSB) 2026-09-14 01:06:55 +08:00
LICENSE chore: tighten open-source repository boundary 2026-09-08 00:00:18 +08:00
product.html feat: add trend range selector with date controls 2026-05-29 11:46:06 +08:00
PRODUCT.md chore: tighten open-source repository boundary 2026-09-08 00:00:18 +08:00
README.md feat: 新增训练负荷曲线页(CTL/ATL/TSB) 2026-09-14 01:06:55 +08:00
requirements.txt init: markov-life health tracking app 2026-05-26 19:47:52 +08:00
SECURITY.md chore: tighten open-source repository boundary 2026-09-08 00:00:18 +08:00
test_metric_panels.py chore: prepare portable private deployment 2026-09-07 11:08:10 +08:00
test_plotly_local.py chore: prepare portable private deployment 2026-09-07 11:08:10 +08:00
test_sleep_chart.py chore: prepare portable private deployment 2026-09-07 11:08:10 +08:00
test_training_load.py feat: 新增训练负荷曲线页(CTL/ATL/TSB) 2026-09-14 01:06:55 +08:00
test_trend_lines.py chore: prepare portable private deployment 2026-09-07 11:08:10 +08:00
test_view_range.py chore(release): 加 CHANGELOG 与 0.1.0 版本号,修掉依赖数据的视图范围测试 2026-09-10 18:18:47 +08:00
training_load.py feat: 新增训练负荷曲线页(CTL/ATL/TSB) 2026-09-14 01:06:55 +08:00

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.db
  • MARKOV_LIFE_AUTH_CONFIG:认证 JSON 路径,默认 $MARKOV_LIFE_DATA_DIR/.site_auth.json
  • MARKOV_LIFE_UPLOAD_DIR:照片目录,默认 $MARKOV_LIFE_DATA_DIR/uploads/body_photos
  • MARKOV_LIFE_STATIC_DIR:静态资源目录,默认项目下 static/

测试

python -m unittest discover -p 'test_*.py'

备份与迁移

停止写入后复制 data/ 并校验文件,再迁移到另一台机器。不要把个人数据库、照片或认证文件放进源码仓库。给朋友部署时,使用全新的空数据目录和全新的认证配置。

开源边界

仓库只保存通用代码、测试、静态资源和部署文档;一次性个人导入脚本、数据集、照片、数据库和本机认证文件均不属于开源发布内容。

许可证

MIT。版本变更见 CHANGELOG.md,安全问题请按 SECURITY.md 报告,参与开发见 CONTRIBUTING.md。