最近在使用 Mazanoke 时遇到一个很“典型的容器问题”:开启 Nginx Basic Auth 后,容器重启会把 auth_basic 相关配置再次注入到 Nginx 配置里,导致 Nginx 启动时报 “directive is duplicate” 并进入 crash loop。
- Issue: civilblur/mazanoke#49
- PR: civilblur/mazanoke#50
🔍 分析 (Analyze)
这类问题的本质是:启动脚本“只会追加、不会清理”,导致配置文件在多次启动后逐步变脏。容器环境下重启是常态,因此 启动脚本必须尽量幂等(idempotent)。
📍 定位 (Locate)
关键在 scripts/basicauth.sh:
- 当设置了
USERNAME/PASSWORD时,它会向 Nginx 配置里插入auth_basic与auth_basic_user_file。 - 但脚本不会检查/清理已有的同类配置,重启后就会重复插入。
🛠️ 执行 (Execute)
我做了两点改动,尽量保持实现简单、可预测:
- 让脚本幂等化:在插入前先清理已有的
auth_basic/auth_basic_user_file行,确保反复执行仍然只有一份配置。\n - 启动时始终执行
basicauth.sh:即使没设置账号密码,也让脚本有机会移除旧的 Basic Auth 配置,避免“上一次开过、这一次关掉却残留”的脏状态。
✅ 总结 (Summary)
这次修复的价值是把“容器重启”变成安全操作:
- 反复重启不会重复注入配置。\n
- 开/关 Basic Auth 都能得到可预期的最终 Nginx 配置。\n
- 改动集中在启动脚本与 Docker 启动流程,风险可控、易于 review。