ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用Docker自建家庭菜谱库:从零搭建私有食谱管理系统

用Docker自建家庭菜谱库:从零搭建私有食谱管理系统 家里的纸质菜谱和手机备忘录实在不够用了前阵子我下了个决心用一台闲置的小主机在自家局域网里搭了一套家庭食谱管理系统Recipes。现在全家人的菜谱都集中在一个私有服务上想找“红烧肉”的做法老人打开平板点一下就有我出门买菜前手机扫一眼购物清单就出发。整个过程不用花一分钱订阅数据和照片都在自己手里用起来踏实。这套东西特别适合几类人家里做饭的人多、菜谱来源杂今天收藏链接、明天拍照存相册又不想把饮食数据放公共平台的或者本来就有群晖、旧电脑之类的设备闲着想折腾点实用项目的。如果你完全没碰过Linux和Docker也能照着下面步骤走通我会把背后的原因和踩过的坑一并写出来。1. 为什么我不继续用备忘录和收藏夹非要在服务器上自建一个菜谱库1.1 家庭菜谱的真实痛点收藏了等于没收藏先说个场景我老婆收藏了七八个美食博主的“蒜香排骨”结果每次做都要从微信聊天记录里翻半天要么打不开要么步骤和配图对不上。我妈做酱牛肉有一套但配方全靠脑子记每次都得打电话问她“生抽到底放几勺”。我自己想创新菜从抖音刷到一条做法截图后在相册里吃灰。这些问题本质上是信息存得太散、没有结构化名称、配料、步骤、备注、难度、荤素、场合全部混在一起搜索只能靠关键词碰运气。自建菜谱库就是把散落的碎片集中到一个统一结构里。每道菜有标准字段用料清单、步骤、预估时间、份量、标签、图片、来源链接。家里每个人都能往里添加也能按自己的习惯打标签比如“孩子爱吃”“减脂”“周末硬菜”。这种结构化的好处用着用着你就会察觉到做饭前不再焦虑打开系统就知道今儿做什么缺什么料。1.2 为什么选“服务器自建”而不是现成App现在市面上的菜谱App也不少但有几个绕不开的问题。第一是数据所有权你上传的照片和习惯数据放别人服务器上哪天平台改版或关停积累的东西可能就没了。第二是全家共享的体验割裂免费版有广告、付费版按人头收费让爸妈和你共用一个账号不仅隐私别扭版本也容易冲突。第三是功能定制空间有限。而自建在服务器上本质上是把数据主权放回自己家。一台旧电脑或者一个小NAS就能跑一旦搭好它就是一个“永远在线”的家庭私有服务。局域网内几十毫秒的延迟打开就像本地应用一样快。更重要的是它可以做到多人独立账号你可以设置管理员权限也能开放“仅看菜谱”给家里老人每个人在手机上都有一个独立的入口却共享同一个菜谱库。这种“私有部署多用户”的组合是任何公共菜谱App都给不了的。1.3 开源方案怎么选Mealie和Tandoor Recipes的取舍选开源食谱管理项目时我主要对比了两个生态最活跃的Mealie和Tandoor Recipes。它们都支持Docker一键部署、多用户、菜谱导入、饮食计划、购物清单但性格完全不同。先说Tandoor Recipes它的另一个名字就叫Recipes功能和社区都很成熟多用户权限体系特别细可以设置家庭组甚至能通过网页抓取任意URL的菜谱。但它的部署略微讲究需要PostgreSQL数据库环境变量多对新手不够友好升级迁移时也有一定门槛。Mealie更像是一个“现代感的家庭食谱库”界面清爽内置了中文部署时可以用SQLite存数据简单到几分钟就起来图片和附件存本地。它对标的就是家用场景多用户、标签收藏、营养解析、meal plan、购物清单全都齐全。我最后用的是Mealie因为它把复杂度藏在了内部运维成本低适合一个家庭长期跑。如果你熟悉PostgreSQL、想精细控制多用户权限可以选Tandoor Recipes如果希望“装上就能用、中文界面省心”Mealie是更稳的选择。无论选哪个核心运行逻辑都是在服务器上开一个Web服务供全家设备访问。2. 搭建前的准备硬件、系统和网络把地基打牢2.1 硬件要求不高闲置机器就行很多人一听到“服务器”就觉得要好几台机架式设备其实家庭自建菜谱库对硬件要求低得惊人。以Mealie为例CPU单核就够用日常操作内存占用大概在512MB到1GB之间加上图片存储几十GB硬盘就绰绰有余。最理想的形式有三种一是旧笔记本拆掉屏幕当主机性能再弱也够跑二是低功耗迷你主机比如J4125、N100这些功耗只有几瓦适合7x24小时开机三是NAS群晖、威联通这类设备自带Docker支持直接在里面跑连备份都能靠NAS的RAID解决。如果你手上只有云服务器同样可以搭。只不过家庭菜谱库的数据属于个人隐私我更推荐放在自己能物理接触到的设备上。我的方案是拿一台退役的ThinkPad装了Debian系统接在路由器旁边功耗很安静内存分配了2GB剩余资源还能跑点别的服务。2.2 系统与Docker环境为什么我推荐Debian系操作系统选Ubuntu/Debian最省心因为这类系统软件源更新及时Docker官方支持最好遇到问题也最容易搜到解决方案。Windows上虽然也能装Docker Desktop但它多了一层虚拟机重启后偶尔会遇到容器没自动跑起来的情况家庭长期运行体验差一些。如果手头只有Windows机器可以先装个VMware或VirtualBox把Debian跑成虚拟机效果一样但会多消耗一部分内存。核心还是Docker它把整个应用连同依赖打包在一起免去手动装数据库、装解释器的痛苦。容器之间互相隔离一旦某个服务出问题重启容器就行不会把宿主系统搞乱。这种“集装箱式”的思想特别适合家庭服务你不会因为升级菜谱系统把整个服务器的其他服务搞挂。2.3 网络规划从局域网访问到远程访问的循序渐进刚开始搭建时别急着搞公网穿透先把局域网访问跑通。你家路由器通常会给服务器一个固定IP比如192.168.1.100那么家人只要在手机浏览器输入http://192.168.1.100:9000就能打开菜谱库页面。要做到这一步只需在路由器后台为服务器设置DHCP静态地址或者直接在系统里配置静态IP避免重启后IP变化。等局域网用顺手了再考虑外部访问。远程访问的稳妥思路是走“组网”而不是把端口暴露到公网。我推荐用Tailscale或ZeroTier它们本质上是搭建一个私有虚拟局域网手机即使在外面也能通过虚拟IP访问家里服务器的菜谱库全程数据加密而且不需要在路由器上开端口安全性比直接端口映射高得多。这个方案后面会细说。3. 实操基于Docker一步步把服务跑起来3.1 安装Docker和Compose两条命令解决的问题假设你已经有一台装了Debian/Ubuntu系统的服务器并且能通过SSH登录。第一步是更新软件源并安装基础工具sudo apt update sudo apt upgrade -y sudo apt install -y curl git然后安装Docker。最可靠的方式是使用Docker官方安装脚本curl -fsSL https://get.docker.com | sudo sh这一步会自动装好Docker引擎和containerd。之后把当前用户加入docker组避免每次都用sudosudo usermod -aG docker $USER newgrp dockerDocker Compose是组装多容器服务的工具新版Docker引擎已经内置了compose子命令可以用docker compose version验证。如果有输出就说明不用单独安装。整个基础环境初始化的时间大约十分钟剩下的就是写配置。3.2 编写docker-compose.yml一份能直接上手的配置我给Mealie准备了一个目录专门存放配置和容器数据比如/opt/mealie。进入目录后新建一个docker-compose.yml文件内容如下services: mealie: image: ghcr.io/mealie-recipes/mealie:latest container_name: mealie restart: unless-stopped ports: - 9000:9000 volumes: - ./mealie-data:/app/data - ./mealie-extra:/app/extra environment: - TZAsia/Shanghai - PUID1000 - PGID1000 - BASE_URLhttp://192.168.1.100:9000 - DEFAULT_GROUP家庭这里解释几个关键配置背后的思考。restart: unless-stopped的意思是除非手动停止否则容器在服务器重启或进程异常退出后会自动拉起这对家庭无人值守环境特别重要。./mealie-data:/app/data把容器里的数据目录映射到宿主机的mealie-data文件夹这样即使容器删掉重建照片和数据库都还留着。PUID/PGID用于指定文件所有者避免容器内进程创建的文件在宿主机上显示为root拖慢后续管理。TZAsia/Shanghai设置时区否则定时任务和菜谱时间显示会差八个小时。DEFAULT_GROUP是自定义的默认分组名这样家庭成员登录后默认就在“家庭”组里。在文件目录下执行启动命令docker compose up -d第一次运行会拉取镜像根据网速一般在几分钟内完成。接着用docker ps查看容器状态看到mealie的STATUS是UP就说明成功。3.3 初始化管理员账号与安全设置浏览器打开http://服务器IP:9000初次访问会跳转到初始化页面。Mealie会让你创建第一个管理员账号填好用户名和密码后系统会自动建立默认的组织和家庭组。这一步要特别注意管理员账号的邮箱和密码务必填写强度足够的组合因为这是整个菜谱库的超级入口拿到它的人不仅能看菜谱还能改设置、加用户。初始化完成后建议立刻做两件事。第一件是把默认的HTTP端口改成更不显眼的自定义端口比如29000但这会牵扯到后续所有访问路径不熟悉也别勉强。第二件是如果计划长期使用尽早配置HTTPS。局域网内部使用可以暂时不配证书一旦要远程访问Tailscale会自动提供加密通道同样安全就不需要单独搞证书了。3.4 数据备份与恢复防患于未然的半小时投入家庭菜谱库用了三个月后你会攒下几百道菜和大量照片那时候再想着备份就晚了。Mealie的数据主要分两部分SQLite数据库文件和data目录下的图片附件。最简单的备份方式是直接复制整个映射目录sudo tar czf mealie-backup-$(date %Y%m%d).tar.gz ./mealie-data备份前不需要停容器SQLite在运行状态下直接复制一般情况下也能恢复但为了绝对安全最好先执行docker compose stop mealie再打包打包完再启动。或者配置cron定时任务每天凌晨自动打包并保留最近七天的备份0 3 * * * cd /opt/mealie docker compose stop mealie tar czf /backup/mealie-$(date \%Y\%m\%d).tar.gz ./mealie-data docker compose start mealie恢复就更简单把备份文件解压回mealie-data目录重启容器即可。很多用户折腾几小时搭好服务却从不考虑备份直到硬盘损坏才后悔所以我建议搭建完立刻做一次手动备份确认文件生成没问题再放心录入菜谱。4. 全家共享的玩法从“独享”到“真·全家共享”4.1 用户管理与家庭权限每个人都有自己的身份服务跑起来只是第一步要让全家都用起来关键是建立多用户。Mealie的管理界面中可以很方便地创建新用户点击“管理”-“用户”添加家庭成员。建议给每位成员独立账号而不是大家共用一个。这样做的价值不只是权限清晰还有几个实际好处每个人可以维护自己的收藏列表和“我的食谱”互相不干扰标记某道菜是谁做的、谁上传的家里就有了一种轻量协作感出问题也好排查比如某个异常导入是谁触发的。权限分配上管理员可以把成员设为“编辑者”或“查看者”。做饭主力账号设成“编辑者”有权增删改菜谱老人和孩子的账号设成“查看者”只能浏览和搜索避免误操作把重要菜谱删了。Mealie的权限是分组级别的还可以按“家庭”组统一管理新成员加进来自动继承组的权限省去一个个配的麻烦。4.2 菜谱录入、URL导入与标签体系把零散信息变成资产菜谱库没有内容就是空壳所以录入效率很关键。Mealie提供了三种录入方式。第一种是手动创建适合家里长辈那种“脑子里传下来的配方”一步一步填写名称、简介、分类、配料、步骤还能上传成品照片。第二种是URL导入把网上看到的菜谱链接粘贴进去系统会自动抓取标题、原料和步骤准确率对常见网站还不错。第三种就是批量导入如果你之前用其他软件导出了JSON或Markdown格式的菜谱Mealie也能识别。我个人强烈建议从一开始就建立统一的标签体系。不要只按菜系标签川菜、粤菜还应该有“工作日快炒”“周末硬菜”“孩子辅食”“减脂”“剩菜利用”这类场景标签。配合列表视图的筛选你会在某个周五晚上发现效率惊人打开“工作日快炒”五分钟内就能选定当晚菜谱随手加入meal plan购物清单自动带着原料飘到手机里。4.3 移动端访问把家人都“绑定”到你的菜谱库如果只能坐在电脑前用老婆孩子在厨房里还是不方便。Mealie自带响应式界面手机浏览器打开网址后可以通过浏览器的“添加到主屏幕”功能安装成PWA应用图标出现在手机桌面打开后全屏显示体验接近原生App。家里主力设备我都装了一个用起来跟独立App没什么差别。厨房是油腻高温环境我不建议直接抱着手机看菜谱所以买了个便宜的防水平板挂在厨房墙上专门打开菜谱库。做饭时语音或触摸划拉步骤比之前一边沾手一边滑手机卫生多了。这与自建服务器配合得特别自然平板不需要登录其他任何平台只能访问自家菜谱库纯粹、没广告、也没多余干扰。4.4 远程访问在外面也能看菜谱和买原料前几天我在超市买菜突然想确认家里有没有老抽。掏出手机连上Tailscale打开菜谱库App搜索“红烧肉”看了一眼用料清单顺手把购物清单里的豆腐勾掉。这种体验的实现靠的是Tailscale组网。Tailscale的部署很简单在服务器上安装并登录手机和家里其他设备也装上同一个账号的客户端。服务器会在虚拟私有网络中获得一个固定的Tailets IP比如100.x.x.x。家人无论在哪个城市只要手机能上网就能通过这个IP访问菜谱库不需要路由器端口映射也没有公网IP要求。相比把9000端口直接暴露到公网Tailscale的连接是加密的且对外不可见安全性高一个量级。如果你只在家里用跳过这步也没问题但一旦开启你会发现“全家共享”才真正没有了地理限制。5. 常见问题与排查心得以及两个值得一提的小技巧5.1 典型问题速查表现象可能原因处理办法浏览器无法访问9000端口容器没起来或防火墙拦截docker ps确认状态检查宿主防火墙放行端口菜谱图片不显示数据目录权限不对确认PUID/PGID与宿主机用户id一致或chown -R 1000:1000 mealie-data添加用户后对方看不到菜谱分组不匹配在管理界面把用户加入与菜谱相同的分组并检查组权限URL导入抓取乱码源网站结构复杂或需登录改成手动录入或先复制正文再粘贴为Markdown容器总是自动停止内存不足或配置有误查看docker logs mealie诊断必要时增加宿主机内存备份无法恢复数据库文件被写入不完整恢复前停止容器确保备份文件完整后再解压时间显示差了8小时未设置TZ环境变量在environment里添加TZAsia/Shanghai并重建容器5.2 几个容易忽视的细节第一个细节是时区。很多容器镜像默认UTC不设置会让菜谱库的“饮食计划”和“更新时间”显示得莫名其妙。建议所有家庭服务都一开始就配上TZAsia/Shanghai不吃时间的亏。第二个细节是不要把数据库文件直接放在Windows NTFS分区或网络挂载盘上。我之前尝试把数据目录放到NAS的SMB共享里结果每次写入都慢得离谱偶尔还出现文件锁问题。解决办法是把数据放在宿主机本地的ext4分区然后用NAS同步备份的方式单独处理。每次重启或者升级稳定性都明显好很多。第三个细节是升级容器前先备份。Mealie迭代挺快但升级也可能引入不兼容的改动。我一般用docker compose pull docker compose up -d更新更新前一定执行一次备份。曾有一次升级后首页布局变了个别历史菜谱图片加载异常幸好备份在手回滚十分钟搞定。再分享两个小技巧。第一个是Mealie支持“最佳配对”和“随机菜谱”家里不知道吃什么时我偶尔会用随机推荐来打破选择困难常常能翻出一两道被遗忘的旧菜。第二个是把菜谱库接入家庭智能屏比如在客厅的智能音箱上把菜谱库的PWA固定到快捷入口做饭前喊一声就能看到今日菜单科技感不算什么但确实方便。这套家庭食谱管理系统Recipes搭建完成后我最大的感触是真正好用的家庭软件不是功能越多越好而是让每个家人都能无门槛地用起来。数据在自己服务器上不担心平台跑路多人在线协作满足全家不同角色Docker管理运维成本极低。如果你手头正好有闲置设备趁着周末动手搭一个比刷一小时短视频有意义多了。
返回列表