树莓派组建nas,云服务器及家庭影院
树莓派家庭小服务器记录
- 设备
- 功能
- 网口映射
- omv安装
- 安装Portainer(图形化管理docker, 可以不装,as you like)
- 配置NAS
- 安装nextcloud
- 创建共享目录
- 构建docker compose文件
- 配置docker源(树莓派有科学上网环境可以忽略)
- 拉起nextcloud服务
- 配置nextcloud
- 安装JellyFin
设备
树莓派4b 2G内存版本 + 32G内存卡,安装树莓派lite系统,桌面版不支持
旧电脑拆机 机械硬盘320G(仅仅作为演示)
本教程只将大致过程以及遇到的主要问题做个记录,方便后面环境崩掉再操作(笑哭),有任何问题emil to me(1253210676@qq.com), will check and reply as soon as possible.
功能
- nas服务器基本功能
- frp映射到公网服务器,实现公网链接
- 搭建openmediavault(OMV服务器),管理磁盘,共享目录,用户权限管理,SAMBA等。
- 小米摄像头视频存储在samba。
- nextcloud实现私人云服务,实现手机图片视频备份。
- jellyfin搭建家庭影院,可以播放小米摄像头视频,及nextcloud每个用户放在指定目录的视频。
网口映射
需要一台公网可以访问的云服务器,阿里云或者腾讯云都可以租到(另外有其它可能更划算的方式实现端口映射,但本人有一轻量服务器,本次就利用起来了)
下载frp
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_arm64.tar.gz # arm64格式, 树莓派可以用
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz # 服务器(我租的是x86的机器)
解压后修改配置文件,其中服务器修改frps.toml如下:
# frps.toml
bindPort = 7000 # 服务端监听端口,用于与客户端通信
auth.token = "xxxxxxx" # 认证令牌,客户端需要配置相同的token才能连接
# 可选:Web管理面板
webServer.addr = "0.0.0.0" # 管理面板监听地址
webServer.port = 7500 # 管理面板端
webServer.user = "xxx" # 管理面板用户名
webServer.password = "xxx" # 管理面板密码
# 日志配置(可选)
log.level = "info" # 日志级别
log.maxDays = 3 # 日志保留天数
log.to = "xxx/xxx/xxx/frps.log" # 日志文件路径(可选)
以上xxx自己修改。
起一个后台服务,nohup或者tmux都行,或者直接写一个frps.service 并enable。使其执行./frps -c frps.toml
客户端也就是树莓派上面解压arm64格式的,首先映射端口22到云服务器,使公网可以访问。frpc.toml修改后如下
serverAddr = "xxx" # 你的云服务器公网 IP
serverPort = 7000 # 与服务端 bindPort 一致
auth.token = "xxx"[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000 # 访问云服务器此端口将转发到内网 SSH
记得云服务器防火墙打开6000 端口,之后将frpc.toml文件保存在/etc/frp下。frpc放在/usr/local/bin/下写一个服务,内容如下
~/work/frp $ cat /etc/systemd/system/frpc.service
[Unit]
Description=Frp Client Service
After=network.target sshd.service[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStartPre=/bin/sleep 5
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml[Install]
WantedBy=multi-user.target
Alias=frpc.service
之后执行systemctl enable frpc
和systemctl start frpc
启动,公网用户就可以通过ssh -p 6000 <树莓派用户名>@<公网ip>登录ssh了
omv安装
获取omv-install.sh脚本,获取方式如下,也可以联系我
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install > omv_install.sh
可以在能科学上网的机器上获取脚本(树莓派可以的话,当我没说)。然后执行以下命令安装
sudo ./omv_install.sh -m "https://mirrors.tuna.tsinghua.edu.cn"
安装指定omv后续安装包的源地址,避免对外_网依赖。如果仅仅国内网络环境,脚本执行最后会有对openmediavault-omvextrasorg_latest_all7.deb
文件依赖不能满足,同样从科学上网的环境中获取deb文件,并适当修改脚本使其走到最后。
安装完成后,树莓派会自动重启。并默认映射8000端口,浏览器输入<树莓派ip>:8000即可访问omv管理界面,默认管理员用户名:admin,密码:openmediavault. 界面如下
在之后将端口映射到公网,修改/etc/frp/frpc.toml添加以下内容
[[proxies]]
name = "omv-manager"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080 # 访问云服务器此端口将转发到omv管理
这样公网也可以访问了。
安装compose插件,用来管理docker,后面有依赖,点ui界面左边“系统”,
之后点插件,搜索compose
点安装,如上图所示。(上图是安装完成后的界面,没安装的话不是这样)
树莓派能科学上网的,点完应该就万事大吉了,但偏偏我的树莓派不可以,此时漫长的等待之后就是依赖没满足,但这个组件显示已安装,怎么办呢:
安装过程中会有log窗口,显示对regctl的依赖,和对yq的依赖都要从科学上网环境上获取,并push到树莓派对应的位置(注意一定要前面点完安装后log里显示依赖的版本,太高太低都不行,血泪教训)。记得卸载掉组件再重新安装。
最后还一个坑,就是安装到最后会执行omv-compose-download-icons
命令,这其实在板子里是个脚本在/usr/sbin/omv-compose-download-icons 路径,其本质是个脚本,更新omv界面上的icon,从github上获取的图标并解压到指定位置,你只要从科学上网的环境下获取到,并更新下脚本即可。
最后在重新安装,应该就可以成功了。
安装Portainer(图形化管理docker, 可以不装,as you like)
找个终端执行
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
通过https://树莓派IP:9443 访问Portainer, 注意加s,https.
界面如下
也可以通过/etc/frp/frpc.toml之后重启frpc服务映射到公网。内容如下
[[proxies]]
name = "portainer"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9443
remotePort = 8081 # 访问云服务器此端口将转发到内网 portainer
配置NAS
我们这里搭建的smb,方便小米摄像机接入,保存历史录像。
- 打开omv管理界面,点击存储器,选择对应的磁盘,然后点击擦除,选择快速擦除即可(注意做好备份,擦除了磁盘就被清空了)。
- 再点击文件系统,将刚才擦除的磁盘格式化成ext4格式(Linux支持比较好的文件系统)。
- 再点击“共享文件夹”->“创建”,之后配置共享文件夹的名字,选择刚才格式化的磁盘,再配置相对路径(这里配置的xiaomi/camera),配置权限(samba一般不能所有用户可见,否则小米摄像头不支持),最后根据需要配置标签,然后保存。
- 点击用户,并点击添加,如下,添加访问samba共享目录权限的用户。这里我们叫“xiaomi”
然后选择刚配置的用户名,点击权限管理,选择刚才创建的文件给读写权限
- 点击服务,选择SMB/CIFS,再选择设置,其它可以选择默认配置,但最低协议一定选择SMB1(小米摄像头支持到1),然后勾选“啟用 NetBIOS”不然小米摄像头搜索不到。
- 点击服务,选择SMB/CIFS,再选择“共享”,里面选择刚刚创建的文件夹,上面勾线“已启动”复选框。其它根据需要配置。
- 最终就是米家里面配置摄像头将视频保存到nas,然后自动搜索,用刚刚创建的用户及对应的密码登录
对OMV的修改完成后,上面都会有一个勾要应用修改
安装nextcloud
上面docker compose安装好之后,后面就操作相对简单了。
创建共享目录
首先按照上面的方式创建一个保存docker compose配置的共享文件夹,这里我们叫“docker”(相对路径也是docker);之后创建一个放家庭影院相关的目录,名字叫movie(相对路径nextcloud/movie),用于后续家庭影院扩展,使nextcloud可以挂载,所有用户都可上传影音文件;最后创建一个用于保存nextcloud数据(相对路径nextcloud_data)的“”三个共享目录都有所有用户可读性权限。
构建docker compose文件
终端打开,刚创建好的“docker”路径一般是“/srv/dev-disk-by-uuid-xxxxxxxxxxx/docker/”格式,创建nextcloud文件夹,创建docker-compose.yml文件,内容如下:
version: "3.8"services:nextcloud-db:image: mariadb:10.5 # 使用MariaDB作为数据库container_name: nextcloud-dbrestart: alwaysnetworks:- nextcloud-netenvironment:- MYSQL_ROOT_PASSWORD=xxxx # 请修改为安全的密码- MYSQL_PASSWORD=xxxx # Nextcloud数据库用户密码- MYSQL_DATABASE=nextcloud- MYSQL_USER=nextcloudvolumes:- nextcloud_db_data:/var/lib/mysql # 数据库数据卷command: --transaction-isolation=READ-COMMITTED --binlog-format=ROWnextcloud-app:image: nextcloud:latestcontainer_name: nextcloud-apprestart: alwaysports:- "8082:80" # 映射端口,宿主端口:容器端口networks:- nextcloud-netdepends_on:- nextcloud-dbenvironment:- MYSQL_HOST=nextcloud-db- MYSQL_DATABASE=nextcloud- MYSQL_USER=nextcloud- MYSQL_PASSWORD=xxxx# 与上面设置的密码一致volumes:# Nextcloud 主数据卷(用户文件、配置)- /srv/dev-disk-by-uuid-xxxxxxxxxxxxx/nextcloud_data:/var/www/html# - /path/to/your/apps:/var/www/html/custom_apps # (可选) 映射自定义应用目录# - /path/to/your/config:/var/www/html/config # (可选) 映射配置目录# 额外挂载小米摄像机录像目录(请先在宿主机上挂载 SMB 到 /srv/smb_mount/xiaomi)- /srv/dev-disk-by-uuid-xxxxxxxxxxxxxxxx/xiaomi/camera:/mnt/xiaomi:rw- /srv/dev-disk-by-uuid-xxxxxxxxxxxxxxxx/nextcloud/movie:/media/movie:rwvolumes:nextcloud_db_data: # 命名卷,持久化数据库数据name: nextcloud_db_datanetworks:nextcloud-net:name: nextcloud-net
需要修改的地方:mysql的密码、端口映射(这里docker映射给宿主机即树莓派的端口是8082,可以通过树莓派ip+8082访问到nextcloud的控制端)、volumes里面的磁盘挂载:其中第一个是必要的,后面两个分别用作小米摄像头即SAMBA目录映射,另一个用作家庭影院方便nextcloud用户上传影音文件。
配置docker源(树莓派有科学上网环境可以忽略)
接下来有一个坑点:如果树莓派没有科学上网环境,docker是pull不到的(哎。。。一声长叹),解决办法更新docker源,虽然速率不快,但在这网络环境下只能如此,修改/etc/docker/daemon.json文件,添加内容如下:
"registry-mirrors": ["https://docker.1ms.run","https://doublezonline.cloud","https://dislabaiot.xyz","https://docker.fxxk.dedyn.io","https://dockerpull.org","https://docker.unsee.tech","https://hub.rat.dev","https://docker.1panel.live","https://docker.nastool.de","https://docker.zhai.cm","https://docker.5z5f.com","https://a.ussh.net","https://docker.udayun.com","https://hub.geekery.cn"]
主打一个量大管饱,给足,总有一个源能用的,后面重新加载配置并重启docker服务.
sudo systemctl daemon-reload
sudo systemctl restart docker
拉起nextcloud服务
最后把nextcloud服务拉起来,执行以下命令
sudo docker compose up -d
如果要更新配置,可以执行以下命令重新加载,并不会失去旧的配置及数据。
docker stop nextcloud-app nextcloud-db
docker rm nextcloud-app nextcloud-db
# 修改docker-compose.yml文件
docker compose up -d
会自动拉取镜像并启动,之后可以通过树莓派ip+配置的端口登录。比如我们配置的端口是8082,就通过树莓派ip:8082访问
最后配置/etc/frp/frpc.toml映射到公网。
[[proxies]]
name = "nextcloud"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8082
remotePort = 8082 # 访问云服务器此端口将转发到内网 nextcloud
另外一个坑点是需要将公网的ip添加到信任列表里,否则公网访问不到,具体配置文件在路径“/srv/dev-disk-by-uuid-xxxxxxxxxx/nextcloud_data/config/config.php”
在**‘trusted_domains’ =>**属性里添加服务器的ip,如下
... #此处做省略'trusted_domains' =>array (0 => '<树莓派ip>:8082',1 => '<公网ip>:8082',),... #此处做省略
);
配置nextcloud
nextcloud支持丰富的插件,有些是保存本地的,可以手动安装,但有些要从github获取,so …
这里我安装了register插件,方便新用户注册,安装及配置方法可自行gpt搜索。
另外使能了external storage app,方便挂载之前映射进来的路径。
配置方法如下:
- 首先通过对应端口进入nextcloud界面,首次登录要配置管理员用户及对应的密码。
- 点击右上角头像,再点击应用,就可以启用external storage app了。
- 只有点击头像,再点击“管理设置“ 添加我们加进来的两个路径。
- 最后就可以点左上角文件,就可以看到了,上面一定选择对所有用户可见,这样所有用户都会多两个文件夹,“本地”里可以查看摄像头录像,movie可以上传电影,音乐等。后面jellyfin可以播放实现家庭影音
最后手机安装nextcloud客户端,可以自行配置自动上传,备份手机里面的数据,自行GPT。
安装JellyFin
还是用docker compose安装,在上面创建的docker目录下,创建一个jellyfin的目录,记录docker-compose.yml文件内容,具体路径为“/srv/dev-disk-by-uuid-641225bf-b897-43c0-8a9e-63de6e4f3c69/docker/jellyfin/docker-compose.yml”,内容如下:
version: "3.8"services:jellyfin:image: jellyfin/jellyfin:latestcontainer_name: jellyfinrestart: unless-stoppednetwork_mode: bridgeports:- "8096:8096" # Web- "8920:8920" # HTTPS(可选)volumes:# 配置和缓存- jellyfin_config:/config- jellyfin_cache:/cache# 挂载宿主机的媒体目录(只读)- /srv/dev-disk-by-uuid-xxxx/xiaomi/camera:/media/camera:rw- /srv/dev-disk-by-uuid-xxxx/nextcloud/movie:/media/movie:rwenvironment:- TZ=Asia/Shanghailogging:driver: "json-file"options:max-size: "50m"max-file: "3"volumes:jellyfin_config:name: jellyfin_configjellyfin_cache:name: jellyfin_cache
然后执行拉起docker服务
docker compose up -d
最后通过端口8096访问jellyfin页面,注册管理员界面,添加媒体库“/media/camera”和“/media/movie”,然后开启自动扫面,就可以看到了。