在树莓派容器化部署私有云和下载机

利用容器把树莓派打造成家庭服务器,具有如下功能:

  • 私有云 - 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

参考 docker 官网文档

搭建 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://:8080
  • Nextcloud 提示 SQLite 不推荐
    因人而异,我是个人使用,轻量级数据库足以应付,所以直接使用的内置 SQLite。
  • 能否外网访问 Nextcloud
    可以。如果路由器上有花生壳服务,可以注册一个花生壳账号,拿一个免费域名,设置一下端口。建议在安装 Nextcloud 前配好域名加端口,省得后面再去配置。
  • 如何访问 Transmission
    默认是 http://: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='/Picture'    # 硬盘中原有的照片目录
export DEST='/rpi-nextcloud/html/data//files/Picture'    # 目标 nextcloud 用户的文件目录下的 Picture 目录
rsync -av ${SRC} ${DEST}
# 运行 occ 扫描新加入的文件
docker exec -u www-data -it rpi-nextcloud php occ -v files:scan 
# 如果只想扫描指定目录中的文件
docker exec -u www-data -it rpi-nextcloud php occ -v files:scan  --path="/files/"
  • 稳定性如何
    经过目前同步百 G 数据,下载了一个近 20G 的复联 4,没出现任何异常。但总运行时间「一周稳定运行」还不够评估其稳定性,不过采用容器化部署,并且数据都存在外接硬盘,也是为了应对崩掉的情况。
  • 性能如何

    CPU 占用还好,内存明显不足,虽然容器内部的内存占用看起来很美好,但实际上整套容器方案部署下来,就捉襟见肘了。
    在树莓派容器化部署私有云和下载机_第1张图片
    CPU & Mem

你可能感兴趣的:(在树莓派容器化部署私有云和下载机)