自托管经期追踪工具 Ovumcy:数据不上云,完全自主掌控

简介

什么是 Ovumcy ?

Ovumcy 是一个开源的隐私优先型经期周期追踪工具,你可以把它部署在自己的服务器上。它帮助你、你的爱人、你的女友记录经期日期、症状和笔记,预测下一次经期、排卵期和受孕窗口,所有健康数据都保存在你控制的设备上,不会上传到任何第三方云服务。

主要特点

  • 隐私优先:无遥测、无广告追踪、无外部网络请求(除非你主动配置了 WebhookOIDC),数据完全由你掌控
  • 智能周期预测:基于你记录的周期数据,自动预测下一次经期、排卵期和受孕窗口,算法完全透明
  • 多维度记录:支持经期天数、流量强度、症状和自由笔记,还可以自定义症状名称
  • 三种提醒方式:仪表盘横幅提醒、Webhook 推送(支持 ntfy/Gotify)、私有日历订阅(.ics
  • 可选 OIDC 单点登录:支持与自建身份提供商集成,可选混合模式或纯 SSO 模式
  • TOTP 双因素认证:可选启用,密钥使用 AES-256-GCM 加密存储
  • 数据导出:支持 CSVJSON 格式导出,数据随时可迁移
  • PWA 支持:可添加到手机主屏幕,像原生应用一样使用
  • 多语言界面:支持英语、俄语、西班牙语、法语、德语、意大利语六种语言
  • 开源免费:基于 AGPL v3 协议开源,可免费使用和修改

应用场景

  • 个人健康管理:女性用户可以在自己的服务器上安全记录经期和症状,无需担心隐私泄露
  • 家庭部署:部署在家庭 NAS 上,家庭成员均可安全访问
  • 隐私敏感用户:对于不希望将健康数据交给第三方云服务的用户,Ovumcy 提供了完全自主的数据控制权
  • 开发者测试:开发人员可以快速搭建测试环境,体验自托管健康追踪应用

Ovumcy 是一个专注于隐私的经期追踪工具,让你在享受智能周期预测的同时,完全掌控自己的健康数据。

安装

在群晖上以 Docker 方式安装。

本文写作时, latest 版本对应为 sha-01d5eac

由于镜像托管在 ghcr.io,群晖 Docker 套件无法直接搜索,需要通过命令行拉取镜像。

docker cli 安装

如果你熟悉命令行,用 docker cli 更快捷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 新建文件夹 ovumcy 和 子目录
mkdir -p /volume1/docker/ovumcy/data

# 进入 ovumcy 目录
cd /volume1/docker/ovumcy

# 修改目录权限
chmod a+rw data

# 一键启动
docker run -d \
--name=ovumcy \
--restart=unless-stopped \
--security-opt no-new-privileges:true \
--cap-drop ALL \
--read-only \
--tmpfs /tmp \
-p 8674:8080 \
-v $(pwd)/data:/app/data \
-e SECRET_KEY=<你的密钥> \
-e TZ=Asia/Shanghai \
-e DEFAULT_LANGUAGE=en \
-e REGISTRATION_MODE=open \
-e COOKIE_SECURE=false \
-e DB_DRIVER=sqlite \
ghcr.io/ovumcy/ovumcy-web

# 示例
docker run -d \
--name=ovumcy \
--restart=unless-stopped \
--security-opt no-new-privileges:true \
--cap-drop ALL \
--read-only \
--tmpfs /tmp \
-p 8674:8080 \
-v $(pwd)/data:/app/data \
-e SECRET_KEY=0d86534bccf833b6c0cc790278f834eb \
-e TZ=Asia/Shanghai \
-e DEFAULT_LANGUAGE=en \
-e REGISTRATION_MODE=open \
-e COOKIE_SECURE=false \
-e DB_DRIVER=sqlite \
ghcr.io/ovumcy/ovumcy-web

SECRET_KEY 可以用 openssl rand -hex 16 命令生成 32 位十六进制字符串

docker-compose 安装

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: '3.8'

services:
ovumcy:
image: ghcr.io/ovumcy/ovumcy-web
container_name: ovumcy
restart: unless-stopped
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
tmpfs:
- /tmp
ports:
- "8674:8080"
volumes:
- ./data:/app/data # 数据持久化
environment:
- SECRET_KEY=0d86534bccf833b6c0cc790278f834eb # 必填,用于会话加密
- TZ=Asia/Shanghai # 时区
- DEFAULT_LANGUAGE=en # 默认语言
- REGISTRATION_MODE=open # 注册模式
- COOKIE_SECURE=false
- DB_DRIVER=sqlite
healthcheck:
test: ["CMD", "/app/ovumcy", "healthcheck"]
interval: 30s
timeout: 5s
retries: 3
start_period: 20s

然后通过 SSH 登录到您的群晖,执行下面的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 新建文件夹 ovumcy 和 子目录
mkdir -p /volume1/docker/ovumcy/data

# 进入 ovumcy 目录
cd /volume1/docker/ovumcy

# 修改目录权限
chmod a+rw data

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

安全配置说明

Ovumcydocker-compose.yml 包含一套严格的安全加固配置,这也是该项目的一大特点:

  • security_opt: no-new-privileges:true:阻止容器内的进程通过 suidsetuid 等机制提升权限。即使容器被攻破,攻击者也无法通过提权获取宿主机的更高权限
  • cap_drop: ALL:丢弃 Linux 内核的所有能力(capabilities),容器进程以最受限的非特权用户运行。这意味着进程无法执行任何需要特权的系统调用(如 mountchown、原始网络套接字等),极大地限制了攻击面
  • read_only: true:容器根文件系统设为只读,除了显式挂载的卷(volumes)和 tmpfs 之外的任何路径都无法写入。这可以防止恶意程序在容器内写入或篡改系统文件
  • tmpfs: /tmp:将 /tmp 目录挂载为内存文件系统(tmpfs),应用所需的临时写入操作只能发生在内存中,容器重启后自动清空,不留痕迹

这四项组合使用的效果是:即使容器被攻破,攻击者无法提权、无法写系统文件、无法持久化恶意载荷,最大程度限制了安全事件的影响范围。对于存储健康数据的应用来说,这样的防御纵深是非常有必要的。

环境变量说明

变量 说明 默认值
SECRET_KEY 必填,用于会话加密的密钥
TZ 时区设置,设为 Asia/Shanghai UTC
DEFAULT_LANGUAGE 默认语言(en/ru/es/fr/de/it) en
REGISTRATION_MODE 注册模式(open/closed) open
DB_DRIVER 数据库驱动(sqlite/postgres) sqlite
COOKIE_SECURE 是否启用安全 Cookie false

SECRET_KEY 说明:这是唯一必填的环境变量,用于加密会话、TOTP Secret 等敏感数据。首次部署前必须设置,一旦设置后不要轻易更改,否则会使所有现有会话和 TOTP 密钥失效。

运行

在浏览器中访问 http://<群晖IP>:8674 即可进入登录界面

默认语言Ovumcy 目前支持英语、俄语、西班牙语、法语、德语、意大利语六种语言,暂未内置中文界面,但可以在设置中切换语言。

首次使用需要点击注册按钮创建账户(默认开放注册)

recovery code 必须要保存好

完成简单的引导设置,填写基本个人信息

进入仪表盘开始记录经期数据

官方的动图演示了基本的使用流程

注意事项

  1. 数据备份:所有数据存储在 /app/data 目录下的 SQLite 数据库中,定期备份该目录即可完整备份 Ovumcy 数据
  2. 密钥管理SECRET_KEY 务必妥善保管,丢失后无法恢复加密数据;更改密钥会使所有现有会话、TOTP 密钥和 Webhook URL 失效
  3. 端口冲突:如果 8080 端口已被占用,修改 ports 映射中的本地端口即可
  4. 反向代理:如需通过域名和 HTTPS 访问,建议在 Ovumcy 前配置反向代理(如 NginxCaddy),同时设置 COOKIE_SECURE=trueTRUST_PROXY_ENABLED=true
  5. 非医疗设备Ovumcy 提供的是基于日历统计的预测估计,不是医疗设备,不可作为避孕或生育治疗的依据

参考文档

Ovumcy — A menstrual cycle tracker you run yourself. Your data stays on your server.
地址:https://github.com/ovumcy/ovumcy-web

Ovumcy 官方网站
地址:https://ovumcy.com

ovumcy-web Docker 镜像
地址:https://github.com/ovumcy/ovumcy-web/pkgs/container/ovumcy-web