「今天谁做饭?」「吃啥?」——干饭厨子把这两个每天都要吵一遍的问题,变成一件温馨小事。
前一天晚上自动开好明天的饭局,家人各自点菜,谁掌勺谁认领,吃完打个分; 月底还能在贡献墙上看看这个月是谁在默默下厨。专为家庭设计,不依赖任何云服务,数据全在你自己的 NAS 上。
- 🚀 真·开箱即用 —— 一条
docker run跑起来,无需配置任何环境变量,密钥首启自动生成并持久化。 - 🗄️ 单容器 + SQLite —— 没有外部数据库、没有云依赖,备份只需复制一个
data目录。 - 👨👩👧 一账号多角色 —— 注册不分身份,人人都能做饭、点菜;做饭人按「每一餐」认领(「我来做这顿」)。
- 👆 选头像登录 —— 共享设备上无需打字,点自己的头像再输 6 位密码即可(像选用户头像)。
- ⏰ 自动饭局(像设闹钟) —— 在后台自由增删多条规则:餐次、时间、提前多久开、提前多久截止、生效星期都可自定义。到点自动开局、截止自动进入做饭、用餐后自动完成。
- 🌱 贡献墙 —— GitHub 风格热力图,谁做饭最勤、谁最会点菜,绿格子一目了然。
- 🖼️ 图片不拖后腿 —— 头像/菜品上传自动裁剪压缩(≤2MB)转 WebP 落盘(告别 base64 进库),加载飞快。
- 🥛 牛奶布艺 UI —— 柔和拟物 + 青菜绿,移动端优先,可作为 PWA 添加到主屏。
- 🌍 中英双语 —— 登录页与「我的 · 设置」一键切换。
- 🔄 升级无痛 —— 拉新镜像即可,数据库自动迁移,登录态不丢;管理员还能在网页端一键更新(需挂载 Docker 套接字,否则降级为手动指引)。
![]() 👆 选头像登录 共享设备免打字,点头像 + 6 位密码 |
![]() 🏠 临近的饭局 这几天吃什么、谁掌勺,一目了然 |
![]() 🍽️ 点菜 · 认领做饭 勾选想吃的,「我来做这顿」 |
![]() ⭐ 大家点了什么 · 打分 谁点了什么,吃完互相评价 |
![]() 🌱 贡献墙 谁在为这个家默默下厨,绿格子见证 |
![]() ⏰ 自动饭局(像设闹钟) 到点自动开局、截止、流转 |
一条线把这些串起来:前一晚自动开好明天的饭局 → 家人各自点菜 → 谁做饭点一下「我来做这顿」 → 吃完打个分 → 月底贡献墙上看看谁最辛苦。
镜像地址(任选其一):
- 🐳 Docker Hub(国内飞牛等 NAS 有加速,推荐):
gloridust/gancook:latest - 📦 GHCR(海外):
ghcr.io/gloridust/gancook:latest
docker run -d --name gancook \
-p 3000:3000 \
-v ./data:/data \
--restart unless-stopped \
gloridust/gancook:latest打开 http://<你的NAS地址>:3000,第一个注册的人即成为管理员。完事。
curl -O https://raw.githubusercontent.com/Gloridust/GanCook/main/docker-compose.yml
docker compose up -d飞牛 / 群晖等 NAS 也可以直接在「Docker / Container Manager」里搜索镜像
gloridust/gancook创建容器: 端口映射3000,把容器内/data映射到一个你方便备份的目录即可。
无需设置任何环境变量。如需自定义,可选:
| 变量 | 默认 | 说明 |
|---|---|---|
TZ |
Asia/Shanghai |
时区,影响自动饭局时间 |
AUTH_SECRET |
自动生成 | 会话签名密钥(留空自动生成并存到 data/auth.secret) |
CRON_SECRET |
自动生成 | 定时触发端点密钥 |
COOKIE_SECURE |
自动 | 会话 Cookie 是否强制 Secure;默认按请求协议判断,HTTPS 反代识别异常时可设为 1 |
- 部署并打开 —— 用上面任一方式启动,浏览器访问
http://<NAS>:3000。 - 建立家庭 —— 首次进入是引导页:填家庭名 + 你的昵称 + 6 位密码,你成为管理员。
- 家人加入 —— 家人各自打开同一地址 →「注册」,填昵称 + 6 位密码即可。之后登录只需在列表里点自己的头像再输密码。 (管理员可在「我的 → 家庭管理」里设置注册口令或关闭注册。)
- 添加菜品 —— 进「菜品」把全家拿手菜加进来(可拍照,自动压缩)。
- 开一顿饭局 —— 首页或「饭局」点「开饭局」,选餐次/时间/截止;家人进去勾选想吃的,谁做饭点「我来做这顿」。
- 设置自动饭局 —— 「我的 → 家庭管理 → 自动饭局」像设闹钟一样添加规则: 例如「每日午餐 12:00、前一天 20:00 自动开、提前 2 小时截止」。以后每天自动开局、自动流转。
- 看贡献墙 —— 「贡献」页用绿格子记录每个人做饭/点菜的活跃度。
- 切换语言 —— 登录页或「我的 → 语言」可在中文 / English 间切换。
想换语言或备份?语言在「我的」里随时切;备份只要复制
data目录。
docker compose pull && docker compose up -d
# docker run 方式:docker pull gloridust/gancook:latest 后重新创建容器数据与密钥都在 data 卷里,升级时数据库会自动迁移,登录态保持不变。
想全自动更新可搭配 Watchtower。
网页端一键更新(可选):在「家庭管理 → 关于与更新」可查看版本、点按钮自动拉新镜像并重建容器。
需要让容器能访问 Docker:在 docker-compose.yml 里挂载 /var/run/docker.sock 并以可访问该套接字的用户运行(见 compose 注释)。
未挂载或权限不足时会自动降级为显示手动更新命令,不影响使用。
整个应用的状态只在一个地方:你映射出来的 data 目录(包含 app.db 与 uploads/)。
定时复制这个目录即是完整备份;恢复时放回去再启动即可。
git clone https://github.com/Gloridust/GanCook.git
cd GanCook
npm install
cp .env.example .env.local # 本地可按需修改
npm run db:migrate # 初始化 SQLite
npm run dev # http://localhost:3000- Next.js 16(App Router · Server Actions)+ React 19 + TypeScript
- SQLite + Drizzle ORM(
better-sqlite3) - 鉴权:bcrypt +
jose签名 JWT + httpOnly Cookie - 图片:
sharp压缩转 WebP 落盘 - 调度:进程内
node-cron(启动钩子instrumentation.ts拉起) - 样式:TailwindCSS v4 + 自建「牛奶布艺」设计系统 + Framer Motion
- 中英双语(已上线)
- 多人协作做饭 / 帮买菜清单
- 菜品标签筛选与搜索
- 消息提醒(开局 / 截止前推送)
- 数据导出与一键备份
欢迎在 Issues 里许愿 🙌
欢迎 Issue / PR!开发约定见 CONTRIBUTING.md。
MIT · Made with ❤️ for family dinners






