说起用 Docker 把 Halo 搞起来,我这几天真是跌跌撞撞。最开始,我还满怀期待地把官方的 docker-compose.yaml 复制粘贴到 NAS 的 /volume1/docker/halo 目录,心里想着「这下省事儿」,结果第一天就被一行红字吓哭了:permission denied while trying to connect to the socket。
我把 halo2 和 db 两个挂载目录直接建在根目录,默认是 admin 用户,容器里跑的是 root。于是容器尝试写入 /root/.halo2 时被拒绝。解决办法很直接:chmod -R 777 halo2 db,或者在 docker-compose 里加上 user: "0:0"。这一步踩过去,后面的日志才会真正出现。
Halo 的数据库密码必须在 POSTGRES_PASSWORD、spring.r2dbc.password 以及 halo.external-url 里保持一致。我第一次把密码写成 openpostgresql,结果在容器日志里看到 authentication failed for user "halo",于是只好把所有地方的密码统一改成 MySecret123,记得写在 .env 文件里,免得手动改来改去。
官方的 healthcheck 用 curl -f http://localhost:8090/actuator/health/readiness,但我的容器一启动就一直显示 unhealthy,原因是 external-url 里写成了 localhost,容器内部根本访问不到外网。把它改成 http://host.docker.internal:8090(或者直接删掉让 Halo 使用默认)后,健康检查顺利通过,容器也不再疯狂重启。
Halo 默认 -Xmx256m,在我这台只有 2GB 内存的 NAS 上运行,刚好够用。但一旦打开了图片上传功能,内存瞬间飙到 800MB,容器直接 OOM 退出。把 JVM_OPTS 改成 -Xmx1g -Xms512m 并在 docker-compose 里加上 mem_limit: 1g,系统稳住了。其实只要根据自己的硬件适配一下,别把默认值当成金科玉律就行。
我曾经把 Halo 的 8090 端口映射到宿主机的同一个端口,却忘了已经有一个旧的 Nextcloud 容器占用了。启动时 Docker 报错 port is already allocated,我只好改成 8091:8090,顺手把反向代理的配置也改了一遍。以后检查 docker ps,确认端口空闲再动手,省得手忙脚乱。
.env,避免手动笔误。docker ps 确认端口不冲突。总的来说,Docker 把 Halo 装进容器里其实并不难,真正卡住的往往是这些细节。把它们一一击破,后面就能安安静静地写博客、发图文了。好啦,祝你玩得开心~
参与讨论
数据库密码要统一这个太关键了,我上次就是漏了一个地方。
健康检查卡住那会儿,我还以为是网络问题,原来是URL写错了。
2G内存的NAS跑Halo确实有点吃力,调了JVM参数才好点。
权限问题真的坑,之前我也折腾了好久才搞定。
端口占用这个太真实了,经常启动失败才发现是被别的服务占了。
想问下,如果用host模式跑,健康检查的地址该怎么写?
感觉楼主总结的这几个点都挺到位的,帮大忙了。🤔
我之前在树莓派上部署也遇到过OOM,加了swap才解决。
反向代理这块能再细说一下吗?Nginx配置有什么要注意的?
这些坑踩一遍,下次部署就顺手多了。
直接给777权限会不会有安全风险啊?
总算看到有人把这些问题说清楚了,点赞。
看来部署前真得好好检查一遍配置,不能直接复制粘贴。