Быстрая практическая инструкция по 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 файлы.