标签: WordPress

  • WordPress 容器化部署中的数据持久化与备份

    整理说明:本文属于“2025-2026 技术笔记整理”系列,于 2026 年 8 月集中整理并公开发布。

    WordPress 容器的数据持久化与可恢复备份

    容器可以重建,但数据不能随可写层消失。WordPress 状态包括数据库中的文章、用户和配置,以及文件系统中的上传、主题、插件与运行配置。只备份一类无法恢复完整站点。

    把数据放到容器之外

    WordPress 站点目录通常是 /var/www/html,MariaDB 数据目录是 /var/lib/mysql。为它们挂载命名卷,容器替换后仍可挂载原数据:

    services:
      database:
        volumes:
          - database_data:/var/lib/mysql
      wordpress:
        volumes:
          - wordpress_data:/var/www/html
    
    volumes:
      database_data:
      wordpress_data:
    

    命名卷由 Docker 管理。docker compose down 默认保留它们,docker compose down -v 则会删除项目命名卷。卷并非备份:磁盘损坏、误删和错误写入仍会影响数据。

    分别导出数据库和站点文件

    数据库应使用自身的逻辑导出工具备份,不能在运行中直接复制 /var/lib/mysql。以下命令从挂载的密码文件读取凭据,并把 SQL 输出到主机;备份目录应提前创建并限制权限:

    docker compose exec -T database sh -c \
      'mariadb-dump --single-transaction --quick \
      -u"$MARIADB_USER" -p"$(cat "$MARIADB_PASSWORD_FILE")" \
      "$MARIADB_DATABASE"' > backup/wordpress.sql
    
    docker compose exec -T wordpress \
      tar -C /var/www/html -czf - . \
      > backup/wordpress-files.tar.gz
    

    -T 关闭伪终端,避免混入控制内容。--single-transaction 为事务表提供一致性快照;存在非事务表或结构变更时应安排维护窗口。文件与数据库应同期备份,减少附件不匹配。

    备份完成不等于可以恢复

    • 为文件名加入时间标识,记录对应的 Compose 配置、镜像标签和恢复说明。
    • 将备份复制到另一台主机或对象存储,不要只放在原服务器磁盘。
    • 对归档和 SQL 计算校验值,备份任务失败时应产生告警。
    • 密码和密钥应单独加密保管,避免明文秘密混进普通归档。

    恢复时先阻止写入,在干净卷还原文件并导入数据库,再核对域名、媒体、登录和插件。演练应在隔离环境执行;只有完成关键操作,才能证明备份有效。生产站点还应明确恢复时间和可接受的数据丢失范围。

  • WordPress 邮箱注册背后的事务邮件链路

    整理说明:本文属于“2025-2026 技术笔记整理”系列,于 2026 年 8 月集中整理并公开发布。

    注册功能只是链路的起点

    WordPress 在“设置-常规”中允许任何人注册后,会开放注册入口,并按“新用户默认角色”创建账号。默认角色应保持为订阅者等低权限角色,不能为了省事设为管理员。公开注册还需要验证码、速率限制或人工审核等反滥用措施;这些措施负责控制账号创建,却不能代替邮件投递配置。

    一封激活邮件经过哪些组件

    注册、密码重置或评论通知触发后,核心代码或插件调用 wp_mail(),再由 WordPress 内置的 PHPMailer 交给本机邮件程序或 SMTP 服务。SMTP 服务器接受后,还要经过队列、域名认证、收件方策略和最终邮箱分类。一封邮件没有出现在收件箱,故障可能位于任意一段:

    注册动作 -> WordPress/插件 -> wp_mail()
             -> PHPMailer -> SMTP 提交 -> 收件服务器 -> 邮箱
    

    wp_mail() 返回成功,只说明调用阶段没有报告错误,不代表收件服务器已经接收,更不代表邮件进入收件箱。应同时查看 WordPress 错误、SMTP 响应、服务商投递事件以及退信内容。

    为事务邮件配置稳定出口

    生产站点通常通过 SMTP 插件或代码把邮件提交到受控中继。587 端口常用于 STARTTLS 提交,465 常用于隐式 TLS;25 端口主要承担邮件服务器之间的传输,不应把主机商封禁 25 端口误判为 WordPress 无法发送邮件。凭据应使用专用账号或令牌,并通过环境变量、秘密文件等受控方式管理,避免出现在仓库、日志和截图中。

    • 发件地址使用站点自己的域名,并保持可接收退信。
    • SPF 授权实际中继,DKIM 由出站系统签名,DMARC 检查 From 域对齐。
    • 邮件正文提供站点名称、操作目的和有效链接,不记录密码或完整重置令牌。
    • 限制注册频率,并为邮件失败提供重新发送入口。

    按场景完成上线测试

    先验证 SMTP 端点的 DNS、端口和 TLS,再分别执行新用户注册、找回密码、管理员通知三类测试。测试应覆盖至少两个不同邮件服务商,并检查发件人、回复地址、链接域名、垃圾箱、延迟和移动端显示。只测试插件自带的“测试邮件”不够,因为它不会覆盖真实注册钩子、模板和权限逻辑。

    openssl s_client -starttls smtp \
      -connect smtp.example.net:587 -servername smtp.example.net
    

    这条命令只能验证网络与 TLS 握手,不能证明账号认证或最终投递成功。运行中应记录时间、收件域、消息标识和 SMTP 状态码,但避免保存邮件正文与敏感链接。这样才能沿链路定位问题,而不是反复更换插件碰运气。