6370
правок
Rain (обсуждение | вклад) м |
Rain (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
В этой статье приводится пример конфигурирования ejabberd с поддержкой актуальных и популярных функций. В качестве основы взят конфиг-файл с работающего сервера версии 21.12, а в качестве сертификатов используется Let's Encrypt - и все это установлено на Debian GNU/Linux. | |||
Рассмотрим особенности данной конфигурации. | |||
== DNS-записи == | |||
Хотя для базового варианта своего jabber-сервера вполне достаточно [[Регистрация доменного имени|бесплатного DynDNS-домена]], для полноценной конфигурации все же нужно обзавестись собственным доменом, где можно будет добавить все необходимые DNS-записи и сделать субдомены для сервисов. Выбор регистратора и покупка домена остается за рамками данной статьи, тут только приводятся шаги, которые надо сделать после покупки домена в его админке. | |||
| | |||
Всего понадобится около 15 записей в DNS: | |||
# Для удобства, чтобы в случае миграции сервера с одного IP на другой не приходилось переписывать все записи, стоит завести для него субдомен, который будет ссылаться на нужный IP с помощью А-записи (или 2 таких субдомена в случае использования IPv4+IPv6 - один с A-записью, а второй с AAAA), а все остальные записи сделать CNAME-алиасами для него. Например, для данного сервера ('''jabberworld.info''') сделаны 2 субдомена '''xmpp.jabberworld.info''', ссылающиеся на IPv4 и IPv6-адреса. | |||
# Создаем субдомены для необходимых сервисов сервера - '''conference''' (для [[Конференции|конференций]]), '''proxy''' (прокси для прямой [[Передача файлов|передачи файлов]]), '''pubsub''' (сервисы типа "Публикация/подписка", где может сохраняться самая разная информация) и '''upload''' (сервис для [[Передача файлов|передачи файлов]] через HTTP Upload). Все эти записи создаем как CNAME на наш субдомен из 1-го пункта. | |||
# Создаем ряд SRV-записей для нашего основного домена - они показывают, где именно какой сервис находится. Конечно, если у вас все на одном адресе, то будет работать и так, но мы ведь решили все делать правильно, верно? Итак, нужны такие SRV-записи: | |||
:: '''_xmpp-client._tcp.EXAMPLE.COM''' (порт '''5222''') - чтобы указать, куда подключаться [[Клиенты Jabber|jabber-клиенту]] | |||
:: '''_xmpps-client._tcp.EXAMPLE.COM''' (порт '''5223''') - аналогичная запись для TLS-подключений клиентов | |||
:: '''_xmpp-server._tcp.EXAMPLE.COM''' (порт '''5269''') - чтобы указать, куда подключаться [[Публичные серверы Jabber|jabber-серверу]] | |||
:: '''_xmpps-server._tcp.EXAMPLE.COM''' (порт '''5270''') - аналогичная запись для TLS-подключений серверов. | |||
Записи ниже служат для работы сервиса аудио/видеозвонков через jabber: | |||
:: '''_stun._tcp.EXAMPLE.COM''' (порт '''3478''') - STUN через TCP | |||
:: '''_stun._udp.EXAMPLE.COM''' (порт '''3478''') - STUN через UDP | |||
:: '''_stuns._tcp.EXAMPLE.COM''' (порт '''5349''') - шифрованный STUN через TCP | |||
:: '''_turn._tcp.EXAMPLE.COM''' (порт '''3478''') - TURN через TCP | |||
:: '''_turn._udp.EXAMPLE.COM''' (порт '''3478''') - TURN через UDP | |||
:: '''_turns._tcp.EXAMPLE.COM''' (порт '''5349''') - шифрованный TURN через TCP | |||
| | |||
| | Во всех случаях target'ом для записей служит наш алиас из первого пункта. | ||
{{Hider hiding | |||
|title=ejabberd.yml | |||
|content=<pre> | |||
### | |||
### ejabberd configuration file | |||
### | |||
### The parameters used in this configuration file are explained at | |||
### | |||
### https://docs.ejabberd.im/admin/configuration | |||
### | |||
### The configuration file is written in YAML. | |||
### ******************************************************* | |||
### ******* !!! WARNING !!! ******* | |||
### ******* YAML IS INDENTATION SENSITIVE ******* | |||
### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY ******* | |||
### ******************************************************* | |||
### Refer to http://en.wikipedia.org/wiki/YAML for the brief description. | |||
### However, ejabberd treats different literals as different types: | |||
### | |||
### - unquoted or single-quoted strings. They are called "atoms". | |||
### Example: dog, 'Jupiter', '3.14159', YELLOW | |||
### | |||
### - numeric literals. Example: 3, -45.0, .0 | |||
### | |||
### - quoted or folded strings. | |||
### Examples of quoted string: "Lizzard", "orange". | |||
### Example of folded string: | |||
### > Art thou not Romeo, | |||
### and a Montague? | |||
### | |||
# | |||
--- | |||
## loglevel: Verbosity of log files generated by ejabberd | |||
## 0: No ejabberd log at all (not recommended) | |||
## 1: Critical | |||
## 2: Error | |||
## 3: Warning | |||
## 4: Info | |||
## 5: Debug | |||
loglevel: 4 | |||
## rotation: Disable ejabberd's internal log rotation, as the Debian package | |||
## uses logrotate(8). | |||
log_rotate_count: 0 | |||
#log_rotate_date: "" | |||
## hosts: Domains served by ejabberd. | |||
## You can define one or several, for example: | |||
## hosts: | |||
## - "example.net" | |||
## - "example.com" | |||
## - "example.org" | |||
hosts: | |||
- "EXAMPLE.COM" | |||
certfiles: | |||
- "/etc/ejabberd/certs/conference.EXAMPLE.COM.fullchain.pem" | |||
- "/etc/ejabberd/certs/conference.EXAMPLE.COM.privkey.pem" | |||
- "/etc/ejabberd/certs/EXAMPLE.COM.fullchain.pem" | |||
- "/etc/ejabberd/certs/EXAMPLE.COM.privkey.pem" | |||
- "/etc/ejabberd/certs/pubsub.EXAMPLE.COM.fullchain.pem" | |||
- "/etc/ejabberd/certs/pubsub.EXAMPLE.COM.privkey.pem" | |||
- "/etc/ejabberd/certs/upload.EXAMPLE.COM.fullchain.pem" | |||
- "/etc/ejabberd/certs/upload.EXAMPLE.COM.privkey.pem" | |||
- "/etc/ejabberd/certs/proxy.EXAMPLE.COM.fullchain.pem" | |||
- "/etc/ejabberd/certs/proxy.EXAMPLE.COM.privkey.pem" | |||
## TLS configuration | |||
define_macro: | |||
'TLS_CIPHERS': "HIGH:!aNULL:!eNULL:!3DES:@STRENGTH" | |||
'TLS_OPTIONS': | |||
- "no_sslv3" | |||
# - "no_tlsv1" | |||
# - "no_tlsv1_1" | |||
- "cipher_server_preference" | |||
- "no_compression" | |||
## generated with: openssl dhparam -out dhparams.pem 2048 | |||
c2s_ciphers: 'TLS_CIPHERS' | |||
s2s_ciphers: 'TLS_CIPHERS' | |||
c2s_protocol_options: 'TLS_OPTIONS' | |||
s2s_protocol_options: 'TLS_OPTIONS' | |||
## c2s_dhfile: 'DH_FILE' | |||
s2s_dhfile: "/etc/ejabberd/dhparams.pem" | |||
listen: | |||
- | |||
port: 3478 | |||
ip: "::" | |||
transport: udp | |||
module: ejabberd_stun | |||
auth_realm: "@HOST@" | |||
use_turn: true | |||
## The server's public IPv4 address: | |||
turn_ipv4_address: "123.123.123.123" | |||
## The server's public IPv6 address: | |||
turn_ipv6_address: "2a01:0123:0123:0123::" | |||
- | |||
port: 3478 | |||
ip: "::" | |||
transport: tcp | |||
module: ejabberd_stun | |||
auth_realm: "@HOST@" | |||
use_turn: true | |||
## The server's public IPv4 address: | |||
turn_ipv4_address: "123.123.123.123" | |||
## The server's public IPv6 address: | |||
turn_ipv6_address: "2a01:0123:0123:0123::" | |||
- | |||
port: 5349 | |||
transport: tcp | |||
module: ejabberd_stun | |||
use_turn: true | |||
tls: true | |||
ip: "::" | |||
## The server's public IPv4 address: | |||
turn_ipv4_address: "123.123.123.123" | |||
## The server's public IPv6 address: | |||
turn_ipv6_address: "2a01:0123:0123:0123::" | |||
- | |||
port: 5000 | |||
ip: "::" | |||
module: ejabberd_http | |||
tls: true | |||
request_handlers: | |||
/conversejs: mod_conversejs | |||
/: mod_http_fileserver | |||
- | |||
port: 5222 | |||
ip: "::" | |||
module: ejabberd_c2s | |||
max_stanza_size: 262144 | |||
shaper: c2s_shaper | |||
access: c2s | |||
zlib: true | |||
starttls_required: true | |||
protocol_options: 'TLS_OPTIONS' | |||
- | |||
port: 5223 | |||
ip: "::" | |||
module: ejabberd_c2s | |||
max_stanza_size: 262144 | |||
shaper: c2s_shaper | |||
access: c2s | |||
tls: true | |||
zlib: true | |||
starttls_required: true | |||
protocol_options: 'TLS_OPTIONS' | |||
- | |||
port: 5269 | |||
ip: "::" | |||
module: ejabberd_s2s_in | |||
max_stanza_size: 524288 | |||
- | |||
port: 5270 | |||
ip: "::" | |||
tls: true | |||
module: ejabberd_s2s_in | |||
max_stanza_size: 524288 | |||
- | |||
port: 5280 | |||
ip: "::" | |||
module: ejabberd_http | |||
request_handlers: | |||
"/captcha": ejabberd_captcha | |||
tls: true | |||
- | |||
port: 5281 | |||
ip: "::" | |||
module: ejabberd_http | |||
request_handlers: | |||
"/admin": ejabberd_web_admin | |||
tls: true | |||
- | |||
port: 5282 | |||
ip: "::" | |||
module: ejabberd_http | |||
request_handlers: | |||
"/captcha": ejabberd_captcha | |||
"/register": mod_register_web | |||
tls: true | |||
- | |||
port: 5283 | |||
ip: "::" | |||
module: ejabberd_http | |||
request_handlers: | |||
"/api": mod_http_api | |||
"/bosh": mod_bosh | |||
"/upload": mod_http_upload | |||
"/ws": ejabberd_http_ws | |||
"/captcha": ejabberd_captcha | |||
tls: true | |||
## Disabling digest-md5 SASL authentication. digest-md5 requires plain-text | |||
## password storage (see auth_password_format option). | |||
disable_sasl_mechanisms: | |||
- "digest-md5" | |||
- "X-OAUTH2" | |||
s2s_use_starttls: required | |||
## Store the plain passwords or hashed for SCRAM: | |||
auth_password_format: scram | |||
## Full path to a script that generates the image. | |||
captcha_cmd: "/usr/share/ejabberd/captcha.sh" | |||
#captcha_url: "https://xmpp.EXAMPLE.COM:5282" | |||
captcha_host: "https://EXAMPLE.COM:5282" | |||
acl: | |||
admin: | |||
user: | |||
- "ADMIN": "EXAMPLE.COM" | |||
local: | |||
user_regexp: "" | |||
loopback: | |||
ip: | |||
- "127.0.0.0/8" | |||
- "::1/128" | |||
- "::FFFF:127.0.0.1/128" | |||
access_rules: | |||
local: | |||
- allow: local | |||
c2s: | |||
- deny: blocked | |||
- allow | |||
announce: | |||
- allow: admin | |||
configure: | |||
- allow: admin | |||
muc_create: | |||
- allow: local | |||
muc: | |||
- allow | |||
pubsub_createnode: | |||
- allow: local | |||
register: | |||
- allow | |||
trusted_network: | |||
- allow: loopback | |||
#webadmin_view: | |||
# - viewers: allow | |||
api_permissions: | |||
"console commands": | |||
from: | |||
- ejabberd_ctl | |||
who: all | |||
what: "*" | |||
"admin access": | |||
who: | |||
- access: | |||
- allow: | |||
- acl: loopback | |||
- acl: admin | |||
- oauth: | |||
- scope: "ejabberd:admin" | |||
- access: | |||
- allow: | |||
- acl: loopback | |||
- acl: admin | |||
what: | |||
- "*" | |||
- "!stop" | |||
- "!start" | |||
"public commands": | |||
who: | |||
- ip: "127.0.0.1/8" | |||
what: | |||
- "status" | |||
- "connected_users_number" | |||
shaper: | |||
normal: 2500 | |||
fast: 50000 | |||
shaper_rules: | |||
max_user_sessions: 25 | |||
max_user_offline_messages: | |||
- 5000: admin | |||
- 200 | |||
c2s_shaper: | |||
- none: admin | |||
- normal | |||
s2s_shaper: fast | |||
modules: | |||
mod_adhoc: {} | |||
mod_admin_extra: {} | |||
mod_announce: | |||
access: announce | |||
mod_avatar: {} | |||
mod_blocking: {} | |||
mod_bosh: {} | |||
mod_caps: {} | |||
mod_carboncopy: {} | |||
mod_client_state: {} | |||
mod_configure: {} | |||
## mod_delegation: {} # for xep0356 | |||
mod_disco: | |||
server_info: | |||
- | |||
modules: all | |||
name: "abuse-addresses" | |||
urls: | |||
- "xmpp:ADMIN@EXAMPLE.COM" | |||
- "mailto:ADMIN@EXAMPLE.COM" | |||
- | |||
modules: [mod_muc] | |||
name: "Web chatroom logs" | |||
urls: ["https://chatlogs.EXAMPLE.COM"] | |||
- | |||
modules: all | |||
name: "support-addresses" | |||
urls: | |||
- "xmpp:ADMIN@EXAMPLE.COM" | |||
- "xmpp:support@conference.EXAMPLE.COM?join" | |||
- "https://my.cool.site" | |||
mod_fail2ban: {} | |||
mod_http_api: {} | |||
mod_http_upload: | |||
put_url: "https://@HOST@:5283/upload" | |||
thumbnail: false | |||
jid_in_url: sha1 | |||
custom_headers: | |||
"Access-Control-Allow-Origin": "*" | |||
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS" | |||
"Access-Control-Allow-Headers": "Content-Type" | |||
mod_http_upload_quota: | |||
max_days: 180 | |||
mod_mam: | |||
## ## Mnesia is limited to 2GB, better to use an SQL backend | |||
## ## For small servers SQLite is a good fit and is very easy | |||
## ## to configure. Uncomment this when you have SQL configured: | |||
db_type: sql | |||
assume_mam_usage: true | |||
default: roster | |||
compress_xml: true | |||
use_cache: true | |||
cache_life_time: 86400 | |||
mod_muc: | |||
access: | |||
- allow | |||
access_admin: | |||
- allow: admin | |||
access_create: muc_create | |||
access_persistent: muc_create | |||
default_room_options: | |||
mam: true | |||
mod_muc_admin: {} | |||
mod_offline: | |||
access_max_user_messages: max_user_offline_messages | |||
mod_muc_log: | |||
outdir: "/var/www/chatlogs" | |||
access_log: muc | |||
cssfile: /var/www/chatlogs.EXAMPLE.COM/htdocs/muc.css | |||
#cssfile: http://chatlogs.EXAMPLE.COM/muc.css | |||
mod_ping: {} | |||
mod_pres_counter: | |||
count: 5 | |||
interval: 60 | |||
mod_privacy: {} | |||
mod_private: {} | |||
mod_proxy65: | |||
# remove ip? | |||
ip: 123.123.123.123 | |||
access: local | |||
max_connections: 10 | |||
mod_pubsub: | |||
access_createnode: pubsub_createnode | |||
plugins: | |||
- "flat" | |||
- "pep" | |||
force_node_config: | |||
"eu.siacs.conversations.axolotl.*": | |||
access_model: open | |||
## Avoid buggy clients to make their bookmarks public | |||
"storage:bookmarks": | |||
access_model: whitelist | |||
mod_push: {} | |||
mod_push_keepalive: {} | |||
mod_register: | |||
## Only accept registration requests from the "trusted" | |||
## network (see access_rules section above). | |||
## Think twice before enabling registration from any | |||
## address. See the Jabber SPAM Manifesto for details: | |||
## https://github.com/ge0rg/jabber-spam-fighting-manifesto | |||
#ip_access: trusted_network | |||
ip_access: all | |||
captcha_protected: true | |||
registration_watchers: | |||
- "ADMIN@EXAMPLE.COM" | |||
welcome_message: | |||
subject: "Добро пожаловать на Jabber-сервер!" | |||
body: "Приветствую. Ведите себя хорошо. Доступен веб-клиент ConverseJS по адресу https://xmpp.EXAMPLE.COM. Лимит на загружаемые файлы - 100 МБ. Срок хранения - 180 дней." | |||
mod_roster: | |||
versioning: true | |||
mod_s2s_dialback: {} | |||
mod_shared_roster: {} | |||
mod_sic: {} | |||
mod_stream_mgmt: | |||
resend_on_timeout: if_offline | |||
mod_vcard: | |||
search: false | |||
mod_stun_disco: | |||
services: | |||
- | |||
host: 123.123.123.123 | |||
port: 3478 | |||
type: stun | |||
transport: udp | |||
restricted: false | |||
- | |||
host: 123.123.123.123 | |||
port: 3478 | |||
type: turn | |||
transport: udp | |||
restricted: true | |||
- | |||
host: 123.123.123.123 | |||
port: 3478 | |||
type: stun | |||
transport: tcp | |||
restricted: false | |||
- | |||
host: 123.123.123.123 | |||
port: 3478 | |||
type: turn | |||
transport: tcp | |||
restricted: true | |||
- | |||
host: "2a01:0123:0123:0123::" | |||
port: 3478 | |||
type: stun | |||
transport: udp | |||
restricted: false | |||
- | |||
host: "2a01:0123:0123:0123::" | |||
port: 3478 | |||
type: turn | |||
transport: udp | |||
restricted: true | |||
- | |||
host: "2a01:0123:0123:0123::" | |||
port: 3478 | |||
type: stun | |||
transport: tcp | |||
restricted: false | |||
- | |||
host: "2a01:0123:0123:0123::" | |||
port: 3478 | |||
type: turn | |||
transport: tcp | |||
restricted: true | |||
- | |||
host: EXAMPLE.COM | |||
port: 5349 | |||
type: stuns | |||
transport: tcp | |||
restricted: false | |||
- | |||
host: EXAMPLE.COM | |||
port: 5349 | |||
type: turns | |||
transport: tcp | |||
restricted: true | |||
mod_vcard_xupdate: {} | |||
mod_version: | |||
show_os: false | |||
mod_stats: {} | |||
mod_last: {} | |||
# mod_time: {} | |||
mod_conversejs: | |||
websocket_url: "wss://EXAMPLE.COM:5283/ws" | |||
conversejs_script: "https://EXAMPLE.COM:5000/converse.min.js" | |||
conversejs_css: "https://EXAMPLE.COM:5000/converse.min.css" | |||
# bosh_service_url: "https://EXAMPLE.COM:5283/bosh" | |||
default_domain: "EXAMPLE.COM" | |||
mod_http_fileserver: | |||
docroot: "/var/www/ejabberd/package/dist" | |||
accesslog: "/var/log/ejabberd/fileserver-access.log" | |||
custom_headers: | |||
"Access-Control-Allow-Origin": "*" | |||
"Access-Control-Allow-Methods": "GET,HEAD,OPTIONS" | |||
"Access-Control-Allow-Headers": "Content-Type" | |||
default_db: sql | |||
sql_type: mysql | |||
sql_server: "localhost" | |||
host_config: | |||
"EXAMPLE.COM": | |||
sql_database: "JABBERDB" | |||
sql_username: "DBUSER" | |||
sql_password: "SUPERPASSWORD" | |||
sql_port: 3306 | |||
language: "ru" | |||
### Local Variables: | |||
### mode: yaml | |||
### End: | |||
### vim: set filetype=yaml tabstop=8 | |||
</pre> | |||
}} | |||
[[Category:Вики]] | [[Category:Вики]] |