Руководство по миграции
Перенесите существующий проект — файлы, Docker-сервисы, базы данных — с традиционного сервера или локальной среды разработки в зашифрованный репозиторий Rediacc.
Предварительные требования
- Установленный CLI
rdc(Установка) - Добавленная и подготовленная машина (Настройка)
- Достаточно дискового пространства на сервере для вашего проекта (проверьте с помощью
rdc machine status)
Шаг 1: Создание репозитория
Создайте зашифрованный репозиторий достаточного размера для вашего проекта. Выделите дополнительное пространство для Docker-образов и данных контейнеров.
rdc repo create my-project -m server-1 --size 20G
Совет: Вы можете изменить размер позже с помощью
rdc repo resize, но репозиторий сначала необходимо отмонтировать. Проще начать с достаточного объёма.
Шаг 2: Загрузка файлов
Используйте rdc sync upload для передачи файлов проекта в репозиторий.
# Предварительный просмотр того, что будет передано (без изменений)
rdc sync upload -m server-1 -r my-project --local ./my-project --dry-run
# Загрузка файлов
rdc sync upload -m server-1 -r my-project --local ./my-project
Перед загрузкой репозиторий должен быть смонтирован. Если он ещё не смонтирован:
rdc repo mount my-project -m server-1
Для последующих синхронизаций, когда удалённая копия должна точно соответствовать локальному каталогу:
rdc sync upload -m server-1 -r my-project --local ./my-project --mirror
Флаг
--mirrorудаляет файлы на удалённом сервере, которые не существуют локально. Сначала используйте--dry-runдля проверки.
Шаг 3: Исправление владения файлами
Загруженные файлы приходят с UID вашего локального пользователя (например, 1000). Rediacc использует универсального пользователя (UID 7111), чтобы VS Code, терминальные сессии и инструменты имели единообразный доступ. Выполните команду изменения владельца:
rdc repo ownership my-project -m server-1
Исключения с учётом Docker
Если Docker-контейнеры запущены (или были запущены), команда владения автоматически обнаруживает их записываемые каталоги данных и пропускает их. Это предотвращает повреждение контейнеров, которые управляют своими файлами с другими UID (например, MariaDB использует UID 999, Nextcloud — UID 33).
Команда выводит отчёт:
Excluding Docker volume: database/data
Excluding Docker volume: redis/data
Ownership set to UID 7111 (245 changed, 4 skipped, 0 errors)
Когда запускать
- После загрузки файлов — для преобразования вашего локального UID в 7111
- После запуска контейнеров — если вы хотите, чтобы каталоги Docker-томов были автоматически исключены. Если контейнеры ещё не были запущены, томов для исключения нет, и все каталоги будут изменены (это нормально — контейнеры пересоздадут свои данные при первом запуске)
Принудительный режим
Чтобы пропустить обнаружение Docker-томов и изменить владельца всего, включая каталоги данных контейнеров:
rdc repo ownership my-project -m server-1 --force
Предупреждение: Это может повредить работающие контейнеры. Сначала остановите их с помощью
rdc repo down, если необходимо.
Пользовательский UID
Чтобы установить UID, отличный от стандартного 7111:
rdc repo ownership my-project -m server-1 --uid 1000
Шаг 4: Настройка Rediaccfile
Создайте Rediaccfile в корне вашего проекта. Этот Bash-скрипт определяет, как ваши сервисы подготавливаются, запускаются и останавливаются.
#!/bin/bash
prep() {
docker compose pull
}
up() {
docker compose up -d
}
down() {
docker compose down
}
Три функции жизненного цикла:
| Функция | Назначение | Поведение при ошибке |
|---|---|---|
prep() | Загрузка образов, выполнение миграций, установка зависимостей | Немедленный сбой: любая ошибка останавливает всё |
up() | Запуск сервисов | Ошибка в корне критична; ошибки в подкаталогах логируются и продолжаются |
down() | Остановка сервисов | Максимальное усилие: всегда пытается выполнить всё |
Важно: Используйте
dockerнапрямую в вашем Rediaccfile — никогдаsudo docker. Командаsudoсбрасывает переменные окружения, из-за чего теряетсяDOCKER_HOSTи контейнеры создаются в системном Docker-демоне, а не в изолированном демоне репозитория. Функции Rediaccfile уже выполняются с достаточными привилегиями. Подробнее см. Сервисы.
Подробнее о Rediaccfile, многосервисных конфигурациях и порядке выполнения см. Сервисы.
Шаг 5: Настройка сети сервисов
Rediacc запускает изолированный Docker-демон для каждого репозитория. Сервисы используют network_mode: host и привязываются к уникальным loopback-IP, чтобы использовать стандартные порты без конфликтов между репозиториями.
Адаптация docker-compose.yml
До (традиционный подход):
services:
postgres:
image: postgres:16
ports:
- "5432:5432"
volumes:
- ./data/postgres:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
redis:
image: redis:7-alpine
ports:
- "6379:6379"
app:
image: my-app:latest
ports:
- "8080:8080"
environment:
DATABASE_URL: postgresql://postgres:secret@postgres:5432/mydb
REDIS_URL: redis://redis:6379
После (Rediacc):
services:
postgres:
image: postgres:16
network_mode: host
restart: unless-stopped
volumes:
- ./data/postgres:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
command: -c listen_addresses=${POSTGRES_IP} -c port=5432
redis:
image: redis:7-alpine
network_mode: host
restart: unless-stopped
command: redis-server --bind ${REDIS_IP} --port 6379
app:
image: my-app:latest
network_mode: host
restart: unless-stopped
environment:
DATABASE_URL: postgresql://postgres:secret@${POSTGRES_IP}:5432/mydb
REDIS_URL: redis://${REDIS_IP}:6379
LISTEN_ADDR: ${APP_IP}:8080
Основные изменения:
- Добавить
network_mode: hostк каждому сервису - Удалить маппинги
ports:(не нужны при host-сети) - Привязать сервисы к переменным окружения
${SERVICE_IP}(автоматически внедряются Rediacc) - Ссылаться на другие сервисы по их IP вместо Docker DNS-имён (например,
${POSTGRES_IP}вместоpostgres)
Переменные {SERVICE}_IP автоматически генерируются из имён сервисов вашего compose-файла. Соглашение об именовании: верхний регистр, дефисы заменяются подчёркиваниями, суффикс _IP. Например, listmonk-app становится LISTMONK_APP_IP.
Подробнее о назначении IP и .rediacc.json см. Сетевое взаимодействие сервисов.
Шаг 6: Запуск сервисов
Смонтируйте репозиторий (если ещё не смонтирован) и запустите все сервисы:
rdc repo up my-project -m server-1 --mount
Это выполнит:
- Монтирование зашифрованного репозитория
- Запуск изолированного Docker-демона
- Автоматическую генерацию
.rediacc.jsonс назначением IP сервисов - Выполнение
prep()из всех Rediaccfile - Выполнение
up()из всех Rediaccfile
Убедитесь, что ваши контейнеры запущены:
rdc machine containers server-1
Шаг 7: Включение автозапуска (необязательно)
По умолчанию репозитории необходимо монтировать и запускать вручную после перезагрузки сервера. Включите автозапуск, чтобы ваши сервисы запускались автоматически:
rdc repo autostart enable my-project -m server-1
Вам будет предложено ввести парольную фразу репозитория.
Примечание о безопасности: Автозапуск сохраняет ключевой файл LUKS на сервере. Любой пользователь с root-доступом может смонтировать репозиторий без парольной фразы. Подробнее см. Автозапуск.
Типичные сценарии миграции
WordPress / PHP с базой данных
my-wordpress/
├── Rediaccfile
├── docker-compose.yml
├── app/ # Файлы WordPress (UID 33 при работе)
├── database/data/ # Данные MariaDB (UID 999 при работе)
└── wp-content/uploads/ # Загрузки пользователей
- Загрузите файлы проекта
- Сначала запустите сервисы (
rdc repo up), чтобы контейнеры создали свои каталоги данных - Выполните исправление владения — каталоги данных MariaDB и приложения автоматически исключаются
Node.js / Python с Redis
my-api/
├── Rediaccfile
├── docker-compose.yml
├── src/ # Исходный код приложения
├── node_modules/ # Зависимости
└── redis-data/ # Персистентность Redis (UID 999 при работе)
- Загрузите проект (рассмотрите исключение
node_modulesи получение их вprep()) - Выполните исправление владения после запуска контейнеров
Пользовательский Docker-проект
Для любого проекта с Docker-сервисами:
- Загрузить файлы проекта
- Адаптировать
docker-compose.yml(см. Шаг 5) - Создать
Rediaccfileс функциями жизненного цикла - Выполнить исправление владения
- Запустить сервисы
Устранение неполадок
Отказ в доступе после загрузки
Файлы всё ещё имеют ваш локальный UID. Выполните команду изменения владельца:
rdc repo ownership my-project -m server-1
Контейнер не запускается
Убедитесь, что сервисы привязаны к назначенному IP, а не к 0.0.0.0 или localhost:
# Проверить назначенные IP
rdc term server-1 my-project -c "cat .rediacc.json"
# Проверить логи контейнера
rdc term server-1 my-project -c "docker logs <container-name>"
Конфликт портов между репозиториями
Каждый репозиторий получает уникальные loopback-IP. Если вы видите конфликты портов, убедитесь, что ваш docker-compose.yml использует ${SERVICE_IP} для привязки вместо 0.0.0.0. Сервисы, привязанные к 0.0.0.0, слушают на всех интерфейсах и будут конфликтовать с другими репозиториями.
Исправление владения повредило контейнеры
Если вы выполнили rdc repo ownership --force и контейнер перестал работать, файлы данных контейнера были изменены. Остановите контейнер, удалите его каталог данных и перезапустите — контейнер пересоздаст его:
rdc repo down my-project -m server-1
# Удалить каталог данных контейнера (например, database/data)
rdc repo up my-project -m server-1