Развертывание XMPP-сервера ejabberd традиционно требовало установки зависимостей, компиляции и сложной настройки. Сегодня, благодаря контейнеризации, этот процесс стал значительно проще. Давай разберем, как быстро и правильно установить ejabberd с помощью Docker Compose — инструмента, который превращает запуск сложных приложений в одну команду.
Подготовка окружения для установки ejabberd
Перед началом убедись, что на твоей системе установлены необходимые инструменты. Вот что тебе понадобится:
- Docker версии 20.10 или выше
- Docker Compose версии 2.0 или выше
- Доступ к командной строке с правами администратора (или возможность использовать
sudo) - Открытые порты 5222 (клиентские соединения), 5269 (сервер-сервер), 5443 (админка)
docker compose version. Если используешь старую версию (v1), замени в дальнейшем команды docker compose на docker-compose.
Создание структуры проекта и Docker Compose файла
Для удобства управления создай отдельную директорию для проекта ejabberd. Внутри нее мы разместим все необходимые конфигурационные файлы.
mkdir ejabberd-docker && cd ejabberd-docker
mkdir -p config data uploads
Теперь создай основной файл docker-compose.yml. Этот файл описывает наш сервис ejabberd, его настройки, тома и порты.
version: '3.8'
services:
ejabberd:
image: ejabberd/ecs:latest
container_name: ejabberd
restart: unless-stopped
ports:
- "5222:5222" # Стандартный порт для клиентов
- "5269:5269" # Порт для соединений между серверами (s2s)
- "5443:5443" # Административный интерфейс (HTTPS)
- "1883:1883" # MQTT (опционально)
- "5280:5280" # HTTP-биндинг, BOSH, Websocket
environment:
- EJABBERD_ADMINS=admin@your-domain.com
- EJABBERD_DOMAIN=your-domain.com
- EJABBERD_HOSTS=your-domain.com
- EJABBERD_MQTTPORT=1883
- EJABBERD_STARTTLS=true
- EJABBERD_S2S_SSL=true
volumes:
- ./config:/home/ejabberd/conf
- ./data:/home/ejabberd/database
- ./uploads:/home/ejabberd/upload
networks:
- ejabberd-network
networks:
ejabberd-network:
driver: bridge
your-domain.com на твое реальное доменное имя. Для локального тестирования можно использовать что-то вроде localhost, но для реального использования нужен настоящий домен с правильно настроенными DNS-записями (A/AAAA).
Базовая настройка ejabberd через конфигурационный файл
Хотя мы задали некоторые параметры через переменные окружения, основные настройки лучше вынести в отдельный файл ejabberd.yml. Создай его в директории config.
# Основные настройки хоста
default_realm: "your-domain.com"
hosts:
- "your-domain.com"
# Настройки администраторов
acl:
admin:
user:
- "admin@your-domain.com"
# Конфигурация модулей
modules:
mod_roster: {}
mod_last: {}
mod_offline: {}
mod_privacy: {}
mod_private: {}
mod_pubsub:
access_createnode: pubsub_createnode
plugins:
- "flat"
- "pep"
force_node_config:
"eu.siacs.conversations.axolotl.*":
access_model: open
# Настройки хранилища (используем Mnesia из коробки)
###
# Логирование
loglevel: 4
log_rotate_size: 10485760
log_rotate_count: 1
# Ограничения
max_fsm_queue: 10000
shaper:
normal: 1000
fast: 50000
Запуск и первоначальная настройка ejabberd контейнера
Теперь, когда все файлы готовы, можно запускать наш XMPP-сервер. Выполни команду из директории с docker-compose.yml.
docker compose up -d
После запуска проверь статус контейнера:
docker compose ps
docker compose logs -f ejabberd
Для первоначальной настройки и создания учетной записи администратора выполни команду внутри контейнера:
docker compose exec ejabberd bin/ejabberd register admin your-domain.com your-secure-password
https://your-domain.com:5443 (или https://localhost:5443 для локального тестирования). Логин: admin@your-domain.com, пароль: тот, что указал при регистрации.
Настройка TLS/SSL сертификатов для безопасного соединения
Для работы в production обязательно нужны SSL-сертификаты. Самый простой способ — использовать Let's Encrypt. Помести сертификаты в директорию config и обнови конфигурацию.
# Пример структуры с сертификатами Let's Encrypt
# Допустим, сертификаты лежат в /etc/letsencrypt/live/your-domain.com/
cp /etc/letsencrypt/live/your-domain.com/fullchain.pem ./config/
cp /etc/letsencrypt/live/your-domain.com/privkey.pem ./config/
# Важно установить правильные права доступа
chmod 644 ./config/fullchain.pem
chmod 600 ./config/privkey.pem
Добавь в config/ejabberd.yml секцию с настройками сертификатов:
# Конфигурация TLS/SSL
certfiles:
- "/home/ejabberd/conf/fullchain.pem"
- "/home/ejabberd/conf/privkey.pem"
c2s_ciphers: "HIGH:!aNULL:!3DES"
c2s_protocol_options: "no_sslv2,no_sslv3,no_tlsv1"
c2s_dhfile: "/home/ejabberd/conf/dh.pem"
Оптимизация и расширенная конфигурация Docker Compose
Для production-среды рекомендуется добавить настройки ресурсов, healthcheck и использовать внешние сети. Вот улучшенная версия docker-compose.yml:
version: '3.8'
services:
ejabberd:
image: ejabberd/ecs:latest
container_name: ejabberd
restart: unless-stopped
hostname: xmpp.your-domain.com
ports:
- "5222:5222"
- "5269:5269"
- "5443:5443"
- "5280:5280"
environment:
- EJABBERD_DOMAIN=your-domain.com
- EJABBERD_ADMINS=admin@your-domain.com
- TZ=Europe/Moscow
volumes:
- ./config:/home/ejabberd/conf:ro
- ./data:/home/ejabberd/database
- ./uploads:/home/ejabberd/upload
networks:
- xmpp-network
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
healthcheck:
test: ["CMD", "bin/ejabberd", "status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
xmpp-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
Часто задаваемые вопросы (FAQ) по установке ejabberd с Docker Compose
Как обновить ejabberd до новой версии?
Обновление выполняется просто: останови контейнер, обнови образ и перезапусти. Выполни команды: docker compose pull ejabberd для загрузки нового образа, затем docker compose up -d --force-recreate. Конфигурация и данные сохранятся, так как они хранятся в томах.
Где хранятся данные ejabberd (логи, база, файлы)?
Все данные персистентно хранятся в смонтированных томах на хостовой машине:
- ./config — конфигурационные файлы ejabberd.yml
- ./data — база данных Mnesia (учетные записи, ростеры, настройки)
- ./uploads — загруженные пользователями файлы (HTTP Upload)
- Логи можно просматривать через
docker compose logsили настроить их вывод в отдельный том.
Как настроить кластеризацию ejabberd в Docker?
Для кластеризации нужно запустить несколько контейнеров ejabberd с уникальными именами и настроить их на взаимодействие через Erlang-ноды. Ключевые шаги: задать уникальный ERLANG_NODE для каждого контейнера, разрешить взаимодействие через настройки файрвола (порт 4369 и диапазон epmd), использовать общую секретную cookie (ERLANG_COOKIE). Это продвинутая тема, требующая отдельного детального руководства.
Почему не работает админка на порту 5443?
Проверь следующее:
- Контейнер запущен (
docker compose ps). - Порт 5443 проброшен и не занят другим процессом на хосте.
- В логах нет ошибок инициализации (
docker compose logs ejabberd). - Ты используешь HTTPS (
https://your-domain.com:5443), а не HTTP. - Если используешь домен, убедись, что DNS-записи ведут на IP-адрес твоего сервера.
Основные команды для управления контейнером ejabberd
| Команда | Описание | Пример |
|---|---|---|
| Запуск | Запускает контейнер в фоне | docker compose up -d |
| Остановка | Останавливает контейнер | docker compose down |
| Логи | Показывает логи в реальном времени | docker compose logs -f |
| Выполнить команду | Запускает команду внутри контейнера | docker compose exec ejabberd bin/ejabberd status |
| Рестарт | Перезапускает контейнер | docker compose restart |
Заключение
Установка ejabberd с Docker Compose — это современный, эффективный и воспроизводимый способ развертывания XMPP-сервера. Ты не только избавляешься от проблем с зависимостями и версиями, но и получаешь удобную систему для управления, обновления и масштабирования. Представь, что теперь твоя конфигурация — это код, который можно версионировать в Git, а запуск нового сервера — это просто git clone и docker compose up -d. Используй эту мощь для построения отказоустойчивой и удобной в обслуживании инфраструктуры мгновенных сообщений.