得益于MiniPC 24小时不间断加班,太适合在上面部署一些自动化下载上传以及文件管理功能了,这篇文章主要讲使用Docker来部署这些服务:

  • Samba:Linux上运行它,可以把Linux映射成一个Windows磁盘,访问MiniPC文件只需要打开Windows的资源管理器
  • FileBrowser:图形化文件管理器,可以部署网页管理界面到公网,相当于自建云盘
  • BaiduPCS Go:命令行控制上传和下载文件到百度云
  • OpenList:AList的开源版,可以挂载一系列云盘,也可以挂载本地

Samba

使用Samba可以将Linux映射为Windows的一个本地磁盘,这样Windows的软件就可以直接打开Linux的文件夹了,大大方便了我们使用命令行来管理Linux文件。

之前部署Samba是直接安装在Linux上的,后来试了试用Docker也完全可以。

Linux直接安装

  • 安装Samba

    sudo apt update
    sudo apt install samba
    
  • 编辑Samba配置文件

    sudo nano /etc/samba/smb.conf
    

    首先建议把[homes]下的所有内容注释掉,否则会自动把所有用户的~目录也一起共享出,我们可以在文本末尾添加内容来手动控制需要共享的目录

    [Name]
    path = /home/user1
    browsable = yes
    read only = no
    guest ok = yes
    

    [Name]是共享文件夹的名称,会显示在Windows磁盘上

  • 设置Samba账户密码

    sudo smbpasswd -a user1
    sudo smbpasswd -e user1
    
  • 重启Samba服务

    sudo systemctl restart smbd
    

Docker

  • 使用Docker Compose安装Samba

    services:
      samba:
        image: dperson/samba
        container_name: samba
        restart: unless-stopped
        ports:
          - "137:137/udp"
          - "138:138/udp"
          - "139:139/tcp"
          - "445:445/tcp"
        volumes:
          - [host_path]:/mount/home     # 替换成宿主机要共享的目录路径
        environment:
          - USERID=[your_uid]           # 替换成宿主机对应用户的UID,运行`id -u`获取
          - GROUPID=[your_gid]          # 替换成宿主机对应用户的GID,运行`id -g`获取
        command: >
          -u "[username];[password]" -s "[Name];/mount/home;yes;no;no;[username]"      
    

    替换[username][password][Name]为自己想要的值

  • Docker容器运行后会产生一些匿名卷,是正常现象

Windows

  • 打开文件资源管理器
  • 右键点击“此电脑”,选择“映射网络驱动器”
  • 选择一个驱动器字母(例如Z:)
  • 在文件夹栏中输入:\\Linux IP Address\[Name]

FileBrowser

File Browser是一个文件浏览器,可以用于图形化地管理MiniPC上的文件。但是我比较习惯用Samba,平时还是习惯用Window的文件管理器直接打开MiniPC上的文件。

然而FileBrowser相较于Samba有一个Web管理器,因此可以将服务暴露到公网,这样我们就相当于自建了一个网盘了。假设和朋友出去玩拍了好多照片,分享的时候嫌微信无法传大文件,就可以用这个了。这样我们每次拍完照把U盘在MiniPC上一插即可。

由于是部署在公网,我们可以只把SD卡的内容挂载进去,就算被黑了MiniPC本身的文件也不会被涉及。

部署

  • 本地创建一个文件夹,然后新建一个文件database.db,修改权限

    touch ./database.db
    chown 1000:1000 ./database.db
    chmod 664 ./database.db
    
  • 创建docker-compose.yml,我打算由cloudflared托管,因此接入它的网络

    services:
      filebrowser:
        image: filebrowser/filebrowser
        container_name: filebrowser
        restart: unless-stopped
        volumes:
          - ./data:/srv
          - ./database.db:/database.db
        expose:
          - "80"
        environment:
          - PUID=1000
          - PGID=1000
          - UMASK=022
          - TZ=America/Toronto
        user: "1000:1000"
        networks:
          - cloudflared
    
    networks:
      cloudflared:
        external: true
    
  • 启动容器,默认用户名密码为adminadmin

    docker compose up -d
    

