Рейтинг:0

Как перенести базу данных ejabberd с SQL-сервера на Mnesia?

флаг za

Существует довольно поддерживаемое действие для перехода от Mnesia к SQL, специальная команда ejabberdctl экспорт2sql (в старых версиях он назывался экспорт2odbc). Некоторым настройкам это может понадобиться, потому что Mnesia ограничена 2 ГБ и бла-бла-бла.

В моем случае действительно нет необходимости иметь внешнюю базу данных. Активных пользователей около 10-15, а всего пользователей не более 30, а размер экспорта из базы данных SQL составляет около 200 КБ.

Кто-то в прошлом делал это, экспортируя базу данных в SQL (в частности, MySQL). Как я могу отменить это изменение?

Может export_piefxis помочь мне как-то? Что оно делает?


Обновление 1. После некоторых исследований я обнаружил, что только два модуля имеют некоторые данные в базе данных SQL: mod_roster и mod_vcard. Так что только они должны быть преобразованы. Есть ли способ преобразовать их данные извне и загрузить в ejabberd? Я имею в виду, есть ejabberdctl dump_table, но снова нет обратной команды.

Также, export_piefxis не похоже, чтобы помочь. Он просто экспортирует нулевой контент, в то время как в базе данных есть данные, и они извлекаются, когда я подключаюсь, например. только что созданный клиент.

Обновление 2. Программное обеспечение: контейнер Debian 11.2 LXC, работающий на хосте Proxmox VE 6.4-1. Ejabberd 21.01-2 установлен с подходящий из стандартного репозитория Debian.

База данных была перенесена со старого Ejabberd версии 2.1, которая работала на Gentoo и последний раз обновлялась в 2015 году.У меня больше нет этой машины на мое усмотрение. Миграция базы данных Mnesia была выполнена следующим образом:

# на старой машине
резервная копия ejabberdctl /tmp/[email protected] 
ejabberdctl mnesia_change_nodename ejabberd@localhost ejabberd@jabber2 \
           /tmp/[email protected] /tmp/[email protected]
# на новой машине (начиная с пустой базы данных)
ejabberdctl install_fallback /tmp/[email protected]
ejabberdctl стоп
запуск ejabberdctl

Конфигурация на новой машине просто ссылается на ту же базу данных MySQL для mod_roster и mod_vcard.

ejabberd.yml:

уровень логирования: информация

log_rotate_count: 0

хосты:
  - "example.org"

host_config:
  «rterm.ru»:
    sql_type: mysql
    sql_server: "сервер базы данных"
    sql_database: "эджабберд"
    sql_username: "еджабберд"
    sql_password: "пароль"
    auth_method: [внешний]

файлы сертификатов:
  - "/etc/ejabberd/ejabberd.pem"

акме:
  авто: ложь

определить_макрос:
  'TLS_CIPHERS': "HIGH:!aNULL:!eNULL:!3DES:@STRENGTH"
  'TLS_OPTIONS':
    - "no_sslv3"
    - "нет_тлсв1"
    - "но_тлсв1_1"
    - "cipher_server_preference"
    - "без_сжатия"


c2s_ciphers: 'TLS_CIPHERS'
s2s_ciphers: 'TLS_CIPHERS'
c2s_protocol_options: 'TLS_OPTIONS'
s2s_protocol_options: 'TLS_OPTIONS'

Слушать:
  -
    порт: 5222
    ИП: "::"
    модуль: ejabberd_c2s
    max_stanza_size: 262144
    формирователь: c2s_shaper
    доступ: c2s
    starttls_required: правда
    протокол_опции: 'TLS_OPTIONS'
  -
    порт: 5223
    ИП: "::"
    модуль: ejabberd_c2s
    max_stanza_size: 262144
    формирователь: c2s_shaper
    доступ: c2s
    тлс: правда
    протокол_опции: 'TLS_OPTIONS'
  -
    порт: 5269
    ИП: "::"
    модуль: ejabberd_s2s_in
    max_stanza_size: 524288
  -
    порт: 5443
    ИП: "::"
    модуль: ejabberd_http
    тлс: правда
    протокол_опции: 'TLS_OPTIONS'
    запрос_обработчики:
      /admin: ejabberd_web_admin
      /апи: mod_http_api
      /бош: mod_bosh
      /загрузить: mod_http_upload
      /ws: ejabberd_http_ws
  -
    порт: 5280
    ИП: "::"
    модуль: ejabberd_http
    тлс: ложь
    запрос_обработчики:
