Утилита для синхронизации директорий
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 73d59f10ed
Изменил(а) на 'README.md'
1 month ago
LICENSE Initial commit 2 months ago
README.md Изменил(а) на 'README.md' 1 month ago
dsync Добавлен прогресс бар при синхронизации 1 month ago
install_dsync.sh Добавлена поддержка скачивания последней версии скрипта 2 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

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