Skip to content

Переезд с другого бота

Импорт аудитории из нескольких источников: remnawave-shopbot, Bedolaga, SoloBot, RemnaShop, remnawave-telegram-shop, remnawave-minishop и 3x-ui. Переносятся юзеры, балансы, подписки с ключами панели, платежи, промокоды и рефералы. Для всех, кроме 3x-ui, панель не трогается — импорт перенимает существующие uuid панели, поэтому ключи подписчиков продолжают работать прямо в момент переезда. 3x-ui — особый случай: юзеров на панели Remnawave ещё нет, импорт их создаёт (panel-first).

Как запустить

Кабинет → Обслуживание → Миграция с другого бота (/cabinet/maintenance).

  1. Выберите источник.
  2. Загрузите файл базы (или впишите Postgres DSN — для Bedolaga и RemnaShop).
  3. Нажмите «Проверить» — увидите счётчики: сколько юзеров, подписок, платежей найдено.
  4. Для 3x-ui — выберите сквад, в который попадут созданные на панели юзеры.
  5. Нажмите «Начать миграцию».

Не закрывайте вкладку

Импорт идёт в одном запросе. На десятках тысяч юзеров 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.jsonORM-дамп, если 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).

После переезда пройдите чеклист запуска: синк нод в «Серверах», тарифы со сквадами, кассы — и тестовая покупка.

MIT License · сделано для тех, кто продаёт VPN, а не настраивает ботов