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.
|
|
1 month ago | |
|---|---|---|
| LICENSE | 2 months ago | |
| 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"