# Это работает за обратным HTTP-прокси с Let's Encrypt, который является соседним контейнером на том же хосте, так что это безопасно
      /admin: ejabberd_web_admin
      /бош: mod_bosh
      /загрузить: mod_http_upload
  -
    порт: 1883
    ИП: "::"
    модуль: mod_mqtt
    отставание: 1000

auth_method: [внешний]
extauth_program: "/etc/ejabberd/auth_mysql.py"
extauth_pool_size: 5

отключить_sasl_механизмы:
  - "Х-ОАУТ2"

s2s_use_starttls: требуется

акк:
  администратор:
    пользователь:
       - "[email protected]"

  местный:
    user_regexp: ""
  обратная связь:
    IP:
      - 127.0.0.0/8
      - ::1/128

правила_доступа:
  местный:
    разрешить: местный
  с2с:
    отрицать: заблокирован
    позволять все
  объявить:
    разрешить: администратор
  настроить:
    разрешить: администратор
  muc_create:
    разрешить: местный
  pubsub_createnode:
    разрешить: местный
  доверенная_сеть:
    разрешить: петля

API_разрешения:
  "консольные команды":
    от:
      - ejabberd_ctl
    кто: все
    какие: "*"
  "доступ администратора":
    кто:
      доступ:
        позволять:
          - acl: петля
          - акк: админ
      авторизация:
        область действия: "ejabberd:admin"
        доступ:
          позволять:
            - acl: петля
            - акк: админ
    какие:
      - "*"
      - "!останавливаться"
      - "!Начало"
  "общедоступные команды":
    кто:
      IP-адрес: 127.0.0.1/8
    какие:
      - положение дел
      - число подключенных_пользователей

формирователь:
  нормальный:
    ставка: 3000
    Burst_size: 20000
  быстро: 200000

shaper_rules:
  max_user_sessions: 10
  max_user_offline_messages:
    5000: администратор
    100: все
  c2s_shaper:
    нет: администратор
    нормальный: все
  s2s_shaper: быстро

модули:
  mod_adhoc: {}
  mod_admin_extra: {}
  mod_announce:
    доступ: объявить
  mod_avatar: {}
  мод_блокировка: {}
  mod_bosh: {}
  mod_caps: {}
  mod_carboncopy: {}
  mod_client_state: {}
  mod_configure: {}
  мод_диско: {}
  mod_fail2ban: {}
  mod_http_api: {}
  mod_http_upload:
    put_url: https://@HOST@:5443/upload
    custom_headers:
      "Access-Control-Allow-Origin": "https://@HOST@"
      "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
      "Access-Control-Allow-Headers": "Content-Type"
  мод_последний: {}
  mod_mqtt: {}
  mod_muc:
    доступ:
      - позволять
    access_admin:
      - разрешить: админ
    access_create: muc_create
    access_persistent: muc_create
    доступ_мам:
      - позволять
    default_room_options:
      мама: правда
  mod_muc_admin: {}
  мод_оффлайн:
    access_max_user_messages: max_user_offline_messages
  мод_пинг: {}
  mod_pres_counter:
    количество: 5
    интервал: 60
  mod_privacy: {}
  mod_private: {}
  mod_proxy65:
    доступ: локальный
    макс_подключения: 5
  mod_pubsub:
    access_createnode: pubsub_createnode
    плагины:
      - плоский
      - бодрость духа
    force_node_config:
      "eu.siacs.conversations.axolotl.*":
        модель доступа: открытая
      хранилище: закладки:
        access_model: белый список
  mod_push: {}
  mod_push_keepalive: {}
  mod_roster:
    db_type: sql # Это то, от чего я хочу избавиться
    версия: правда
  mod_s2s_dialback: {}
  mod_shared_roster: {}
  mod_sic: {}
  mod_stream_mgmt:
    resend_on_timeout: if_offline
  mod_stun_disco: {}
  mod_vcard:
    db_type: sql # И это
    поиск: ложь
  mod_vcard_xupdate: {}
  версия_мода: {}
