用户决策:scope=self-only,strategy=full-acme(容器内跑完整 acme.sh)。 ## 动机 此前 HomeDash 的证书由外部链路提供(.106 acme.sh → .60 → 云主机), 而容器是**只读**挂载 /etc/nginx/certs(RW=false),续期后没人告诉它的 nginx 重新握手。本 agent 让 HomeDash 自己闭环:签发 → 写数据卷 → reload。 ## 实现 - deploy/cert-agent.sh:supervisord 新增 [program:cert-agent] - 域名从 /app/data/gateway.yml 的 host 提取(或 CERT_DOMAINS 显式指定) - acme.sh 装进**数据卷** /app/data/acme(容器重建不丢续期状态) - install-cert 到 /app/data/certs/,--reloadcmd 设为 nginx -t && nginx -s reload - 续期后比对公钥指纹,变了才 reload(不盲目 reload) - 未配置 CERT_DNS_CRED 时安静退出,行为与现在完全一致 - 证书目录挂载去掉 :ro(自签需要写;此前只读是刻意的保护) - zd-host.sh 的 env 白名单加 CERT_ 前缀,否则升级时凭据传不进新容器 - install-host.sh 同步支持 CERT_DNS_CRED,避免两套脚本行为不一致 - 证书路径改为数据卷 /app/data/certs/(gateway.yml 指向它) ## 测试(沙箱 stub,非真实签发) - 无凭据 → 安静退出、exit 0、不调 acme、不报错 - 有凭据 → 正确从 gateway.yml 提取 2 个域名、识别 dns_ali、 签发参数正确、指纹变化后触发 reload ## 途中修掉自己的两个真 bug ① run_acme 里用 `set -- $DOMAINS` 改函数位置参数,dash 下与后续变量 展开冲突 ② LE_RELOAD 是命令串,直接当命令名执行 → "LE_RELOAD: not found", 容器里 reload 会**静默失效**;改为函数 + eval ## 边界 只管 HomeDash 自己;introduce/sdk.homeagent 等仍走外部链路。 凭据只从环境变量读,不落盘不入库。
65 lines
2.2 KiB
Plaintext
65 lines
2.2 KiB
Plaintext
[supervisord]
|
||
nodaemon=true
|
||
logfile=/var/log/supervisor/supervisord.log
|
||
pidfile=/run/supervisord.pid
|
||
childlogdir=/var/log/supervisor
|
||
|
||
[program:nginx]
|
||
command=nginx -g "daemon off;"
|
||
autostart=true
|
||
autorestart=true
|
||
stdout_logfile=/dev/stdout
|
||
stdout_logfile_maxbytes=0
|
||
stderr_logfile=/dev/stderr
|
||
stderr_logfile_maxbytes=0
|
||
|
||
[program:searxng]
|
||
# 配置优先级:data 卷里的 /app/data/searxng-settings.yml 存在则用它,
|
||
# 否则用镜像内置的 /etc/searxng/settings.yml。
|
||
#
|
||
# 这样代理(outgoing.proxies)这类**部署相关**配置就落在数据卷里,
|
||
# 重建容器不会再丢;同时也免去“改配置必须重建镜像”。
|
||
# 注意:不能用 supervisord 的 environment= 做条件判断,它不支持逻辑,
|
||
# 所以这里用 sh -c 包一层(/bin/sh 是 dash,语法保持最小)。
|
||
command=/bin/sh -c 'if [ -f /app/data/searxng-settings.yml ]; then export SEARXNG_SETTINGS_PATH=/app/data/searxng-settings.yml; fi; exec /app/searxng-venv/bin/python -m searx.webapp'
|
||
# 不设 environment:继承 docker run -e SEARXNG_BASE_URL 等父进程环境变量
|
||
autostart=true
|
||
autorestart=true
|
||
stdout_logfile=/dev/stdout
|
||
stdout_logfile_maxbytes=0
|
||
stderr_logfile=/dev/stderr
|
||
stderr_logfile_maxbytes=0
|
||
|
||
[program:history-server]
|
||
command=/usr/local/bin/history-server
|
||
autostart=true
|
||
autorestart=true
|
||
stdout_logfile=/dev/stdout
|
||
stdout_logfile_maxbytes=0
|
||
stderr_logfile=/dev/stderr
|
||
stderr_logfile_maxbytes=0
|
||
|
||
[program:admin-server]
|
||
command=/usr/local/bin/admin-server
|
||
autostart=true
|
||
autorestart=true
|
||
stdout_logfile=/dev/stdout
|
||
stdout_logfile_maxbytes=0
|
||
stderr_logfile=/dev/stderr
|
||
stderr_logfile_maxbytes=0
|
||
|
||
[program:cert-agent]
|
||
# 容器内自动续签 HomeDash **自己**的证书(不接管其它站点)。
|
||
# 未配置 CERT_DNS_API/CERT_DNS_CRED 时脚本会安静退出,不影响入口,
|
||
# 证书仍由外部链路(acme.sh → 同步)提供。
|
||
command=/usr/local/bin/cert-agent
|
||
autostart=true
|
||
# autorestart=false:脚本自己内含 sleep 循环,异常退出会停止续签,
|
||
# 但重启它也没用(凭据问题会再退),所以不自动重启以免刷日志。
|
||
autorestart=false
|
||
startsecs=10
|
||
stdout_logfile=/dev/stdout
|
||
stdout_logfile_maxbytes=0
|
||
stderr_logfile=/dev/stderr
|
||
stderr_logfile_maxbytes=0
|