修改密码

  • 先停掉容器

    docker compose down
    
  • 重置密码

    docker run --rm \
      -v $(pwd)/database.db:/database.db \
      filebrowser/filebrowser \
      users update User --password 12345678 --database /database.db
    

挂载U盘 / SD卡

  • 先停止容器docker compose down

  • 首先需要把U盘挂载到miniPC,如果希望手动挂载,请继续往下看,但是这里建议自动挂载(详见:使用udev自动挂载U盘 | Kunyang’s Blog),U盘插入后直接挂载到对应的文件夹。下面是手动挂载的流程:

    • 假设U盘名称(Label)为Nikon-1,我们先手动挂载在~/filebrowser/Nikon-1下,这样我们访问~/filebrowser/Nikon-1这个文件夹就是在访问我们的U盘

    • 得到设备名

      lsblk
      

      一般就叫/dev/sdb1

    • 创建挂载点目录

      sudo mkdir -p ~/filebrowser/nikon-1
      
    • 挂载设备

      sudo mount /dev/sdb1 ~/filebrowser/nikon-1
      
  • 假设我的尼康相机有两个SD卡,大疆有一个SD卡,SD卡都分别被我命名为了nikon-1nikon-2dji-1。本地的miniPC挂载完成后,修改File Browser的docker-compose.yml,把逻辑卷加入

    volumes:
      - ./data:/srv
      - ./database.db:/database.db
      # 挂载SD卡
      - ./nikon-1/DCIM/102NZ_FC:/srv/nikon/SD1
      - ./nikon-2/DCIM/102NZ_FC:/srv/nikon/SD2
      - ./dji-1/DCIM/DJI_001:/srv/dji/SD1
      # 挂载服务器,不建议,如果用户名密码被破解很危险,建议使用VPN访问
      - /home/username/:/srv/debian
    
  • 重启容器

    docker compose up -d
    

BaiduPCS Go

虽然百度网盘经常被吐槽限速,但是我一直没有放弃使用百度云,因为我是比较早期的用户,一直有 2T 的存储空间,所以它非常适合用来备份一些“电子鸡肋”(比如现在相机拍一张RAW格式照片动辄就是30MB,拍的大疆视频好几个G,剪视频能有的片段很少),正好可以利用这个空间长期存放。2T的空间我现在才用了不到300G,且这种正常的视频百度云一般不会和谐。

但是百度云盘无法直接运行在Linux上,况且我的服务器连GUI都没有,因此需要一个Docker + 命令行版本的百度网盘,查了一下还真有,可以使用BaiduPCS Go。我把这个做成了Docker镜像:kyxie/baidupcs-go - Docker Image | Docker Hub

部署

  • 直接运行

    docker run -d -it --name baidupcs-go \
      -v $(pwd)/data:/data \
      -v $(pwd)/upload:/upload \
      -v $(pwd)/config:/root/.config/BaiduPCS-Go \
      -w /upload \
      kyxie/baidupcs-go:latest
    
  • 使用Docker Compose部署(推荐)

    services:
      baidupcs-go:
        image: kyxie/baidupcs-go:latest
        container_name: baidupcs-go
    
        stdin_open: true
        tty: true
    
        volumes:
          - ./data:/data
          - ./upload:/upload
          - ./config:/root/.config/BaiduPCS-Go
          # 挂载其他目录,比如U盘的目录
          - /mnt/usb:/u
    
        working_dir: /upload
    

常见命令

  • 查看容器内部文件

    docker exec -it baidupcs-go /bin/sh
    
  • 进入容器,登录后显示网盘的文件

    docker exec -it baidupcs-go BaiduPCS-Go
    
  • 登录

    • 使用浏览器登录百度网盘

    • 键盘F12 → Application → Cookies → https://pan.baidu.com → 找到BDUSS字段,复制

      BDUSS

    • 输入命令

      login -bduss=<BDUSS>
      
  • 上传,建议使用screen,因为关闭终端有可能会暂停上传

    screen -S pcs-upload
    
    docker exec baidupcs-go \
      BaiduPCS-Go upload <本地路径> <云盘路径>
    
    # 举例
    docker exec baidupcs-go \
      BaiduPCS-Go upload /nikon-1 "/照片和视频/来自:Nikon Zfc/2025 花瓶岛"
    
    docker exec baidupcs-go \
      BaiduPCS-Go upload /dji-1/MP4 "/照片和视频/来自:DJI/2025 花瓶岛"
    

    可以登录到云盘之后pwd显示云盘的路径,如果带有中文可以添加双引号。Ctrl + a,然后按d,暂时退出,不影响上传任务

  • 其余详见:GitHub - qjfoidnh/BaiduPCS-Go: iikira/BaiduPCS-Go原版基础上集成了分享链接/秒传链接转存功能

