本文约 2,993 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:为什么有人会把网站放在家里的 NAS 上
把 WordPress 放在群晖 NAS 上,听起来像折腾,但对特定人群很合理:摄影师想建私人作品库、小团队需要内网知识库、个人开发者想有个零成本的测试环境。硬件已经有了,电费比云主机便宜,数据还在自己手里。
但要清醒:家用宽带没有固定公网 IP、80/443 端口通常被封、上下行带宽不对称。所以 NAS 建站的正确姿势是”内网可用 + 有条件的外网访问”,而不是拿来跑商业站点。
原理分析:NAS 上的容器与云服务器有什么区别
群晖 DSM 7 之后,Docker 套件改名为 Container Manager,本质还是 Docker,只是给了图形界面。三点差异需要注意:
- 共享文件夹即挂载卷:群晖把
/volume1/docker/wordpress这类路径映射到容器,备份时直接打包这个目录即可; - 端口要避免冲突:DSM 自身占用 5000/5001,群晖自带套件也会占端口,WordPress 建议映射 8080 之类的高位端口;
- 网络模式:
bridge模式下容器间用服务名互访(和云服务器一致),host模式会直接用 NAS 的 IP,容易和 DSM 冲突,不建议。
保姆级实操
第一步:安装 Container Manager
套件中心 → 搜索 Container Manager(DSM 6 为 Docker)→ 安装。
第二步:建立目录结构
File Station 里在 docker 下建:
docker/
├── wordpress/
│ ├── html/
│ └── uploads.ini
└── mariadb/
└── data/
第三步:用项目(docker-compose)方式部署
Container Manager → 项目 → 新建,粘贴:
services:
db:
image: mariadb:10.11
container_name: nas-wp-db
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
MARIADB_DATABASE: wordpress
MARIADB_USER: wpuser
MARIADB_PASSWORD: "${DB_PASSWORD}"
volumes:
- /volume1/docker/mariadb/data:/var/lib/mysql
wordpress:
image: wordpress:6.7-php8.2-apache
container_name: nas-wp-web
restart: unless-stopped
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: "${DB_PASSWORD}"
volumes:
- /volume1/docker/wordpress/html:/var/www/html
- /volume1/docker/wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
ports:
- "8080:80"
uploads.ini 内容:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
第四步:修复权限
群晖上 UID/GID 与 Linux 略有差异,容器内 www-data 常无法写入。SSH 登录 NAS 后:
sudo chown -R 33:33 /volume1/docker/wordpress/html/wp-content
(33 是 Debian 系 www-data 的默认 UID/GID。)
第五步:外网访问方案(三选一)
- 方案 A:群晖 QuickConnect / DDNS + 端口转发 —— 在路由器把外网 8080 转发到 NAS,用
xxx.synology.me:8080访问。需要宽带有公网 IP(可向运营商申请)。 - 方案 B:内网穿透工具 —— frp、Cloudflare Tunnel 等。没有公网 IP 时的首选,Cloudflare Tunnel 还能免费拿到 HTTPS。
- 方案 C:Tailscale / ZeroTier 组网 —— 适合纯私人用途,设备装客户端后像在同一个局域网,不暴露到公网,安全性最高。
第六步:备份
群晖自带的 Hyper Backup 可以直接备份 docker 共享文件夹:
控制面板 → 任务计划 → 新增 → Hyper Backup,目标选本地共享文件夹 / 外接 USB / 云端。同时单独做数据库导出:
docker exec nas-wp-db mysqldump -u wpuser -p密码 wordpress > /volume1/backup/wp-$(date +%F).sql
常见踩坑与失败案例
- 容器启动后立刻退出 —— 多半是
/volume1/docker/mariadb/data目录权限或属主不对,MariaDB 拒绝写入。给目录 777 太粗暴,正确做法是查镜像要求(MariaDB 镜像内部用户 UID 为 999)。 - 外网访问时样式全丢 —— 站点地址写的是内网 IP:8080。需要把
WP_HOME/WP_SITEURL改成外网地址。 - 案例:一位摄影师用 NAS 放作品站,上传 500 张原图后 NAS 卡死。原因是 WordPress 生成缩略图时 CPU 打满且没开缓存。解决办法是上传前先本地压缩,并安装图片压缩插件减少生成尺寸。
- 硬盘休眠被破坏 —— MariaDB 频繁写日志会让 NAS 硬盘无法休眠。可以把数据库日志写入关闭或降低频率。
- 突然断电导致数据库损坏 —— NAS 上跑数据库强烈建议配 UPS,否则一次断电就可能
Table is marked as crashed。
总结
群晖 NAS 部署 WordPress 适合私人、内网、低频访问场景,优势是零边际成本和数据自主,劣势是带宽、稳定性和公网可达性。真要对外服务,我的建议是用 Cloudflare Tunnel 或 Tailscale 这类不暴露端口的方案,配合 Hyper Backup 做每日备份,把 NAS 当作”内容生产与存储端”,把公网流量交给 CDN 或云服务器。