Рейтинг:0
флаг ru

Хорошо, есть несовместимость функций: вы запрашиваете у ejabberd подробности о зарегистрированных учетных записях, но ejabberd не знает, какие учетные записи существуют.

Вы настроили ejabberd на использование внеаутент, что означает, что ejabberd использует этот скрипт для проверить, существует ли учетная запись или нет... Но этот скрипт никогда не сообщает список зарегистрированных учетных записей.

Это проблема, когда вы хотите узнать список зарегистрированных учетных записей:

  • экспортировать существующие аккаунты с помощью export_piefxis
  • просмотреть список учетных записей в ejabberd WebAdmin

Об этом сообщили в https://github.com/processone/ejabberd/issues/3705

Одним из решений было бы включить опцию auth_use_cache чтобы каждая попытка входа давала подсказку, которую хранит ejabberd. Подождите несколько дней или недель, а позже, когда вы запросите список «зарегистрированных учетных записей», ejabberd прочитает этот кеш аутентификации и использует его.

Проблема в том, что вам нужно будет дождаться входа всех зарегистрированных учетных записей и оставить эту кешированную информацию в ejabberd...

Хорошая новость: есть способ заполнить кеш авторизации учетными записями:

  1. Получить список зарегистрированных аккаунтов самостоятельно, вручную, каким-либо образом

  2. Давать возможность auth_use_cache в ejabberd и перезапустить

  3. Запустите эту команду для каждой учетной записи, которую вы хотите экспортировать. Это обеспечит запуск extauth для этой учетной записи, а кеш аутентификации сохранит эту подсказку:

    ejabberdctl check_account user123 localhost

  4. Просто из любопытства вы можете просмотреть список зарегистрированных учетных записей (на самом деле это только список учетных записей, кэшированных с помощью аутентификации...)

    ejabberdctl зарегистрированные_пользователи локальный хост администратор пользователь123

  5. Теперь вы, наконец, можете запустить export_piefxis

  6. Помните: информация кэша аутентификации удаляется, когда ejabberd останавливается.

  7. После экспорта вы можете восстановить конфигурацию

Nikita Kipriyanov avatar
флаг za
Это разумное объяснение. Спасибо за советы как действовать, я попробую!
Рейтинг:0
флаг ru

Может ли мне как-то помочь export_piefxis? Что оно делает?

Да, это должна быть команда, которая делает то, что вы хотите: запускайте ее, когда хранилище SQL все еще используется. Получив содержимое в файлах XML, настройте ejabberd для использования Mnesia и импортируйте эти файлы.

Кроме того, export_piefxis, похоже, не помогает.

Оно сломалось? Или он просто экспортировал нулевое содержимое?

Nikita Kipriyanov avatar
флаг za
Я повторил попытку. Он экспортировал нулевое содержимое (два файла, один 180 байт, а другой 132 — последний — мои данные хоста). В то время как при подключении к jabber с новым клиентом я вижу данные реестра и vcard, полученные из базы данных sql,
Badlop avatar
флаг ru
Я установил ejabberd из git, настроил использование MySQL для аутентификации и хранилища по умолчанию, зарегистрировал учетную запись, добавил контакт и отредактировал vcard. Затем экспортируется, и второй xml содержит данные пользователя: ......
Badlop avatar
флаг ru
Обновите свой исходный вопрос, указав, какая версия ejabberd работает, как она была установлена, ее файл конфигурации (закомментируйте личные данные)
Nikita Kipriyanov avatar
флаг za
Я добавил все детали, которые вы хотели

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.