/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
利用 Docker 搭建私有家庭云盘:Nextcloud 与 Tailscale 的无公网内网穿透

在全家人的数字生活中,"远程访问家中数据"是一个极高频的需求:
老爸老妈出门旅游,想随时在手机上查看存放在家中 NAS 里的老照片和体检报告;自己在异地咖啡馆办公,需要调取家里私有 Git 仓库和 Beancount 账本。
很多开发者为了解决外网访问,去申请昂贵的公网公网 IP、或者在路由器上开放高危的端口映射(Port Forwarding)。但在没有专业安全团队维护的情况下,将家庭 NAS 的 80/443 端口直接暴露在公网 IPv4/IPv6 上,等同于向全网黑客扫描器门户大开,极易遭遇勒索病毒(Ransomware)的定点爆破。
最安全、最优雅的现代方案是:零端口映射、零公网暴露,基于开源的 Nextcloud 搭建私有云盘 + 基于 WireGuard 协议的 Tailscale 虚拟网状局域网(Mesh VPN)。
无论全家人身在天涯海角,只要打开手机,所有设备如同物理连接在客厅同一个局域网交换机上一样,享受百兆加密直连。
flowchart LR
DadPhone[老爸在景区手机 (移动5G)] –> TailscaleClient[Tailscale 客户端]
TailscaleClient –>|基于 WireGuard 的 P2P 零信任加密隧道| TailscaleNAS[家中 NAS Tailscale 节点]
TailscaleNAS –> Nextcloud[Docker Nextcloud 私有云盘容器]
Nextcloud –> ZFS[(NAS 本地 ZFS 存储池: /mnt/storage)]
Nextcloud + Tailscale 方案的三大核心优势
- 路由器不需要开启任何端口转发(Port Forwarding),公网扫描器根本探测不到家庭 NAS 的任何开放端口。
- Tailscale 仅利用协调服务器进行 NAT 穿透握手;一旦建立连接,数据流量直接在手机与 NAS 之间进行点对点 UDP 传输,速度跑满 5G 物理宽带上限。
- 在父母手机上开启"始终开启 VPN",老两口完全不需要理解复杂的网络概念,打开相册 App 就能像在家里一样秒刷高清照片。
Docker Compose 极简部署清单
在家庭 NAS 上,我们通过 docker-compose.yml 快速拉起优化后的 Nextcloud 与 Tailscale 容器:
version: '3.8'
services:
# 1. 数据库后端 (PostgreSQL)
nextcloud_db:
image: postgres:16-alpine
container_name: nextcloud_db
restart: always
environment:
POSTGRES_DB: nextcloud
POSTGRES_USER: nc_admin
POSTGRES_PASSWORD: SecretPassword123!
volumes:
– /mnt/storage/app_data/nc_db:/var/lib/postgresql/data
deploy:
resources:
limits:
memory: 256M
# 2. Nextcloud 核心服务
nextcloud_app:
image: nextcloud:30-apache
container_name: nextcloud_app
restart: always
depends_on:
– nextcloud_db
environment:
– POSTGRES_HOST=nextcloud_db
– POSTGRES_DB=nextcloud
– POSTGRES_USER=nc_admin
– POSTGRES_PASSWORD=SecretPassword123!
– NEXTCLOUD_TRUSTED_DOMAINS=100.x.y.z nas.family.internal
volumes:
– /mnt/storage/app_data/nc_html:/var/www/html
– /mnt/storage/family_data:/var/www/html/data # 挂载大容量数据池
ports:
– "8088:80"
# 3. Tailscale 虚拟网状节点 (宿主网络互通)
tailscale:
image: tailscale/tailscale:latest
container_name: family_tailscale
restart: always
hostname: home-nas
environment:
– TS_AUTHKEY=tskey-auth-kXXXXX-XXXXXXXXCNTRL
– TS_STATE_DIR=/var/lib/tailscale
– TS_ROUTES=192.168.20.0/24 # 将整套家庭局域网子网作为路由广播出去
volumes:
– /mnt/storage/app_data/tailscale:/var/lib/tailscale
– /dev/net/tun:/dev/net/tun
cap_add:
– NET_ADMIN
– NET_RAW
开启 Redis 内存缓存加速 Nextcloud
为了让 Nextcloud 在低配置 NAS 上的文件列表加载速度从 3 秒压降至 100ms,在 config/config.php 中注入 Redis 内存锁:
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'timeout' => 0.0,
],
带着整个家走向远方
当我们在千里之外的旅途中,掏出手机依然能秒级翻看存放在家里书房硬盘上的全部照片与手账,那种笃定与安全感是任何商业公有云网盘都无法替代的。
用最坚固的现代加密协议封锁住家庭的数据大门,同时为家人搭建一条畅通无阻的私有通道,这便是网络工程为现代家庭生活构筑的最可靠的避风港。


