Puncte:0

Cum se migrează baza de date ejabberd de la backend SQL la Mnesia?

drapel za

Există o acțiune destul de acceptată pentru a trece de la Mnesia la SQL, o comandă specială ejabberdctl export2sql (în versiunile mai vechi se numea export2odbc). Unele configurații ar putea avea nevoie de asta, deoarece Mnesia este limitată la 2GiB și bla, bla, bla.

În cazul meu, chiar nu este nevoie să aveți o bază de date externă. Există aproximativ 10-15 utilizatori activi și nu mai mult de 30 din totalul utilizatorilor, iar dimensiunea exportului din baza de date SQL este de aproximativ 200 kB.

Cineva în trecut a făcut acest lucru, a exportat o bază de date în SQL (în special, MySQL). Cum pot anula acea modificare?

Poate sa export_piefxis sa ma ajuti cumva? Ce face?


Actualizare 1. După câteva explorări, am descoperit că doar două module au câteva date în baza de date SQL: mod_roster și mod_vcard. Deci doar aceia trebuie convertiți. Există o modalitate de a le converti datele extern și de a le încărca în ejabberd? Adică, există o ejabberdctl dump_table, dar din nou nicio comandă inversă.

De asemenea, export_piefxis nu pare să ajute. Doar exportă conținut zero, în timp ce există date în baza de date și este preluat când mă conectez cu, de ex. client nou instanțiat.

Actualizare 2. Software: containerul Debian 11.2 LXC care rulează pe gazda Proxmox VE 6.4-1. Ejabberd 21.01-2 instalat cu apt din depozitul standard Debian.

Baza de date a fost migrată de la vechiul Ejabberd de aproximativ versiunea 2.1, care rula pe Gentoo și ultima actualizare în 2015.Nu mai am acea mașină la discreția mea. Migrarea bazei de date Mnesia s-a făcut după cum urmează:

# pe vechea mașină
ejabberdctl backup /tmp/[email protected] 
ejabberdctl mnesia_change_nodename ejabberd@localhost ejabberd@jabber2 \
           /tmp/[email protected] /tmp/[email protected]
# pe noua mașină (începând cu baza de date goală)
ejabberdctl install_fallback /tmp/[email protected]
ejabberdctl stop
ejabberdctl start

Configurația de pe noua mașină face referire doar la aceeași bază de date MySQL pentru mod_roster și mod_vcard.

ejabberd.yml:

loglevel: info

log_rotate_count: 0

gazde:
  - „example.org”

host_config:
  „rterm.ru”:
    sql_type: mysql
    sql_server: „dbserver”
    sql_database: „ejabberd”
    sql_username: „ejabberd”
    sql_password: „parolă”
    auth_method: [extern]

certificatfiles:
  - „/etc/ejabberd/ejabberd.pem”

culme:
  auto: fals

define_macro:
  „TLS_CIPHERS”: „HIGH:!aNULL:!eNULL:!3DES:@STRENGTH”
  „TLS_OPTIONS”:
    - „no_sslv3”
    - „no_tlsv1”
    - „no_tlsv1_1”
    - „preferință_server_cifrare”
    - „fără_compresie”


c2s_ciphers: „TLS_CIPHERS”
s2s_ciphers: „TLS_CIPHERS”
c2s_protocol_options: „TLS_OPTIONS”
s2s_protocol_options: „TLS_OPTIONS”

asculta:
  -
    port: 5222
    ip: "::"
    modul: ejabberd_c2s
    Dimensiune_max_stanza: 262144
    modelator: c2s_shaper
    acces: c2s
    starttls_required: adevărat
    protocol_options: „TLS_OPTIONS”
  -
    portul: 5223
    ip: "::"
    modul: ejabberd_c2s
    Dimensiune_max_stanza: 262144
    modelator: c2s_shaper
    acces: c2s
    tls: adevărat
    protocol_options: „TLS_OPTIONS”
  -
    port: 5269
    ip: "::"
    modul: ejabberd_s2s_in
    Dimensiune_max_stanza: 524288
  -
    port: 5443
    ip: "::"
    modul: ejabberd_http
    tls: adevărat
    protocol_options: „TLS_OPTIONS”
    request_handlers:
      /admin: ejabberd_web_admin
      /api: mod_http_api
      /bosh: mod_bosh
      /upload: mod_http_upload
      /ws: ejabberd_http_ws
  -
    port: 5280
    ip: "::"
    modul: ejabberd_http
    tls: fals
    request_handlers:
