Песочница: различия между версиями
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:Вики]] |
Версия 16:08, 20 августа 2022
В этой статье приводится пример конфигурирования 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-клиенту
- _xmpps-client._tcp.EXAMPLE.COM (порт 5223) - аналогичная запись для TLS-подключений клиентов
- _xmpp-server._tcp.EXAMPLE.COM (порт 5269) - чтобы указать, куда подключаться 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'ом для записей служит наш алиас из первого пункта.
### ### 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