Guide: How To Use Rclone To Mount Cloud Drives And Play Files


DZMM

Recommended Posts

1 hour ago, privateer said:

 

Do you do anything with the "Rescan Series Folder After Refresh" option in Sonarr? I've moved mine to after manual refresh, but I'm not sure if I needed to do that.

Yes it should be on "always", otherwise sonarr/radarr won't pick up changes or new downloads you made. Using manual is only useful for never changing libraries.

Link to comment
3 hours ago, Kaizac said:

Yes it should be on "always", otherwise sonarr/radarr won't pick up changes or new downloads you made. Using manual is only useful for never changing libraries.

 

Discovered a new problem! If I attempt to manually import something that's on my cloud drive (Manage episodes -> import, due to misnamed files), it can't execute the command but keeps the task running.

 

This is interesting because the automatic import works on the cloud drive, it's only for files that aren't correctly named and have to be manually added.

 

Encounter this before, or have any thoughts?

Link to comment
On 3/27/2023 at 3:54 AM, Kaizac said:

Correct, but with Dropbox you also are required to ask for additional storage. So if you are just starting out you could ask for a good amount of storage and then request more whenever you need it. So it really depends on you whether it is worth the price and hassle of getting the storage.

this is pretty much my use right now.. its $25 a month and you get a small discount if you pay per year. i always ask for like 10TB-ish a time and they always grant. lols i'm up to like 105?

 

 

Link to comment
On 4/11/2023 at 9:58 PM, privateer said:

 

Discovered a new problem! If I attempt to manually import something that's on my cloud drive (Manage episodes -> import, due to misnamed files), it can't execute the command but keeps the task running.

 

This is interesting because the automatic import works on the cloud drive, it's only for files that aren't correctly named and have to be manually added.

 

Encounter this before, or have any thoughts?

No, not when Sonarr uses the /mnt/user base and not direct paths. If you use direct paths like /downloads it will first download files from your cloud and then re-upload them again when importing.

 

Your logs should mention something about it though.

Link to comment
8 hours ago, Kaizac said:

No, not when Sonarr uses the /mnt/user base and not direct paths. If you use direct paths like /downloads it will first download files from your cloud and then re-upload them again when importing.

 

Your logs should mention something about it though.

 

Well finally did enough testing etc and after walking through it with the sonarr team, it's a bug!

Link to comment

I seem to have messed up this install/etc. 

 

My main issue is that files seem to be left in the .../mount_rclone/google/.... and the script won't mount again, since there the path isn't empty. 

 

I've noticed it twice, one was files in the "movies" folder, which I just deleted and let it mount. Second time it was the "TV" folder, and I updated the main script to just mount if not empty. The issue "occured" because the server rebooted/hard powered off (power issues that I can't really remedy with getting a UPS for this backup unraid server). 

 

The only thing I think I do out of the ordinary is copy files directly into the /mount/mergerfs/google/TV or Movies folder with an automated script.

 

I'm only running the main script: unraid_rclone_mount

 

I don't run any "upload script". I'm pretty sure that the files "broken" (left in the mount_rclone) folder never upload to gdrive, they are available to "plex" for example, and listed in mergerfs folder, but not actually in the cloud.

 

Any ideas or directions? 

Link to comment
20 hours ago, 00b5 said:

I seem to have messed up this install/etc. 

 

My main issue is that files seem to be left in the .../mount_rclone/google/.... and the script won't mount again, since there the path isn't empty. 

 

I've noticed it twice, one was files in the "movies" folder, which I just deleted and let it mount. Second time it was the "TV" folder, and I updated the main script to just mount if not empty. The issue "occured" because the server rebooted/hard powered off (power issues that I can't really remedy with getting a UPS for this backup unraid server). 

 

The only thing I think I do out of the ordinary is copy files directly into the /mount/mergerfs/google/TV or Movies folder with an automated script.

 

I'm only running the main script: unraid_rclone_mount

 

I don't run any "upload script". I'm pretty sure that the files "broken" (left in the mount_rclone) folder never upload to gdrive, they are available to "plex" for example, and listed in mergerfs folder, but not actually in the cloud.

 

