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.服务器部署#
基本软件安装
sudo apt update && sudo apt install rclone apache2-utils -y
Rclone 连接 OneDrive
自行搜索
linux服务器使用rclone连接onedrive
注意:rclone 新建的 name 应为onedrive1T
运行 rclone config
结果应包含如下:
Current remotes:
Name Type
==== ====
onedrive1T onedrive
项目文件夹创建
mkdir -p /projectpath/rclone_onedrive_webdav mkdir -p /projectpath/rclone_onedrive_webdav/cache mkdir -p /projectpath/rclone_onedrive_webdav/temp
项目文件
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
文件权限为 644sudo chmod 644 /projectpath/rclone_onedrive_webdav/htpasswd
然后输入 webdavpassword
创建
rclone.log
文件touch /projectpath/rclone_onedrive_webdav/rclone.log
启动服务
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
设置反向代理,并配置 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; } }
配置完成后,访问
https://youtwebdav.site
即可。
2.本地挂载#
2.1 基础使用#
- 创建项目路径
mkdir -p /home/username/Documents/OneDrive mkdir -p /home/username/.cache/rclone touch /home/username/.cache/rclone/rclone.log
- 挂载
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 进阶使用#
默认挂载脚本:
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
挂载 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
应用图标:
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
搭配DwarFS使用