作者: 未知狐 时间: 2025-7-19 分类: 随手记,Linux,趣分享,时间轴,折腾=-=,硬核灌水
前清提要:
为了方便使用,我用podman-compose 文件部署了pmail,配置如下:

pmail-compose.yml

version: '3'
services:
pmail:

image: ghcr.io/jinnrry/pmail:latest
container_name: pmail
restart: always
ports:
  - "25:25"
  - "80:80"
  - "443:443"
  - "110:110"
  - "465:465"
  - "995:995"
  - "993:993"
volumes:
  - "/root/podman/pmail/config:/work/config"

这样,更新pmail版本只需要执行:

podman stop pmail
podman rm pmail
podman rmi pmail:latest
podman-compose -f pmail-compose.yml up -d

就能完成数据无损更新。

但是今天发现kmail无法正常连接邮件服务器,打开浏览器一检查后台,发现web后台也挂了,那肯定是后端服务出问题了。
遂SSH上线Debug。
podman logs -f pmail
发现日志疯狂刷新不带停的,Ctr+C 好几次后才停下来。报错和ssl.go等文件有关系,我不是开发者也看不明白,不过报错文件路径前有一句指向明确的英语意思是警告证书过期,这句倒是看懂了🤣。
那么接下来就是更新证书了,查看服务配置文件发现,我配置的是手动管理证书。
参见: 配置文件说明

{

"logLevel": "",
"domain": "linuxuser.site",
"domains": [
    "linuxuser.site"
],
"webDomain": "mail.linuxuser.site",
"dkimPrivateKeyPath": "/work/config/dkim/dkim.priv",
"sslType": "1",
"SSLPrivateKeyPath": "/work/./config/ssl/private.key",
"SSLPublicKeyPath": "/work/./config/ssl/public.crt",
"dbDSN": "/work/config/pmail.db",
"dbType": "sqlite",
"httpsEnabled": 0,
"spamFilterLevel": 1,
"httpPort": 0,
"httpsPort": 0,
"weChatPushAppId": "",
"weChatPushSecret": "",
"weChatPushTemplateId": "",
"weChatPushUserId": "",
"tgBotToken": "",
"tgChatId": "",
"isInit": true,
"webPushUrl": "",
"webPushToken": ""

}
显然是当初部署的时候因为已经有服务器部署了ACME.sh更新证书所以不能用项目推荐的证书更新管理方式;这等于是又挖了个更新的坑————配置A-B服务器证书文件同步。

编写证书同步脚本:
首先要厘清我的服务架构,我在ClawHK服务器(也就是本博客所在的服务器)部署了ACME.sh管理证书并对其他服务器线路不佳的Web服务(RackNerd-USA)进行反代,因此证书本身是处于ClawHK上的,现在我需要把它同步到Racknerd-USA的指定路径供PMail使用。
先自己简单写出来基本操作流程,再用DeepSeek和ChatGPT进行细节润色。

!/bin/bash

PmailSSLSync.sh

本脚本应该运行在Racknerd-USA

定义变量

local_private_key_path="/root/podman/pmail/config/ssl/private.key"
local_public_key_path="/root/podman/pmail/config/ssl/public.crt"
remote_private_key_path="/home/xfox/www/all_linuxuser.site/privkey.pem"
remote_public_key_path="/home/xfox/www/all_linuxuser.site/fullchain.pem"
temp_dir=$(mktemp -d /tmp/cert_sync_XXXXXX)

停止服务

sudo podman stop pmail

删除本地过期证书

sudo rm -f "$local_private_key_path" "$local_public_key_path"

从ClawHK同步证书文件到临时目录

sudo rsync -avz -e "ssh -i /root/.ssh/id_ed25519 -o StrictHostKeyChecking=no" \
[email protected]:"$remote_private_key_path" \
[email protected]:"$remote_public_key_path" \
"$temp_dir/"

检查文件是否存在

if [ ! -f "$temp_dir/privkey.pem" ] || [ ! -f "$temp_dir/fullchain.pem" ]; then
echo "证书同步失败!"
sudo podman start pmail
exit 1
fi

移动证书到最终位置

sudo mkdir -p "/root/podman/pmail/config/ssl"
sudo mv "$temp_dir/privkey.pem" "$local_private_key_path"
sudo mv "$temp_dir/fullchain.pem" "$local_public_key_path"
sudo chmod 600 "$local_private_key_path"
sudo chmod 644 "$local_public_key_path"

清理临时目录

rm -rf "$temp_dir"

重启服务

sudo podman start pmail

有脚本了,还得保证脚本及脚本所需命令能能按时跑。
在邮件服务器上安装好所需工具,并添加定时任务
apt install crontab rsync
crontab -e
添加如下条目

0 4 * /root/PmailSSLSync.sh

应该不会有人凌晨四点给我发邮件吧 ;)
添加完成后检查一下:
crontab -l
大功告成!

标签: none

添加新评论