Any ideas or directions? 

This normally happens when you have a docker starting up before the mount script is finished so it will create folders already in the mount_rclone/gdrive folder. Dockers which download like Sabnzbd and torrent clients often do this so they create the folder structure they need when it's not available. So try booting without autostart of dockers and then see if it happens again.

Link to comment

i'm going crazy here..

 

i followed every step. i don't use crypted because i have movies and tv shows at google.

 

first time it worked. then i ghad to reboot. now nothing works. i tried deleting everything that had to do with rclone. every directories.

 

i can do a rclone lsd gdrive:

 

every directories show up. but when i run the script no mount's now...

 

i don't get it :)

Link to comment
53 minutes ago, bubbadk said:

i'm going crazy here..

 

i followed every step. i don't use crypted because i have movies and tv shows at google.

 

first time it worked. then i ghad to reboot. now nothing works. i tried deleting everything that had to do with rclone. every directories.

 

i can do a rclone lsd gdrive:

 

every directories show up. but when i run the script no mount's now...

 

i don't get it :)

Paste your mount script. And explain which folders you use. Does the mount script give any errors?

  • Like 1
Link to comment
15 minutes ago, Kaizac said:

Paste your mount script. And explain which folders you use. Does the mount script give any errors?

######################
#### Mount Script ####
######################
## Version 0.96.9.3 ##
######################

####### EDIT ONLY THESE SETTINGS #######

# INSTRUCTIONS
# 1. Change the name of the rclone remote and shares to match your setup
# 2. NOTE: enter RcloneRemoteName WITHOUT ':'
# 3. Optional: include custom command and bind mount settings
# 4. Optional: include extra folders in mergerfs mount

# REQUIRED SETTINGS
RcloneRemoteName="gdrive_vfs" # Name of rclone remote mount WITHOUT ':'. NOTE: Choose your encrypted remote for sensitive data
RcloneMountShare="/mnt/user/mount_rclone" # where your rclone remote will be located without trailing slash  e.g. /mnt/user/mount_rclone
RcloneMountDirCacheTime="720h" # rclone dir cache time
LocalFilesShare="/mnt/user/local" # location of the local files and MountFolders you want to upload without trailing slash to rclone e.g. /mnt/user/local. Enter 'ignore' to disable
RcloneCacheShare="/mnt/user0/mount_rclone" # location of rclone cache files without trailing slash e.g. /mnt/user0/mount_rclone
RcloneCacheMaxSize="40G" # Maximum size of rclone cache
RcloneCacheMaxAge="336h" # Maximum age of cache files
MergerfsMountShare="/mnt/user/mount_mergerfs" # location without trailing slash  e.g. /mnt/user/mount_mergerfs. Enter 'ignore' to disable
DockerStart="" # list of dockers, separated by space, to start once mergerfs mount verified. Remember to disable AUTOSTART for dockers added in docker settings page
MountFolders=\{"downloads/complete,downloads/intermediate,downloads/seeds,movies,tv"\} # comma separated list of folders to create within the mount

# Note: Again - remember to NOT use ':' in your remote name above

# OPTIONAL SETTINGS

# Add extra paths to mergerfs mount in addition to LocalFilesShare
LocalFilesShare2="ignore" # without trailing slash e.g. /mnt/user/other__remote_mount/or_other_local_folder.  Enter 'ignore' to disable
LocalFilesShare3="ignore"
LocalFilesShare4="ignore"

# Add extra commands or filters
Command1="--rc"
Command2="--allow-non-empty"
Command3=""
Command4=""
Command5=""
Command6=""
Command7=""
Command8=""

CreateBindMount="N" # Y/N. Choose whether to bind traffic to a particular network adapter
RCloneMountIP="192.168.1.234" # My unraid IP is 172.30.12.2 so I create another similar IP address
NetworkAdapter="eth0" # choose your network adapter. eth0 recommended
VirtualIPNumber="2" # creates eth0:x e.g. eth0:1.  I create a unique virtual IP addresses for each mount & upload so I can monitor and traffic shape for each of them

