Dasturlash

O'z XMPP Serveringizni Docker’da Qurish: Xavfsiz va Mustaqil Xabar Almashish

15-mart, 2026, 04:057 ko'rish4 daqiqa o'qish
O'z XMPP Serveringizni Docker’da Qurish: Xavfsiz va Mustaqil Xabar Almashish

Bugun ko'p foydalanuvchilar Signal yoki WhatsApp kabi yopiq platformalarga tayanadi. Biroq, bunday xizmatlar bir kun to‘xtab qolsa, aloqalar ham uzilib qoladi. XMPP (Extensible Messaging and Presence Protocol) esa federatsiyalangan, ochiq standart bo‘lib, o‘z serveringizni boshqarish orqali mustaqil xabar almashish imkonini beradi. Ushbu maqolada Docker konteynerida Prosody XMPP serverini o‘rnatish, TLS sertifikatlari, fayl yuklash, guruh chat va TURN/STUN orqali ovozli qo‘ng‘iroqlarni yo‘lga qo‘yish jarayonlari batafsil ko‘rib chiqiladi.

Kerakli shartlar

  • Docker va Docker Compose o‘rnatilgan server
  • Sizga tegishli domen nomi
  • Let's Encrypt kabi bepul TLS sertifikatlari

DNS yozuvlarini sozlash

XMPP serverlari boshqa serverlar va mijozlar bilan aloqani SRV yozuvlari orqali topadi. Quyidagi yozuvlarni domeningiz DNS paneliga qo‘shing:

  • _xmpp-client._tcp.example.com SRV 0 5 5222 xmpp.example.com. – mijozlar uchun port
  • _xmpp-server._tcp.example.com SRV 0 5 5269 xmpp.example.com. – server‑to‑server federatsiya porti
  • A yoki CNAME yozuvi xmpp.example.com – server IP manziliga yo‘naltiradi
  • Fayl yuklash uchun upload.xmpp.example.com va guruh chat uchun conference.xmpp.example.com yozuvlarini ham qo‘shish tavsiya etiladi.

TLS sertifikatlarini olish

Prosody xavfsiz aloqasiz ishga tushmaydi. Cloudflare DNS challenge yordamida Let’s Encrypt sertifikatini quyidagicha olish mumkin:

docker run --rm \
  -v ~/docker/xmpp/certs:/etc/letsencrypt \
  -v ~/docker/xmpp/cloudflare.ini:/etc/cloudflare.ini:ro \
  certbot/dns-cloudflare certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/cloudflare.ini \
  -d xmpp.example.com

Keyin fayl ruxsatlarini moslashtiring va har oy yangilanish uchun cron qo‘shing.

Docker‑Compose faylini yaratish

services:
  prosody:
    image: prosodyim/prosody:13.0
    container_name: xmpp
    restart: unless-stopped
    ports:
      - "5222:5222"
      - "5269:5269"
    volumes:
      - prosody-data:/var/lib/prosody
      - ./prosody.cfg.lua:/etc/prosody/prosody.cfg.lua:ro
      - ./certs/live/xmpp.example.com/fullchain.pem:/etc/prosody/certs/xmpp.example.com.crt:ro
      - ./certs/live/xmpp.example.com/privkey.pem:/etc/prosody/certs/xmpp.example.com.key:ro
volumes:
  prosody-data:

5222 mijozlar, 5269 federatsiya uchun. Ma'lumotlar hajmi prosody-data hajmida saqlanadi.

Prosody konfiguratsiyasi

Prosody modullari yordamida mobil qurilmalar, xavfsizlik va arxivlashni yoqish mumkin. Eng muhim modullar:

  • carbons – bir nechta qurilmada xabarlar sinxronlanadi
  • smacks – uzluksiz aloqani tiklaydi, xabar yo‘qolishini oldini oladi
  • cloud_notify – push‑xabarnomalar, batareya tejash uchun
  • mam – server‑tomonida xabar arxivlash
  • blocklist – spam va zararli foydalanuvchilarni bloklash

Xavfsizlik sozlamalari:

c2s_require_encryption = true
s2s_require_encryption = true
s2s_secure_auth = true
authentication = "internal_hashed"
allow_registration = false

Bu barcha aloqalarni TLS orqali shifrlaydi va ro‘yxatdan o‘tishni qo‘lda amalga oshirishni talab qiladi.

End‑to‑End shifrlash – OMEMO

TLS faqat uzatish vaqtida shifrlashni ta’minlaydi, lekin server xabarlarni o‘qishi mumkin. OMEMO protokoli esa xabarlarni mijoz darajasida shifrlaydi, shuning uchun hatto server admini ham mazmunni ko‘ra olmaydi. OMEMO’ni alohida sozlash shart emas – u mijoz dasturlari (Monal, Conversations, Gajim) tomonidan avtomatik qo‘llab‑quvvatlanadi.

Fayl yuklash va guruh chat

Prosody HTTP‑porti 5280 orqali fayl almashishni amalga oshiradi. Reverse proxy (masalan, Caddy) orqali HTTPSga yo‘naltirish tavsiya etiladi:

xmpp.example.com {
  reverse_proxy xmpp:5280
}

Guruh chat uchun conference.xmpp.example.com komponentini muc (Multi‑User Chat) va muc_mam modullari bilan yoqish kifoya.

TURN/STUN serveri – ovozli va video qo‘ng‘iroqlar

NAT orqa tarmog‘ida ishlaydigan mijozlar to‘g‘ridan‑to‘g‘ri media oqimini yaratolmaydi. Bu muammoni hal qilish uchun coturn konteynerini qo‘shamiz:

services:
  coturn:
    image: coturn/coturn:latest
    container_name: coturn
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./turnserver.conf:/etc/coturn/turnserver.conf:ro
    tmpfs:
      - /var/lib/coturn

Konfiguratsiyada use-auth-secret va static-auth-secret orqali umumiy maxfiy kalit belgilab, Prosodyga ham shu kalitni ko‘rsatish kifoya.

Hisob yaratish va sinov

Ro‘yxatdan o‘tish o‘chirib qo‘yilgan, shuning uchun foydalanuvchi qo‘lda qo‘shiladi:

docker exec -it xmpp prosodyctl adduser foydalanuvchi@xmpp.example.com

Keyin har qanday XMPP mijozida (Monal – iOS, Conversations – Android, Gajim – desktop) login qilishingiz mumkin.

Tarmoq xavfsizligi

UFW yoki boshqa firewall orqali 5222, 5269, 3478, 5349 va TURN relay UDP portlarini oching. Routerda ham shu portlarni forward qilishni unutmang.

Yakuniy fikrlar

Docker va Prosody yordamida bir necha konteynerda to‘liq funksional XMPP serverini yaratish oddiy va arzon. Siz o‘z xabarlaringizni, fayllaringizni, guruh chatlaringizni va hatto ovozli qo‘ng‘iroqlarni mustaqil, shifrlangan muhitda boshqarasiz. Signal kabi yopiq platformalarga qo‘shimcha sifatida bu yechim sizga raqamli hayotingizni yanada mustahkamlaydi.

Manba: Hacker News
#XMPP #Prosody #Docker #open source #messaging
Telegram da muhokama qilish