--- title: Rclone S3 Mounts description: This script configures Rclone to provide several S3-compliant mounts by leveraging CloudFlare R2 sidebar_label: 50 Rclone S3 Mounts slug: /scripts/after/run_onchange_after_50-rclone.sh.tmpl githubLocation: https://github.com/megabyte-labs/install.doctor/blob/master/home/.chezmoiscripts/universal/run_onchange_after_50-rclone.sh.tmpl scriptLocation: https://github.com/megabyte-labs/install.doctor/raw/master/home/.chezmoiscripts/universal/run_onchange_after_50-rclone.sh.tmpl repoLocation: home/.chezmoiscripts/universal/run_onchange_after_50-rclone.sh.tmpl --- # Rclone S3 Mounts This script configures Rclone to provide several S3-compliant mounts by leveraging CloudFlare R2 ## Overview Install Doctor leverages Rclone and CloudFlare R2 to provide S3-compliant bucket mounts that allow you to retain stateful files and configurations. In general, these buckets are used for backing up files like your browser profiles, Docker backup files, and other files that cannot be stored as as code in your Install Doctor fork. This script sets up Rclone to provide several folders that are synchronized with S3-compliant buckets (using CloudFlare R2 by default). The script ensures required directories are created and that proper permissions are applied. This script will only run if `rclone` is available in the `PATH`. It also requires the user to provide `CLOUDFLARE_R2_ID` and `CLOUDFLARE_R2_SECRET` as either environment variables or through the encrypted repository-fork-housed method detailed in the [Secrets documentation](https://install.doctor/docs/customization/secrets). ## Mounts The script will setup five mounts by default and enable / start `systemd` services on Linux systems so that the mounts are available whenever the device is turned on. The mounts are: | Mount Location | Description | |-----------------------|-----------------------------------------------------------------------------------------------------------------------| | `/mnt/s3-private` | Private system-wide bucket used for any private files that should not be able to be accessed publicly over HTTPS | | `/mnt/s3-public` | Public system-wide bucket that can be accessed by anyone over HTTPS with the bucket's URL (provided by CloudFlare R2) | | `/mnt/s3-docker` | Private system-wide bucket used for storing Docker-related backups / files | | `/mnt/s3-system` | Private system-wide bucket similar to `/mnt/s3-private` but intended for system file backups | | `$HOME/.local/mnt/s3` | Private user-specific bucket (used for backing up application settings) | ## Permissions The system files are all assigned proper permissions and are owned by the user `rclone` with the group `rclone`. The exception to this is the user-specific mount which uses the user's user name and user group. ## Samba If Samba is installed, then by default Samba will create two shares that are symlinked to the `/mnt/s3-private` and `/mnt/s3-public` buckets. This feature allows you to easily access the two buckets from other devices in your local network. If Rclone buckets are not available then the Samba setup script will just create regular empty folders as shares. ## Notes * The mount services all leverage the executable found at `$HOME/.local/bin/rclone-mount` to mount the shares. ## Links * [Rclone mount script](https://github.com/megabyte-labs/install.doctor/tree/master/home/dot_local/bin/executable_rclone-mount) * [Rclone default configurations](https://github.com/megabyte-labs/install.doctor/tree/master/home/dot_config/rclone) * [Rclone documentation](https://rclone.org/docs/) ## Source Code ``` {{- if ne .host.distro.family "windows" -}} #!/usr/bin/env bash # @file Rclone S3 Mounts # @brief This script configures Rclone to provide several S3-compliant mounts by leveraging CloudFlare R2 # @description # Install Doctor leverages Rclone and CloudFlare R2 to provide S3-compliant bucket mounts that allow you to retain stateful files and configurations. # In general, these buckets are used for backing up files like your browser profiles, Docker backup files, and other files that cannot be stored as # as code in your Install Doctor fork. # # This script sets up Rclone to provide several folders that are synchronized with S3-compliant buckets (using CloudFlare R2 by default). # The script ensures required directories are created and that proper permissions are applied. This script will only run if `rclone` is # available in the `PATH`. It also requires the user to provide `CLOUDFLARE_R2_ID` and `CLOUDFLARE_R2_SECRET` as either environment variables # or through the encrypted repository-fork-housed method detailed in the [Secrets documentation](https://install.doctor/docs/customization/secrets). # # ## Mounts # # The script will setup five mounts by default and enable / start `systemd` services on Linux systems so that the mounts are available # whenever the device is turned on. The mounts are: # # | Mount Location | Description | # |-----------------------|-----------------------------------------------------------------------------------------------------------------------| # | `/mnt/s3-private` | Private system-wide bucket used for any private files that should not be able to be accessed publicly over HTTPS | # | `/mnt/s3-public` | Public system-wide bucket that can be accessed by anyone over HTTPS with the bucket's URL (provided by CloudFlare R2) | # | `/mnt/s3-docker` | Private system-wide bucket used for storing Docker-related backups / files | # | `/mnt/s3-system` | Private system-wide bucket similar to `/mnt/s3-private` but intended for system file backups | # | `$HOME/.local/mnt/s3` | Private user-specific bucket (used for backing up application settings) | # # ## Permissions # # The system files are all assigned proper permissions and are owned by the user `rclone` with the group `rclone`. The exception to this is the # user-specific mount which uses the user's user name and user group. # # ## Samba # # If Samba is installed, then by default Samba will create two shares that are symlinked to the `/mnt/s3-private` and `/mnt/s3-public` # buckets. This feature allows you to easily access the two buckets from other devices in your local network. If Rclone buckets are not # available then the Samba setup script will just create regular empty folders as shares. # # ## Notes # # * The mount services all leverage the executable found at `$HOME/.local/bin/rclone-mount` to mount the shares. # # ## Links # # * [Rclone mount script](https://github.com/megabyte-labs/install.doctor/tree/master/home/dot_local/bin/executable_rclone-mount) # * [Rclone default configurations](https://github.com/megabyte-labs/install.doctor/tree/master/home/dot_config/rclone) # * [Rclone documentation](https://rclone.org/docs/) {{ includeTemplate "universal/profile" }} {{ includeTemplate "universal/logg" }} if command -v rclone > /dev/null; then logg info 'Ensuring /var/cache/rclone exists' sudo mkdir -p /var/cache/rclone sudo chmod 700 /var/cache/rclone sudo chown -Rf rclone:rclone /var/cache/rclone logg info 'Ensuring /var/log/rclone exists' sudo mkdir -p /var/log/rclone sudo chmod 700 /var/log/rclone sudo chown -Rf rclone:rclone /var/log/rclone logg info 'Adding ~/.local/bin/rclone-mount to /usr/local/bin' sudo cp -f "$HOME/.local/bin/rclone-mount" /usr/local/bin/rclone-mount sudo chmod +x /usr/local/bin/rclone-mount logg info 'Adding ~/.config/rclone/rcloneignore to /etc/rcloneignore' sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/rclone/rcloneignore" /etc/rcloneignore sudo chmod 644 /etc/rcloneignore logg info 'Adding ~/.config/rclone/system-rclone.conf to /etc/rclone.conf' sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/rclone/system-rclone.conf" /etc/rclone.conf ### Add / configure service files if [ -d /etc/systemd/system ]; then find "${XDG_CONFIG_HOME:-$HOME/.config}/rclone/system" -mindepth 1 -maxdepth 1 -type f | while read RCLONE_SERVICE; do ### Add systemd service file logg info "Adding S3 system mount service defined at $RCLONE_SERVICE" FILENAME="$(basename "$RCLONE_SERVICE")" SERVICE_ID="$(echo "$FILENAME" | sed 's/.service//')" sudo cp -f "$RCLONE_SERVICE" "/etc/systemd/system/$(basename "$RCLONE_SERVICE")" ### Ensure mount folder is created logg info "Ensuring /mnt/$SERVICE_ID is created with proper permissions" sudo mkdir -p "/mnt/$SERVICE_ID" sudo chmod 770 "/mnt/$SERVICE_ID" sudo chown -Rf rclone:rclone "/mnt/$SERVICE_ID" ### Enable / restart the service logg info "Enabling / restarting the $SERVICE_ID S3 service" sudo systemctl enable "$SERVICE_ID" sudo systemctl restart "$SERVICE_ID" done ### Add user Rclone mount logg info 'Adding user S3 rclone mount (available at ~/.local/mnt/s3)' sudo cp -f "${XDG_CONFIG_HOME:-$HOME/.config}/rclone/s3-user.service" "/etc/systemd/system/s3-${USER}.service" logg info 'Enabling / restarting the S3 user mount' sudo systemctl enable "s3-${USER}" sudo systemctl restart "s3-${USER}" fi else logg info 'rclone is not available' fi {{ end -}} ```