跳过正文
  1. 文章/

使用Rclone开放OneDrive

··757 字·4 分钟
Rclone WebDav OneDrive
目录

0.写在开头
#

由于新购入了一台腾讯云首尔 200M 的小鸡,所以准备多搞搞以前受网速影响没搞的个人服务。

又在土耳其区订阅了 Miscrosoft 365,里面有稳定的 1T 空间 OneDrive可以使用,平时使用占用不多,所以想到这个方案。

graph TD A[本地设备/外部服务] B(OneDrive服务器) C(服务器) A -->|rclone直接挂载| B A -->|WebDAV访问| C C -->|rclone连接| B C -->|提供WebDAV服务| A

以下信息请根据实际情况全局替换:

  • 项目路径:/projectpath/rclone_onedrive_webdav
  • 项目名:rclone_onedrive_webdav
  • 内部端口:10001
  • WebDav 用户名:webdavusername
  • WebDav 密码:webdavpassword
  • 本地设备用户名:username
  • webdav 网址:youtwebdav.site

1.服务器部署
#

  1. 基本软件安装

    sudo apt update && sudo apt install rclone apache2-utils -y
    
  2. Rclone 连接 OneDrive

    自行搜索 linux服务器使用rclone连接onedrive

注意:rclone 新建的 name 应为 onedrive1T

运行 rclone config结果应包含如下:

Current remotes:

Name                 Type
====                 ====
onedrive1T           onedrive
  1. 项目文件夹创建

    mkdir -p /projectpath/rclone_onedrive_webdav
    mkdir -p /projectpath/rclone_onedrive_webdav/cache
    mkdir -p /projectpath/rclone_onedrive_webdav/temp
    
  2. 项目文件

    • rclone-webdav.service

      [Unit]
      Description=Rclone WebDAV service
      After=network-online.target
      Wants=network-online.target
      
      [Service]
      Type=simple
      User=root
      ExecStart=/projectpath/rclone_onedrive_webdav/start_rclone_webdav.sh
      Restart=on-failure
      RestartSec=30
      StartLimitInterval=60s
      StartLimitBurst=3
      
      [Install]
      WantedBy=multi-user.target
      
    • start_rclone_webdav.sh

      #!/bin/bash
      /usr/bin/rclone serve webdav onedrive1T: \
      --addr=127.0.0.1:10001 \
      --vfs-cache-mode writes \
      --vfs-cache-max-size 1G \
      --vfs-cache-max-age 6h \
      --buffer-size 16M \
      --dir-cache-time 30m \
      --poll-interval 1h \
      --tpslimit 30 \
      --bwlimit 150M \
      --log-level WARNING \
      --log-file /projectpath/rclone_onedrive_webdav/rclone.log \
      --cache-dir=/projectpath/rclone_onedrive_webdav/cache \
      --htpasswd /projectpath/rclone_onedrive_webdav/htpasswd \
      --no-checksum \
      --timeout 1m
      
    • 创建 htpasswd文件:

      sudo htpasswd -c /projectpath/rclone_onedrive_webdav/htpasswd webdavusername
      
    • 确保 htpasswd文件权限为 644

      sudo chmod 644 /projectpath/rclone_onedrive_webdav/htpasswd
      

      然后输入 webdavpassword

    • 创建 rclone.log文件

      touch /projectpath/rclone_onedrive_webdav/rclone.log
      
  3. 启动服务

    sudo cp /projectpath/rclone_onedrive_webdav/rclone-webdav.service /etc/systemd/system/
    sudo systemctl daemon-reload
    sudo systemctl enable rclone-webdav.service
    sudo systemctl start rclone-webdav.service
    
  4. 设置反向代理,并配置 HTTPS。

    server {
        listen 80;
        listen 443 ssl http2;
        server_name youtwebdav.site;
    
        # SSL配置优化
        ssl_certificate /www/sites/youtwebdav.site/ssl/fullchain.pem;
        ssl_certificate_key /www/sites/youtwebdav.site/ssl/privkey.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
        ssl_prefer_server_ciphers off;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 1d;
        ssl_session_tickets off;
    
        # OCSP Stapling
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4 valid=60s;
        resolver_timeout 2s;
    
        # HTTP跳转HTTPS
        if ($scheme = "http") {
            return 301 https://$host$request_uri;
        }
        error_page 497 https://$host$request_uri;
    
        # 日志配置
        access_log /www/sites/youtwebdav.site/log/access.log combined buffer=512k flush=1m;
        error_log /www/sites/youtwebdav.site/log/error.log warn;
    
        # 上传限制
        client_max_body_size 10240M;
        client_body_timeout 3600s;
    
        # 代理基础配置
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "";
        proxy_set_header Authorization $http_authorization;
        proxy_pass_header Authorization;
    
        # ACME验证
        location ^~ /.well-known/acme-challenge {
            allow all;
            root /usr/share/nginx/html;
        }
    
        # WebDAV配置
        location / {
            proxy_pass http://127.0.0.1:10001;
    
            # 超时设置优化
            proxy_connect_timeout 60s;
            proxy_send_timeout 3600s;
            proxy_read_timeout 3600s;
            send_timeout 3600s;
    
            # 缓冲区优化
            proxy_buffer_size 16k;
            proxy_buffers 8 16k;
            proxy_busy_buffers_size 32k;
    
            # 关闭缓冲提高传输效率
            proxy_buffering off;
            proxy_request_buffering off;
            proxy_max_temp_file_size 0;
    
            # WebDAV方法
            limit_except GET HEAD POST PUT DELETE MKCOL COPY MOVE PROPFIND PROPPATCH LOCK UNLOCK OPTIONS {
                deny all;
            }
    
            # 大文件传输优化
            client_body_buffer_size 512k;
    
            # 启用压缩
            gzip on;
            gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        }
    
        # 安全头优化
        add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-XSS-Protection "1; mode=block" always;
        add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    
        # 禁止访问隐藏文件
        location ~ /\. {
            deny all;
            access_log off;
            log_not_found off;
        }
    }
    
  5. 配置完成后,访问 https://youtwebdav.site即可。

