Контейнер для синхронизации локального каталога /data в каталог на Yandex Disk через rclone.
В репозитории также есть отдельный новый Python-only вариант загрузчика, который работает без rclone и загружает файлы через Yandex Disk REST API.
Dockerfile.rclone- основной и поддерживаемый вариант.Dockerfile.yandex-disk- контейнер с официальнымyandex-diskпока находится в разработке, использовать его не нужно.Dockerfile.python-uploader- отдельный Python-only uploader. Он не заменяет текущийrclone-сценарий и запускается через отдельный compose-файл.
Уже собранный образ публикуется в GitHub Container Registry:
ghcr.io/astrot1988/ydsk-sync:latestСейчас CI публикует Python uploader image. Также публикуются теги branch и sha-<commit>.
- контейнер делает начальный
rclone sync - затем
lsyncdотслеживает изменения в/data - при изменениях запускается
rclone syncв${RCLONE_REMOTE_NAME}:${YDSK_REMOTE_PATH} - дополнительно есть периодический fallback-sync каждые
PERIODIC_SYNC_SECONDS, чтобы изменения не терялись на окружениях без надёжного inotify
cp .env.example .env
docker compose up -d ydsk-rclone
docker compose logs -f ydsk-rcloneЕсли rclone remote ещё не настроен, контейнер может провести авторизацию через Telegram и Yandex Device Flow.
Нужны переменные:
YANDEX_CLIENT_IDYANDEX_CLIENT_SECRETTELEGRAM_BOT_TOKENTELEGRAM_ADMIN
Флоу:
- контейнер видит, что remote отсутствует
- отправляет запрос в Telegram
- ждёт
/auth - получает у Яндекса
device_code - присылает ссылку
https://oauth.yandex.com/deviceи код - пользователь вводит код в браузере
- контейнер сам получает токены и пишет
rclone.conf
RCLONE_REMOTE_NAME- имя remote, по умолчаниюydYDSK_REMOTE_PATH- целевой каталог на Yandex DiskLSYNCD_DELAY_SECONDS- debounce перед sync, по умолчанию5LSYNCD_LOG_LEVEL- уровень логированияlsyncdPERIODIC_SYNC_SECONDS- резервный периодический sync, по умолчанию300RCLONE_SYNC_FLAGS- дополнительные флаги дляrclone syncYANDEX_OAUTH_DEBUG-1, чтобы печатать debug OAuth в логи
docker build -f ./Dockerfile.rclone -t ydsk-rclone .Этот вариант запускается отдельно и не затрагивает текущий rclone-стек.
Что он делает:
- авторизуется через Telegram + Yandex Device Flow
- сравнивает локальное дерево
/dataс удалённым каталогом на Yandex Disk - загружает только новые или изменившиеся файлы напрямую в Yandex Disk API
- удаляет на Yandex Disk файлы, которых больше нет локально
- перед загрузкой переименовывает локальный файл в
*.file - после успешной загрузки переименовывает удалённый файл из
*.fileв финальное имя - после успешной загрузки возвращает локальному файлу исходное имя и оставляет его на диске
Быстрый старт:
cp .env.python-uploader.example .env.python-uploader
docker compose --env-file ./.env.python-uploader -f ./docker-compose.python-uploader.yml up --build -d
docker compose --env-file ./.env.python-uploader -f ./docker-compose.python-uploader.yml logs -f ydsk-python-uploaderДля нового сервиса используются отдельные каталоги:
./config-python./data-python
При коммите в master GitHub Actions собирает образ из Dockerfile.python-uploader и публикует его в GHCR.