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

2019-08-20  本文已影响0人  我是石巍

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

步骤预览
  • 硬件准备
  • 安装 AlpineLinux
  • 安装 Docker
  • 安装 docker-compose
  • 搭建 Nextcloud 和 Transmission BT
  • FAQ

硬件准备

安装 AlpineLinux

# 找到 TF 卡,我的是 /dev/disk2
diskutil list
# 格式化 /dev/disk2 为可启动的 FAT32,卷标为 RPI
diskutil partitionDisk /dev/disk2 MBR FAT32 RPI 0b
# 进入格式化好的 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
# 接上显示器和键盘,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

# 供参考的脚本
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
# 以我的硬盘数据举例
# 首先确定要同步到那个用户的目录中,用 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>"
上一篇下一篇

猜你喜欢

热点阅读