尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

树莓派4B低成本搭建家庭NAS:Docker应用部署与远程访问全指南

树莓派4B低成本搭建家庭NAS:Docker应用部署与远程访问全指南 在家用NAS这件事上我折腾过不少方案最后留在身边长期服役的是一台树莓派4B。手机照片、工作文档、电影剧集、密码库甚至一些自托管的小服务全都跑在这块巴掌大的板子上。这套树莓派家庭NAS加上Docker应用部署的组合总共花销不到五百块却能覆盖大多数人对“私有云存储”的想象。这篇文章我打算把整个折腾过程完整记录下来从为什么选树莓派而不是成品NAS到系统安装、Samba共享、DDNS远程访问再到用Docker一键部署Jellyfin、Vaultwarden这类常用应用以及我踩过的那些坑。无论你是刚接触树莓派的新手还是想给家里补一个低成本存储中心的玩家这篇笔记应该都能给你一些可复用的思路。1. 项目定位为什么是树莓派而不是成品NAS或玩客云1.1 树莓派4B的硬件底子树莓派4B是我认为目前做DIY NAS性价比最高的板子没有之一。它采用BCM2711四核Cortex-A72处理器主频1.5GHz提供2GB、4GB、8GB三种内存版本。对纯NAS加几组Docker服务来说4GB内存版本是最平衡的选择系统加Samba占内存不到500MB剩下的内存跑Jellyfin、Vaultwarden、MySQL这种日常服务绰绰有余。真正让树莓派4B区别于前代的关键是两个USB 3.0接口和一个真千兆网口。USB 3.0实测能跑到350MB/s以上的理论速度实际搭配SSD或者稍好的移动硬盘SMB传输稳定在110MB/s左右对于家庭内网播放蓝光原盘、备份手机照片来说完全够用。相比之下树莓派3B的USB 2.0瓶颈直接把传输速度压死在30MB/s上下体验差距非常明显。树莓派5发布之后M.2 HAT这类扩展板可以把NVMe SSD直接挂在PCIe通道上读写性能又是一个台阶。如果你预算充足且想一步到位树莓派5加M.2 HAT的方案值得考虑。但就“低成本、够用、资料多”这几个维度来说4B依旧是最稳妥的选择教程和踩坑资料铺天盖地遇到问题几乎都能搜到答案。1.2 三大方案横向对比树莓派、成品NAS、玩客云很多人纠结是买群晖/绿联/飞牛这类成品NAS还是收一台玩客云刷机或者自己用树莓派攒一台。我结合自己的使用经验把三个方案拉出来对比对比维度树莓派DIY成品NAS群晖/绿联/飞牛玩客云刷机硬件成本300~600元不含硬盘1000~3000元不含硬盘100元以内性能表现中上4核A72满足日常高中低都有视型号而定较弱单核A53扩展性GPIO、USB、PCIe5代硬盘位固定扩展受限极差系统自由度极高随便装Linux依赖厂商系统权限受限中等社区固件有限功耗约5~8W20W以上常见约3~5W维护成本需要一定Linux基础低图形化界面低但系统老旧我的结论很直接如果你完全不想碰命令行买成品NAS是明智的选择省心就是它最大的价值。但如果你愿意花一个周末折腾树莓派的灵活性是成品NAS给不了的。玩客云便宜归便宜性能实在太弱跑个Jellyfin转码都费劲只适合做纯文件共享的“电子仓库”。1.3 硬件清单与避坑购买建议把树莓派NAS看作一套完整的硬件系统任何一环拉了胯整体体验都会打折扣。以下是反复验证过的硬件组合主板树莓派4B4GB内存版。别为了省钱买2GB版Docker跑起来之后内存很容易吃紧。供电官方USB-C电源5V 3A。这一点务必不要省钱劣质充电器的电压纹波会让SD卡在几个月内报废甚至导致树莓派随机死机。系统盘A2等级的TF卡至少32GB。推荐闪迪 Extreme系列或三星 EVO Plus普通Class 10卡在频繁读写下寿命堪忧。数据盘2.5英寸移动硬盘或者SATA SSD通过USB 3.0连接。如果你手头只有3.5英寸台式机硬盘那就必须配一个带独立供电的硬盘底座否则USB口供电根本带不动。外壳带主动散热风扇的铝合金外壳。树莓派4B高负载下温度能逼近80℃不加散热会触发降频影响传输速度。网络六类网线直连路由器不要指望Wi-Fi尤其是隔着墙的5G信号会直接砍半传输带宽。购买时最容易踩的坑是电源。很多人家里有一堆手机充电头随手拿一个5V 2A的就插上了短时间内能用一遇到硬盘读写的高负载场景就出问题。我的做法是直接买树莓派官方电源或者选有3C认证的品牌电源支持5V 3A输出稳定压倒一切。2. 系统安装与基础调优把Ubuntu Server跑稳2.1 系统镜像烧录与初始配置树莓派官方系统Raspberry Pi OS也可以做NAS但我更推荐装Ubuntu Server 22.04 LTS。原因有三个一是Ubuntu Server没有桌面环境内存占用极低二是它的LTS支持周期长安全更新省心三是我个人更熟悉Debian系的生态之后的Docker、Samba配置资料也更多。烧录系统我建议直接用树莓派官方的Raspberry Pi Imager工具。插上TF卡打开Imager选择“Raspberry Pi 4”对应的Ubuntu Server 22.04镜像在设置界面勾选“启用SSH”顺手把用户名、密码和Wi-Fi信息都写好。这样树莓派第一次开机后我就能直接在电脑上通过SSH连接不用额外接显示器。ssh ubuntu树莓派IP地址首次登录后先做两件事更新软件包然后确认系统盘是否已经扩展到整个TF卡。sudo apt update sudo apt upgrade -y df -h如果根分区没有占满整张卡执行sudo resize2fs /dev/mmcblk0p2完成扩展。这个细节很多新手会漏掉导致系统盘空间白白浪费。2.2 换源、SSH加固与固定IPUbuntu Server默认的apt源在国内更新速度堪忧换源是安装完的第一优先事项。Ubuntu 22.04的源配置文件和旧版不同路径是/etc/apt/sources.list.d/ubuntu.sources。我习惯把sources文件里originUbuntu的条目中的archive.ubuntu.com替换成国内高校或云厂商的镜像源地址替换后执行sudo apt update速度提升立竿见影。SSH默认监听22端口树莓派在局域网内暂时问题不大但只要做了端口转发暴露到公网22端口就是扫描器的重点照顾对象。我的做法分两步第一步修改/etc/ssh/sshd_config把端口改到一个高位端口同时把PermitRootLogin设为no第二步生成SSH密钥对把公钥拷贝到树莓派的~/.ssh/authorized_keys确认密钥登录正常后再把PasswordAuthentication设为no。固定IP这一步Ubuntu Server默认使用netplan管理网络。编辑/etc/netplan/01-netcfg.yaml把DHCP改为静态地址network: version: 2 ethernets: eth0: dhcp4: false addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 119.29.29.29这里把树莓派的IP固定在192.168.1.100后续映射端口、访问服务都用这个内网地址省得DHCP重新分配导致所有配置失效。2.3 散热与忘记密码的应对策略散热这件事我的建议是物理散热优先于软件调优。铝合金外壳加主动风扇待机温度能压到40℃出头满载也不超过65℃。系统层面可以用vcgencmd measure_temp查看CPU温度但这个命令在Ubuntu上不一定预装需要安装raspberrypi-utils。如果你没装风扇可以写一个简单的脚本根据温度阈值控制GPIO引脚为风扇供电。用GPIO 14号引脚接一个三极管驱动5V风扇脚本检测到温度超过50℃就拉高引脚输出温度降下来再关闭。关于“树莓派忘记密码”这个高频问题我的方案是从源头上规避系统盘和数据盘分离。系统盘里只有系统和应用配置重要的数据全部放在独立的数据硬盘上。万一哪天真把密码忘了直接重刷系统盘把备份的Docker Compose文件和配置目录还原回来30分钟就能恢复全部服务。这个思路比单纯背一串密码靠谱得多因为配置即代码丢了密码损失的只是时间不是数据。3. 存储层搭建从硬盘挂载到SMB共享3.1 硬盘分区、格式化与自动挂载数据盘是整个NAS的核心挂载这步必须严谨。用lsblk确认硬盘设备名比如/dev/sda。如果是一块新盘先用fdisk或者parted分区再格式化成ext4文件系统sudo fdisk /dev/sda # 创建新分区 sudo mkfs.ext4 /dev/sda1为了开机自动挂载不要直接在fstab里写设备名因为USB设备的设备名可能在重启后变化。正确的做法是通过UUID挂载。用sudo blkid查看分区UUID然后在/etc/fstab里添加一行UUID你的硬盘UUID /mnt/data ext4 defaults,noatime,nofail 0 2nofail这个参数很关键如果硬盘没有插着系统依然能够正常启动不会被卡在挂载阶段。挂载完成后我习惯在/mnt/data下面按用途建几个目录media放电影剧集backup放备份photo放照片归档docker存放所有Docker应用的配置和数据卷。硬盘长期通电发热我建议启用空闲休眠。安装hdparm后在/etc/hdparm.conf里设置spindown_time为 120 秒或者通过sudo hdparm -S 120 /dev/sda临时测试。注意频繁休眠反而可能损伤硬盘如果家里经常访问NAS不设置休眠也没问题。3.2 Samba共享与权限配置树莓派NAS首要服务就是文件共享Samba是目前跨平台兼容性最好的方案。安装和配置过程中最容易出问题的是权限Samba的权限既要看Linux文件系统的权限也要看Samba自身的共享配置。sudo apt install samba -y sudo smbpasswd -a ubuntu然后把共享目录的所有权交给当前用户避免权限混乱sudo chown -R ubuntu:ubuntu /mnt/data编辑/etc/samba/smb.conf在文件末尾追加共享定义[media] comment Media Center path /mnt/data/media browseable yes read only no valid users ubuntu create mask 0755 directory mask 0755 [backup] comment Backup Space path /mnt/data/backup browseable yes read only no valid users ubuntu重启Samba服务后Windows资源管理器输入\\192.168.1.100macOS在访德里按CommandK输入smb://192.168.1.100再输入用户名密码就能看到了。如果Windows连接时提示找不到网络路径多半是系统默认禁用了SMB 1.0协议或者路由器开启了AP隔离把这两个地方检查一遍基本能解决。3.3 数据安全与备份策略有了共享存储下一步要操心的就是数据安全。一块硬盘谈不上可靠我的备份策略是“主存储加定时同步”——主盘负责日常读写备盘每天凌晨用rsync做增量同步。在crontab里加一行0 3 * * * rsync -avz --delete /mnt/data/media/ /mnt/data/backup/media/--delete参数让备份目录和源目录保持严格一致源端删除的文件在备份端也会同步删除。如果你担心误删文件那就去掉--delete改成按日期保留历史快照用rsync -avz --link-dest配合硬链接实现“伪时间机器”效果。树莓派NAS除了自用还可以作为家庭局域网内其他设备的备份中心。比如PVE宿主机、绿联这类其他NAS都可以通过NFS或SMB协议把树莓派的共享目录挂载过去作为二级备份空间。这样整个家庭数据链路就形成了“设备主存储、树莓派定时同步、其他NAS再备份”的多层结构任一层挂了都能快速恢复。4. 远程访问用DDNS把NAS带回身边4.1 动态公网IP与DDNS的原理内网访问NAS只是基本功出门在外也能访问才是刚需。国内大部分家庭宽带默认分配的是动态公网IPv4地址但地址不是固定的每隔一段时间会重新分配。你不可能记住一串随时变化的数字于是就需要DDNS把一个域名解析到当前的家庭公网IP上IP变了之后域名自动跟着变。先确认自己是否有公网IP。登录路由器后台查看WAN口IP然后用手机流量ping一下这个地址能ping通说明大概率是公网IP。还有一种简单判断方式百度搜索“IP”看返回的地址和路由器WAN口地址是否一致一致就基本是公网IP。如果不一致说明运营商做了NAT你在外面无法直接连回家里这种情况只能换一种方案或者联系运营商申请公网IP。注意我这里说的是常规家庭网络访问用的都是合法合规的端口映射和公网服务方式需要在符合运营商规则的前提下操作。4.2 DDNS配置实操DDNS的完整链路是域名 DNS 记录 域名服务商的API 定时更新脚本 路由器的端口转发。以常见的云解析服务为例我先把一个二级域名的A记录随便填一个占位地址然后在树莓派上写一个脚本检测到本机公网IP变化后自动调用域名服务商的API更新DNS记录。脚本核心逻辑大致这样#!/bin/bash # 获取当前公网IP public_ip$(curl -s https://api.ipify.org) # 调用DNS服务商API更新记录 curl -s -X PUT https://dns-api.example.com/update?domainhome.example.comip$public_ip把这个脚本放进crontab每5分钟执行一次域名永远指向最新的公网地址。实际操作中不同服务商的API格式不同但思路完全一致网上都有现成的SDK和命令行工具。路由器端口转发是另一环。我需要在路由器后台把外网端口映射到树莓派的内网IP和端口。比如把外网的2222端口转发到树莓派的22端口外网的8096端口转发到Jellyfin的8096端口。注意不要直接暴露默认的22端口这是最基础的防扫描措施。安全加固上我会叠加三层SSH密钥登录、fail2ban自动封禁频繁错误尝试的IP、Nginx反向代理加HTTPS。用Nginx把HTTP请求代理到内网服务同时用Certbot申请免费的HTTPS证书既解决了传输加密问题也让自建服务用起来更安心。4.3 没有公网IP时的备选方案如果你确认了自己没有公网IP或者不想折腾端口转发还有一条更省心的路异地组网工具。这类工具的原理是在家庭内网和一个客户端设备之间建立加密隧道让外出的手机、电脑“感觉上”就像在同一个局域网里。我最常用的是Tailscale。在树莓派上安装后用同一账号登录家里的路由器、手机、笔记本电脑这些设备之间就会组成一个虚拟局域网无论是访问SSH、Samba还是Jellyfin直接使用虚拟局域网IP就行。它的好处在于不需要公网IP不需要端口转发所有流量都是加密的而且配置简单到近乎零门槛。类似的工具还有ZeroTier功能和体验大同小异选一个用顺手就好。这种方案唯一的缺点是多了一层隧道封装速度受限于中转服务器的带宽但在大多数场景下办公、浏览照片、下个小文件都够用。5. Docker部署给NAS加上“应用商店”5.1 安装Docker与Docker ComposeDocker家庭NAS的价值翻倍几乎实现了从“存储设备”到“家庭服务器”的跨越。安装Docker的常规做法是使用官方安装脚本curl -fsSL https://get.docker.com | sudo sh如果你更喜欢用apt安装Ubuntu仓库里也有docker.io包版本不算太旧但胜在稳定。安装完验证一下sudo docker run hello-world为了之后方便编排多个容器Docker Compose是必需品。Docker Compose V2现在已经是docker compose插件形式安装完Docker之后一般都会带上用docker compose version确认即可。镜像拉取在部分地区速度不理想我建议在/etc/docker/daemon.json里配置公共镜像加速地址{ registry-mirrors: [ https://docker.m.daocloud.io ] }配置完重启Docker服务sudo systemctl restart docker。注意镜像加速地址属于公共资源如果某一天失效了换成其他主流云厂商提供的加速地址就好原理都一样。5.2 安装Docker Desktop的差异说明如果你习惯在Windows或macOS上用Docker Desktop再远程操作树莓派上的容器有一个概念必须先分清楚Docker Desktop是跑在你本机上的容器运行环境它管理的容器运行在你的电脑上而树莓派上的Docker是独立的实例。Docker Desktop有个功能叫“上下文上下文切换”可以让你直接用本机的docker命令操作远程树莓派上的Docker。操作方法是先开启树莓派Docker的远程API端口默认2375注意只能监听在内网不要暴露到公网然后在本机上执行docker context create raspberry --docker hosttcp://192.168.1.100:2375 docker context use raspberry之后执行docker ps、docker compose up就会直接操作树莓派。这个功能适合不习惯SSH到服务器敲命令的朋友但要注意2375端口裸奔在公网相当于把服务器钥匙交出去务必用防火墙限制这个端口只允许内网访问。5.3 Jellyfin媒体服务器视频目录映射是重点Jellyfin是家庭NAS上的核心应用电影、剧集、家庭录像都能通过它集中管理在电视、手机、平板上随时观看。部署Jellyfin用Docker Compose非常方便services: jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin ports: - 8096:8096 volumes: - /mnt/data/docker/jellyfin/config:/config - /mnt/data/media:/media environment: - PUID1000 - PGID1000 - TZAsia/Shanghai restart: unless-stopped部署完访问http://树莓派IP:8096进入初始化向导。很多人在“视频目录”这个环节卡住明明容器启动成功了媒体库却扫不到任何文件。根本原因通常是两个一是宿主机的视频文件确实存在但容器里映射的路径不对二是权限问题Jellyfin进程没有读取视频文件的权限。解决路径非常直接确认宿主机的130GB电影文件夹确实能在/mnt/data/media下面看到然后查看容器内部的/media目录是否能看到同样的文件。如果宿主机能看、容器内看不到那就是卷映射写错了。如果容器内能看到文件但Jellyfin扫不到检查文件夹的权限最简单的办法是给这个目录设置成chmod 755或者用一条命令放权给当前用户组sudo chown -R 1000:1000 /mnt/data/media这样把媒体目录的所有权交给UID 1000也就是Jellyfin容器默认运行的用户扫描问题基本迎刃而解。关于转码树莓派4B的CPU软转能力一般1080P的H.264高码率文件在转码时CPU会打满体验不佳。我的建议是尽量原码率播放或者播放前在客户端设置“直接播放”避免树莓派做重负载转码。5.4 Vaultwarden密码管理器自托管密码库密码管理这件事用浏览器自带的密码填充确实方便但跨设备同步就是个麻烦。Vaultwarden是Bitwarden服务器的开源轻量实现树莓派的性能跑它绰绰有余。Docker部署services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped ports: - 8080:80 volumes: - /mnt/data/docker/vaultwarden:/data environment: - TZAsia/Shanghai - DOMAINhttps://your-domain.example.com - SIGNUPS_ALLOWEDfalse部署完成后浏览器和手机端安装官方的Bitwarden客户端在登录界面选择“自建服务器”填上树莓派的域名或者IP就能把密码库完全掌握在自己手里。SIGNUPS_ALLOWEDfalse表示关闭公开注册只有你手动添加的用户才能使用安全上更稳妥。如果你习惯用KeepassXC这类桌面密码管理工具Vaultwarden也能通过Bitwarden协议与之同步两者搭配使用桌面端用KeepassXC移动端用Bitwarden客户端底层密码库同一个。这里要特别说一句密码库数据的价值远高于NAS本身Vaultwarden的数据目录一定要纳入自动备份范围否则硬盘一挂所有密码直接归零。5.5 青龙面板、MySQL与Redis一次性搞定数据库和任务调度NAS上数据多了之后定时任务和数据库就变成刚需。青龙面板本质上是一个定时任务管理平台适合跑一些周期性脚本比如备份同步、签到提醒、数据抓取之类的内网自动化任务。它在配置上有一个“依赖管理”的概念很多脚本需要特定的Python或Node.js依赖才能运行直接在面板的“依赖管理”里添加即可。配合数据库的需求我通常会一次性把MySQL 8.0和Redis也部署起来。MySQL用来存结构化数据Redis用来做缓存青龙面板或Jellyfin的某些插件都能用到。MySQL主从方案的Compose配置services: mysql-master: image: mysql:8.0 container_name: mysql-master environment: MYSQL_ROOT_PASSWORD: root_pass MYSQL_DATABASE: app_db command: --server-id1 --log-binmysql-bin --binlog-do-dbapp_db volumes: - /mnt/data/docker/mysql/master:/var/lib/mysql ports: - 3306:3306 mysql-slave: image: mysql:8.0 container_name: mysql-slave environment: MYSQL_ROOT_PASSWORD: root_pass command: --server-id2 volumes: - /mnt/data/docker/mysql/slave:/var/lib/mysql depends_on: - mysql-master主从配置的核心就两个参数主库开log-bin并指定唯一的server-id从库设置不同的server-id然后手工在从库执行CHANGE MASTER TO指向主库地址。这个方案适合数据读写分离的场景如果只是单机使用完全不建主从一个MySQL容器足够。Redis主从更简单在从库的启动命令里加上--replicaof master-ip 6379即可。这类数据库容器统一丢到树莓派上用局域网IP互相访问就形成了一个轻量的内网服务集群。所有容器配置全部用Compose文件维护存放在/mnt/data/docker目录下配合之前提到的备份机制重装系统后一键拉起所有服务。6. 常见问题排查与避坑实录6.1 高频故障速查表折腾这套系统将近一年我把遇到的典型问题整理成了一张速查表后续再遇到直接对症下药问题现象根本原因解决方法TF卡频繁损坏系统无故卡死供电不稳或TF卡质量差换A2品牌卡换官方电源或改用SSD启动硬盘间歇性掉盘复制大文件失败USB供电不足或线材劣质换带独立供电的硬盘底座或换优质USB数据线Windows找不到SMB共享路径SMB 1.0协议被禁用或AP隔离开启检查Windows SMB功能关闭路由器AP隔离Docker重启后配置全丢容器没有挂载数据卷所有容器必须使用volumes持久化Jellyfin扫描不到电影权限或路径映射错误检查卷映射和目录权限用UID 1000统一管理媒体目录远程访问经常超时公网IP变化或端口被封启用DDNS自动更新检查端口映射考虑异地组网方案树莓派高负载时明显变卡CPU过热降频加强散热安装鳍片和主动风扇查看温度6.2 我踩过的坑与最终心得第一个大坑是供电。最开始我用了一个旧手机充电头给树莓派供电平时看个网页没问题插上移动硬盘一拷贝大文件SSH连接直接断掉系统日志里全是电压不足警告。换了官方5V 3A电源之后问题瞬间消失。那种“电压不足但还能开机”的假象非常迷惑人一定要留意系统日志里有没有Under-voltage detected这类提示。第二个大坑是目录规划。早期我装服务没有统一目录一会儿在home下建个目录一会儿又在opt下建目录备份脚本配置得一盘散沙。后来我彻底重构所有持久化数据统一放在/mnt/data/docker/应用名下面每个应用一个目录配置文件和数据卷泾渭分明。这样带来的好处是极其直观的备份时rsync整个docker目录新的应用要迁移直接把目录拷贝到新机器然后docker compose up -d就能恢复。第三点关于容器数据安全。Docker的好处是环境隔离、部署简单但代价是容器本身是“无状态”的容器一删里面的数据跟着消失。一定不要把数据放在容器内部必须通过卷映射到宿主机。我见过太多人部署MySQL之后忘了挂载数据卷容器重建瞬间所有库表清零这个代价是学费级别。最后再分享一个习惯所有改动过的配置文件我都会在文件里加上注释说明这个配置是什么时候改的、为什么改。树莓派NAS用久了配置会越来越多几个月后再回头看自己写过的配置当时的记录就是最好的文档。这套系统如今在我家全天候运行功耗不到10W安静、稳定、可控。如果你也想整一台属于自己的家庭NAS别犹豫从树莓派和一块硬盘开始你会收获比存储本身更多的东西。
返回列表