Быстрая практическая инструкция по Mosquitto

Вкратце: установите Mosquitto (apt или Docker), отключите allow_anonymous, создайте файл паролей через mosquitto_passwd, укажите password_file и acl_file в конфиге, настройте listeners 1883 (локально), 8883 (TLS) и/или 9001 (WebSockets), подключите сертификаты (certfile/keyfile/cafile), перезапустите сервис и проверьте mosquitto_pub/sub.

Установка

Debian/Ubuntu:

sudo apt update && sudo apt install -y mosquitto mosquitto-clients mosquitto-passwd
sudo systemctl enable --now mosquitto

Docker (быстро, для изоляции):

docker run -d --name mosquitto \
  -p 1883:1883 -p 8883:8883 -p 9001:9001 \
  -v "$(pwd)/config:/mosquitto/config" \
  -v "$(pwd)/data:/mosquitto/data" \
  -v "$(pwd)/log:/mosquitto/log" \
  eclipse-mosquitto

Для production используйте docker-compose и отдельные тома; заранее подготовьте passwd/acl/certs с корректными правами.

Базовая конфигурация (mosquitto.conf) и TLS

Создайте файл /etc/mosquitto/conf.d/01-default.conf с минимальными настройками:

persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
per_listener_settings true

# Внутренний listener (для локальных сервисов)
listener 1883 127.0.0.1
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl

# TLS listener для внешних клиентов
listener 8883
protocol mqtt
cafile /etc/letsencrypt/live/example.com/chain.pem
certfile /etc/letsencrypt/live/example.com/fullchain.pem
keyfile /etc/letsencrypt/live/example.com/privkey.pem

При использовании WebSockets (WSS) добавьте:

listener 9001
protocol websockets

После изменения конфига:

sudo systemctl restart mosquitto
# или: sudo kill -HUP $(pidof mosquitto)  # для reload без полного рестарта (в версиях, где поддерживается)

Проверьте права на файлы сертификатов и password_file — процесс mosquitto должен иметь к ним доступ.

Аутентификация и ACL

Создать файл паролей:

sudo mosquitto_passwd -c /etc/mosquitto/passwd user1
# добавить:
sudo mosquitto_passwd /etc/mosquitto/passwd user2
# удалить:
sudo mosquitto_passwd -D /etc/mosquitto/passwd user1

Простой ACL (/etc/mosquitto/acl):

user user1
topic readwrite sensors/user1/#

user user2
topic read public/announcement

pattern write devices/%u/data

Параметры: topic (read/write/readwrite), user, pattern (%u = username, %c = client id).

Тестирование

Локально:

mosquitto_sub -h localhost -t test -v &
mosquitto_pub -h localhost -t test -m "hello"

С паролем:

mosquitto_pub -h broker.example.com -u user1 -P 'password' -t test -m "hi"

Через TLS (порт 8883):

mosquitto_pub -h broker.example.com -p 8883 --cafile /path/to/ca.pem -t test -m "secure"

Частые ошибки

  • password_file или certs недоступны процессу mosquitto (неверные права/vs владельцы).
  • В Docker монтируют не те пути — убедитесь, что смонтированы именно /mosquitto/config, /mosquitto/data, /mosquitto/log.
  • allow_anonymous остаётся true — клиенты проходят без аутентификации.
  • Неполная цепочка сертификатов: используйте fullchain.pem для certfile и chain.pem/CA в cafile при необходимости.

FAQ

  • Как принудительно обновлять сертификаты Let's Encrypt? — Настройте certbot renew и в hook выполните SIGHUP процессу mosquitto или перезапуск сервиса после обновления.
  • Можно ли TLS закончить на reverse proxy? — Да: терминируйте TLS (Nginx/Traefik), а Mosquitto держите без TLS на внутреннем интерфейсе.
  • Нужны ли ACL для всех проектов? — Для простых личных тестов можно обойтись без ACL, но для production рекомендуется ограничивать доступ по темам и пользователям.

Контрольный список перед вводом в эксплуатацию:

  • allow_anonymous = false
  • password_file создан и протестирован
  • acl_file настроен при необходимости
  • TLS настроен и файлы доступны
  • Открыты нужные порты в firewall
  • Настроены логи/мониторинг

Если нужно, подготовлю: минимальный mosquitto.conf под вашу архитектуру, docker-compose.yml и примерные passwd/acl файлы.