Contents:
Install (macOS) #
This is required for getting mount
to work properly, see:
Run:
brew install --cask macfuse
brew install gromgit/fuse/rclone-mac
Mount (OneDrive) #
#!/usr/bin/env bash
LOG_PATH="$HOME/Library/Logs/rclone-onedrive-mirror.log"
MOUNT_DIR="$HOME/Library/CloudStorage/OneDrive"
mkdir -p "$MOUNT_DIR"
/usr/local/opt/rclone-mac/libexec/rclone/rclone mount \
onedrive: "$MOUNT_DIR" \
--volname "OneDrive" \
--buffer-size 64M \
--vfs-read-ahead 512M \
--vfs-cache-mode full \
--vfs-cache-max-age 8760h \
--vfs-cache-max-size 100G \
--vfs-cache-poll-interval 30s \
--vfs-write-back 5s \
--attr-timeout 8700h \
--dir-cache-time 8760h \
--poll-interval 30s \
--log-level INFO \
--log-file "$LOG_PATH"
# Optional:
# --rc \
# --rc-web-gui \
# --rc-web-gui-no-open-browser \
# --rc-htpasswd "$HOME/.config/rclone/htpasswd"
# Optionally, inform the user when the process stops.
# Requires: brew install terminal-notifier
PROC_EXIT_CODE="$?"
terminal-notifier -title "OneDrive mount stopped!" -message "$LOG_PATH"
exit $PROC_EXIT_CODE
Notes:
- Web interface is served at http://127.0.0.1:5572/, see: Remote controlling rclone with its API;
- For the cache options used, see: VFS File Caching;
For serving the remote control web UI, you need credentials:
touch ~/.config/rclone/htpasswd
htpasswd -B ~/.config/rclone/htpasswd alex
macOS service #
The above command supports a --daemon
option, but I’d like automatic launch at startup, maybe even restarts.
Create a script in ~/bin/mount-onedrive
:
Create ~/Library/LaunchAgents/my.rclone-onedrive-mount.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>my.rclone-onedrive-mount</string>
<key>ProgramArguments</key>
<array>
<string>/Users/myname/bin/mount-onedrive</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>myname</string>
</dict>
</plist>
The service can then be loaded via:
launchctl load -w ~/Library/LaunchAgents/my.rclone-onedrive-mount.plist
Or unloaded via:
launchctl unload ~/Library/LaunchAgents/my.rclone-onedrive-mount.plist
Bisync #
Alternatively there’s a bisync command.
On first run, the database needs to be initialized, via --resync
, but as a warning, this can override the files of “path2” with those of “path1”.
This is the onedrive-sync-init
script:
#!/usr/bin/env bash
function notifyIfError() {
PROC_EXIT_CODE="$1"
if [ "$PROC_EXIT_CODE" -ne 0 ]; then
terminal-notifier -title "OneDrive sync failed!" -message "Check the logs"
echo "OneDrive sync failed"
exit "$PROC_EXIT_CODE"
fi
}
mkdir -p ~/OneDrive/Bisync
mkdir -p ~/OneDrive/.db
rclone bisync onedrive: ~/OneDrive/Bisync \
--resync \
--filters-file ~/.config/rclone/onedrive-filter.conf \
--workdir ~/OneDrive/.db \
-v "$@"
notifyIfError "$?"
# Adds .rclone-check files in the top sub-directories
find ~/OneDrive/Bisync -type d -d 1 -exec touch "{}/.rclone-check" \;
notifyIfError "$?"
# Syncs those .rclone-check files
rclone bisync onedrive: ~/OneDrive/Bisync \
--filters-file ~/.config/rclone/onedrive-filter.conf \
--workdir ~/OneDrive/.db \
-v "$@"
notifyIfError "$?"
This is the onedrive-sync-periodic
script, which could be installed in crontab:
#!/usr/bin/env bash
rclone bisync onedrive: ~/OneDrive/Bisync \
--check-access \
--check-filename ".rclone-check" \
--filters-file ~/.config/rclone/onedrive-filter.conf \
--workdir ~/OneDrive/.db \
-v "$@"
PROC_EXIT_CODE="$1"
if [ "$PROC_EXIT_CODE" -ne 0 ]; then
terminal-notifier -title "OneDrive sync failed!" -message "Check the logs"
echo "OneDrive sync failed"
exit "$PROC_EXIT_CODE"
fi
And then there’s the ~/.config/rclone/onedrive-filter.conf
file, which dictates what to sync (aka selective sync):
- **/.DS_Store
- **/.localized
- **/*.swp
+ /Documents/**
+ /Scanned/**
+ /Screenshots/**
# Exclude everything by default
- **