MacOS文件分类命令

  • Nikon:在Mac上自动把混在一起的.NEF文件和.JPG文件归类成两个文件夹/NEF/JPG

    mkdir -p RAW JPG && mv *.NEF RAW/ && mv *.JPG JPG/
    
  • DJI:在Mac上自动把混在一起的.LRF文件和.MP4文件归类成两个文件夹/LRF/MP4

    mkdir -p LRF MP4 && mv *.LRF LRF/ && mv *.MP4 MP4/
    

OpenList

因为之前也没怎么用过AList,它被卖了之后打算试一下OpenList,使用它可以挂载不同的云盘,方便我们在一个地方管理不同云盘的内容,还可以自动下载和上传云盘的内容。相当于结合了BaiduPCS和FileBrowser吧。

部署

  • 在之前Cloudflare ZeroTrust创建的Tunnel再创建一个新的public hostname,一个Example:

    Subdomain: cloud
    Domain: example.com
    Type: HTTP
    URL: openlist:5244
    
  • OpenList官网有很详细的文档:Use Docker - OpenList Docs

  • 同样的本地创建一个文件夹,然后创建docker-compose.yml

    services:
      openlist:
        image: 'openlistteam/openlist:latest-aio'
        container_name: openlist
        volumes:
          - './data:/opt/openlist/data'
          - './storage:/opt/openlist/storage'
        environment:
          - PUID=1000
          - PGID=1000
          - UMASK=022
          - TZ=America/Toronto
        restart: unless-stopped
        networks:
          - cloudflared
    
    networks:
      cloudflared:
        external: true
    

    lastest-aio镜像打包了一个Aria2在里面,作为默认的下载器,在OpenList里也可以配置本机自带的其他的下载器。我并没有集中用一个下载器,影音部分用的是qbit,这里用的Aria2,一方面下载电影确实适合P2P,挂在网盘则不是。另一方面qBit挂载的目录Sonarr和Radarr也得有权限访问,一旦OpenList使用qBit挂载目录配置错了会影响Sonarr的访问,因此干脆直接用两个

  • 根据这篇文章:使用udev自动挂载U盘 | Kunyang’s Blog,我们可以修改/usr/local/bin/auto-mount-usb.sh脚本,把mount_base改为~/openlist/storage

  • 启动容器

    docker compose up -d
    
  • 产生一个临时的随机密码,使用这个密码就可以登录了,登录之后再在网页端修改密码,建议开启2FA

    docker exec -it openlist ./openlist admin random
    

挂载本地

  • 我们插入SD卡或者U盘后就会自动挂载到storage目录下
  • 在网页端 → Storage → 添加 → 本地储存
    • 挂载路径就是网页内要展示的路径,比如/SD,还可以使用多级目录,比如/SD/Nikon-2
    • WebDAV策略默认本地代理
    • 根文件夹目录就是容器内的目录,我设置为/opt/openlist/storage,这样就把U盘映射出去了
    • 如果没找到,则重启容器,需要在启动容器前挂载SD卡

挂载云盘

  • 挂载百度网盘:Baidu Netdisk - OpenList Docs

    • 在百度云盘点击上传打开的还是Windows的管理器,如果想直接从SD卡上传到百度云可以使用复制,从一个储存复制到另外一个,网盘见互传也可以这样,这样的话可以退役BaiduPCS Go了
  • 挂载Google Drive:Google Drive - OpenList Docs

目前我只使用了这两个,文档里也有很详细的挂载其他网盘的教程。