# Acesta rulează în spatele proxy-ului HTTP invers cu Let's Encrypt, care este un container vecin pe aceeași gazdă, deci este sigur
      /admin: ejabberd_web_admin
      /bosh: mod_bosh
      /upload: mod_http_upload
  -
    port: 1883
    ip: "::"
    modul: mod_mqtt
    restanță: 1000

auth_method: [extern]
extauth_program: „/etc/ejabberd/auth_mysql.py”
extauth_pool_size: 5

disable_sasl_mechanisms:
  - „X-OAUTH2”

s2s_use_starttls: obligatoriu

acl:
  admin:
    utilizator:
       - „[email protected]”

  local:
    user_regexp: ""
  loopback:
    ip:
      - 127.0.0.0/8
      - ::1/128

access_rules:
  local:
    permite: local
  c2s:
    nega: blocat
    permite: toate
  anunta:
    permite: admin
  configura:
    permite: admin
  muc_create:
    permite: local
  pubsub_createnode:
    permite: local
  rețea_de_încredere:
    permite: loopback

api_permissions:
  "comenzi console":
    din:
      - ejabberd_ctl
    cine: toti
    ce: "*"
  „acces administrator”:
    OMS:
      acces:
        permite:
          - acl: loopback
          - acl: admin
      auth:
        domeniul de aplicare: „ejabberd:admin”
        acces:
          permite:
            - acl: loopback
            - acl: admin
    ce:
      - "*"
      - "!Stop"
      - "!start"
  "comenzi publice":
    OMS:
      ip: 127.0.0.1/8
    ce:
      - stare
      - număr_utilizatori_conectați

modelator:
  normal:
    rata: 3000
    dimensiunea exploziei: 20000
  rapid: 200000

shaper_rules:
  max_user_sessions: 10
  max_user_offline_messages:
    5000: admin
    100: toate
  c2s_shaper:
    niciunul: admin
    normal: toate
  s2s_shaper: rapid

module:
  mod_adhoc: {}
  mod_admin_extra: {}
  mod_announce:
    acces: anunță
  mod_avatar: {}
  mod_blocking: {}
  mod_bosh: {}
  mod_caps: {}
  mod_carboncopy: {}
  mod_client_state: {}
  mod_configure: {}
  mod_disco: {}
  mod_fail2ban: {}
  mod_http_api: {}
  mod_http_upload:
    put_url: https://@HOST@:5443/upload
    custom_headers:
      „Access-Control-Allow-Origin”: „https://@HOST@”
      „Acces-Control-Allow-Methods”: „GET, HEAD,PUT,OPTIONS”
      „Access-Control-Allow-Headers”: „Content-Type”
  mod_last: {}
  mod_mqtt: {}
  mod_muc:
    acces:
      - permite
    access_admin:
      - permit: admin
    access_create: muc_create
    access_persistent: muc_create
    access_mam:
      - permite
    default_room_options:
      mama: adevarat
  mod_muc_admin: {}
  mod_offline:
    access_max_user_messages: max_user_offline_messages
  mod_ping: {}
  mod_pres_counter:
    număr: 5
    interval: 60
  mod_privacy: {}
  mod_private: {}
  mod_proxy65:
    acces: local
    max_conexiuni: 5
  mod_pubsub:
    access_createnode: pubsub_createnode
    pluginuri:
      - apartament
      - pep
    force_node_config:
      „eu.siacs.conversations.axolotl.*”:
        access_model: deschis
      stocare:marcaje:
        access_model: lista albă
  mod_push: {}
  mod_push_keepalive: {}
  mod_roster:
    db_type: sql # De asta vreau să scap
    versiunea: adevărat
  mod_s2s_dialback: {}
  mod_shared_roster: {}
  mod_sic: {}
  mod_stream_mgmt:
    resend_on_timeout: if_offline
  mod_stun_disco: {}
  mod_vcard:
    db_type: sql # Și asta
    căutare: fals
  mod_vcard_xupdate: {}
  mod_version: {}
