# Миграция с `remnawave-tg-shop` на `remnawave-minishop` > Примечание для новой Docker-архитектуры: основной production stack теперь состоит из > `frontend`, `backend`, `worker`, `migrate`, `postgres` и `redis`. После переноса данных > запускайте корневой `docker-compose.yml`; миграции применит one-shot сервис `migrate`, а логи > приложения смотрите через `docker compose logs -f backend worker frontend`. Начиная с этой версии контейнеры и тома названы `remnawave-minishop*` вместо `remnawave-tg-shop*`. Старый и новый стеки используют **разные имена томов**, поэтому простой `docker compose up -d` после `git pull` создаст пустую БД. Эта инструкция описывает, как перенести данные. Есть два пути: - [Автоматический](#автоматический-способ-через-скрипт) — один скрипт, идемпотентный, проверяет состояние на каждом шаге. - [Ручной](#ручной-способ) — команды, которые делает скрипт, если хочется понимать происходящее или выполнить выборочно. В обоих случаях: - старые тома **не удаляются** автоматически — это безопасный бэкап на случай отката; - сертификаты Caddy (если используется `deploy/compose/docker-compose-caddy.yml`) тоже переносятся, чтобы Let's Encrypt не выписывал их заново и не упереться в rate limit. ## Автоматический способ (через скрипт) Если helper ещё не лежит у вас локально, запускайте его прямо из `raw` из корня старого репозитория: ```bash bash <(curl -fsSL https://raw.githubusercontent.com/3252a8/remnawave-minishop/main/scripts/migrate_to_minishop.sh) ``` > Команда выше рассчитана на `bash` / Git Bash / WSL. Если вы запускаете из PowerShell, удобнее сначала открыть Git Bash. Если вы уже подтянули новую версию и файл есть локально, можно запускать и так: ```bash bash scripts/migrate_to_minishop.sh ``` По умолчанию скрипт работает с `docker-compose.yml` и переключается на ветку `main`. Можно переопределить через переменные окружения: | Переменная | Назначение | По умолчанию | | ----------------- | ----------------------------------------------------------------------- | ---------------------- | | `PROJECT_ROOT` | Явный путь к корню старого репозитория, если запуск не из него | текущая директория | | `COMPOSE_FILE` | Какой compose-файл стартовать в конце | `docker-compose.yml` | | `TARGET_BRANCH` | На какую ветку переключаться и подтягивать обновления | `main` | | `GIT_REMOTE` | Какой remote использовать для `fetch`/`pull` | `origin` | | `NEW_ORIGIN_URL` | Если задано и не совпадает с URL выбранного remote — он будет обновлён | (не меняется) | | `ASSUME_YES` | `1` — не задавать интерактивных вопросов | `0` | Примеры: ```bash # Caddy-вариант из raw COMPOSE_FILE=deploy/compose/docker-compose-caddy.yml \ bash <(curl -fsSL https://raw.githubusercontent.com/3252a8/remnawave-minishop/main/scripts/migrate_to_minishop.sh) # С переключением origin на форк 3252a8 NEW_ORIGIN_URL=https://github.com/3252a8/remnawave-minishop.git \ bash <(curl -fsSL https://raw.githubusercontent.com/3252a8/remnawave-minishop/main/scripts/migrate_to_minishop.sh) # Без интерактива ASSUME_YES=1 \ bash <(curl -fsSL https://raw.githubusercontent.com/3252a8/remnawave-minishop/main/scripts/migrate_to_minishop.sh) ``` Что делает скрипт: 1. **Останавливает текущий стек**: проверяет известные контейнеры старой и новой схемы и останавливает их, если они запущены. 2. **Переключает `origin`**, если задана переменная `NEW_ORIGIN_URL`, иначе оставляет как есть. 3. **Подтягивает целевую ветку** (`git fetch` + `git switch` + `git pull --ff-only`). Прерывается, если в рабочем дереве есть незакоммиченные изменения. 4. **Обновляет `.env`** и правит `POSTGRES_HOST`, если он ещё указывает на старый контейнер. 5. **Подготавливает новый стек в режиме `--no-start`**, чтобы Compose сам создал тома и не ругался на уже существующий volume. 6. **Переносит тома** `remnawave-tg-shop-*` → `remnawave-minishop-*` через одноразовый `alpine`-контейнер. Если новый том уже непустой, копирование пропускается. 7. **Стартует новый стек** (`docker compose -f $COMPOSE_FILE up -d --remove-orphans`, а для локальной сборки ещё и `--build`) и печатает `docker compose ps`. Скрипт идемпотентен: повторный запуск ничего не сломает, просто пропустит уже выполненные шаги. После того как убедитесь, что бот работает и данные на месте, удалите старые тома: ```bash docker volume rm remnawave-tg-shop-db-data docker volume rm remnawave-tg-shop-caddy-data remnawave-tg-shop-caddy-config 2>/dev/null || true ``` > ⚠️ Если у вас есть внешний reverse proxy (Nginx и т.п.), не забудьте поправить в его конфиге `upstream`/`proxy_pass`: имя хоста контейнера изменилось с `remnawave-tg-shop` на `remnawave-minishop`. Скрипт не трогает внешние конфиги. ## Ручной способ 1. **Остановите старый стек и обновите код:** ```bash docker compose down git fetch origin git checkout main git pull --ff-only origin main ``` 2. **Обновите `.env`:** ```bash sed -i.bak 's/^POSTGRES_HOST=remnawave-tg-shop-db$/POSTGRES_HOST=remnawave-minishop-db/' .env ``` 3. **Подготовьте новый стек без запуска:** ```bash # Локальная сборка docker compose up --no-start --build # Или Caddy-вариант docker compose -f deploy/compose/docker-compose-caddy.yml up --no-start # Или готовый образ docker compose -f deploy/compose/docker-compose-remote-server.yml up --no-start ``` 4. **Перенесите том БД в новое имя:** ```bash docker run --rm \ -v remnawave-tg-shop-db-data:/from:ro \ -v remnawave-minishop-db-data:/to \ alpine sh -c "cd /from && cp -a . /to" ``` 5. **(Только для Caddy)** перенесите тома Caddy с TLS-сертификатами и состоянием ACME: ```bash for v in caddy-data caddy-config; do docker run --rm \ -v "remnawave-tg-shop-$v":/from:ro \ -v "remnawave-minishop-$v":/to \ alpine sh -c "cd /from && cp -a . /to" done ``` 6. **Запустите новый стек:** ```bash docker compose up -d # или docker compose -f deploy/compose/docker-compose-caddy.yml up -d # или docker compose -f deploy/compose/docker-compose-remote-server.yml up -d ``` 7. **Проверьте:** ```bash docker compose ps docker compose logs -f backend worker frontend ``` 8. **(Опционально) удалите старые тома**, когда убедитесь, что новый стек стабилен: ```bash docker volume rm remnawave-tg-shop-db-data docker volume rm remnawave-tg-shop-caddy-data remnawave-tg-shop-caddy-config 2>/dev/null || true ```