在树莓派容器化部署私有云和下载机
2019-08-20 本文已影响0人
我是石巍
利用容器把树莓派打造成家庭服务器,具有如下功能:
- 私有云 - Nextcloud
- 下载机 - Transmission BT
步骤预览
- 硬件准备
- 安装 AlpineLinux
- 安装 Docker
- 安装 docker-compose
- 搭建 Nextcloud 和 Transmission BT
- FAQ
硬件准备
- 「必须」RaspberryPi 一块「我的型号是 3B」
- 「必须」TF 卡一张「推荐 2G 以上」
- 「必须」显示器、USB 键盘「系统装完后默认不能远程」
- 「必须」电脑「用来写数据到 TF 卡」
- 「可选」外接硬盘「存放数据」
安装 AlpineLinux
- 格式化 TF 卡,并设置为可启动,Windows 上可以用工具,Mac 上用 diskutil 如下:
# 找到 TF 卡,我的是 /dev/disk2
diskutil list
# 格式化 /dev/disk2 为可启动的 FAT32,卷标为 RPI
diskutil partitionDisk /dev/disk2 MBR FAT32 RPI 0b
- 下载 AlpineLinux 镜像并解压
# 进入格式化好的 TF
cd /Volumes/RPI
# 可以选择从阿里云镜像下载
# https://mirrors.aliyun.com/alpine/
# 我下载的时候最新稳定版是 3.10,所以镜像可以根据自己的需求下载
# 选择 armhf 的版本就行了
wget http://mirrors.aliyun.com/alpine/latest-stable/releases/armhf/alpine-rpi-3.10.0-armhf.tar.gz -o alpine-rpi.tar.gz
# 解压
tar zvxf alpine-rpi.tar.gz
# 清理现场
rm -rf alpine-rpi.tar.gz
# 切出目录
cd ~
# 推出 TF
diskutil unmountDisk /dev/disk2
- 装入该 TF 卡后启动树莓派安装 AlpineLinux
# 接上显示器和键盘,root 账号免密登录
# 用 setup-alpine 命令进行安装
setup-alpine
# 以下省略问答模式的配置步骤
# 由于在派上安装 AlpineLinux 只能是 LBU 模式,所以需要确认写入 TF 卡
lbu_commit -d
# 重启
reboot
想了解 LBU
- 定制化配置
# 修改 /etc/fstab 中挂载的 /dev/mmcblk0p1 为 rw 模式
/dev/mmcblk0p1 /media/mmcblk0p1 vfat rw,relatime,fmask=0022,dmask=0022,errors=remount-ro 0 0
# 若有外接硬盘,也可以添加进来,挂载到一个已经存在的目录
/dev/sda1 /media/mmcblk0p1/ext ext4 rw,relatime,data=ordered 0 1
# 修改 /etc/apk/repositories 换与自己匹配的源
https://mirrors.aliyun.com/alpine/latest-stable/main/
https://mirrors.aliyun.com/alpine/latest-stable/community/
# 修改 /etc/ssh/sshd_config 允许远程 Root 账号登录
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
# 保存后重启
lbu_commit -d
reboot
安装 Docker
# 用 apk 安装 docker
apk update
apk add docker
# 查看一下 docker 的版本,返回结果说明安装成功
docker --version
# 修改 docker 的默认根目录 /var/lib/docker 为自己的硬盘或者 TF 卡里的某个目录
WORK_DIR='这里设置自己期望的目录'
echo "{\"graph\":\"$WORK_DIR\"}" > /etc/docker/daemon.json
# 启动 docker
service docker start
# docker ps 工作,说明服务正常
docker ps
# 检查 docker 根目录是否符合预期
docker info | grep 'Docker Root Dir'
# 把服务加入开机启动
rc-update add docker boot
# 保存后退出
lbu_commit -d
reboot
安装 docker-compose
apk add py-pip python-dev libffi-dev openssl-dev gcc libc-dev make
pip install docker-compose
lbu_commit -d
reboot
搭建 Nextcloud 和 Transmission BT
docker-compose -f docker-compose.yaml pull
docker-compose -f docker-compose.yaml up -d
lbu_commit -d
docker-compose.yaml 文件如下:
version: '2'
services:
nextcloud:
image: nextcloud:stable
container_name: rpi-nextcloud
restart: always
ports:
- 8080:80
volumes:
- ./rpi-nextcloud/html/data:/var/www/html/data
- ./rpi-nextcloud/html/config:/var/www/html/config
transmission:
image: linuxserver/transmission
container_name: rpi-transmission
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- TRANSMISSION_WEB_HOME=/combustion-release/ #optional
ports:
- 9091:9091
- 51413:51413
- 51413:51413/udp
volumes:
- ./rpi-transmission/config:/config
- ./rpi-transmission/watch:/watch
- ./rpi-transmission/downloads:/downloads
FAQ
- 如何关机
命令行poweroff
,关机后可以拔电源 - 为什么做了新的配置,重启后就没了
lbu_commit -d
在重启前千万别忘记 - 重启后时间不对了
可以用service chronyd restart
来同步一下时间 - docker pull 空间不够
建议修改 docker 的默认根目录,添加 /etc/docker/daemon.json 并加入内容{"graph":"/path"}
,这里的 /path 是想要使用的路径,lbu 保存一下重启 - 选择哪个版本的 AlpineLinux
版本上 latest-stable release 看起来没什么问题,不过这个没做过测试;型号上虽然有 armv7,但我装了之后感觉有点卡卡的,所以选择 armhf 总归不会有问题。 - 如何访问 Nextcloud
默认 http://<IP>:8080 - Nextcloud 提示 SQLite 不推荐
因人而异,我是个人使用,轻量级数据库足以应付,所以直接使用的内置 SQLite。 - 能否外网访问 Nextcloud
可以。如果路由器上有花生壳服务,可以注册一个花生壳账号,拿一个免费域名,设置一下端口。建议在安装 Nextcloud 前配好域名加端口,省得后面再去配置。 - 如何访问 Transmission
默认是 http://<IP>:9091 - Transmission UI 是否可以设置帐密
可以。修改 /config/settings.json 中的rpc-authentication-required
rpc-username
rpc-password
这三个 key 的值。其中rpc-password
是经过 sha1sum 处理,并且加了{
前缀的字符串。
# 供参考的脚本
docker exec -it rpi-transmission bash
export UI_USER='admin'
export UI_PASSWD='password'
export UI_PASSWD_SHA=$(echo -n "${UI_PASSWD}" | sha1sum | awk '{print $1}')
sed -i 's/"rpc-authentication-required".*/"rpc-authentication-required": true,/' config/settings.json
ed -i "s/\"rpc-username\".*/\"rpc-username\": \"${UI_USER}\",/" config/settings.json
sed -i "s/\"rpc-password\".*/\"rpc-password\": \"{${UI_PASSWD_SHA}\",/" config/settings.json
- 硬盘已有的数据是否能直接导入到 Nextcloud
可以。总共需要两步:1. 迁移数据到对应目录 2. 扫描数据
# 以我的硬盘数据举例
# 首先确定要同步到那个用户的目录中,用 www-data 用户运行 occ 查询用户列表
docker exec -u www-data -it rpi-nextcloud php occ user:list
# 安装同步工具
apk add rsync
# 数据同步到 Nextcloud 用户的数据目录中
export SRC='<path>/Picture' # 硬盘中原有的照片目录
export DEST='<path>/rpi-nextcloud/html/data/<user>/files/Picture' # 目标 nextcloud 用户的文件目录下的 Picture 目录
rsync -av ${SRC} ${DEST}
# 运行 occ 扫描新加入的文件
docker exec -u www-data -it rpi-nextcloud php occ -v files:scan <user>
# 如果只想扫描指定目录中的文件
docker exec -u www-data -it rpi-nextcloud php occ -v files:scan <user> --path="<user>/files/<dir path>"
- 稳定性如何
经过目前同步百 G 数据,下载了一个近 20G 的复联 4,没出现任何异常。但总运行时间「一周稳定运行」还不够评估其稳定性,不过采用容器化部署,并且数据都存在外接硬盘,也是为了应对崩掉的情况。 -
性能如何
CPU 占用还好,内存明显不足,虽然容器内部的内存占用看起来很美好,但实际上整套容器方案部署下来,就捉襟见肘了。 CPU & Mem