Переезд с другого бота
Импорт аудитории из нескольких источников: remnawave-shopbot, Bedolaga, SoloBot, RemnaShop, remnawave-telegram-shop, remnawave-minishop и 3x-ui. Переносятся юзеры, балансы, подписки с ключами панели, платежи, промокоды и рефералы. Для всех, кроме 3x-ui, панель не трогается — импорт перенимает существующие uuid панели, поэтому ключи подписчиков продолжают работать прямо в момент переезда. 3x-ui — особый случай: юзеров на панели Remnawave ещё нет, импорт их создаёт (panel-first).
Как запустить
Кабинет → Обслуживание → Миграция с другого бота (/cabinet/maintenance).
- Выберите источник.
- Загрузите файл базы (или впишите Postgres DSN — для Bedolaga и RemnaShop).
- Нажмите «Проверить» — увидите счётчики: сколько юзеров, подписок, платежей найдено.
- Для 3x-ui — выберите сквад, в который попадут созданные на панели юзеры.
- Нажмите «Начать миграцию».
Не закрывайте вкладку
Импорт идёт в одном запросе. На десятках тысяч юзеров 3x-ui (создание на панели) он может занять минуты.
Идемпотентность
Повторный запуск безопасен: юзеры матчатся по telegram_id, подписки — по uuid панели, платежи — по внешнему id, промокоды — по коду. Повтор обновляет записи, а не плодит дубли. Баланс уже существующего юзера повторный импорт не трогает.
remnawave-shopbot
Файл users.db из папки бота (SQLite — загрузчик проверяет сигнатуру файла и отклонит что-то другое).
Переезжают: балансы (оба кошелька суммируются), подписки с ключами панели, платежи, промокоды, рефералы. Панель не трогается — ключи юзеров продолжают работать.
Bedolaga
Подходит любой из вариантов:
| Источник | Где взять |
|---|---|
bot.db | если бот работал в SQLite-режиме (./data/bot.db) |
database.sql или сам архив backup_YYYYMMDD_HHMMSS.tar.gz | бот шлёт их в Telegram, либо лежат в /app/data/backups |
database.json | ORM-дамп, если pg_dump не было |
| Postgres DSN | из .env бота: postgresql://remnawave_user:пароль@хост:5432/remnawave_bot — порт должен быть доступен с сервера HUB-BOT |
Переезжают: балансы (копейки 1:1), подписки с uuid панели (single- и multi-tariff режимы), squad'ы, автоплатёж, платежи (включая маппинг шлюзов, pal24 → paypalych), промокоды (баланс / дни / скидка-процент), рефералы. Панель не трогается.
Не переезжают: promo-группы (промокоды типа promo_group пропускаются с пометкой), кабинетные юзеры без telegram_id.
SoloBot (Vladless/Solo_bot)
Дамп PostgreSQL-базы (pg_dump .sql) или ORM-json, либо Postgres DSN прямо из .env SoloBot. Нужны таблицы users, keys, payments, referrals, coupons, tariffs.
Переезжают: балансы (рубли balance → копейки), подписки из keys (у юзера их может быть несколько) с uuid панели — берётся keys.client_id (для Remnawave это UUID юзера панели), срок из expiry_time, ссылка remnawave_link, лимит устройств; платежи со status = success (маппинг payment_system → шлюз), рефералы (по Telegram id), купоны с суммой → промокоды на баланс. Панель не трогается — если client_id не UUID, uuid резолвится с живой панели по telegram_id (SoloBot проставляет его на панель-юзера).
Не переезжают: купоны-скидки процентом (нет 1:1 соответствия), замороженные ключи импортируются как «выключено».
RemnaShop (snoups/remnashop)
db_backup_*.sql из папки backups рядом с ботом (bind-mount ./backups), либо DSN postgresql://remnashop:пароль@127.0.0.1:5001/remnashop — порт паблишится на localhost сервера RemnaShop.
Переезжают: юзеры (скидки personal/purchase, триал-флаг), текущая подписка каждого юзера с uuid панели и plan_snapshot, завершённые платежи (суммы из pricing с учётом валюты — рубли ×100, звёзды 1:1), промокоды, рефералы. Панель не трогается.
Не переезжают: кошелёк (в RemnaShop его нет, points не конвертируются), web-юзеры без Telegram, исторические подписки — переносится только текущая, потому что панель-юзер один на юзера.
3x-ui
Файл /etc/x-ui/x-ui.db — остановите панель или сделайте копию файла. Единственный источник, где юзеров на панели Remnawave ещё нет: импорт работает panel-first — сначала создаёт юзеров на панели, и только потом пишет локальные строки. При этом идентичность клиентов сохраняется:
vlessUuid= id клиента из 3x-ui → конфиги на устройствах продолжают работать. Нужен тот же Reality/инбаунд-профиль на нодах — это настройка панели, не импорта.shortUuid=subId→ старую ссылку подписки можно завести 301-редиректом/sub/{subId} → https://SUB_DOMAIN/{subId}— идентичность полная, т.к. shortUuid = subId.tgIdклиента → юзер бота. Официальный remnawave/migrate эту привязку теряет.totalGB(на деле это байты, несмотря на имя) → лимит трафика; отрицательныйexpiryTime(«после первого запуска») → срок = сейчас + остаток.
Клиенты с общим subId группируются: одна группа = один panel-юзер = одна подписка.
После «Проверить» выберите сквад — в него попадут созданные юзеры. Без сквада импорт не запустится: юзеры на панели остались бы без инбаундов, то есть с мёртвыми подписками. Клиенты без tgId создаются на панели и в базе без Telegram-привязки (видны в админке юзеров, в проверке — счётчик «без Telegram»).
INFO
Триал импортированным из 3x-ui выключен (is_trial_available = false) — они уже были клиентами.
Ограничения и безопасность
- Файл — до 200 МБ. Форматы:
.db/.sqlite/.sqlite3,.sql,.json, бэкап.tar.gz. - Загруженный файл хранится вне публичной статики (в нём балансы и токены), доступен только по сгенерированному сервером id и удаляется после успешного импорта.
- DSN принимается только вида
postgres:///postgresql://; 3x-ui импортируется только из файлаx-ui.db. - В ответе импорта список пропущенных записей ограничен первыми 50.
- Все проверки и запуски пишутся в журнал операций (audit).
После переезда пройдите чеклист запуска: синк нод в «Серверах», тарифы со сквадами, кассы — и тестовая покупка.
