init: docker-migrate universal migration tool
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
# docker-migrate
|
||||
|
||||
Универсальный интерактивный инструмент миграции Docker-сервисов между Ubuntu-серверами.
|
||||
|
||||
## Что делает
|
||||
|
||||
Этот скрипт переносит **не только Docker-контейнер**, а **всё окружение сервиса**:
|
||||
|
||||
- Docker Compose, .env, volumes, bind mounts
|
||||
- Nginx конфиги, SSL-сертификаты
|
||||
- Systemd unit-файлы
|
||||
- Cron-задания
|
||||
- **Sidecar-процессы** (WARP, wireproxy, SOCKS-прокси, и т.д.) — найденные через loopback-соединения
|
||||
- Сетевую конфигурацию (iptables, routes, sysctl)
|
||||
|
||||
## Быстрый старт (одна команда из Gitea)
|
||||
|
||||
```bash
|
||||
wget -qO- https://giteas.stitch505.su/Stitch505/docker-migrate/raw/main/install.sh | bash
|
||||
```
|
||||
|
||||
Или через curl:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://giteas.stitch505.su/Stitch505/docker-migrate/raw/main/install.sh | bash
|
||||
```
|
||||
|
||||
`install.sh` сам:
|
||||
1. Проверит Python3 (при необходимости — `apt-get install -y python3`)
|
||||
2. Скачает репозиторий (git clone / curl zip / wget zip) в `/opt/docker-migrate`
|
||||
3. Поставит symlink `/usr/local/bin/docker-migrate`
|
||||
4. Сразу запустит `migrate`
|
||||
|
||||
Repository: https://giteas.stitch505.su/Stitch505/docker-migrate
|
||||
|
||||
## Как пользоваться
|
||||
|
||||
На старом сервере (source):
|
||||
|
||||
```bash
|
||||
docker-migrate
|
||||
# или: python3 /opt/docker-migrate/migrate
|
||||
# Выбираем: 1 — Подготовка к переносу (Source)
|
||||
```
|
||||
|
||||
Скрипт:
|
||||
1. Запрашивает имя Docker-сервиса/контейнера
|
||||
2. Автоматически найдет всё окружение
|
||||
3. Покажет манифест (что будет перенесено)
|
||||
4. Попросит подтверждения
|
||||
5. Соберёт tar.gz архив
|
||||
6. Предложит остановить сервис
|
||||
7. Предложит передать на новый сервер
|
||||
|
||||
На новом сервере (target):
|
||||
|
||||
```bash
|
||||
docker-migrate --mode=target --remote-dir=/tmp/docker-migrate-incoming
|
||||
```
|
||||
|
||||
Или интерактивно:
|
||||
|
||||
```bash
|
||||
docker-migrate
|
||||
# Выбираем: 2 — Восстановление (Target)
|
||||
```
|
||||
|
||||
Скрипт:
|
||||
1. Проверит Ubuntu и права
|
||||
2. Установит Docker, Compose, nginx (если нужно)
|
||||
3. Сделает backup существующего
|
||||
4. Восстановит файлы
|
||||
5. Запустит сервис и проверит логи
|
||||
|
||||
## Resume (если ошибка)
|
||||
|
||||
```bash
|
||||
python3 migrate --resume
|
||||
```
|
||||
|
||||
Или:
|
||||
|
||||
```bash
|
||||
python3 migrate
|
||||
# Выбираем: 3 — Продолжить (Resume)
|
||||
```
|
||||
|
||||
## Статус и логи
|
||||
|
||||
```bash
|
||||
python3 migrate --status
|
||||
python3 migrate --logs
|
||||
```
|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
docker-migrate/
|
||||
├── migrate # bootstrap (python3)
|
||||
├── migrate.sh # bash wrapper (опционально)
|
||||
├── core/
|
||||
│ ├── main.py # точка входа, меню, CLI
|
||||
│ ├── fsm.py # state machine (resume)
|
||||
│ ├── state.py # JSON state.json
|
||||
│ ├── color.py # цветной вывод и UI
|
||||
│ └── runner.py # shell exec с логами
|
||||
├── discover/
|
||||
│ ├── docker.py # docker inspect, compose, mounts
|
||||
│ ├── nginx.py # nginx -T parser
|
||||
│ └── network.py # loopback, sidecar, routes, iptables
|
||||
├── manifest/
|
||||
│ └── manifest.py # build/review JSON manifest
|
||||
├── source/
|
||||
│ └── source.py # source-режим (pack, stop, transfer)
|
||||
├── transfer/
|
||||
│ └── transfer.py # scp/rsync adaptive transfer
|
||||
└── target/
|
||||
└── target.py # target-режим (install, restore, verify)
|
||||
```
|
||||
|
||||
## Зависимости
|
||||
|
||||
- `python3 >= 3.8`
|
||||
- `docker` (на source)
|
||||
- `ssh` / `scp` / `rsync` (для transfer)
|
||||
- `sudo` или root (для target)
|
||||
|
||||
## Принципы
|
||||
|
||||
- **Модульность**, не монолит
|
||||
- **Универсальность**, не заточен под один сервис
|
||||
- **Автопоиск** вместо ручного выбора
|
||||
- **Полный манифест** вместо тупого копирования
|
||||
- **Resume** вместо "начни сначала"
|
||||
|
||||
Reference in New Issue
Block a user