HomeLab

Как самостоятельно развернуть Stoat с помощью Docker Compose

15 мая 2026, 08:17
Источник: selfhosting.sh
Как самостоятельно развернуть 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

Начальная настройка

  1. Откройте https://chat.yourdomain.com в браузере
  2. Создайте первую учетную запись — это станет владельцем экземпляра
  3. Создайте сервер (эквивалент сервера Discord)
  4. Создайте каналы внутри сервера
  5. Сгенерируйте приглашения для их передачи команде

Нет отдельной панели администратора. Администрирование экземпляра происходит через 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.

Связанные