####### END SETTINGS #######

###############################################################################
#####   DO NOT EDIT ANYTHING BELOW UNLESS YOU KNOW WHAT YOU ARE DOING   #######
###############################################################################

####### Preparing mount location variables #######
RcloneMountLocation="$RcloneMountShare/$RcloneRemoteName" # Location for rclone mount
LocalFilesLocation="$LocalFilesShare/$RcloneRemoteName" # Location for local files to be merged with rclone mount
MergerFSMountLocation="$MergerfsMountShare/$RcloneRemoteName" # Rclone data folder location

####### create directories for rclone mount and mergerfs mounts #######
mkdir -p /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName # for script files
mkdir -p $RcloneCacheShare/cache/$RcloneRemoteName # for cache files
if [[  $LocalFilesShare == 'ignore' ]]; then
    echo "$(date "+%d.%m.%Y %T") INFO: Not creating local folders as requested."
    LocalFilesLocation="/tmp/$RcloneRemoteName"
    eval mkdir -p $LocalFilesLocation
else
    echo "$(date "+%d.%m.%Y %T") INFO: Creating local folders."
    eval mkdir -p $LocalFilesLocation/"$MountFolders"
fi
mkdir -p $RcloneMountLocation

if [[  $MergerfsMountShare == 'ignore' ]]; then
    echo "$(date "+%d.%m.%Y %T") INFO: Not creating MergerFS folders as requested."
else
    echo "$(date "+%d.%m.%Y %T") INFO: Creating MergerFS folders."
    mkdir -p $MergerFSMountLocation
fi


#######  Check if script is already running  #######
echo "$(date "+%d.%m.%Y %T") INFO: *** Starting mount of remote ${RcloneRemoteName}"
echo "$(date "+%d.%m.%Y %T") INFO: Checking if this script is already running."
if [[ -f "/mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running" ]]; then
    echo "$(date "+%d.%m.%Y %T") INFO: Exiting script as already running."
    exit
else
    echo "$(date "+%d.%m.%Y %T") INFO: Script not running - proceeding."
    touch /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
fi

####### Checking have connectivity #######

echo "$(date "+%d.%m.%Y %T") INFO: *** Checking if online"
ping -q -c2 google.com > /dev/null # -q quiet, -c number of pings to perform
if [ $? -eq 0 ]; then # ping returns exit status 0 if successful
    echo "$(date "+%d.%m.%Y %T") PASSED: *** Internet online"
else
    echo "$(date "+%d.%m.%Y %T") FAIL: *** No connectivity.  Will try again on next run"
    rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
    exit
fi

#######  Create Rclone Mount  #######

# Check If Rclone Mount Already Created
if [[ -f "$RcloneMountLocation/mountcheck" ]]; then
    echo "$(date "+%d.%m.%Y %T") INFO: Success ${RcloneRemoteName} remote is already mounted."
else
    echo "$(date "+%d.%m.%Y %T") INFO: Mount not running. Will now mount ${RcloneRemoteName} remote."
# Creating mountcheck file in case it doesn't already exist
    echo "$(date "+%d.%m.%Y %T") INFO: Recreating mountcheck file for ${RcloneRemoteName} remote."
    touch mountcheck
    rclone copy mountcheck $RcloneRemoteName: -vv --no-traverse
# Check bind option
    if [[  $CreateBindMount == 'Y' ]]; then
        echo "$(date "+%d.%m.%Y %T") INFO: *** Checking if IP address ${RCloneMountIP} already created for remote ${RcloneRemoteName}"
        ping -q -c2 $RCloneMountIP > /dev/null # -q quiet, -c number of pings to perform
        if [ $? -eq 0 ]; then # ping returns exit status 0 if successful
            echo "$(date "+%d.%m.%Y %T") INFO: *** IP address ${RCloneMountIP} already created for remote ${RcloneRemoteName}"
        else
            echo "$(date "+%d.%m.%Y %T") INFO: *** Creating IP address ${RCloneMountIP} for remote ${RcloneRemoteName}"
            ip addr add $RCloneMountIP/24 dev $NetworkAdapter label $NetworkAdapter:$VirtualIPNumber
        fi
        echo "$(date "+%d.%m.%Y %T") INFO: *** Created bind mount ${RCloneMountIP} for remote ${RcloneRemoteName}"
    else
        RCloneMountIP=""
        echo "$(date "+%d.%m.%Y %T") INFO: *** Creating mount for remote ${RcloneRemoteName}"
    fi
