Опубліковано 19 липня19 лип Адміністратор ПередмоваЯкщо вам раптом захотілося перестати користуватися пропрієтарними месенджерами типу Telegram, або просто подивитися як це працює, то можете скористатися цією інструкцією.За гайдом можна налаштувати власний сервер XMPP Prosody на Ubuntu 20.04, з веб-версією та закритою реєстрацією, аудіо та відео викликами.Паролі, де вони будуть потрібні, обов'язково потрібно записувати собі, щоб їх не забувати, краще використовувати менеджер паролів Keepass, а щоб простіше генерувати їх, можна встановити pwgen і запускати його командою:pwgen -1 64 В інтернеті є безліч гайдів з налаштування Prosody, але оскільки деякі сайти поступово чи різко вмирають – зайвим не буде.Після налаштування можна перевірити свій сервер на https://compliance.conversations.im – результат має бути 100%, тобто дана конфігурація сервера повністю відповідає сучасним баченням необхідних XEP для роботи з XMPP.Залізна сторона питання - сервер їсть в районі 30-70мб ОЗУ на 30-100 користувачів, тобто для сім'ї та друзів вам вистачить навіть найдешевшої VPS або можете тримати хост вдома, якщо є білий IP. Незважаючи на висловлювання про давність XMPP як технології та перевитрату ресурсів, трафіку це все споживає мало, працює стабільно навіть у 2G мережі, що загалом радше добре, ніж погано.Якщо у вас щось не вийшло, чи потрібні якісь пояснення – пишіть у коментарях, обов'язково відповім.Налаштування домену у реєстратораДля початку нам потрібно прописати DNS записи для домену у вашого реєстратора домену4 А-записи:conference proxy pubsub upload2 SRV записи:_xmpp-client._tcp.example.com. example.com. 5 0 5222 _xmpp-server._tcp.example.com. example.com. 5 0 52692 TXT запису:_xmppconnect "_xmpp-client-websocket=wss://example.com/xmpp-websocket" _xmppconnect "_xmpp-client-xbosh=https://example.com/http-bind"NGINX+модуліДалі додамо репозиторій Prosody в систему, щоб завжди мати свіжу версію серверної частини:визначаємо дистрибутив та додаємо репозиторій Prosodyecho deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/prosody.list sudo wget https://prosody.im/files/prosody-debian-packages.key -O/etc/apt/trusted.gpg.d/prosody.gpg sudo apt updateі все, тепер Prosody встановлюватиметься з репозиторію розробників.Встановлення NGINX та модуль завантаження файлів:sudo apt install nginx libnginx-mod-http-perlСтворимо технічні домени та заповнимо:mkdir /var/www/tech chown -R www-data:www-data /var/www/tech sudo nano /etc/nginx/sites-enabled/example.com ---здесь и далее, после nano вставляем нижеидущий код server { server_name example.com; location / { root /var/www/tech; #proxy_pass http://localhost:80; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_buffering off; # proxy_protocol: on; tcp_nodelay on; } } location /http-bind { proxy_pass http://localhost:5280/http-bind; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_buffering off; tcp_nodelay on; } location /xmpp-websocket { proxy_pass http://localhost:5280/xmpp-websocket; proxy_http_version 1.1; proxy_set_header Connection "Upgrade"; proxy_set_header Upgrade $http_upgrade; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_read_timeout 900s; } location /register_web { proxy_pass http://localhost:5280/register_web; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_buffering off; tcp_nodelay on; auth_basic "Private area"; auth_basic_user_file /var/www/protect/.htpasswd; } location /web { proxy_pass http://localhost:5280/conversejs; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_buffering off; tcp_nodelay on; } }Технічні домени:uploadsudo nano /etc/nginx/sites-enabled/upload.example.com server { listen 80; server_name upload.example.com; root /upload; location / { perl upload::handle; } } pubsubsudo nano /etc/nginx/sites-enabled/pubsub.example.com server { listen 80; server_name pubsub.example.com; root /var/www/tech; index index.html; location / { try_files $uri $uri/ =404; } }proxysudo nano /etc/nginx/sites-enabled/proxy.example.com server { listen 80; server_name proxy.example.com; root /var/www/tech; index index.html; location / { try_files $uri $uri/ =404; } }conferencesudo nano /etc/nginx/sites-enabled/conference.example.com server { listen 80; server_name conference.example.com; root /var/www/tech; index index.html; location / { try_files $uri $uri/ =404; } }Створюємо пароль для закритої реєстрації користувачів:perl -le 'print crypt("пароль_для_регистрации", "любые_символы_для_хэширования")'Далі записуємо згенерований пароль та вписуємо його у /var/www/protect/.htpasswd у форматі login:passwordmkdir /var/www/protect sudo nano /var/www/protect/.htpasswd login:passwordПідключаємо модуль upload для NGINX:mkdir /upload chown -R www-data:www-data /upload/ mkdir -p /usr/local/lib/perl wget -O /usr/local/lib/perl/upload.pm https://git.io/fNZgLДодамо модуль у конфіг:sudo nano /etc/nginx/nginx.conf perl_modules /usr/local/lib/perl; perl_require upload.pm; client_max_body_size 4096m;Впишемо пароль у конфіг perl:sudo nano /usr/local/lib/perl/upload.pm CTRL+W пишем external_secret ENTER и вписываем пароль $external_secret = 'ПАРОЛЬ'Перезапускаємо NGINX та перевіряємо його роботу:sudo systemctl restart nginx.service sudo systemctl status nginx.serviceЯкщо стартанув без помилок тиснемо CTRL + C і їдемо даліСертифікати Let's Encrypt+БДUPDATE: на сьогоднішній день сертбот поставляється через snap, версія на пітоні вважається застарілою, тобто вам потрібно встановити snap і certbot, далі отримати сертифікати на 5 доменів, які нижче за інструкцією https://certbot.eff.org/instructions?ws=nginx&os=ubuntusudo apt install python3-certbot-nginx certbot --nginx --rsa-key-size 4096 -d example.com certbot --nginx --rsa-key-size 4096 -d upload.example.com certbot --nginx --rsa-key-size 4096 -d conference.example.com certbot --nginx --rsa-key-size 4096 -d proxy.example.com certbot --nginx --rsa-key-size 4096 -d pubsub.example.comПісля цього можна зайти на домени та подивитися, чи працюють сертифікатиДалі встановлюємо базу даних та редагуємо конфіг:sudo apt install postgresql postgresql-contrib sudo nano /etc/postgresql/14/main/postgresql.conf и там вписываем listen_addresses = '127.0.0.1'(увага, версія Postgesql може бути інша, від цього залежить розташування конфіга в цифрі, замість 14 може бути наприклад 10 або 16)Перезапускаємо БД:sudo systemctl restart postgresql.serviceСтворюємо користувача БД:su - postgres createuser --pwprompt prosodyuserСтворюємо саму БД:psql и вставляем это CREATE DATABASE prosodyuser OWNER prosodyuser;Виходимо з БД \qУстановка Prosodysudo apt install prosody lua-event lua-dbi-postgresqlВстановлюємо модулі:(У версії 12 модулі начебто ставляться за умовчанням, але я не розбирався в таких тонкощах)cd /opt sudo apt install mercurial hg clone https://hg.prosody.im/prosody-modules/ prosody-modules chown -R prosody:prosody /opt/prosody-modules Створимо директорію для PID файлу:mkdir /var/run/prosody chown -R prosody:prosody /var/run/prosodyСтворюємо ключ Діффі-Хелмана:cd /etc/prosody/certs/ openssl dhparam -out dh-2048.pem 2048 chown prosody:prosody dh-2048.pem chmod u=rw,go= dh-2048.pemВстановимо пакет для імпорту сертифікатів Prosody:sudo apt install lua-secТепер переходимо до настроювання конфіга самого Prosody:sudo nano /etc/prosody/prosody.cfg.luaІ туди вставляємо наступний конфіг:pidfile = "/var/run/prosody/prosody.pid"; ---администраторы сервера--- admins = { "user@example.com" } ---Отключаем регистрацию через клиенты--- allow_registration = false ---Хранить всё в БД--- default_storage = "sql" sql = { driver = "PostgreSQL"; database = "prosodyuser"; host = "127.0.0.1"; port = 5432; username = "prosodyuser"; password = "ПАРОЛЬ_ОТ_ПОЛЬЗОВАТЕЛЯ_БД"; } sql_manage_tables = true ---Сертификаты--- certificates = "/etc/prosody/certs" ---http http_host = "127.0.0.1" http_ports = { 5280 } https_ports = { } http_interfaces = { "127.0.0.1" } trusted_proxies = { "127.0.0.1" } ---Методы шифрования--- ssl = { --key = "/etc/prosody/certs/example.com.key"; --certificate = "/etc/prosody/certs/example.com.crt"; options = { "no_sslv3", "no_sslv2", "no_ticket", "no_compression", "cipher_server_preference", "single_dh_use", "single_ecdh_use" }; ciphers="EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:AES256-GCM-SHA384"; protocol = "tlsv1_1+"; dhparam = "/etc/prosody/certs/dh-2048.pem"; } ---Обязательное шифрование Клиент сервер и Сервер и сервер c2s_require_encryption = true; s2s_require_encryption = true; s2s_secure_auth = true; ---Модули--- plugin_paths = { "/opt/prosody-modules/" } ---Глобальные модули--- modules_enabled = { -- Wichtige Module "roster"; "saslauth"; "tls"; "dialback"; "disco"; -- Empfohlene Module "private"; "profile"; "offline"; "admin_adhoc"; "admin_telnet"; --"http_files"; "legacyauth"; "version"; "uptime"; "time"; "ping"; "register"; "posix"; "bosh"; "announce"; -- "proxy65"; "pep"; "smacks"; "carbons"; "blocklist"; "csi"; "csi_battery_saver"; "mam"; "lastlog"; "list_inactive"; "cloud_notify"; "compat_dialback"; "throttle_presence"; "log_auth"; "server_contact_info"; "websocket"; "bookmarks"; "privacy_lists"; --"pubsub"; "filter_chatstates"; "vcard_legacy"; "pinger"; -- "turncredentials"; "http_upload_external"; "register_web"; "http_altconnect"; "conversejs"; "turn_external"; }; ---Выключаем логи--- log = { --debug = "/var/log/prosody/debug.log"; --info = "/var/log/prosody/info.log"; --warn = "/var/log/prosody/warn.log"; --error = "/var/log/prosody/error.log"; } ---Настройка архива сообщений, можно выставить в днях, или отключить вовсе--- default_archive_policy = true; archive_expires_after = "1d"; ---EXTERNAL HTTP UPLOAD--- http_upload_external_base_url = "https://upload.example.com/" http_upload_external_secret = "ПАРОЛЬ_ОТ_UPLOAD" http_upload_external_file_size_limit = 536870912 --4Gb ---шаблон для веб регистрации--- register_web_template = "/etc/prosody/register-templates/Prosody-Web-Registration-Theme" ---Websocket--- consider_websocket_secure = true; --cross_domain_websocket = true; ---настройки веб клиента--- conversejs_options = { debug = false; view_mode = "fullscreen"; } conversejs_tags = { -- Load libsignal-protocol.js for OMEMO support (GPLv3; be aware of licence implications) [[<script src="https://cdn.conversejs.org/3rdparty/libsignal-protocol.min.js"></script>]]; } ---cross_domain_bosh = true; consider_bosh_secure = true; ---TURN STUN для звонков--- turn_external_host = "example.com" turn_external_port = 3478 turn_external_secret = "ПАРОЛЬ" contact_info = { abuse = { "mailto:user@example.com", "xmpp:user@example.com" }; admin = { "mailto:user@example.com", "xmpp:user@example.com" }; feedback = { "mailto:user@example.com", "xmpp:user@example.com" }; sales = { "mailto:user@example.com", "xmpp:user@example.com" }; security = { "mailto:user@example.com", "xmpp:user@example.com" }; support = { "mailto:user@example.com", "xmpp:user@example.com" }; }; ---domain--- c2s_direct_tls_ports = { 5223 } c2s_direct_tls_ssl = { certificate = "/etc/prosody/certs/example.com.crt"; key = "/etc/prosody/certs/example.com.key"; } VirtualHost "example.com" http_host = "example.com" http_external_url = "https://example.com/" authentication = "internal_hashed" Component "conference.example.com" "muc" name = "example.com chatrooms" restrict_room_creation = "local" muc_room_default_public = false muc_room_default_members_only = true muc_room_default_language = "ru" max_history_messages = 500 modules_enabled = { "muc_mam", "vcard_muc", "muc_cloud_notify"; } muc_log_by_default = true disco_items = { { "conference.example.com", "example.com MUC" }; } Component "pubsub.example.com" "pubsub" Component "proxy.example.com" "proxy65" proxy65_acl = { "example.com" } Після зміни конфігу перезапускаємо Prosody:sudo systemctl restart prosody.service sudo systemctl status prosody.serviceІмпортуємо сертифікати, які створили за допомогою Let's Encrypt:sudo prosodyctl --root cert import /etc/letsencrypt/liveСтворюємо веб-інтерфейс для реєстрації:mkdir /etc/prosody/register-templates/ cd /etc/prosody/register-templates git clone https://gitlab.com/mimi89999/Prosody-Web-Registration-Theme.gitНалаштування дзвінківУстановка Coturn для дзвінків через Conversation та Dinosudo apt install coturnДалі правимо конфіг:sudo nano /etc/turnserver.conf use-auth-secret static-auth-secret=ПАРОЛЬ_ДЛЯ_КОТЮРНА realm=example.com # VoIP traffic is all UDP. There is no reason to let users connect to arbitrary TCP endpoints via the relay. no-tcp-relay # don't let the relay ever try to connect to private IP address ranges within your network (if any) # given the turn server is likely behind your firewall, remember to include any privileged public IPs too. denied-peer-ip=10.0.0.0-10.255.255.255 denied-peer-ip=192.168.0.0-192.168.255.255 denied-peer-ip=172.16.0.0-172.31.255.255 # special case the turn server itself so that client->TURN->TURN->client flows work allowed-peer-ip=10.0.0.1 # consider whether you want to limit the quota of relayed streams per user (or total) to avoid risk of DoS. user-quota=12 # 4 streams per video call, so 12 streams = 3 simultaneous relayed calls per user. total-quota=1200І ще один:sudo nano /etc/default/coturn расскоментируйте строчку enable 1 и sudo systemctl enable --now coturn sudo systemctl restart coturn sudo systemctl status coturnІмпорт сертифікатів за допомогою Cron:sudo crontab -e 0 5 * * 1 /usr/bin/certbot renew --renew-hook "prosodyctl --root cert import /etc/letsencrypt/live" --quietВключаємо файрвол:sudo ufw allow 3478 sudo ufw allow 5222 sudo ufw allow 5000 sudo ufw allow 5269 sudo ufw allow ssh sudo ufw allow 443 sudo ufw allow 80 sudo ufw enable Видалення файлів користувачівОскільки автоочищення файлів немає, можна видаляти їх через Cron залежно від часу:sudo nano /etc/cron.daily/deletefilesВставляємо:#!/bin/sh find /upload/ -type f -mtime +30 -exec rm -v {} \;Після цього скрипт перевірятиме дати файлів і видалятиме все, що старше 30 днів.Робимо файл виконуваним:chmod +x deletefilesРеєстрація користувачів відбувається на сторінці https://example.com/register_web, якщо ви попередньо надіслали їм логін та пароль для заходуВеб клієнт Converse.js знаходиться тут https://example.com/webКлієнтиКлієнти для смартфонів:Conversations https://conversations.im/ AndroidBlabber https://blabber.im/en.html AndroidMonal https://monal.im/ iOSSiskin https://siskin.im/ iOSКлієнти для ПК:Gajim https://gajim.org/ GNU/Linux та WindowsDINO https://dino.im/ GNU/LinuxWeb клієнт:https://conversejs.org/Стаття розповсюджується під ліцензією GNU FDL 1.3, повний текст ліцензії доступний на https://www.gnu.org/licenses/fdl-1.3.html
Для публікації повідомлень створіть обліковий запис або авторизуйтесь