# dsync - Утилита для синхронизации директорий **dsync** - это инструмент командной строки для синхронизации локальных проектов с удаленными серверами через SSH и rsync. Позволяет легко управлять синхронизацией нескольких проектов с различными наборами серверов. ## Структура проекта ``` /workspace/project1/ ├── train.py ├── .dsyncconfig └── .dsyncignore /workspace/project2/ ├── train2.py ├── .dsyncconfig └── .dsyncignore ``` ## Основные возможности - 🚀 **Быстрая синхронизация** - использует rsync для эффективной передачи файлов - 📊 **Проверка статуса** - показывает изменения перед синхронизацией - 🔧 **Гибкая настройка** - каждый проект имеет свою конфигурацию - 🚫 **Игнорирование файлов** - поддержка .dsyncignore для исключения файлов - 🌐 **Множественные узлы** - синхронизация с несколькими серверами одновременно - 🗂️ Пер-нодовые пути — remote_dir на каждую ноду - 🎨 **Цветной вывод** - понятная визуализация результатов - ⚡ **Параллельная обработка** - проверка статуса всех узлов одновременно ## Установка Пользовательская установка (в ~/.local/bin) ```bash curl -fsSL "https://git.ai.infran.ru/ilyukhin/dsync/raw/branch/main/install_dsync.sh" | bash ``` Системная установка (в /usr/local/bin) — передаём флаг --system ```bash curl -fsSL "https://git.ai.infran.ru/ilyukhin/dsync/raw/branch/main/install_dsync.sh" | bash -s -- --system ``` ## Использование ### Инициализация проекта ```bash cd /workspace/project1 dsync init ``` Создает файлы: - `.dsyncconfig` - конфигурация проекта - `.dsyncignore` - паттерны для игнорирования файлов ### Управление узлами ```bash # Добавить узлы для синхронизации dsync add-node user@server1.com user@server2.com:/workspace/data user@server3.net:~/configs # Удалить узел dsync del-node user@server1.com # Показать все узлы dsync list-nodes ``` ### Синхронизация ```bash # Проверить статус dsync status # Выполнить синхронизацию dsync sync ``` ## Конфигурационные файлы ### `.dsyncconfig` ```json { "master_dir": "/workspace/project1", "nodes": [ { "name": "user@server1", "remote_dir": "/srv/projects/p1" }, { "name": "user@server3", "remote_dir": null } ], "ignore_file": ".dsyncignore" } ``` ### `.dsyncignore` ``` # Системные файлы .git/ .gitignore .dsyncconfig .dsyncignore # Python __pycache__/ *.pyc *.pyo .venv/ venv/ # IDE .vscode/ .idea/ # Логи *.log # Node.js node_modules/ .npm ``` ## Примеры использования ### Базовый workflow ```bash # 1. Инициализация нового проекта cd /workspace/ml-project dsync init # 2. Добавление серверов для обучения dsync add-node gpu-server1.com gpu-server2.com # 3. Проверка что будет синхронизировано dsync status # 4. Синхронизация dsync sync ``` ### Форматы указания нод Можно указывать ноды несколькими способами: ```bash # 1) Без пути — возьмётся master_dir из .dsyncconfig dsync add-node user@server1 # 2) С путём в одном токене dsync add-node user@server1:/remote/project1 # 3) Альтернативная форма для одной ноды — двумя аргументами dsync add-node user@server2 /another/dir # 4) Смешанно и сразу несколько dsync add-node user@h1 user@h2:/work/a user@h3 /work/b ``` ### Управление нодами ```bash # Добавить ноды dsync add-node user@server1 user@server2:/srv/ml/project # Изменить путь у существующей ноды dsync set-node-dir user@server1 /srv/projects/p1 # Сбросить путь (использовать master_dir) dsync clear-node-dir user@server1 # Удалить ноду dsync del-node user@server2 # Показать все ноды с их фактическими путями dsync list-nodes ``` ### Вывод команды list-nodes ``` Configured nodes: 1. user@server1 -> /srv/projects/p1 2. user@server3 -> /workspace/project1 # взят master_dir ``` ### Вывод команды status ``` Checking status for 2 node(s)... -------------------------------------------------- [OK] user@server1 (/srv/projects/p1): Up to date [!] user@server3 (/workspace/project1): 3 change(s) pending NEW FILE: train.py SEND FILE: config.json (content, timestamp) DELETE: old_model.pkl -------------------------------------------------- Summary: 2 active, 0 error(s), 3 total changes Run 'dsync sync' to apply changes ``` ### Вывод команды sync ``` [Sync] user@server1 [############################] 100% [OK] Successfully synced to user@server1 (/srv/projects/p1) [Sync] user@server3 [############################] 100% [OK] Successfully synced to user@server3 (/workspace/project1) Sync completed: 2/2 nodes successful ``` ## Команды | Команда | Описание | | ---------------------------------------- | ------------------------------------------------------------------------------------- | | `dsync init` | Инициализировать dsync в текущей директории | | `dsync add-node [node2 ...]` | Добавить ноды. Форматы: `user@host`, `user@host:/dir`, либо `add-node user@host /dir` | | `dsync del-node [node2 ...]` | Удалить одну или несколько нод | | `dsync set-node-dir ` | Установить/изменить удалённый путь для ноды | | `dsync clear-node-dir ` | Сбросить путь ноды (будет использоваться `master_dir`) | | `dsync list-nodes` | Показать ноды с фактическими путями | | `dsync status` | Показать ожидаемые изменения по всем нодам | | `dsync sync [-r или --reverse]` | Выполнить синхронизацию на все ноды (флаг -r сначала делает pull недостающих файлов со всех нод, а после выполняет синхронизацию) | | `dsync help` | Показать справку | | `dsync version` | Показать версию | ## Особенности - **Удаление файлов**: Использует `rsync --delete` для удаления файлов на удаленных серверах - **Тайм-ауты**: Автоматические тайм-ауты для избежания зависания - **Параллельность**: Проверка статуса всех узлов происходит параллельно - **Безопасность**: SSH-соединения с отключенной проверкой host key - **Цветной вывод**: Зеленый для успеха, желтый для предупреждений, красный для ошибок ## Требования - Python 3.6+ - rsync - SSH-доступ к удаленным серверам ## Примечания - Каждый проект должен иметь свою конфигурацию - SSH-ключи должны быть настроены для работы без пароля - Изменения в `.dsyncignore` влияют на последующие синхронизации - Пути с пробелами и ~ экранируйте кавычками: `dsync set-node-dir user@host "/srv/projects with space/p1"`