Двусторонняя синхронизация локальной папки с Google Drive в Ubuntu Linux

Редкий пост в этом блоге для линуксоидов. Надеюсь, что все описанное ниже скоро станет не актуальным. Дело в том, что для Linux до сих пор нет официального клиента Google Drive. Есть Linux клиенты для Dropbox, для Pcloud, а для Google Drive клиента нет. Есть, правда, google-drive-ocamlfuse, но это решение в виде подключенного сетевого диска, это не то.

Итак, вот что хотят многие пользователи. Есть ноутбук, есть компьютер на работе и нужно чтобы содержимое специальной папки на ноутбуке синхронизировалось с содержимом папки на рабочем компьютере. При чем, хорошо иметь ту же самую папку еще и в облаке, чтобы можно было зайти в нее с еще какого нибудь устройства (с телефона, например). Если я меняю файл в папке на рабочем компе, то автоматически меняется файл в облаке. А когда я приеду домой и открою ноутбук, то и в нем появится новая версия файла, подгруженная из облака. Я могу дома поработать над файлом, изменения немедленно загрузятся в облако. И на следующий день, когда я на работе включу компьютер, то на его локальный диск с облака подгрузится измененный дома файл. Это называется двусторонняя синхронизация (two way sync).

Для синхронизации с участием облака (того же Google Drive) в Linux есть программа rclone (запускается из терминала). Но дело в том, что rclone позволяет делать только одностороннюю синхронизацию. То есть, rclone позволяет сделать простую вещь: сделать так, чтобы содержимое папки 1 (локальной или на облаке) было таким же, как содержимое папки 2 (на облаке или локальной). Это отлично подходит для организации backup, однако такого функционала недостаточно для организации двусторонней синхронизации, которая нам нужна. Однако, добрые люди написали скрипт на Python (проект rclonesync), который является “надстройкой” над rclone и позволяет сделать полноценную two way синхронизацию в Linux.

Инструкция.

Пусть у вас есть аккаунт в Google и вы пользуетесь Google Drive. Для удобства сделайте в корне Google Drive папку которая и будет синхронизироваться. Пусть ее название будет “linuxfolder”.

Заходим на сайт https://rclone.org/ и скачиваем программу rclone. Для большинства современных компьютеров с Ubuntu/LinuxMint можно качать AMD64-64Bit deb-пакет. Устанавливаем программу.

Открываем терминал и начинаем настраивать rclone. Вводим команду:
rclone config

В ответ вы увидите нечто вроде:

No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q>

Вводим n и нажимаем Enter, выбирая тем самым “New remote”.

Программа просит ввести имя облачного диска, то есть то, как мы будем называть наш Google Drive:

name>

Вводим, например, gdrive (или что-то на ваш выбор, далее, я буду использовать имя gdrive) и нажимаем Enter.

После этого появится огромный список облачных хранилищ, которые поддерживает rclone. Начинается он так:

Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / 1Fichier
\ "fichier"
2 / Alias for an existing remote
\ "alias"
3 / Amazon Drive
\ "amazon cloud drive"
4 / Amazon S3 Compliant Storage Provider (AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, etc)
\ "s3"

и т.д.

Нас интересует пункт:
13 / Google Drive
\ "drive"

Поэтому вводим число 13 и нажимаем Enter. (Может быть в следующих версиях программы номер будет другой, следите за этим внимательно!).

Далее вас попросят ввести client_id и client_secret – ничего не вводите, нажимайте Enter.

Затем появятся следующие опции:


Scope that rclone should use when requesting access from drive.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Full access all files, excluding Application Data Folder.
\ "drive"
2 / Read-only access to file metadata and file contents.
\ "drive.readonly"
/ Access to files created by rclone only.
3 | These are visible in the drive website.
| File authorization is revoked when the user deauthorizes the app.
\ "drive.file"
/ Allows read and write access to the Application Data folder.
4 | This is not visible in the drive website.
\ "drive.appfolder"
/ Allows read-only access to file metadata but
5 | does not allow any access to read or download file content.
\ "drive.metadata.readonly"

Вводите 1 и нажимайте Enter.

Далее, вас спросят root_folder_id> и service_account_file> – нажимаете Enter оба раза, ничего не вводя.

Затем: Edit advanced config? – выбираете n.

Remote config
Use auto config? – выбираете y.

После этого у вас должен открыться браузер со страницей авторизации Google. Авторизуйтесь, если нужно, и потом вас спросят:

