群晖 DS220+ Docker WordPress 部署与外网访问使用说明(含问题复盘与流量策略)

目标与约束

  • 目标
  • 在 Synology DS220+ 上使用 Docker 部署 WordPress(写博客、上传摄影作品)
  • 支持外网 HTTPS 访问:https://blog.8848.myds.me
  • 支持后续扩展多个应用(必须使用子域名/反向代理,不占用根域名单站点)
  • 提供可恢复的备份方案(博客内容长期资产)

关键约束/现实条件

  • 网络出口设备为 Singtel ONR(光猫一体机)192.168.1.254,TP-Link 为 AP 模式(不做路由/DHCP/DNS)
  • ONR 不支持(或阉割):
  • NAT Hairpin / NAT Loopback(内网访问公网域名回流失败)
  • DHCP 下发 DNS(LAN DNS 输入框灰色无法编辑)
  • 因此:外网能访问域名,但内网访问同域名会失败,需要额外方案解决(见 §6)
  1. 当前网络拓扑

Internet
|
[Singtel ONR/光猫一体机] LAN: 192.168.1.254 (负责 NAT / 防火墙 / 端口转发 / DHCP)
|
[TP-Link] AP 模式 (只做 Wi-Fi/交换,不做 NAT/DHCP/DNS)
|
局域网设备:Mac/iPad/PS5/Apple TV/群晖 NAS
群晖 NAS:192.168.1.x (示例,以你实际为准)

  1. 域名、DDNS 与证书
    3.1 已使用域名
    Synology DDNS / myds.me:
    ann9527.myds.me(原有)
    blog.8848.myds.me(新增用于 WordPress)
    结论:DDNS 多个记录可共存,新增 blog.* 不必覆盖 DSM 的 DDNS,只要你在反向代理和证书里正确绑定即可。
    3.2 HTTPS 证书
    Let’s Encrypt 证书需覆盖 实际访问的域名:blog.8848.myds.me
    关键点:证书必须绑定到反向代理的“主机名”,而不是只给根域名 8848.myds.me
  2. ONR(光猫)侧配置:端口映射/转发
    4.1 端口映射的目的
    让公网访问:
    https://blog.8848.myds.me(443)
    (可选)HTTP 80 用于跳转到 HTTPS 或 ACME 验证
    转发到群晖 NAS 内网 IP(示例 192.168.1.3)。
    4.2 端口映射规则(建议)
    在 ONR 后台的 Port Forwarding / Virtual Server 中新增(示例):

重要说明:端口转发只影响入站连接(Internet → 家里)。
家里设备访问外网的“出站流量”不会因为端口转发而被改变。
4.3 “转发 443 会影响其他设备吗?”
不会影响局域网设备“出站访问”443(比如 Apple TV 看 Netflix、PS5 玩游戏)。
影响的是外部访问你家的公网 443时,转发到 NAS。

  1. 群晖侧配置:反向代理与 Docker WordPress
    5.1 Docker Compose(核心要点)
    你当前的 WordPress 对内用 8080:80 暴露(局域网调试入口),最终对外由 NAS 的反向代理承接 443。
    示例(你实际使用的容器名与密码已固定):
    WordPress 容器:wp_app
    DB 容器:wp_db
    WordPress 端口:NAS 8080 → 容器 80
    数据持久化目录:
    /volume1/docker/wordpress/app
    /volume1/docker/wordpress/db
    5.2 为什么 DB 版本降级后才稳定?
    你遇到过:
    MariaDB 11 相关崩溃恢复 / tc.log 错误
    出现 “ready for connections” 不稳定
    “Error establishing a database connection”
    最终通过降低 DB 版本并重建解决。
    经验结论:在 Synology 的内核/容器限制下,某些 MariaDB 新版本可能更容易触发崩溃恢复/IO 模式兼容问题;选择更成熟的版本更稳。
    5.3 群晖反向代理(外网入口)
    目标:外网访问 https://blog.8848.myds.me → 反代到 http://127.0.0.1:8080(或 http://NAS_LAN_IP:8080)
    反向代理规则建议
    来源:
    协议:HTTPS
    主机名:blog.8848.myds.me
    端口:443
    目标:
    协议:HTTP
    主机名:127.0.0.1(或 192.168.1.3)
    端口:8080
    证书:选择覆盖 blog.8848.myds.me 的 Let’s Encrypt 证书。
    5.4 WordPress 必须“知道外面是 HTTPS”
    你已经在 wp-config.php 加了:

if (isset($_SERVER[‘HTTP_X_FORWARDED_PROTO’]) && strpos($_SERVER[‘HTTP_X_FORWARDED_PROTO’], ‘https’) !== false) {
$_SERVER[‘HTTPS’] = ‘on’;
}
作用:
反向代理到容器内部是 HTTP,但外部用户是 HTTPS
如果不设置,WordPress 会误判为 HTTP,导致:
登录回跳异常
生成 URL 带 :8080 或混合内容
反复重定向到错误端口
5.5 是否需要把 URL 从 IP 改成域名?
建议最终使用域名作为唯一入口(外网与内网都统一),避免数据库里生成大量 IP 链接。

  1. 特殊问题:内网访问域名失败(NAT Hairpin / DNS 限制)
    6.1 现象
    外网访问:✅ https://blog.8848.myds.me 正常
    内网访问(连家里 Wi-Fi):❌ 打不开或超时
    6.2 根因(你这套网络下的关键结论)
    内网设备解析 blog.8848.myds.me → 公网 IP
    访问路径变成:内网 → 公网IP → ONR →(需要回流到内网 NAS)
    ONR 不支持 NAT Loopback/Hairpin → 回流失败
    且 ONR 的 LAN DNS 下发被锁(DNS 输入框灰色),TP-Link 又是 AP(无法替代 DHCP/DNS)
    6.3 已验证的临时解决方案(Mac)
    Mac 可以通过 hosts 强制解析到内网 IP:
    /etc/hosts 添加:

