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.

247 lines
9.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 <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"`