美文网首页
在树莓派容器化部署私有云和下载机

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

作者: 我是石巍 | 来源:发表于2019-08-20 12:51 被阅读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
    

    参考 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://<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

    相关文章

      网友评论

          本文标题:在树莓派容器化部署私有云和下载机

          本文链接:https://www.haomeiwen.com/subject/fifssctx.html