2.本地挂载
#

2.1 基础使用
#

  1. 创建项目路径
    mkdir -p /home/username/Documents/OneDrive
    mkdir -p /home/username/.cache/rclone
    touch /home/username/.cache/rclone/rclone.log
    
  2. 挂载
     rclone mount onedrive1T: /home/username/Documents/OneDrive \
     --vfs-cache-mode full \
     --vfs-cache-max-size 30G \
     --vfs-cache-max-age 168h \
     --vfs-cache-poll-interval 15m \
     --buffer-size 1G \
     --vfs-read-chunk-size 256M \
     --vfs-read-chunk-size-limit 8G \
     --vfs-read-ahead 3G \
     --fast-list \
     --dir-cache-time 12h \
     --poll-interval 2m \
     --transfers 16 \
     --checkers 32 \
     --multi-thread-cutoff 1G \
     --multi-thread-streams 8 \
     --cache-dir /home/username/.cache/rclone \
     --use-mmap \
     --max-read-ahead 1G \
     --log-file=/home/username/.cache/rclone/rclone.log \
     --log-level NOTICE \
     --allow-non-empty \
     --daemon \
     --allow-other
    

2.2 进阶使用
#

  1. 默认挂载脚本:mount_Cloud_Drive.sh

     #!/bin/bash
    
     # 在这里定义要挂载的云盘,用空格分隔
     CLOUD_DRIVES="OneDrive"
    
     # 生成选项列表
     options=()
     for drive in $CLOUD_DRIVES; do
         options+=("挂载$drive")
     done
     options+=("挂载全部")
    
     # 使用zenity创建选择对话框
     choice=$(zenity --list \
     --title="挂载云盘" \
     --column="选项" \
     "${options[@]}" \
     --width=300 --height=400 \
     --cancel-label="取消" \
     --ok-label="确定")
    
     # 如果用户取消了选择,则退出脚本
     if [ $? -ne 0 ]; then
         exit 0
     fi
    
     # 定义挂载函数
     mount_drive() {
         local script="<你放脚本的地址>/mount_$1.sh"
         if [ -f "$script" ]; then
             "$script"
         else
             zenity --error --text="找不到挂载脚本:$script"
         fi
     }
    
     # 处理用户选择
     if [ "$choice" = "挂载全部" ]; then
         for drive in $CLOUD_DRIVES; do
             mount_drive "$drive"
         done
     else
         # 从选项中提取云盘名称
         selected_drive=${choice#挂载}
         mount_drive "$selected_drive"
     fi
    
  2. 挂载 OneDrive 脚本:mount_OneDrive.sh

     #!/bin/bash
     SERVICE_NAME="OneDrive"
     RCLONE_REMOTE="onedrive1T:"
     MOUNT_POINT="/home/username/Documents/OneDrive"
     ICON_PATH="/home/username/Pictures/AppIcons/onedrive_1.icns"
    
     # 检查是否已经挂载
     if mountpoint -q "$MOUNT_POINT"; then
         # 如果已经挂载,用nautilus打开文件夹
         notify-send -t 1000 -u normal -i "$ICON_PATH" "${SERVICE_NAME}已挂载" "正在打开文件夹..."
         nautilus "$MOUNT_POINT"
     else
         # 如果未挂载,开始挂载流程
         notify-send -t 1000 -u normal -i "$ICON_PATH" "正在挂载${SERVICE_NAME}" "请等待…………"
    
         # 执行rclone挂载命令
         rclone mount "$RCLONE_REMOTE" "$MOUNT_POINT" \
         --vfs-cache-mode full \
         --vfs-cache-max-size 20G \
         --vfs-cache-max-age 168h \
         --vfs-cache-poll-interval 1m \
         --buffer-size 256M \
         --vfs-read-chunk-size 256M \
         --vfs-read-chunk-size-limit 8G \
         --vfs-read-ahead 2G \
         --fast-list \
         --dir-cache-time 12h \
         --poll-interval 1m \
         --transfers 8 \
         --checkers 16 \
         --multi-thread-cutoff 512M \
         --multi-thread-streams 8 \
         --cache-dir /home/username/.cache/rclone/${SERVICE_NAME} \
         --use-mmap \
         --max-read-ahead 512M \
         --log-file=/home/username/.cache/rclone/rclone_${SERVICE_NAME}.log \
         --log-level NOTICE \
         --allow-non-empty \
         --daemon \
         --allow-other \
         --volname "$SERVICE_NAME" \
         --umask 002 \
         --attr-timeout 5s \
         --no-modtime
    
         # 等待rclone挂载完成
         while ! mountpoint -q "$MOUNT_POINT"; do
             sleep 1
         done
    
         # 显示挂载完成信息
         notify-send -t 1000 -u normal -i "$ICON_PATH" "${SERVICE_NAME}挂载完成" "已挂载到 ${MOUNT_POINT}"
     fi
    
  3. 应用图标:mount_cloud_drive.desktop

    [Desktop Entry]
    Type=Application
    Name=Mount Cloud Drive
    Name[en]=Mount Cloud Drive
    Comment=挂载云盘到本地文件系统
    Comment[en]=Mount Cloud Drive to local filesystem
    Exec=/home/username/APP/Scripts/mount_cloud_drive/mount_Cloud_Drive.sh
    Icon=/home/username/Pictures/AppIcons/drive.icns
    Terminal=false
    Categories=Utility;
    Actions=MountOneDrive;
    
    [Desktop Action MountOneDrive]
    Name=挂载OneDrive
    Name[en]=Mount OneDrive
    Exec=/home/username/APP/Scripts/mount_cloud_drive/mount_OneDrive.sh
    
  4. 搭配DwarFS使用

xiadengma
作者
xiadengma