家里有两个经久不衰的难题:今天谁做饭,以及吃什么。
回答这两个问题的过程,常常比做饭本身还累。商量半天,要么没人接话,要么最后又是同一个人进了厨房。
GitHub 上有个叫「干饭厨子」(GanCook)的开源项目,把这套流程搬到了 NAS 上——让一家人轮流做饭、点菜、打分,全程自动流转,所有数据存储在本地 NAS 上,不依赖任何云服务。
可一键部署到 NAS 的家庭点菜系统,让一家人轮流做饭、点菜、互相打分
可一键部署到 NAS 的家庭点菜系统,让一家人轮流做饭、点菜、互相打分
干饭厨子的核心逻辑可以拆成三步:
第一步:自动开局。 你可以像设闹钟一样添加规则——比如「每天午餐 12:00,前一晚 20:00 自动开,提前两小时截止点菜」。到时间系统自动创建饭局,不用人盯着。
第二步:点菜和认领。 饭局开了以后,家人各自勾选想吃的菜。谁今天掌勺,点一下「我来做这顿」就算认领了,责任归属清楚。
第三步:吃完饭打分。 饭后互相评价,这个分数会汇入贡献墙。
贡献墙是一个 GitHub 风格的热力图,用绿格子记录每个人做饭和点菜的活跃度。月底扫一眼,谁在默默下厨一目了然。
作者在 README 里写道:「今天谁做饭?」「吃啥?」——干饭厨子把这两个每天都要吵一遍的问题,变成一件温馨小事。
部署就一条命令- docker run -d --name gancook \
- -p 3000:3000 \
- -v ./data:/data \
- --restart unless-stopped \
- gloridust/gancook:latest
复制代码
打开 http://<NAS-IP>:3000,第一个注册的人自动成为管理员。不用配环境变量,不用单独搭数据库,密钥和会话签名首启时自动生成并存到 data 目录里。
也支持 docker compose,飞牛、群晖等 NAS 可以直接在 Docker 管理界面搜 gloridust/gancook 创建容器。
备份:把映射出来的 data 目录复制一份就行,里面是 SQLite 数据库和上传的图片。恢复时放回原位置,重新启动容器即可。
几个用心的细节
选头像登录。 家里的平板通常多人共用,打字登录很麻烦。干饭厨子的做法是:注册时上传头像,之后登录只需在列表里点头像再输 6 位密码,对老人和小孩都友好。
图片自动压缩。 头像和菜品照片上传时用 sharp 压缩转 WebP 格式,限制在 2MB 以内,直接落盘而不是塞进数据库里。加载快,数据库体积也小。
网页端一键更新。 管理员在「家庭管理 → 关于与更新」可以看到当前版本,点击按钮自动拉新镜像并重建容器。前提是挂载了 Docker 套接字;没挂载或权限不够时会自动降级为显示手动更新命令。
PWA 支持。 可以从浏览器添加到手机主屏,体验接近原生应用,但不需要走应用商店分发。
技术栈
GanCook 基于 Next.js 16(App Router + Server Actions),React 19 + TypeScript。数据库用 SQLite 搭配 Drizzle ORM(better-sqlite3)。鉴权用 bcrypt 加 jose 签名的 JWT,存在 httpOnly Cookie 里。
定时调度由进程内的 node-cron 处理,通过 Next.js 的 instrumentation.ts 启动钩子拉起。样式是 TailwindCSS v4 加自建的「牛奶布艺」设计系统,动效用了 Framer Motion,移动端优先。
整个项目只有一个容器,没有外部数据库,没有云服务依赖。
项目地址:https://github.com/Gloridust/GanCook
|