Утилита для синхронизации директорий
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
ilyukhin 694ab9815a
Добавлена поддержка скачивания последней версии скрипта
11 months ago
LICENSE Initial commit 11 months ago
README.md Добавлена возможность устанавливать различные пути для нод 11 months ago
dsync Добавлена поддержка скачивания последней версии скрипта 11 months ago
install_dsync.sh Добавлена поддержка скачивания последней версии скрипта 11 months ago

README.md

dsync - Утилита для синхронизации директорий

dsync - это инструмент командной строки для синхронизации локальных проектов с удаленными серверами через SSH и rsync. Позволяет легко управлять синхронизацией нескольких проектов с различными наборами серверов.

Структура проекта

/workspace/project1/
├── train.py
├── .dsyncconfig
└── .dsyncignore

/workspace/project2/
├── train2.py
├── .dsyncconfig
└── .dsyncignore

Основные возможности

  • 🚀 Быстрая синхронизация - использует rsync для эффективной передачи файлов
  • 📊 Проверка статуса - показывает изменения перед синхронизацией
  • 🔧 Гибкая настройка - каждый проект имеет свою конфигурацию
  • 🚫 Игнорирование файлов - поддержка .dsyncignore для исключения файлов
  • 🌐 Множественные узлы - синхронизация с несколькими серверами одновременно
  • 🗂️ Пер-нодовые пути — remote_dir на каждую ноду
  • 🎨 Цветной вывод - понятная визуализация результатов
  • Параллельная обработка - проверка статуса всех узлов одновременно

Установка

Пользовательская установка (в ~/.local/bin)

curl -fsSL "https://git.ai.infran.ru/ilyukhin/dsync/raw/branch/main/install_dsync.sh" | bash

Системная установка (в /usr/local/bin) — передаём флаг --system

curl -fsSL "https://git.ai.infran.ru/ilyukhin/dsync/raw/branch/main/install_dsync.sh" | bash -s -- --system

Использование

Инициализация проекта

cd /workspace/project1
dsync init

Создает файлы:

  • .dsyncconfig - конфигурация проекта
  • .dsyncignore - паттерны для игнорирования файлов

Управление узлами

# Добавить узлы для синхронизации
dsync add-node user@server1.com user@server2.com:/workspace/data user@server3.net:~/configs

# Удалить узел
dsync del-node user@server1.com

# Показать все узлы
dsync list-nodes

Синхронизация

# Проверить статус
dsync status

# Выполнить синхронизацию
dsync sync

Конфигурационные файлы

.dsyncconfig

{
  "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

# 1. Инициализация нового проекта
cd /workspace/ml-project
dsync init

# 2. Добавление серверов для обучения
dsync add-node gpu-server1.com gpu-server2.com

# 3. Проверка что будет синхронизировано
dsync status

# 4. Синхронизация
dsync sync

Форматы указания нод

Можно указывать ноды несколькими способами:

# 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

Управление нодами

# Добавить ноды
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

Syncing to user@server1:/srv/projects/p1...
[OK] Successfully synced to user@server1 (/srv/projects/p1)

Syncing to user@server3:/workspace/project1...
[OK] Successfully synced to user@server3 (/workspace/project1)

Sync completed: 2/2 nodes successful

Команды

Команда Описание
dsync init Инициализировать dsync в текущей директории
dsync add-node <node1> [node2 ...] Добавить ноды. Форматы: user@host, user@host:/dir, либо add-node user@host /dir
dsync del-node <node1> [node2 ...] Удалить одну или несколько нод
dsync set-node-dir <node> <remote_dir> Установить/изменить удалённый путь для ноды
dsync clear-node-dir <node> Сбросить путь ноды (будет использоваться master_dir)
dsync list-nodes Показать ноды с фактическими путями
dsync status Показать ожидаемые изменения по всем нодам
dsync sync Выполнить синхронизацию на все ноды
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"