用cerbot自动更新docker里caddy的证书
用cerbot自动更新docker里caddy的证书
一、背景
一个小项目,使用了ssl加密访问web服务。之前用nginx+zeroSSl来免费白嫖证书,每三个月换一次,用了大概一年左右,这次再续期时,竟然提示我You have reached the maximum amount of 90-day certificates allowed on the Free Plan.
。好家伙,不给你玩了!
为了这不赚钱的小项目去买证书是不可能的,转caddy去,之前用v2xx+caddy+ssl搭建科学上网就很好的解决了证书问题。不过那都是在主机里运行的,这次有点不一样,caddy是运行在docker里的。
二、准备工作
- 安装certbot
apt install certbot
安装caddy容器
这里我用的是docker-swarm编排文件deploy.yml,其中Caddyfile配置文件需要自己建。
caddy: image: caddy restart: unless-stopped ports: - "6000:80" - "4000:443" volumes: - /home/docker/caddy/Caddyfile:/etc/caddy/Caddyfile - /home/docker/caddy/site:/srv - /home/docker/caddy/caddy_data:/data - /home/docker/caddy/caddy_config:/config
完成后,
docker-compose -f deploy.yml up -d
==-d== 表示后台运行。这里也给出Caddyfile的简单配置信息吧,每个人的需求不一样,需要根据情况修改。{ http_port 80 debug https_port 443 } xx.xxx.cn { # tls mail@qq.com #这里是获取到证书后才引用的 tls cert.pem privkey.pem #hanlde /test { # respond "this is test" #} root * /srv file_server browse
三、获取证书
对于获取证书,之前我有写过, certbot certonly 自动获取证书非80端口的坑。当时使用的是自动校验域名的方式,还踩了坑。由于项目所在外网不开放80端口,这次采用dns的方式来验证。
certbot --manual --preferred-challenges dns certonly
根据向导确认,后面会生成一个acme字符串和值,到dns域名控制台,新建一个txt记录,粘贴进去即可,这个写得很好(https://blog.csdn.net/qq_36840228/article/details/121038844)我就不重复了。获取到的证书 在/etc/letsencrypt/live/你的域名
文件夹下,我们只需要cert.pem,privkey.pem。
把上面两个文件复制到网站的根目录下,将handle /test注释去掉,保存重启caddy,测试xx/test,能看到消息说明证书正常。
四、设置自启动及自动更新证书
由于certbot与caddy不在同一环境里,tls xxx@xx.com 自然不生效的,所以才需要手动指定tls证书。我这里是将certbot生成的证书直接放到caddy网站根目录,然后用certbot renew去更新证书,最后再用crontab来设置每5天更新一次证书,然后自动重启caddy。
crontab -e进入编辑,增加两行,一行是每次系统重启执行,一行是每5天执行一次。
@reboot /home/docker/update_cert/auto_update.sh &
* * */5 * * /home/docker/update_cert/auto_update.sh &
shell代码如下:
echo "$(date) start now.." >> log.txt
certbot renew >>log.txt
docker restart `docker ps |grep caddy |awk '{print $1}'` >> log.txt
echo "$(date) end!"
这样设置之后就能愉快的玩耍了!
评论已关闭