Приложение “rclone” запрашивает разрешение на доступ к вашему аккаунту Google.

Нажмите “Разрешить”.

После этого в браузере вы должны увидеть:

Success!
All done. Please go back to rclone.

Возвращаемся к терминалу, там будет адрес страницы, которую нужно ввести вручную, если на предыдущем этапе браузер сам не открылся и еще один вопрос:

If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=yDbMo1beUVS3wUTxNww6AQ
Log in and authorize rclone for access
Waiting for code...
Got code
Configure this as a team drive?
y) Yes
n) No (default)
y/n>

На вопрос отвечаем n.
После этого программа покажет результат, который нужно утвердить. Выглядит это примерно так:

[gdrive]
type = drive
scope = drive
token = {"access_token":"ihwueh73723yfg72h.................................."}
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>

Вводим ответ y и нажимаем Enter. После чего программа покажет, что у нее появился в настройках ваш Google Drive:

Current remotes:

Name Type
==== ====
gdrive drive

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

Нажимаем q и Enter, выходим из программы rclone.

Представим, что пользователя Linux зовут John и его домашняя директория это /home/John/.

Сделайте в домашней директории папку scripts (/home/John/scripts/)

Сделайте в домашней директории папку .rclonesyncwd (/home/John/.rclonesyncwd/) (название папки с точкой в начале!).

Допустим, локальная папка, которую мы хотим синхронизировать, тоже находится в домашней директории и она называется GOOGLE-DRIVE ( /home/John/GOOGLE-DRIVE/ ).

Зайдите на сайт: https://github.com/cjnaz/rclonesync-V2.

Скачайте оттуда в папку /home/John/scripts/ файл rclonesync.py.

Зайдите в терминал и попробуйте ввести команду:

python3.6 ~/scripts/rclonesync.py -h

Если возникла ошибка, то значит вместо python3.6, нужно попробовать вводить python3.7, или на худой конец python – то есть, интерпретатор Python. Допустим, у вас работает python3.6. По команде выше, если у вас работает Python, будет просто выведено много текста помощи по настройкам скрипта.

Для первого запуска синхронизации нужно в терминале набрать команду:

python3.6 ~/scripts/rclonesync.py --first-sync /home/John/GOOGLE-DRIVE/ gdrive:linuxfolder

Если не будет ошибок, то в локальную папку GOOGLE-DRIVE должно скопироваться содержимое папки linuxfolder на Google диске. Это может занять время.

Далее запускать синхронизацию нужно командой:

python3.6 ~/scripts/rclonesync.py /home/John/GOOGLE-DRIVE/ gdrive:linuxfolder

(тут уже нет ключа –first-sync).

Вручную каждый раз вводить команду для синхронизации неудобно, поэтому можно настроить автоматический запуск синхронизации каждую минуту. Для этого нужно создать задание для cron. Вводим в терминале команду:

crontab -e

Если вы делаете это впервые, то вас могут спросить про предпочитаемый редактор:

Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest 2. /usr/bin/vim.tiny 3. /bin/ed Choose 1-3 [1]:

Выбирайте 1 и попадаете в текстовый редактор. И в нем в отдельной последней строке введите:

* * * * * python3.6 ~/scripts/rclonesync.py /home/John/GOOGLE-DRIVE/ gdrive:linuxfolder

После этого введите пару раз Enter, добавляя в конец файла пустые строки. Это важно, за вашей строкой должна быть пустая, иначе работать не будет.

Сохраните файл и выйдите. Если вы работаете в nano (выбрали пункт 1 выше), то сохранить файл: Ctrl+O и затем Enter. А выход: Ctrl + X.

Если вы новичок в Linux и у вас получилось все это настроить, то вы - молодец!

О работе синхронизации:

В этой двусторонней синхронизации есть неприятный баг с пустыми папками. Если вы создали пустую папку, то она не будет синхронизироваться, пока вы не поместите в нее файл. Если в пустую папку поместить еще одну пустую папку, то эта матрешка из пустых папок все равно синхронизироваться не будет. Но если во внутреннюю пустую папку поместить файл, то вся матрешка засинхронизируется.

Переименование папок: например, была не пустая папка А, вы ее переименовали в папку Б. При синхронизации у вас может остаться пустая папка А и появится папка Б с содержимым, которое было ранее в папке А.

PS. Я смотрел в сторону проекта Unison, но он очень давно не обновлялся, поэтому я не стал с ним связываться и не знаю, насколько он хорош.

Поделиться:      twitter       facebook