Skip to content

🔄 Out-of-the-box acme.sh Docker automation solution - Auto-renew SSL certificates and reload services

License

Notifications You must be signed in to change notification settings

AptS-1547/acme-docker-reloader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

acme-reloader

License

开箱即用的 acme.sh Docker 证书自动化解决方案

一个完整的解决方案,让 acme.sh 在 Docker 容器中自动申请和续签证书,并在证书更新后自动重载宿主机或其他容器的服务(如 Nginx、Caddy 等)。

✨ 为什么选择 acme-reloader?

  • 🚀 开箱即用:克隆、安装、启动,三步搞定
  • 🐳 完美容器化:acme.sh 运行在 Docker,Web 服务器在宿主机或其他容器
  • 🔄 自动化一切:证书自动续签,服务自动重载,无需人工干预
  • 🛡️ 健壮可靠:超时重试、错误处理、详细日志
  • 📝 配置简单:只需配置一条重启命令即可

🎯 使用场景

这个项目专为以下场景设计:

  • acme.sh 运行在 Docker 容器中
  • Nginx/Caddy 运行在宿主机上
  • 需要在证书更新后自动重载 Web 服务器

架构图:

┌─────────────────────┐         ┌──────────────────┐
│  acme.sh 容器       │  socket │   宿主机          │
│  - 自动续签证书      │◄───────►│  - Nginx/Caddy   │
│  - 调用 reloadcmd   │  通信   │  - 自动重载       │
└─────────────────────┘         └──────────────────┘

🚀 快速开始

三步部署

# 1. 克隆项目
git clone https://github.com/AptS-1547/acme-docker-reloader.git
cd acme-reloader

# 2. 运行安装脚本(会提示输入重载命令)
sudo ./install.sh

# 3. 启动 acme.sh 容器
docker-compose up -d

就这么简单!🎉

申请证书

# 进入容器(bash 已自动安装)
docker exec -it acme.sh bash

# 首次使用:注册账号
acme.sh --register-account -m [email protected]
acme.sh --set-default-ca --server letsencrypt

# 申请证书(以 Cloudflare DNS 验证为例)
export CF_Token="your_cloudflare_token"
export CF_Zone_ID="your_zone_id"
acme.sh --issue -d example.com -d *.example.com --dns dns_cf

# 安装证书并设置自动重载
acme.sh --install-cert -d example.com \
  --cert-file /ssl/example.com/cert.pem \
  --key-file /ssl/example.com/key.pem \
  --fullchain-file /ssl/example.com/fullchain.pem \
  --reloadcmd "bash /acme-reloader.sh"

配置 Web 服务器

证书文件位于项目的 ssl/ 目录下,配置你的 Nginx:

server {
    listen 443 ssl;
    server_name example.com;

    # 使用证书的绝对路径
    ssl_certificate /path/to/acme-reloader/ssl/example.com/fullchain.pem;
    ssl_certificate_key /path/to/acme-reloader/ssl/example.com/key.pem;

    # 其他配置...
}

重载 Nginx:

sudo nginx -t
sudo systemctl reload nginx

完成!🎊 证书会自动续签,续签后自动重载 Nginx。

📁 项目结构

acme-reloader/
├── bin/                          # 可执行脚本
│   ├── acme-reloader.sh          # 容器端客户端
│   └── acme-reloader-host.sh     # 宿主机端守护进程
├── lib/                          # 库模块
│   ├── logger.sh                 # 日志模块
│   ├── config.sh                 # 配置解析
│   ├── ipc.sh                    # 进程间通信
│   └── service.sh                # 服务管理
├── config/                       # 配置文件
│   └── config.yml                # 主配置(安装时自动生成)
├── ssl/                          # 证书存储(自动创建)
├── acme-config/                  # acme.sh 配置(自动创建)
├── acme-reloader/                # Socket 通信目录(自动创建)
├── logs/                         # 日志目录(自动创建)
├── docker-compose.yml            # 核心配置文件
├── install.sh                    # 一键安装脚本
├── uninstall.sh                  # 一键卸载脚本
└── README.md                     # 本文件

🔧 工作原理

  1. 安装阶段

    • install.sh 在当前目录初始化项目
    • 配置 systemd 服务运行 acme-reloader-host.sh
    • 创建必要的目录和配置文件
  2. 运行阶段

    • acme-reloader-host.sh 在宿主机作为守护进程运行
    • 创建命名管道(socket)等待通知
  3. 证书更新

    • acme.sh 容器中的证书到期自动续签
    • 续签完成后调用 reloadcmd(即容器内的 /acme-reloader.sh
    • 脚本通过 socket 通知宿主机守护进程
    • 守护进程执行配置的重载命令(如 systemctl reload nginx
    • 返回执行结果

⚙️ 配置说明

配置文件在 config/config.yml,安装时会自动生成。

核心配置

services:
  main:
    command: "systemctl reload nginx"  # 你的重载命令
    enabled: true
    timeout: 15

多服务配置

如果需要同时重载多个服务:

services:
  nginx:
    command: "systemctl reload nginx"
    enabled: true

  caddy:
    command: "systemctl reload caddy"
    enabled: true

Docker 容器服务

如果你的 Nginx 也在 Docker 中:

services:
  nginx_container:
    command: "docker exec nginx nginx -s reload"
    enabled: true

🐛 故障排查

检查服务状态

# 检查宿主机守护进程
sudo systemctl status acme-reloader-host

# 查看日志
sudo journalctl -u acme-reloader-host -f
tail -f ./logs/acme-reloader.log

手动测试重载

# 在容器内测试
docker exec acme.sh bash /acme-reloader.sh

# 在宿主机测试
./bin/acme-reloader.sh

常见问题

Socket not found

问题:容器无法连接到宿主机

解决

  1. 检查守护进程是否运行:sudo systemctl status acme-reloader-host
  2. 检查 socket 是否存在:ls -la ./acme-reloader/socket/
  3. 重启守护进程:sudo systemctl restart acme-reloader-host

服务重载失败

问题:命令执行失败

解决

  1. 查看详细日志:tail -f ./logs/acme-reloader.log
  2. 手动测试命令:systemctl reload nginx
  3. 检查配置文件:cat config/config.yml
  4. 确认有 sudo 权限

更多故障排查请查看 docs/TROUBLESHOOTING.md

📚 详细文档

🔄 升级

# 1. 备份配置
cp config/config.yml ~/config.yml.bak

# 2. 停止服务
sudo systemctl stop acme-reloader-host
docker-compose down

# 3. 拉取最新代码
git pull

# 4. 重新安装(会保留现有配置)
sudo ./install.sh

# 5. 重启服务
sudo systemctl start acme-reloader-host
docker-compose up -d

🗑️ 卸载

sudo ./uninstall.sh

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📄 许可证

MIT License

👤 作者

AptS:1547

🙏 致谢

  • acme.sh - 出色的 ACME 客户端
  • 所有贡献者

⭐ Star History

如果这个项目对你有帮助,欢迎给个 Star!


快速链接安装指南 | 配置说明 | 故障排查 | 提交 Issue

About

🔄 Out-of-the-box acme.sh Docker automation solution - Auto-renew SSL certificates and reload services

Topics

Resources

License

Stars

Watchers

Forks

Contributors 2

  •  
  •  

Languages