# create rclone mount
    rclone mount \
    $Command1 $Command2 $Command3 $Command4 $Command5 $Command6 $Command7 $Command8 \
    --allow-other \
    --umask 000 \
    --dir-cache-time $RcloneMountDirCacheTime \
    --attr-timeout $RcloneMountDirCacheTime \
    --log-level INFO \
    --poll-interval 10s \
    --cache-dir=$RcloneCacheShare/cache/$RcloneRemoteName \
    --drive-pacer-min-sleep 10ms \
    --drive-pacer-burst 1000 \
    --vfs-cache-mode full \
    --vfs-cache-max-size $RcloneCacheMaxSize \
    --vfs-cache-max-age $RcloneCacheMaxAge \
    --vfs-read-ahead 1G \
    --bind=$RCloneMountIP \
    $RcloneRemoteName: $RcloneMountLocation &

# Check if Mount Successful
    echo "$(date "+%d.%m.%Y %T") INFO: sleeping for 5 seconds"
# slight pause to give mount time to finalise
    sleep 5
    echo "$(date "+%d.%m.%Y %T") INFO: continuing..."
    if [[ -f "$RcloneMountLocation/mountcheck" ]]; then
        echo "$(date "+%d.%m.%Y %T") INFO: Successful mount of ${RcloneRemoteName} mount."
    else
        echo "$(date "+%d.%m.%Y %T") CRITICAL: ${RcloneRemoteName} mount failed - please check for problems.  Stopping dockers"
        docker stop $DockerStart
        rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
        exit
    fi
fi

####### Start MergerFS Mount #######

if [[  $MergerfsMountShare == 'ignore' ]]; then
    echo "$(date "+%d.%m.%Y %T") INFO: Not creating mergerfs mount as requested."
else
    if [[ -f "$MergerFSMountLocation/mountcheck" ]]; then
        echo "$(date "+%d.%m.%Y %T") INFO: Check successful, ${RcloneRemoteName} mergerfs mount in place."
    else
# check if mergerfs already installed
        if [[ -f "/bin/mergerfs" ]]; then
            echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs already installed, proceeding to create mergerfs mount"
        else
# Build mergerfs binary
            echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs not installed - installing now."
            mkdir -p /mnt/user/appdata/other/rclone/mergerfs
            docker run -v /mnt/user/appdata/other/rclone/mergerfs:/build --rm trapexit/mergerfs-static-build
            mv /mnt/user/appdata/other/rclone/mergerfs/mergerfs /bin
# check if mergerfs install successful
            echo "$(date "+%d.%m.%Y %T") INFO: *sleeping for 5 seconds"
            sleep 5
            if [[ -f "/bin/mergerfs" ]]; then
                echo "$(date "+%d.%m.%Y %T") INFO: Mergerfs installed successfully, proceeding to create mergerfs mount."
            else
                echo "$(date "+%d.%m.%Y %T") ERROR: Mergerfs not installed successfully.  Please check for errors.  Exiting."
                rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
                exit
            fi
        fi
# Create mergerfs mount
        echo "$(date "+%d.%m.%Y %T") INFO: Creating ${RcloneRemoteName} mergerfs mount."
# Extra Mergerfs folders
        if [[  $LocalFilesShare2 != 'ignore' ]]; then
            echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare2} to ${RcloneRemoteName} mergerfs mount."
            LocalFilesShare2=":$LocalFilesShare2"
        else
            LocalFilesShare2=""
        fi
        if [[  $LocalFilesShare3 != 'ignore' ]]; then
            echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare3} to ${RcloneRemoteName} mergerfs mount."
            LocalFilesShare3=":$LocalFilesShare3"
        else
            LocalFilesShare3=""
        fi
        if [[  $LocalFilesShare4 != 'ignore' ]]; then
            echo "$(date "+%d.%m.%Y %T") INFO: Adding ${LocalFilesShare4} to ${RcloneRemoteName} mergerfs mount."
            LocalFilesShare4=":$LocalFilesShare4"
        else
            LocalFilesShare4=""
        fi