Puncte:0
drapel ru

Export_piefxis mă poate ajuta cumva? Ce face?

Da, aceasta ar trebui să fie comanda care face ceea ce doriți: rulați-o când stocarea SQL este încă în uz. Odată ce aveți conținutul în fișiere XML, configurați ejabberd pentru a utiliza Mnesia și importați acele fișiere.

De asemenea, export_piefxis nu pare să ajute.

S-a prăbușit? Sau pur și simplu a exportat conținut zero?

Nikita Kipriyanov avatar
drapel za
am reîncercat. A exportat zero conținut (două fișiere, unul de 180 de octeți și celălalt de 132 – ultimele sunt datele gazdei mele). În timp ce, conectându-mă la jabber cu noul client, pot vedea datele despre listă și vcard preluate din baza de date sql,
Badlop avatar
drapel ru
Am instalat ejabberd din git, configurat să utilizeze MySQL pentru autentificare și stocare implicită, am înregistrat un cont, am adăugat un contact și am editat vcard. Apoi exportat, iar al doilea xml conține detaliile utilizatorului: ......
Badlop avatar
drapel ru
Actualizați-vă întrebarea inițială, detaliind ce versiune ejabberd rulează, cum a fost instalată, fișierul de configurare (comentați detaliile private)
Nikita Kipriyanov avatar
drapel za
Am adăugat toate detaliile dorite
Puncte:0
drapel ru

Ok, există o incompatibilitate de caracteristici: îi întrebi pe ejabberd detaliile despre conturile înregistrate, dar ejabberd nu știe ce conturi există.

Ai configurat ejabberd pentru utilizare extauth, ceea ce înseamnă că ejabberd folosește acel script pentru verifica daca exista un cont sau nu... Dar acel script nu raportează niciodată lista conturilor înregistrate.

Aceasta este o problemă atunci când doriți să aflați lista de conturi înregistrate:

  • exportați conturile existente folosind export_piefxis
  • vizualizați lista de conturi în ejabberd WebAdmin

Acest lucru a fost raportat în https://github.com/processone/ejabberd/issues/3705

O soluție ar fi activarea opțiunii auth_use_cache astfel încât fiecare încercare de conectare să ofere un indiciu pe care ejabberd îl stochează. Așteptați câteva zile sau săptămâni, iar mai târziu când solicitați lista de „conturi înregistrate”, ejabberd citește acel cache de autentificare și îl folosește.

Problema este că ar trebui să așteptați ca toate conturile înregistrate să se autentifice și să lăsați informațiile din cache în ejabberd...

Vestea bună: există o modalitate prin care puteți completa memoria cache de autentificare cu conturile:

  1. Obțineți singur lista de conturi înregistrate, manual, într-un fel

  2. Permite auth_use_cache în ejabberd și reporniți

  3. Rulați această comandă pentru fiecare cont pe care doriți să îl exportați. Acest lucru va asigura că extauth este rulat pentru acel cont și cache-ul de autentificare stochează acest indiciu:

    ejabberdctl check_account user123 localhost

  4. Doar de curiozitate, puteți vizualiza lista de conturi înregistrate (de fapt este doar lista de conturi autentificate în cache...)

    ejabberdctl registered_users localhost admin utilizator123

  5. Acum puteți rula în sfârșit export_piefxis

  6. Amintiți-vă: că informațiile din cache de autentificare sunt șterse când ejabberd se oprește.

  7. După ce este exportat, puteți reveni la configurație

Nikita Kipriyanov avatar
drapel za
Aceasta este o explicație rezonabilă. Mulțumesc pentru sugestii despre cum să procedați, voi încerca!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.