Установка ejabberd с Docker Compose: пошаговый гайд и конфигурация | AdminWiki

Полное руководство по установке ejabberd с Docker Compose: от конфигурации до запуска

19 декабря 2025 7 мин. чтения #devops #docker #docker compose #ejabberd #xmpp #контейнеризация #установка

Развертывание XMPP-сервера ejabberd традиционно требовало установки зависимостей, компиляции и сложной настройки. Сегодня, благодаря контейнеризации, этот процесс стал значительно проще. Давай разберем, как быстро и правильно установить ejabberd с помощью Docker Compose — инструмента, который превращает запуск сложных приложений в одну команду.

Подготовка окружения для установки ejabberd

Перед началом убедись, что на твоей системе установлены необходимые инструменты. Вот что тебе понадобится:

  • Docker версии 20.10 или выше
  • Docker Compose версии 2.0 или выше
  • Доступ к командной строке с правами администратора (или возможность использовать sudo)
  • Открытые порты 5222 (клиентские соединения), 5269 (сервер-сервер), 5443 (админка)
Проверь установку Docker Compose командой docker compose version. Если используешь старую версию (v1), замени в дальнейшем команды docker compose на docker-compose.

Создание структуры проекта и Docker Compose файла

Для удобства управления создай отдельную директорию для проекта ejabberd. Внутри нее мы разместим все необходимые конфигурационные файлы.

bash
mkdir ejabberd-docker && cd ejabberd-docker
mkdir -p config data uploads

Теперь создай основной файл docker-compose.yml. Этот файл описывает наш сервис ejabberd, его настройки, тома и порты.

yaml
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.

yaml
# Основные настройки хоста
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.

bash
docker compose up -d

После запуска проверь статус контейнера:

bash
docker compose ps
docker compose logs -f ejabberd

Для первоначальной настройки и создания учетной записи администратора выполни команду внутри контейнера:

bash
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 и обнови конфигурацию.

bash
# Пример структуры с сертификатами 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 секцию с настройками сертификатов:

yaml
# Конфигурация 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:

yaml
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?

Проверь следующее:

  1. Контейнер запущен (docker compose ps).
  2. Порт 5443 проброшен и не занят другим процессом на хосте.
  3. В логах нет ошибок инициализации (docker compose logs ejabberd).
  4. Ты используешь HTTPS (https://your-domain.com:5443), а не HTTP.
  5. Если используешь домен, убедись, что 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. Используй эту мощь для построения отказоустойчивой и удобной в обслуживании инфраструктуры мгновенных сообщений.

Поделиться:
Сохранить гайд? В закладки браузера