# make sure mergerfs mount point is empty
        mv $MergerFSMountLocation $LocalFilesLocation
        mkdir -p $MergerFSMountLocation
# mergerfs mount command
        mergerfs $LocalFilesLocation:$RcloneMountLocation$LocalFilesShare2$LocalFilesShare3$LocalFilesShare4 $MergerFSMountLocation -o rw,async_read=false,use_ino,allow_other,func.getattr=newest,category.action=all,category.create=ff,cache.files=partial,dropcacheonclose=true
# check if mergerfs mount successful
        echo "$(date "+%d.%m.%Y %T") INFO: Checking if ${RcloneRemoteName} mergerfs mount created."
        if [[ -f "$MergerFSMountLocation/mountcheck" ]]; then
            echo "$(date "+%d.%m.%Y %T") INFO: Check successful, ${RcloneRemoteName} mergerfs mount created."
        else
            echo "$(date "+%d.%m.%Y %T") CRITICAL: ${RcloneRemoteName} mergerfs mount failed.  Stopping dockers."
            docker stop $DockerStart
            rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
            exit
        fi
    fi
fi

####### Starting Dockers That Need Mergerfs Mount To Work Properly #######

# only start dockers once
if [[ -f "/mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/dockers_started" ]]; then
    echo "$(date "+%d.%m.%Y %T") INFO: dockers already started."
else
# Check CA Appdata plugin not backing up or restoring
    if [ -f "/tmp/ca.backup2/tempFiles/backupInProgress" ] || [ -f "/tmp/ca.backup2/tempFiles/restoreInProgress" ] ; then
        echo "$(date "+%d.%m.%Y %T") INFO: Appdata Backup plugin running - not starting dockers."
    else
        touch /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/dockers_started
        echo "$(date "+%d.%m.%Y %T") INFO: Starting dockers."
        docker start $DockerStart
    fi
fi

rm /mnt/user/appdata/other/rclone/remotes/$RcloneRemoteName/mount_running
echo "$(date "+%d.%m.%Y %T") INFO: Script complete"

exit

 

 

that's the script.

 

i'm using the standard directories the script make :)

Link to comment

ok.. this is odd..

 

when i do this : rclone mount --allow-other --buffer-size 256M --dir-cache-time 720h --drive-chunk-size 512M --fast-list --log-level INFO --vfs-read-chunk-size 128M --vfs-read-chunk-size-limit off --vfs-cache-mode writes gdrive_vfs: /mnt/user/mount_rclone/google_vfs &

 

then i can see it.

 

but the script does nothing for me.

 

then i can't use the script and all the features...bummer :)

Link to comment
3 hours ago, bubbadk said:

ok.. this is odd..

 

when i do this : rclone mount --allow-other --buffer-size 256M --dir-cache-time 720h --drive-chunk-size 512M --fast-list --log-level INFO --vfs-read-chunk-size 128M --vfs-read-chunk-size-limit off --vfs-cache-mode writes gdrive_vfs: /mnt/user/mount_rclone/google_vfs &

 

then i can see it.

 

but the script does nothing for me.

 

then i can't use the script and all the features...bummer :)

You're mounting /mnt/user/mount_rclone/  instead of /mnt/user/mount_mergerfs/ in that command so that's the reason why it does work. It's just mounting the Gdrive.

 

I think the problem lies in that you added --allow-non-empty in your mount script. That's not recommended and I see no reason why you would use it. Try removing that from the script, disable your dockers (from the settings menu, so they won't autostart at reboot). Then restart your server and run the mount script. See what it does, check the logging.

Link to comment
7 minutes ago, Kaizac said:

