Как самостоятельно развернуть Stoat с помощью Docker Compose
✎Источник: selfhosting.sh
Что такое Stoat?
Stoat начинал как Revolt, альтернатива Discord, созданная с нуля на Rust. После получения уведомления о прекращении действий в начале 2026 года проект был переименован в Stoat и перемещён на github.com/stoatchat. Основной продукт не изменился — это платформа для чата в реальном времени с текстовыми каналами, голосовыми звонками (через LiveKit), обменом файлами, ботами, пользовательскими emoji и веб/десктоп/мобильным клиентом. Архитектура основана на микросервисах: отдельные бинарные файлы на Rust обрабатывают API, события WebSocket, хранение файлов, push-уведомления и проксирование медиа. Лицензия AGPL-3.0. В отличие от Matrix или XMPP, Stoat не поддерживает федерацию. Это платформа с одним сервером, созданная так, чтобы ощущаться как Discord — приглашения на сервер, разрешения ролей, категории каналов и знакомый интерфейс. Если ваша цель — заменить сервер Discord для вашей команды или сообщества без требований федерации, Stoat является самым близким к этому самохостингом. Получите конфигурации Docker Compose, рекомендации по оборудованию и ярлыки настройки, которые мы не включаем в статьи. Еженедельно. Без спама.
Подписаться
Быстрый вердикт
Stoat — это самая похожая на Discord платформа для самохостинга чатов. Голосовые каналы, обмен файлами, поиск GIF, боты и продвинутый веб-интерфейс работают из коробки. Обратная сторона — это сложность — 14 контейнеров требуют много управления, и проект еще молод (v0.11.x). Для команд, которым нужна частная замена Discord и не требуется федерация, это лучший вариант. Для более простых нужд рассмотрите Mattermost или Rocket.Chat.
Обзор архитектуры
Stoat работает как стек микросервисов. Каждый бинарник Rust обрабатывает одну задачу:
Служба | Изображение | Назначение
---|---|---
API | ghcr.io/stoatchat/api:v0.11.5 | REST API бэкенд
События | ghcr.io/stoatchat/events:v0.11.5 | WebSocket сервер (мгновенные сообщения)
Файловый сервер | ghcr.io/stoatchat/file-server:v0.11.5 | Загрузка/скачивание файлов (Autumn)
Прокси | ghcr.io/stoatchat/proxy:v0.11.5 | Предпросмотры ссылок и медиа-прокси (January)
GIF-прокси | ghcr.io/stoatchat/gifbox:v0.11.5 | Прокси для поиска GIF через Tenor
Cron-демон | ghcr.io/stoatchat/crond:v0.11.5 | Запланированные задачи очистки
Push-демон | ghcr.io/stoatchat/pushd:v0.11.5 | Web push уведомления
Голосовой вход | ghcr.io/stoatchat/voice-ingress:v0.11.5 | Маршрутизация голосовых каналов
LiveKit | ghcr.io/stoatchat/livekit-server:v1.9.6 | Инфраструктура для голос/видео
Веб-фронтенд | ghcr.io/stoatchat/for-web:v0.11.5 | Веб-клиент Solid.js
MongoDB | mongo:7 | Основная база данных
Redis | redis:7-alpine | Кэш и pub/sub
RabbitMQ | rabbitmq:3-management-alpine | Внутренний брокер сообщений
MinIO | minio/minio | Хранение файлов, совместимое с S3
Caddy | caddy:2-alpine | Обратный прокси и HTTPS
Требования
- Linux сервер (рекомендуется Ubuntu 22.04+)
- Установленный Docker и Docker Compose (руководство)
- Минимум 2 ГБ ОЗУ (рекомендуется 4 ГБ с голосом)
- 10 ГБ свободного дискового пространства (увеличивается с загрузкой файлов)
- Доменное имя с настроенным DNS
- Открыты порты 80, 443, 7881/TCP и 50000-50100/UDP
Конфигурация Docker Compose
Stoat предоставляет автоматизированный скрипт настройки. Клонируйте репозиторий и запустите генератор конфигурации:
git clone https://github.com/stoatchat/self-hosted stoat
cd stoat
chmod +x ./generate_config.sh
./generate_config.sh chat.yourdomain.com
Это сгенерирует четыре файла:
* Revolt.toml — Основная конфигурация (общая для всех служб)
* secrets.env — Ключи VAPID, ключи шифрования, учетные данные LiveKit
* .env.web — Переменные окружения фронтенда
* livekit.yml — Конфигурация сервера LiveKit
Просмотрите файл Revolt.toml перед запуском. Ключевые параметры для проверки:
# Домен должен соответствовать вашему DNS
[api]
hostname = "chat.yourdomain.com"
# Подтверждение электронной почты (по умолчанию отключено для самохостинга)
[api.registration]
email_verification = false
invite_only = false
Затем запустите стэк:
docker compose up -d
Первый запуск загрузит ~2 ГБ образов и инициализирует MongoDB. Подождите 1-2 минуты перед доступом к веб-интерфейсу.
Ручная настройка (если не используете generate_config.sh)
Если необходимо настроить вручную, создайте файл secrets.env:
# Сгенерируйте ключи VAPID для push-уведомлений
npx web-push generate-vapid-keys
# Сгенерируйте ключ шифрования файла
openssl rand -hex 32
# Сгенерируйте учетные данные LiveKit
openssl rand -hex 16 # ключ
openssl rand -hex 32 # секрет
Заполните secrets.env:
# Ключи VAPID для push-уведомлений (из вывода web-push)
PUSHD_VAPID_PRIVATEKEY=your_private_key_here
PUSHD_VAPID_PUBLICKEY=your_public_key_here
# Шифрование файлов
FILES_ENCRYPTION_KEY=your_hex_key_here
# LiveKit голос/видео
LIVEKIT_WORLDWIDE_KEY=your_livekit_key
LIVEKIT_WORLDWIDE_SECRET=your_livekit_secret
Начальная настройка
- Откройте
https://chat.yourdomain.comв браузере - Создайте первую учетную запись — это станет владельцем экземпляра
- Создайте сервер (эквивалент сервера Discord)
- Создайте каналы внутри сервера
- Сгенерируйте приглашения для их передачи команде
Нет отдельной панели администратора. Администрирование экземпляра происходит через API и настройки сервера в веб-интерфейсе.
Настройка
Режим только по приглашениям
Чтобы ограничить регистрацию только приглашёнными пользователями, отредактируйте Revolt.toml:
[api.registration]
invite_only = true
Перезапустите сервис API: docker compose restart api
Ограничения на загрузку файлов
MinIO обрабатывает хранение файлов. Ограничения по умолчанию настроены в Revolt.toml. Настройте объем хранилища в зависимости от ожидаемого объема загрузки файлов.
Пользовательский домен
Файл Caddyfile в репозитории обрабатывает завершение HTTPS. Caddy автоматически предоставляет сертификаты Let’s Encrypt. Если вы используете другой обратный прокси, настройте его так, чтобы он проксировал:
Путь | Бэкенд
---|---
/api/ | api:14009
/ws | events:9000
/autumn/ | file-server:3000
/january/ | proxy:7000
/gifbox/ | gifbox:14008
/ | web:5000
Правила брандмауэра
Голосовые каналы требуют дополнительных портов:
# HTTPS и HTTP
ufw allow 80/tcp
ufw allow 443/tcp
# Сигнализация LiveKit
ufw allow 7881/tcp
# Мультимедиа LiveKit (голос/видео RTP)
ufw allow 50000:50100/udp
Резервное копирование
Резервное копирование этих каталогов и файлов:
Что | Путь | Почему
---|---|---
Данные MongoDB | ./data/db/ | Все сообщения, пользователи, серверы, каналы
Данные MinIO | ./data/minio/ | Все загруженные файлы и вложения
Конфигурация | Revolt.toml, secrets.env, .env.web | Настройки экземпляра и секреты
Резервное копирование MongoDB:
docker compose exec mongodb mongodump --out /data/backup/$(date +%Y%m%d)
docker cp stoat-mongodb-1:/data/backup/ ./backups/
Смотрите Стратегия резервного копирования для полного подхода 3-2-1.
Устранение неполадок
Веб-интерфейс показывает пустую страницу
Симптом: Браузер загружается, но ничего не показывает после docker compose up. Решение: Подождите 1-2 минуты, чтобы все службы инициализировались. Проверьте docker compose logs web на наличие ошибок. Убедитесь, что .env.web имеет правильный VITE_API_URL, соответствующий вашему домену.
Голосовые каналы не подключаются
Симптом: При нажатии на голосовой канал отображается «подключение» бесконечно. Решение: Убедитесь, что порты 7881/TCP и 50000-50100/UDP открыты в вашем брандмауэре и перенаправлены, если за NAT. Проверьте docker compose logs livekit-server на наличие ошибок.
Загрузки файлов не удались
Симптом: При загрузке изображений или файлов возникает ошибка. Решение: Проверьте, что MinIO работает: docker compose logs minio. Убедитесь, что FILES_ENCRYPTION_KEY в secrets.env совпадает с тем, что в Revolt.toml. Если вы повторно запустили generate_config.sh, существующие секреты могли быть перезаписаны — восстановите из резервной копии.
Сообщения не доставляются в реальном времени
Симптом: Сообщения появляются только после обновления страницы. Решение: Служба событий WebSocket может быть отключена. Проверьте docker compose logs events. Также проверьте, что RabbitMQ в порядке: docker compose logs rabbitmq.
Регистрация не работает
Симптом: Форма_signup возвращает ошибку. Решение: Проверьте, установлено ли invite_only = true в Revolt.toml. Если подтверждение электронной почты включено, убедитесь, что настройки SMTP настроены. Для самохостинговых экземпляров обычно отключают подтверждение электронной почты (email_verification = false).
Требования к ресурсам
| Метрика | Значение |
|---|---|
| Минимальная ОЗУ | 2 ГБ |
| Рекомендуемая ОЗУ | 4 ГБ (с голосом) |
| ЦП | 2+ ядра |
| Неактивное использование диска | ~2 ГБ (изображения + базы данных) |
| Контейнеры | 15 |
| Сетевые порты | 80, 443, 7881/TCP, 50000-50100/UDP |
Вердикт
Stoat — это самое близкое, что вы можете получить к самостоятельному хостингу Discord. Интерфейс удобен, голосовые каналы работают через LiveKit, а бэкенд на Rust производителен. Недостатки реальны: 15 контейнеров — это бремя обслуживания, проект еще до версии 1.0 (v0.11.x), документация скромна, и федерации нет. Если ваше сообщество нуждается в голосовых каналах и UX, похожем на Discord, Stoat — это правильный инструмент. Если текстового чата достаточно, Mattermost или Matrix с Element проще в развертывании.
Часто задаваемые вопросы
Является ли Stoat тем же самым, что и Revolt?
Да. Stoat изначально назывался Revolt. Проект переименовался в Stoat в начале 2026 года после получения уведомления о прекращении действий. Кодовая база, функции и команда разработки остались прежними — изменилось только имя и организация на GitHub (теперь github.com/stoatchat).
Поддерживает ли Stoat федерацию?
Нет. В отличие от Matrix или XMPP, Stoat — это односерверная платформа. Все пользователи, каналы и данные находятся на одном экземпляре. Если федерация является необходимостью, используйте вместо этого Matrix с Element.
Могу ли я мигрировать с Discord на Stoat?
Автоматизированного инструмента миграции нет. Вам понадобится вручную воспроизвести серверы, каналы и роли в Stoat. История сообщений из Discord не может быть импортирована. Интерфейс и концепции Stoat (сервера, каналы, роли, приглашения) близки к Discord, поэтому переход для пользователей интуитивно понятен.
Сколько RAM нужно для Stoat?
Минимум 2 ГБ, но рекомендуется 4 ГБ, если вы планируете использовать голосовые каналы. Архитектура из 15 контейнеров (MongoDB, Redis, RabbitMQ, MinIO, LiveKit и услуги на Rust) накладывает свой отпечаток. Без голосовых каналов 2 ГБ подойдут для небольших сообществ.
Есть ли у Stoat мобильные приложения?
Да. У Stoat есть мобильное веб-приложение и нативные приложения для Android и iOS, хотя мобильный интерфейс менее проработан, чем веб-клиент. Веб-интерфейс хорошо работает на мобильных браузерах в качестве резервного варианта.
Как Stoat сравнивается с Mattermost?
Mattermost проще развернуть (2-3 контейнера против 15), более зрелый и лучше подходит для командной коммуникации. Stoat больше похож на Discord с голосовыми каналами, иерархией серверов/каналов и ориентированным на потребителя интерфейсом. Выбирайте Mattermost для рабочего чата; выбирайте Stoat для общественных серверов, которым нужен опыт, похожий на Discord.