192.168.1.3 blog.8848.myds.me
这能让内网访问域名直达 NAS,不走公网,从而绕开 Hairpin 问题。
6.4 iPad 无法改 hosts(结论)
iPadOS 不支持修改 hosts(不越狱情况下不可行)。
6.5 面向全家设备的长期方案(推荐路径)
要让 iPad/Apple TV/PS5 在内网也能用域名,只有三类路:
让 TP-Link 改成主路由模式(Router 模式)
让 TP-Link 承担 NAT/DHCP/DNS,下发自定义 DNS 或支持 NAT Loopback
ONR 尽量桥接/DMZ/关闭双 NAT(取决于 Singtel 是否允许)
内网自建 DNS(Synology DNS Server / AdGuard Home)并让 DHCP 下发 DNS
但你当前 ONR 锁死 LAN DNS,下发做不了
只有当你把“发 DHCP 的设备”换成可控设备(如 TP-Link Router 模式)才成立
每台设备单独改 Wi-Fi DNS(可行但维护成本高)
iPad 可在 Wi-Fi 里“配置 DNS→手动”指向群晖 DNS
但对多设备不够优雅

  1. 当前方案的流量转发策略(最重要)
    7.1 外网访问链路(HTTPS)

外网用户浏览器
-> DNS 解析 blog.8848.myds.me 到你的公网 IP
-> 访问 公网IP:443
-> ONR 端口转发:443/TCP -> 192.168.1.x:443(群晖)
-> 群晖 Nginx/反向代理:按 Host=blog.8848.myds.me 匹配规则
-> 反代到 http://127.0.0.1:8080
-> Docker 容器 wp_app:80 响应 WordPress
7.2 内网访问链路(当前现实)
内网直接访问域名:失败(因 Hairpin)
内网通过 hosts(Mac):

Mac hosts 将 blog.8848.myds.me -> 192.168.1.x
-> 直接访问 NAS 内网 443
-> 群晖反代 -> 8080 -> wp_app
7.3 DSM 访问(避免互相干扰)
DSM 默认端口常见为 5000/5001
WordPress 走 80/443(Host-based 反向代理分流)
只要你不在 NAS 上“把 443 直接绑死到某单一应用”,通过反向代理按域名分流即可共存

  1. 备份与恢复(已落地脚本)
    你已经落地了:
    自动备份脚本(逻辑 + 停机物理)
    自动恢复脚本(指定日期恢复 + 重命名旧目录防误操作)
    备份路径统一到 /volume1/DOC/… 并修复 ACL 可见性问题(你之前踩过 /volume1/doc 大小写坑)
    建议把备份脚本 + 恢复脚本一起存放在:
/volume1/docker/wordpress/backup_scripts/
    并用 DSM 任务计划(root 执行)定时运行。
  2. 已解决的“坑点清单”(复盘)
    80/443 外网访问失败
    最终确认可通过 ONR 端口映射解决(转发到 NAS)
    反向代理 443 被占用
    原因:DSM 自身 Nginx 占用 443 属正常
    正确做法:在“反向代理规则”里按 Host 分流,不是抢占端口
    WordPress 数据库连接错误 / DB 不稳定
    MariaDB 版本兼容/崩溃恢复导致
    降低 DB 版本后重建恢复正常
    外网跳转到 :5001 / :8080
    WordPress 不知道外部是 HTTPS / URL 写死与反代冲突
    通过 HTTP_X_FORWARDED_PROTO 处理 + 统一域名入口修正
    内网域名访问失败
    ONR 不支持 NAT Hairpin + DNS 下发锁死
    Mac 可用 hosts 验证与临时解决;iPad 不能改 hosts,需要网络架构升级或 DNS 方案
    备份文件 DSM 看不到
    原因:路径写到 /volume1/doc(小写)产生 root 私有目录,且 Synology ACL 影响可见性
    统一改为 /volume1/DOC 并执行 ACL 继承/权限修复后解决
  3. 日常使用建议(摄影博客场景)
    上传图片建议启用压缩/缩略图策略(避免原图外网加载慢)
    主题/插件升级前先跑一次备份(你脚本已支持)
    避免直接用 IP 访问站点,长期会污染链接(图床、文章内链)
  4. 后续可选升级路线(按优先级)
    把 TP-Link 从 AP 改为 Router(主路由):一次性解决 Hairpin + 可控 DHCP DNS
    内网 DNS(Synology DNS Server/AdGuard):统一解决 iPad/Apple TV 内网域名访问
    异地备份:Hyper Backup 到云端/另一台 NAS(长期资产更稳)

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注