You're mounting /mnt/user/mount_rclone/  instead of /mnt/user/mount_mergerfs/ in that command so that's the reason why it does work. It's just mounting the Gdrive.

 

I think the problem lies in that you added --allow-non-empty in your mount script. That's not recommended and I see no reason why you would use it. Try removing that from the script, disable your dockers (from the settings menu, so they won't autostart at reboot). Then restart your server and run the mount script. See what it does, check the logging.

ok just to be clear. when i use the script from here. I can't see my gdrive. what does it do to be exact. does it make directories on my google drive. am i suppose to move my existing folders with movies and tv to another directory or ?!?!?

 

i'm a bit confused as what it does.

Link to comment
7 minutes ago, bubbadk said:

ok just to be clear. when i use the script from here. I can't see my gdrive. what does it do to be exact. does it make directories on my google drive. am i suppose to move my existing folders with movies and tv to another directory or ?!?!?

 

i'm a bit confused as what it does.

What do you mean with "script from here"? When you run the mount script it should show your Google drive files in /user/mount_rclone/gdrive_vfs/ and your google drive files and local files combined in /user/mount_mergerfs/gdrive_vfs/. Your mount_mergerfs and mount_rclone folders should be empty before the mount script runs. Only /user/local/ is allowed to have file before the mount script is started.

Link to comment
1 minute ago, Kaizac said:

What do you mean with "script from here"? When you run the mount script it should show your Google drive files in /user/mount_rclone/gdrive_vfs/ and your google drive files and local files combined in /user/mount_mergerfs/gdrive_vfs/. Your mount_mergerfs and mount_rclone folders should be empty before the mount script runs. Only /user/local/ is allowed to have file before the mount script is started.

 

ahh ok. well i'm running the script now. made sure all was deleted before running the script. crossing fingers.

 

i have run the script 20 times now. all with the same output. no mount.

Link to comment
5 minutes ago, bubbadk said:

 

ahh ok. well i'm running the script now. made sure all was deleted before running the script. crossing fingers.

 

i have run the script 20 times now. all with the same output. no mount.

Are you checking the logs?

 

And do you run the script through User Scripts as "run in background"?

Link to comment
1 minute ago, bubbadk said:

holy monkey...u are a god..

it worked.

 

when i download. where do i point to. and what directory do i point plex too :)

You have to create a path in your docker templates to /mnt/user/ as /user. So within the dockers you have to point to /user/mount_mergerfs/gdrive_vfs/XX for the folder you want to be in. But if you want to download to /user/downloads/ that's also fine, just make sure you start all paths from /user so the file system will see it as the same storage. Otherwise it will copy + paste then delete instead of just moving straight away.

 

For plex you use the media folders for example /user/mount_mergerfs/gdrive_vfs/Movies for your movies and /user/mount_mergerfs/gdrive_vfs/Shows for your TV-shows. Make sure you read up in the start post and the github about which settings you should disable in Plex to limit your api hits.

  • Thanks 1
Link to comment
2 minutes ago, Kaizac said:

You have to create a path in your docker templates to /mnt/user/ as /user. So within the dockers you have to point to /user/mount_mergerfs/gdrive_vfs/XX for the folder you want to be in. But if you want to download to /user/downloads/ that's also fine, just make sure you start all paths from /user so the file system will see it as the same storage. Otherwise it will copy + paste then delete instead of just moving straight away.

 

For plex you use the media folders for example /user/mount_mergerfs/gdrive_vfs/Movies for your movies and /user/mount_mergerfs/gdrive_vfs/Shows for your TV-shows. Make sure you read up in the start post and the github about which settings you should disable in Plex to limit your api hits.

 

ok the plex part. i have my files (movies etc..) on my google at (see picture)

 

should they be moved to another location

 

 

media.png

Link to comment
6 minutes ago, bubbadk said:

 

ok the plex part. i have my files (movies etc..) on my google at (see picture)

 

should they be moved to another location

 

 

media.png

 

No why would that be needed? You're just mounting all the folders you have on this Google Drive folder. This will also be available through the windows explorer for example. So if that is not a problem then you can just leave as is.

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.