
Не шучу, правда довели. Одни уходят, другие замедляют. И у меня начала мелькать шальная мысль: а что, если взять и поднять свой корпоративный чат?
Но я это делаю вообще в первый раз, поэтому сразу появилась гора вопросов: а с чего начать, как это спроектировать, сколько нужно серверов, нужен ли VPN, как не оставить дыру в безопасности и не собрать систему, которую потом я сам же запарюсь поддерживать?
Я Марк Ковалев, технический специалист по ИБ. И сегодня я отвечу на все эти вопросы себе и вам, а также расскажу, как поднял корпоративный мессенджер в облаке с нуля. Сильно не ругайтесь, я знаю, что решение может быть не самым оптимальным — поэтому жду советы в комментах, чтобы его докрутить и сделать круче.
Что не так с телегой под VPN?

Даже если бы телегу не замедляли, с ней все равно много проблем. Расскажу про них поподробнее.
У нас небольшая команда разработки, до 15 человек. Два года мы жили в телеге, и раньше все было нормально: и быстро, и привычно. Но все это время команда росла и процессы тоже менялись. И я, и остальные стали замечать недостатки, которые полезли со всех сторон.
Боль №1: треды
В телеге ответ на сообщение — это цитирование в общий поток, а не ветка обсуждения. Когда в одном рабочем канале одновременно идут разговоры о баге в проде, пиаре на ревью и об организации корпоратива, навигация превращается в пытку. Да, есть топики в супергруппах, но, боже мой, как же это неудобно! Вы уже мучились в попытке выйти из супергруппы и скрыть меню всех подгрупп? Ну вот и я о том же, ненавижу супергруппы. Mattermost и Slack, к слову, решили эту задачу пять лет назад. А телега до сих пор нет.
Боль №2: пуши по CI/CD

Мы написали бота, который отправлял результаты билдов и деплоев в отдельный чат. Но гранулярности ноль: нельзя подписаться на уведомления от конкретного пайплайна или отфильтровать по проекту. Все валится в одну ленту, и через неделю люди просто мьютят чат. А иногда и раньше. Бот превращается в помойку, в которую никто не смотрит.
Боль №3: поиск по истории
Попробуйте найти обсуждение архитектурного решения полугодовой давности в телеграм-чате на 15 человек с несколькими тысячами сообщений в месяц. Телега в общем поиске ищет по подстроке, без фильтрации по автору, дате или каналу (внутри канала можно поискать по автору или дате, но не всегда выдает верные результаты). Вы получите 200 результатов и будете листать вручную. Но в процессе все может залагать — и придется листать заново.
Боль №4: права доступа
Точнее, их отсутствие. В Telegram нельзя дать стажеру доступ только к каналам его проекта. Он либо в чате, либо нет. Нет ролей — только косметические лейблы ролей/должностей, нет per-channel permissions, нет гостевых аккаунтов с ограниченным доступом.
Боль №5: конфиденциальность
Корпоративная переписка, внутренние API-ключи, проброшенные в сообщениях (да, так не надо, но так бывает), обсуждение инцидентов и постмортемов — все это живет на серверах публичного мессенджера. Серверная часть телеги — проприетарный код, условия доступа к данным определяет третья сторона. Для нас это перестало быть приемлемым.
По итогу наше решение: self-hosted-чат на собственной инфраструктуре, доступный исключительно через VPN. Ниже — то, как мы выбирали платформу, почему остановились на Matrix, и полная инструкция по развертыванию.
А кандидаты кто?
Мы рассматривали три платформы: Mattermost, Rocket.Chat и Matrix + Element. У каждой свои сильные стороны и своя галька в тапочке, которая к 2026 году стала мешаться еще сильнее, чем еще пару лет назад.
Mattermost: был фаворитом, пока не вышла v11

Mattermost долго был золотым стандартом self-hosted-чата для разработчиков. Интерфейс, скопированный со Slack, каналы, треды, вебхуки, интеграции с GitLab и Jenkins из коробки. Простой деплой тоже был плюсом: один docker-контейнер с PostgreSQL. Документация качественная, сообщество активное. Для небольшой команды это идеальный кандидат.
Все изменилось в октябре 2025 года с выходом v11.0. Mattermost радикально перекроил бесплатные предложения. Теперь при запуске enterprise-бинарника без лицензии вы получаете Entry Edition, которая накладывает лимит в 10 000 сообщений — не на канал, а на весь сервер суммарно. Старые сообщения остаются в базе данных, но полностью пропадают из интерфейса и поиска. Для команды, генерирующей 200–300 сообщений в день, это примерно полтора месяца до стены. Помимо этого, звонки ограничены 40 минутами, пуш-уведомления — 10 000 в месяц, доски — 1 000 карточками, плейбуки — пятью запусками в месяц.
Реакция сообщества была, мягко говоря, бурной. На Hacker News тред набрал 314 очков и более 250 комментариев. Пользователи сравнивали ретроактивное скрытие истории с ransomware. Администратор школы с 2 000 пользователей и 470 000 сообщений подал в GitHub issue #34271, после того как потерял доступ ко всей истории до сентября 2025 года.
В ответ на ситуацию появился форк Mostlymatter от французской некоммерческой организации Framasoft. Это drop-in-замена бинарника, убирающая лимиты на пользователей и сообщения. System76 перевела на него чат сообщества Pop!_OS в феврале 2026-го, YunoHost переключил свой официальный пакет. Для команд, которым нужен UX «Маттермоста» без искусственных ограничений, Mostlymatter — вполне рабочий вариант. Но зависимость от энтузиазма стороннего создателя, пусть и уважаемого, — не лучшая основа для долгосрочного планирования, на мой взгляд… Но тут сами решайте.
Еще один путь — остаться на v10.11 ESR, которая поддерживается до 15 августа 2026-го. Это покупает время, но не решает проблему.
Rocket.Chat: смерть от тысячи порезов

Rocket.Chat — вполне зрелый продукт с богатым интерфейсом: каналами, тредами, аудио- и видеозвонками, омниканальной поддержкой клиентов, маркетплейсом приложений. На нем сидят крупные игроки, в том числе некоторые юниты «Сбера». Но Community Edition обложена ограничениями, которые по отдельности кажутся терпимыми, а все вместе делают продукт непригодным для серьезного использования.
Главный лимит — 10 000 пуш-уведомлений в месяц через официальный шлюз. Эта квота была введена еще в 2020 году, и на форумах модераторы подтверждали в 2024 году, что пересматривать ее никто не планирует.
Обходной путь для пуш-уведомлений формально существует, но он дорогой. Официальная документация предлагает форкнуть мобильное приложение Rocket.Chat, создать собственные Firebase- и APNs-ключи, собрать white-label-приложение, опубликовать его в App Store и Google Play. Apple Developer Account стоит 99 долларов в год, плюс вы берете на себя постоянную поддержку сборки при каждом обновлении SDK. Для небольшой команды это какая-то жесть, а не решение.
Есть и бесплатный тариф Starter (до 50 пользователей, расширен с 25 в v7.0), который снимает лимит на пуши и добавляет премиум-функции. Но там нужна регистрация в Rocket.Chat Cloud и привязка сервера, что для self-hosted-сценария, мотивированного контролем над данными, выглядит как противоречие.
Matrix + Element: открытый протокол без лимитов
Matrix — открытый федеративный протокол для коммуникаций.
Synapse — эталонная серверная реализация на Python.
Element — основной клиент, доступный как веб-приложение, десктопное приложение (Electron) и мобильные приложения на iOS и Android.
Принципиальное отличие от «Маттермоста» и Rocket.Chat — в отсутствии лимитов на сообщения, пользователей, пуш-уведомления или функции. Протокол открыт (Apache 2.0), сервер — под Apache 2.0, клиент — тоже.
Федерация — ключевая особенность Matrix, но для внутреннего командного чата она не нужна. Если сервер доступен только через VPN и вы не планируете общаться с пользователями на других matrix-серверах, ее лучше отключить.
Это делается одной строкой в homeserver.yaml:
federation_domain_whitelist: []` // пустой список = федерация ни с кем
Убирает фоновый трафик key-fetching и presence и уменьшает поверхность атаки.
Слабые стороны тоже есть. Развертывание заметно сложнее: Synapse + PostgreSQL + Element Web + Caddy + CoreDNS — это 5–8 контейнеров против 2–3 у «Маттермоста», да и начальная настройка занимает 2–4 часа вместо получаса. UX-онбординг тяжелее: верификация cross-signing при первом входе с нового устройства сбивает с толку нетехнических коллег, а потеря ключа восстановления равна потере зашифрованной истории навсегда.
Наш выбор
Да, по моему описанию было несложно понять, что мы выбрали Matrix + Element. Причина: это единственная платформа, где вендор не может задним числом ввести лимит на историю сообщений или количество пуш-уведомлений. Сложность развертывания для нас — это одноразовая цена. А вот лицензионные сюрпризы — штука повторяющаяся.
Важно! Если вашей команде не нужна федерация, а нужен максимально простой деплой с привычным Slack-like UX, присмотритесь к Mostlymatter. Он поднимается за час на том же стеке.
Архитектура решения
Итоговый стек развернут на одном виртуальном сервере в Сloud.ru.
Конфигурация:
2 vCPU / 4 GB RAM (тип standard из линейки Evolution Compute), Debian 13, 40 GB.
Визуал решения вот такой:

Единственный порт, который открыт наружу, — UDP 51820 для WireGuard. Все остальные сервисы слушают только на VPN-интерфейсе (10.8.0.1). Веб UI wg-easy защищен паролем с двухфакторкой и доступен только через VPN. Caddy выступает в роли внутреннего удостоверяющего центра (CA) и генерирует и автоматически обновляет TLS-сертификаты для всех сервисов через директиву tls internal. Никаких внешних зависимостей, никаких публичных DNS-записей.
CoreDNS резолвит имена вида chat.team.internal и element.team.internal в VPN-адрес сервера. WireGuard-клиенты получают адрес DNS-сервера автоматически при подключении. Единственная ручная операция — один раз установить корневой сертификат Caddy на устройства участников команды.
Медиафайлы и вложения хранятся не на локальном диске, а в Evolution Object Storage — S3-совместимом хранилище. Оно работает со стандартным AWS SDK (boto3, aws-cli, rclone) через эндпойнт https://s3.cloud.ru, регион ru-1a, авторизация AWS Signature v4. Так я решил проблему роста диска VPS и упростил бэкапирование.
Развертывание
Шаг 1: подготовка VPS
В консоли Evolution создаем виртуальную машину. Если у вас совсем нет опыта или просто неохота разбираться, можно попросить их внутреннего ИИ-помощника сделать это за вас.

Выбираем конфигурацию, которую описывал раньше: 2 vCPU / 4 GB RAM. Диск 40 GB SSD, операционная система Debian 12 (потом обновим до 13-й). Публичный IP делаем прямой на машину, без NATa.

На платформе есть free tier (2 vCPU, 4 GB, 30 GB), но без публичного IP. Добавление интернет-доступа стоит примерно 146 руб/мес. Но под мою задачу нужен полноценный публичный IP для WireGuard endpoint, поэтому free tier подходит только для тестирования. Новые аккаунты, кстати, получают 4 000 бонусных рублей на 60 дней, их тоже заюзал.
Добавляем свой SSH-ключ, подключаемся:
ssh user1@<PUBLIC_IP> sudo apt update && sudo apt upgrade -y
Меняем bookworm на trixie и обновляемся до Debian 13:
sudo vi /etc/apt/sources.list sudo apt update && sudo apt dist-upgrade -y
Меняем порт SSH на нестандартный, чтобы ботам хоть чуть-чуть сложнее было ддосить машину:
sudo vi /etc/ssh/sshd_config --- Port 3422 --- sudo systemctl restart ssh
На этом моменте мы сможем заметить, что новые SSH-подключения на новый порт не идут. Это потому, что порты по дефолту закрыты.
Идем в группы безопасности, находим ту, в которой сидит интерфейс машины, меняем SSH-правило. И заодно добавляем проброс порта для WireGuard-трафика:


Далее доустанавливаем докер, добавляем своего пользователя в группу, все стандартно.
# Добавляем GPG-ключ для Docker: sudo apt update sudo apt install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Добавляем репозиторий: sudo tee /etc/apt/sources.list.d/docker.sources <<EOF Types: deb URIs: https://download.docker.com/linux/debian Suites: $(. /etc/os-release && echo "$VERSION_CODENAME") Components: stable Signed-By: /etc/apt/keyrings/docker.asc EOF sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo adduser user1 docker
Шаг 2: S3-хранилище для медиафайлов
В консоли Evolution создаем бакет в Evolution Object Storage. Имя — matrix-media; регион — ru-central-1; класс хранения — стандартный:


Этот бакет для Synapse, для хранения загруженных медиафайлов (изображения, файлы, аватарки). Локальный диск VPS при этом используется только для метаданных и кеширования.
Для его подключения еще нужны будут ключи доступа. Чтобы их сделать, заходим в «Настройки пользователя» → «Ключи доступа» → «Создать ключ». Делаем описание, задаем время жизни. Обязательно копируем Key Secret (пароль): после закрытия окошка его не получить. Также запоминаем Key ID (логин).

Шаг 3: WireGuard через wg-easy
У wg-easy v15 была полная переработка проекта в мае 2025-го: сменилась лицензия на AGPL-3.0. Главное изменение: почти все переменные окружения вроде WG_HOST, WG_DEFAULT_ADDRESS, WG_DEFAULT_DNS, PASSWORD_HASH удалены. И конфигурация теперь происходит через интерактивный мастер настройки при первом запуске, а параметры хранятся в SQLite-базе внутри контейнера. Из переменных окружения остались только PORT (TCP-порт Web UI, по умолчанию 51821), HOST (bind-адрес, по умолчанию 0.0.0.0), INSECURE (разрешить HTTP без TLS, по умолчанию false) и DISABLE_IPV6.
mkdir -p ~/wireguard && cd ~/wireguard vi ./docker_compose.yml
volumes: etc_wireguard: services: wg-easy: image: ghcr.io/wg-easy/wg-easy:15 container_name: wg-easy network_mode: host environment: # Без reverse proxy внутри VPN, разрешаем plain HTTP - INSECURE=true # Выключаем IPv6 - DISABLE_IPV6=true volumes: - etc_wireguard:/etc/wireguard - /lib/modules:/lib/modules:ro restart: unless-stopped cap_add: - NET_ADMIN - SYS_MODULE devices: - /dev/net/tun:/dev/net/tun
Важно! /lib/modules:/lib/modules:ro — новое обязательное требование на v15 для доступа к модулям ядра. Без него контейнер не стартанет. А именованный том etc_wireguard вместо bind mount — это рекомендация из официальной доки.
Также используем хостовую сеть, чтобы интерфейс wg0 с адресом 10.8.0.1 был недоступен для бинда сервисов без лишних изворотов с роутингом.
Добавляем конфиг sysctl для форвардинга:
sudo tee /etc/sysctl.d/90-wireguard.conf << 'EOF' net.ipv4.ip_forward=1 net.ipv4.conf.all.src_valid_mark=1 EOF
Дальше:
docker compose up -d
Делаем SSH-туннель, чтобы безопасно подключиться к незащищенной веб-морде:
ssh -L 51821:127.0.0.1:51821 -p 3422 -N user1@<PUBLIC_IP>
Заходим в http://127.0.0.1:51821. При первом запуске wg-easy показывает мастер настройки, в котором задаем:
Учетную запись администратора.
Host — публичный IP сервера.
Port — 51820 (по умолчанию).


Дальше в настройках задаем:
Разрешенные IP‑адреса. 10.8.0.0/24 (только VPN-трафик, не весь интернет клиента).
DNS. Указываем IP нашего будущего CoreDNS — 10.8.0.1.
Устройство. Указываем сетевой интерфейс машины, у меня enp3s0.
Также меняем хуки в настройках. По сути, убираем NAT. Через VPN доступа в обычную сеть нет, он только для доступа к внутренним ресурсам и, может быть, к коллегам.
PostUp:
iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT
PostDown:
iptables -D FORWARD -i wg0 -o wg0 -j ACCEPT
Создаем конфигурации и тестим. Теперь веб-интерфейс доступен также через VPN: http://10.8.0.1:51821.
Важно! Для автоматизации (Ansible, скрипты) в v15 есть INIT-переменные: INIT_ENABLED=true, INIT_USERNAME, INIT_PASSWORD, INIT_HOST, INIT_PORT, INIT_DNS и т. д. Они отрабатывают только при первом запуске и игнорируются при последующих. После первичной настройки рекомендуется убрать их из docker-compose, чтобы пароль не светился в конфиге.
Шаг 4: внутренний DNS на CoreDNS
Нам нужно, чтобы имена вроде chat.team.internal резолвились в VPN-адрес сервера (10.8.0.1) для клиентов внутри VPN. Это берет на себя CoreDNS.
Важно! Не используйте TLD .local, так как он зарезервирован для mDNS и конфликтует с Bonjour на macOS и iOS. Хорошие варианты: .internal (зарезервирован IANA для приватного использования) или home.arpa.
Качаем и устанавливаем свежую версию:
cd /tmp wget https://github.com/coredns/coredns/releases/download/v1.14.2/coredns_1.14.2_linux_amd64.tgz tar xzf coredns_1.14.2_linux_amd64.tgz sudo mv coredns /usr/local/bin/ sudo chmod +x /usr/local/bin/coredns coredns --version
Создаем директорию для конфигов:
sudo mkdir -p /etc/coredns
Файл зоны db.team.internal — стандартный формат BIND zone file:
sudo tee /etc/coredns/db.team.internal << 'EOF' ; $ORIGIN задает суффикс по умолчанию для неполных имен в этом файле $ORIGIN team.internal. ; SOA (Start of Authority) обязательная запись для любой DNS-зоны ; Формат: primary-ns admin-email (serial refresh retry expire minimum-ttl) ; admin-email: точка вместо @, т. е. admin.team.internal = admin@team.internal @ IN SOA ns.team.internal. admin.team.internal. ( 2025010101 ; serial — увеличивайте при каждом изменении зоны 3600 ; refresh — как часто secondary DNS проверяет обновления (нам неважно) 600 ; retry — интервал повтора при неудаче 86400 ; expire — через сколько secondary перестает отдавать зону 60 ; minimum TTL — время жизни negative-кеша ) ; NS указывает authoritative nameserver для зоны @ IN NS ns.team.internal. ; A-записи: имя = IPv4-адрес внутри VPN ; Все сервисы живут на одном VPS, поэтому все указывают на 10.8.0.1 ns IN A 10.8.0.1 chat IN A 10.8.0.1 ; Synapse homeserver element IN A 10.8.0.1 ; Element Web frontend wg IN A 10.8.0.1 ; wg-easy Web UI EOF
Конфиг CoreDNS Corefile — каждый блок в { } описывает зону и набор плагинов для нее:
sudo tee /etc/coredns/Corefile << 'EOF' # Зона team.internal — наши внутренние сервисы # CoreDNS будет отвечать на запросы к *.team.internal . { # привязываемся на WireGuard-сервер bind 10.8.0.1 # Зона team.internal — наши внутренние сервисы # file — плагин, загружающий зону из файла в формате BIND file /etc/coredns/db.team.internal team.internal # forward — проксирует запросы к upstream DNS-серверам # Здесь используем Google (8.8.8.8) и Cloudflare (1.1.1.1) # Можно заменить на любые другие, например Яндекс (77.88.8.8) forward . 8.8.8.8 1.1.1.1 # cache — кеширует ответы от upstream на 30 секунд # Уменьшает задержку и нагрузку на upstream при повторных запросах cache 30 # log — логирует все DNS-запросы к этой зоне в stdout # Полезно для отладки; в продакшене можно убрать log # Return errors for failed queries instead of silently dropping # Возвращать ошибки, а не втихую дропать errors } EOF
Создаем systemd-сервис:
sudo tee /etc/systemd/system/coredns.service << 'EOF' [Unit] Description=CoreDNS DNS Server Documentation=https://coredns.io After=network-online.target # Запускаемся после докера, чтобы подняться после wg-easy и интерфейс wg0 уже был на месте After=docker.service Wants=network-online.target [Service] Type=simple ExecStart=/usr/local/bin/coredns -conf /etc/coredns/Corefile Restart=on-failure RestartSec=5 # Разрешение на привязку к порту 53 AmbientCapabilities=CAP_NET_BIND_SERVICE # Запускаем отдельным юзером User=coredns Group=coredns [Install] WantedBy=multi-user.target EOF
Добавляем юзера и запускаем сервис:
sudo useradd -r -s /usr/sbin/nologin -d /nonexistent coredns sudo systemctl daemon-reload sudo systemctl enable --now coredns sudo systemctl status coredns


Шаг 5: Synapse + PostgreSQL + Element Web
Создаем рабочую директорию и генерируем начальный конфиг Synapse:
mkdir -p ~/matrix && cd ~/matrix docker run -it --rm \ -v ./data:/data \ -e SYNAPSE_SERVER_NAME=chat.team.internal \ -e SYNAPSE_REPORT_STATS=no \ matrixdotorg/synapse generate
Редактируем data/homeserver.yaml. Ключевые секции, которые нужно изменить:
server_name: "chat.team.internal" database: name: psycopg2 args: user: synapse password: "СМЕНИТЬ_НА_НАДЕЖНЫЙ_ПАРОЛЬ" database: synapse host: postgres cp_min: 5 cp_max: 10 media_storage_providers: - module: s3_storage_provider.S3StorageProviderBackend store_local: true store_remote: true store_synchronous: true config: bucket: matrix-media endpoint_url: https://s3.cloud.ru region_name: ru-central-1 access_key_id: "Key ID" secret_access_key: "Key Secret" # Отключаем открытую регистрацию. Пользователей создаем вручную # или позже включим регистрацию по токену. enable_registration: false # Отключаем федерацию — сервер только для нашей команды federation_domain_whitelist: [] listeners: - port: 8008 type: http tls: false x_forwarded: true resources: - names: [client] compress: false # global_factor < 1.0 уменьшает размер всех кешей пропорционально. # Для 15 пользователей 0.5 более чем достаточно, экономит около 200–300 MB RAM. caches: global_factor: 0.5 # Дальше идут настройки секретных ключей и прочего, что сгенерилось автоматом, мы это не трогаем
Для S3 storage provider нужен пакет synapse-s3-storage-provider, которого нет в базовом образе. Собираем свой:
cat > Dockerfile.synapse << 'EOF' FROM matrixdotorg/synapse:latest RUN pip install --no-cache-dir synapse-s3-storage-provider EOF
Позже стоит добавить крон джобу для подчистки данных, которые ушли в S3, чтобы не засорять VPS:
docker exec synapse s3_media_upload update /data 30d
Конфиг Element Web (в element-config.json):
"default_server_config": { "m.homeserver": { "base_url": "https://chat.team.internal", "server_name": "chat.team.internal" } }, "disable_guests": true, "disable_3pid_login": true, "brand": "Team Chat", "default_theme": "light", "room_directory": { "servers": ["chat.team.internal"] } }
Конфиг для TURN-сервера, чтобы нормально работали звонки:
mkdir -p ~/matrix/coturn # Генерим секрет openssl rand -hex 32 cat > ~/matrix/coturn/turnserver.conf << 'EOF' # Слушаем на VPN-интерфейсе listening-ip=10.8.0.1 # Порт TURN listening-port=3478 # Диапазон портов для media relay min-port=49152 max-port=49200 # Авторизация -- static secret, разделяемый с Synapse use-auth-secret static-auth-secret=<сгенеренный секрет> # Realm -- любое имя, обычно совпадает с доменом realm=chat.team.internal # Логирование log-file=stdout no-cli EOF
Докинем в homeserver.yaml:
turn_uris: - "turn:10.8.0.1:3478?transport=udp" - "turn:10.8.0.1:3478?transport=tcp" turn_shared_secret: <тот же секрет> turn_user_lifetime: 86400000 turn_allow_guests: false
docker-compose.yml для всего стека Matrix:
services: postgres: image: postgres container_name: matrix-postgres environment: POSTGRES_USER: synapse POSTGRES_PASSWORD: changeme POSTGRES_DB: synapse POSTGRES_INITDB_ARGS: "--encoding=UTF8 --lc-collate=C --lc-ctype=C" volumes: - postgres-data:/var/lib/postgresql restart: unless-stopped synapse: build: context: . dockerfile: Dockerfile.synapse container_name: synapse depends_on: - postgres volumes: - ./data:/data restart: unless-stopped element-web: image: vectorim/element-web container_name: element-web volumes: - ./element-config.json:/app/config.json:ro restart: unless-stopped coturn: image: coturn/coturn:alpine container_name: coturn network_mode: host volumes: - ./coturn/turnserver.conf:/etc/coturn/turnserver.conf:ro restart: unless-stopped volumes: postgres-data:
Шаг 6: Caddy с внутренним CA
Наши сервисы живут за VPN и не доступны из интернета, поэтому получить сертификат от Let's Encrypt через стандартный HTTP-01 challenge невозможно. Можно было бы использовать DNS-01 challenge (создавать TXT-записи через API DNS-провайдера), но это добавляет внешнюю зависимость и заметно усложняет настройку. Пока обойдемся без этого.
Проще так: Caddy умеет работать как собственный удостоверяющий центр (CA). Директива tls internal заставляет Caddy сгенерировать корневой сертификат (срок жизни — 10 лет), промежуточный сертификат и leaf-сертификаты для каждого сайта автоматически, без внешних запросов. Обновление leaf-сертификатов происходит прозрачно само. Единственное, нужно один раз установить корневой сертификат Caddy на устройства участников команды.
Caddyfile:
{ # Все сайты по умолчанию используют внутренний CA local_certs # Опционально: задаем имя CA (видно в системном хранилище сертификатов) pki { ca local { name "Team Internal CA" root_cn "Team Internal Root CA" } } } # Synapse API chat.team.internal { reverse_proxy synapse:8008 } # Element Web element.team.internal { reverse_proxy element-web:80 }
Добавляем Caddy в docker-compose стека Matrix (стандартный образ, без кастомной сборки, tls internal работает из коробки):
caddy: image: caddy:2-alpine container_name: caddy ports: # Слушаем только на VPN-интерфейсе - "10.8.0.1:443:443" - "10.8.0.1:80:80" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy-data:/data - caddy-config:/config restart: unless-stopped volumes: caddy-data: caddy-config:
Порты привязаны к 10.8.0.1, из интернета к ним доступа нет. Кастомная сборка Caddy не нужна: tls internal — встроенная функция.
После первого запуска Caddy извлекаем корневой сертификат CA:
docker compose cp caddy:/data/caddy/pki/authorities/local/root.crt ./team-root-ca.crt
Этот файл team-root-ca.crt нужно один раз установить на каждое устройство в команде. Сертификат действует 10 лет, так что повторная установка не потребуется. Шутить про Третью мировую не буду, сами дошутите.
# Linux (Ubuntu/Debian) sudo cp team-root-ca.crt /usr/local/share/ca-certificates/team-root-ca.crt sudo update-ca-certificates # macOS sudo security add-trusted-cert -d -r trustRoot \ -k /Library/Keychains/System.keychain team-root-ca.crt # Windows (PowerShell от имени администратора) Import-Certificate -FilePath team-root-ca.crt -CertStoreLocation Cert:\LocalMachine\Root
На iOS: отправляем файл через AirDrop или скачиваем через VPN, устанавливаем профиль в «Настройки» → «Основные» → «VPN и управление устройством», затем включаем доверие в «Настройки» → «Основные» → «Об этом устройстве» → «Доверие сертификатам».
На Android: «Настройки» → «Безопасность» → «Установить сертификат» → «Сертификат ЦС». Система покажет предупреждение: «Сеть может отслеживаться». Это ок при установке любого стороннего CA.
Для небольшой команды это одноразовая операция, которую удобно описать в той же инструкции, что и подключение к VPN. Я добавил team-root-ca.crt в общую matrix-комнату с закрепленным сообщением.
Шаг 7: первый запуск и создание пользователей
cd ~/matrix docker compose up -d # Ждем инициализации (~ 30 сек.), затем создаем администратора docker exec -it synapse register_new_matrix_user \ -c /data/homeserver.yaml \ -u admin -a \ http://localhost:8008
Программа спросит пароль интерактивно.
Подключаемся к VPN и наконец заходим на https://element.team.internal. И радуемся, что работает!

Входим как admin. Создаем Space для команды, а внутри него — комнаты по проектам.

Для приглашения остальных участников включаем регистрацию по токену:
# homeserver.yaml enable_registration: true registration_requires_token: true
Перезапускаем Synapse:
docker compose restart synapse
В настройках находим и запоминаем токен доступа:

Делаем запрос на регистрационный токен:
curl -X POST https://chat.team.internal/_synapse/admin/v1/registration_tokens/new \ -H "Authorization: Bearer ВАШ_ACCESS_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"uses_allowed": 5, "expiry_time": null}'
И получаем что-то типа этого:
{"token":"uyRtuFpu.B~EVaVk","uses_allowed":5,"pending":0,"completed":0,"expiry_time":null}
С этим токеном уже можно зарегистрироваться:


Приглашение от админа — и мы в чате!

С этим аккаунтом уже можно и с телефона зайти. Не закрывайте при этом сессию на ПК, потому что там будет занятный квест с подтверждением устройства: мы же все-таки хотели безопасности.

Я тут себе подчеркнул: надо будет изучить возможность добавления аккаунта на мобильные устройства через QR-код, чтобы было удобнее.
Шаг 8: подключение команды
Инструкция для участника занимает 5 минут:
1. Установить WireGuard-клиент (Windows, macOS, Linux, iOS, Android — все поддерживаются).
2. Импортировать конфигурацию через QR-код из wg-easy.
3. Подключиться к VPN.
4. Открыть https://element.team.internal в браузере.
5. Зарегистрироваться по токену.
6. Сохранить security key (ключ восстановления шифрования). Это критически важно, так как без него зашифрованные сообщения будут утеряны навсегда при потере всех активных сессий.
На мобильных устройствах: Element X (iOS/Android), после подключения к VPN указать homeserver URL. На Android пуш-уведомления работают через ntfy (UnifiedPush), полностью без google-зависимости. На iOS пуши проще оставить через стандартный matrix.org Sygnal relay. Содержимое сообщений при этом не передается — показывается только факт нового сообщения.
Модель авторизации
Немножко подробнее расскажу про концепт. В моем стеке нет единого центра авторизации. Доступ контролируется на двух независимых уровнях, и о каждом нужно помнить отдельно.
Первый уровень — WireGuard. Доступ к VPN определяется наличием конфигурационного файла с приватным ключом. Никаких логинов и паролей. Кто владеет .conf-файлом, тот в сети. Это одновременно и плюс (простота, нет кредов для фишинга), и минус (потерянный ноутбук с WireGuard-конфигом = у кого-то другого доступ к внутренней сети до момента отзыва ключа).
Второй уровень — Matrix/Synapse. У каждого пользователя есть аккаунт с паролем. Даже попав в VPN, без валидного аккаунта в Synapse прочитать переписку или отправить сообщение нельзя. E2EE добавляет третий слой: даже администратор сервера не может читать зашифрованные сообщения без ключей сессии.
SSO я сознательно не внедрял ПОКА ЧТО. Synapse поддерживает OpenID Connect, и можно было бы развернуть Authentik или Keycloak для единой точки авторизации. Но для 15 человек это ту мач: еще один сервис для поддержки, еще одна потенциальная точка отказа. При масштабировании до 50 человек и более это решение я, конечно, пересмотрю.
Чек-лист при уходе сотрудника
А что, если человечек ушел из команды? Тут составил универсальный чек-лист офбординга:
1. Удалить клиента в wg-easy (Admin Panel → «Удалить пользователя»). Эффект мгновенный, ключ сразу перестает приниматься сервером.
2. Деактивировать аккаунт в Synapse через Admin API:
curl -X POST https://chat.team.internal/_synapse/admin/v1/deactivate/@user:chat.team.internal -H "Authorization: Bearer $ADMIN_TOKEN" -d '{"erase": false}'
Параметр erase: false сохраняет историю сообщений в комнатах, а erase: true заменяет имя и аватар на заглушки.
3. Если есть подозрение на компрометацию устройства, меняем Shared Secret в homeserver.yaml (если использовался для регистрации) и пересоздаем registration tokens.
Этот чек-лист у нас оформлен как закрепленное сообщение в приватной комнате админов. Действий всего на две минуты. Не идеально, но для команды нашего размера ок.
Заключение: что дальше
Резюмирую, что поднять корпоративный мессенджер в облаке реально и без сверхсложной инфраструктуры. Особенно если уже есть готовый сетап с понятной документацией.
Мессенджер есть куда масштабировать: хотелось бы докинуть позже мониторинг, централизованные логи, отдельные бэкапы и, в конце концов, внедрить ИИ-агента под пуши CI/CD. Не все из этого пока что до конца понимаю, как реализовать эффективнее, особенно в рамках того, что хочу разворачиваться на той же платформе. Есть вопросы по продуктам, которые, надеюсь, смогу разобрать на конфе GoCloud. Может, даже допилю что-то в рамках практической лабораторной работы, поспрашиваю специалистов от платформы и других коллег.
Хочу написать вторую часть с доработками, так что, если интересно, дайте знать в комментах. Критики, вопросов, советов — всего этого тоже жду. Может, кто-то уже поднимал для своей команды мессенджер? Делитесь опытом.
Комментарии (75)

SpiderEkb
29.03.2026 11:11Давно уже живем на рокете (до это был слак). Это даже не командный, это общекорпоративный ресурс. Внутри уже есть команды, у команд есть свои каналы Плюс большой набор общих каналов.
И да. Свой сервер, свой форк (как для компов, так и для мобильных устройств) под все платформы. Вход по корпоративной учетке - рабочая почта + indeed key + пароль от рабочего компа через свой сервер аутентификации.
Для аудио-видео есть K-Talk (тоже на своем сервере). И аудио/видео звонки из рокета перенаправлены туда (в оригинале там использовался jeetsy). Хотя в Талке тоже какие-то чаты прикрутили, но не так удобно.
Ну и вся корпоративная IP-телефония завязана на Cisco Jabber - еще один канал связи.
Так что по ТГ тут никто слез не льет особо.

restoniich Автор
29.03.2026 11:11а как обошли ограничения бесплатной версии? платите лицензию или в своем форке все нужное наладили?

SpiderEkb
29.03.2026 11:11Тут я не в курсе. Практически наверняка уверен что все куплено. Для крупного банка это не слишком большие расходы. А у нас только IT подразделение (если всех считать) тысяч пять душ.

mirsalimov
29.03.2026 11:11Все так, только стоит еще упомянуть, что через пару месяцев с этого комбайна планируется переезд.

func-rust
29.03.2026 11:11О! Я тоже матрикс юзаю. Поднял сервак для себя и друзей)

restoniich Автор
29.03.2026 11:11по тем же причинам именно его выбрали?) где сервер подняли?

func-rust
29.03.2026 11:11Я выбрал его по причине того, что телегу душат, а хочется мессенджер для повседневного общения, чтобы был доступен всегда.
Сервак поднял на Яндекс Клауде, настроил обход DPI и звонки, в итоге работает даже при белых списках, все довольны)
В качестве реализации выбрал Conduit, так как конфигурация нищая (3 гига ОЗУ и 2 ядра), а так как он написан на «ржавом» — он работает просто шикарно. ;)
AVX
29.03.2026 11:11Вот прямо при белых списках работает? Они же для определенного ограниченного списка сервисов, и яндекс клауд не входит туда? Не скините адрес какой-то странички, чтобы можно было через браузер открвть (можно в личку) ? У нас как раз на постоянку белые списки, проверить хочу. Если так можно, я тоже тогда на яндексе подниму виртуалку.

kamaz1
29.03.2026 11:11Насколько я знаю часть яндекс облака входит в белые списки, но эти ip ловить надо, и некоторое время назад это было сделать не просто. И через них уже можно ВПН в настоящий интернет подавать

Pavel7
29.03.2026 11:11SSO я сознательно не внедрял ПОКА ЧТО. Synapse поддерживает OpenID Connect, и можно было бы развернуть Authentik или Keycloak для единой точки авторизации. Но для 15 человек это ту мач
Потом это будет сделать ощутимо сложнее, если успеют добавиться другие сервисы, далеко не любой сервис нормально переживает переезд с внутренней БД аутентификации на SSO с примапливанием пользователей. Да и даже в вашей случае, SSO, например, даст возможность использовать tailscale вместо чистого wg под той же учёткой, под которой пользователь заходит в matrix.

restoniich Автор
29.03.2026 11:11Согласен, пока хотелось так потестить. Сейчас изучаю как сделать SSO, т.к. уже понял, насколько регистрация и логин без этого неудобные)
А насчёт tailscale у меня сомнения. Он же в базе через свой проприетарный софт идёт. Это можно по идее пофиксить разворотом headscale, это пока просто не изучал. wg-easy мне уже был знаком, поэтому им и воспользовался.
Можете подробнее описать или ссылку дать, как tailscale с SSO взаимодействует?

Pavel7
29.03.2026 11:11Сейчас изучаю как сделать SSO, т.к. уже понял, насколько регистрация и логин без этого неудобные)
Я бы советовал делать отдельно LDAP и уже поверх него SSO через федерацию. 389ds (или его же в составе freeipa) + keycloak, например. Рано или поздно можно наткнуться на что-нибудь нужное экзотическое, которое умеет LDAP, но не умеет SAML/OIDC и LDAP может пригодиться (хотя все фичи keycloak, типа 2fa, конечно, работать в LDAP аутентификации не будут). И обязательно ещё заранее проверить, что выбранный LDAP сервер умеет разворачивать вложенность групп (openldap, например, не умеет), потому что на этом, обычно, строится вся система прав, в т.ч. то, что keycloak отдаёт в groups клиенту.
А насчёт tailscale у меня сомнения. Он же в базе через свой проприетарный софт идёт.
Да, я именно про headscale, от tailscale будут нужны только клиенты. Tailscale, насколько я знаю, вообще поблочил ру-сегмент в своём облаке, да и даже без этой шизы, идея облачного координационного сервера для своей VPN сети звучит экстремальненько. Headscale умеет OIDC как раз (в т.ч. авторизацию через членство в группе): https://headscale.net/development/ref/oidc/
В ближайшем headscale 0.29 обещают полную поддержку grants, тоже полезная вещь для управления https://tailscale.com/docs/features/access-control/grants

smke
29.03.2026 11:11далеко не любой сервис нормально переживает переезд с внутренней БД аутентификации на SSO с примапливанием пользователей
А можно примеры? Ибо звучит как бред

Pavel7
29.03.2026 11:11firefly_iii, guacamole, immich, meshcentral, vaultwarden

smke
29.03.2026 11:11Из этого списка половина уже нормально работает с sso из коробки, вторая половина при прямых руках и с доступом к бд тоже не вызывает проблем
Да, иногда просто прописать idp недостаточно в настройках, если ты про это, но масштаб проблемы явно преувеличен :)

Pavel7
29.03.2026 11:11Из этого списка половина уже нормально работает с sso из коробки
Смелое утверждение. Firefly_iii, например, вообще с SSO не работает, только remote-user пока умеет.
вторая половина при прямых руках и с доступом к бд тоже не вызывает проблем
Что угодно при прямых руках не вызывает проблем. Суть не в том, что это неосуществимо, а в том, что для многих приложений это лишние трудозатраты, которых можно избежать изначально заводя исключительно внешних пользователей.
масштаб проблемы явно преувеличен :)
Да нет, масштаб как раз указан корректно, особенно для того, кто эту миграцию будет делать в первый раз.

Vilarik
29.03.2026 11:11На всякий случай. Если в Firefly III вы используете remote-user, то, насколько я помню, Firefly III больше ничего дополнительно не проверяет, и можно получить несанкционированный доступ, просто подставив нужный remote-user.

Pavel7
29.03.2026 11:11Firefly III больше ничего дополнительно не проверяет, и можно получить несанкционированный доступ, просто подставив нужный remote-user
Ну конечно, прокси, которая устанавливает этот хедер, должна отвечать и за то, чтобы не принимать его от клиента.

Vilarik
29.03.2026 11:11Если не настроена изоляции Firefly III на сетевом уровне и есть возможность достучаться до Firefly III в обход прокси (что усложняет конфиг), то в этом случае возможна проблема.

Pavel7
29.03.2026 11:11Ну, мне кажется, это первое правило публикации любого приложения, что оно не должно быть доступно напрямую :)

Vilarik
29.03.2026 11:11Если интересно, то могу поделиться наработкой поддержки SAML для Firefly_iii (сделано не концептуально правильно, но для личного использования рабочий вариант)
PS А вы Firefly_iii для корп. нужд используете? Интересно стало - какой use case?

Pavel7
29.03.2026 11:11Нет, исключительно для личных, для корпоративных он вряд ли годится :)
Я через oauth2proxy его к keycloak подключал.

Vilarik
29.03.2026 11:11oauth2proxy если поднимать и поддерживать только ради Firefly_iii, то излишние расточительство ресурсов и усложнение конфига. Мне показалось, что накодить поддержку SAML будет несильно проблемней. Накодил. Сразу не выложил в паблик. Сейчас полез и понял, что уже забыл, как там все сделал- надо заново разбираться. Поставил себе в задачи разобраться и выложить в паблик. Будете в будущем обновлять свою инфраструктуру, поищите на github "Firefly_iii SAML" - к этому моменту должен выложить.

Nemridis
29.03.2026 11:11А как насчет Nextcloud Talk? Лимитов нет, код открытый. Он не рассмативался как кандидатура? Или каких-то функций не хватает?

restoniich Автор
29.03.2026 11:11Nextcloud Talk за собой вроде весь nextcloud stack тащит, мы этого не хотели. + мне кажется не такое развитое решение, как matrix

shirmanov
29.03.2026 11:11Почему Campfire не рассматривали от 37signals?

restoniich Автор
29.03.2026 11:11Как-то даже не наткнулся на него, да и на весь Basecamp. Мельком глянул -- выглядит интересно. Надо будет пощупать

JediPhilosopher
29.03.2026 11:11На примере Rocket Chat печально наблюдал деградацию продукта. Чем дальше тем больше хочется обзывать разработчиков.
Приложения Rocket Chat постоянно требуют актуальную версию сервера. Нельзя просто единожды поставить сервер и радоваться. Новые версии приложений в какой-то момент начнут вам показывать сообщение "вы используете устаревший сервер, обновите его или я через месяц перестану работать". И таки перестают! Причем этому нет никакой логичной логики типа обновления API и несовместимости. Нет, присто приложение по таймеру следит и отрубает поддержку старых серверов, чтобы заставлять вас их регулярно обновлять.
А зачем?
А затем что с каждой новой версией урезают функционал. В одной версии пропали, например, отметки о прочтении. Теперь только в платной enterprise версии. В другой версии начали требовать обязательно регистрировать ваш личный сервер в их облаке. По сути сделав бессмысленной всю идею self-hosted чата, я ведь конечно для того его завел на своем сервере, чтобы регистрироваться в вашем драном облаке, ага-ага.
Сперва этот процесс регистрации добавили, потом сделали обязательным но обходимым (через ручное редактирование флага в БД), а затем и обход поломали. Все должны быть в облаке! Все! Не умеете регаться в облаке - научим, не хотите - заставим.
А не обновляться, напомню, вы не можете, так как через некоторое время у вас просто отваливается мобильное приложение, отказываясь работать с вашей версией сервера, которая вам может полностью устраивать.
В общем печаль, куда они его катят. Да, я понимаю, денег все хотят, а on-premise решение их не приносит и отъедает клиентов у облачного, которое приносит. Atlassian вон полностью убил все свои self-hosted продукты (кто-то еще помнит, что когда-то Jira можно было у себя развернуть?). Но можно хотя бы не заставлять принудительно обновляться и не менять условия по ходу пьесы?

Zachelovek
29.03.2026 11:11На примере Rocket Chat печально наблюдал деградацию продукта. Чем дальше тем больше хочется обзывать разработчиков.
Полностью согласен. Очень многообещающая штуковина. Была.
Приложения Rocket Chat постоянно требуют актуальную версию сервера.
А затем они, судя по всему, кого-то из ватсаппа переманили. И началась такая enshittification.

restoniich Автор
29.03.2026 11:11Да грустно это. Получается лишний раз подтвердились мои опасения насчет его. Думали куда-то переезжать?

si1v3r
29.03.2026 11:11А поиск нормально работает?

restoniich Автор
29.03.2026 11:11Пока да, но сейчас еще не много комнат, обсуждений и прочего. Надо смотреть со временем.

min8
29.03.2026 11:11Меня одного смущает доступ через впн? Когда это в рамках офиса, возможно, но к примеру телефон не может быть одновременно к 2м впн подключен, а следовательно, если подключен к чату, не подключен к YouTube или еще чему, это же неудобно, да и без подключения нет уведомлений и чата. Да и вообще технически не подкованный человек может тупить, почему не приходят сообщения, а оказывается просто впн отвалился

restoniich Автор
29.03.2026 11:11Да, этот момент мешает, особенно в текущих реалиях. Думаем, что с этим сделать.

Daiichi
29.03.2026 11:11Да, этот момент мешает, особенно в текущих реалиях. Думаем, что с этим сделать.
SSH port forwarding или OpenSSL tunnel proxy рассматривали? Эти два варианта позволяют сделать аутентификацию по ключам/сертификатам. Так-то прокси можно сделать на чём угодно, хоть на netcat, но не на всём можно сделать сравнительно безопасную аутентификацию.

UcnleGaara
29.03.2026 11:11Если мне не изменяет память в mattermost team edition история доступна вся без лицензий. В чём принципиально использование энтерпрайз сервера?

restoniich Автор
29.03.2026 11:11Там нет SSO, кап на 250 юзеров, нет звонков.
В общем, выглядит так, что тоже обрезано, просто с другой стороны.
Я этот момент с двумя такими различающимися бесплатными версиями вообще не понял.
Ну и общая тенденция такая, что непонятно, какие ещё фичи отрежут, мб вообще версию уберут.

ImagineTables
29.03.2026 11:11Итоговый стек развернут на одном виртуальном сервере в Сloud.ru.
Тот неловкий момент, когда ты читаешь это предложение и уже собираешься написать: «Расскажите лучше, как сделать то же самое на домашнем сервере с dynamic IP», а потом понимаешь, что читаешь корпоративный блог Сloud.ru.

Pavel7
29.03.2026 11:11Расскажите лучше, как сделать то же самое на домашнем сервере с dynamic IP
Да вроде никакой разницы с описанием автора не будет, кроме дополнительной необходимости в ddns клиенте.

restoniich Автор
29.03.2026 11:11Подтверждаю, если ddns есть, то норм. Конфиг того же wireguard как раз с доменным именем можно распространять как адрес эндпоинта.

anwender95
29.03.2026 11:11А в чем проблемы с ddns?
Обычно, аптайм роутера дома висит до следующего отключения электричества, а без ребута роутера IP не меняется.
Роутер ребутнулся, ddns обновил домен no-ip или кого-угодно и опять все работает по домену.

homm
29.03.2026 11:11Довели. Поднял корпоративный мессенджер локально
Ну получается ещё не довели, всё ещё терпите

checkpoint
29.03.2026 11:11Неправильную технологию ты выбрал для корпоративного чата, Дядя Фёдор, XMPP сервер надо было поднимать (ejabberd).

select26
29.03.2026 11:11Тоже об этом подумал. Но в последний раз использовал Jabber в 2007 году.
Как сейчас у него с клиентами и корпоративным функционалом?

checkpoint
29.03.2026 11:11Клиентов с поддержкой XMPP много, но в целом прогресс остановился где-то в 2010 году. С другой стороны, функционала там уже в то время было с избытком. Ну может быть видео и аудио звонки отладили.

Zachelovek
29.03.2026 11:11XMPP сервер надо было поднимать (ejabberd)
Для команды в 15 человек (и даже больше) на 120% хватило бы Prosody. Ejabberd - это когда у вас тысячи пользователей.

checkpoint
29.03.2026 11:11

restoniich Автор
29.03.2026 11:11Это тоже интересно, на самом деле. Я бы такую штуку для друзей поднял, где нужны просто чаты.
Вот вопрос в функциональности. Есть ли клиенты XMPP, где присутствует/можно настроить вот это слаковое естество с комнатами, тредами и комментариями? Или просто чаты?

checkpoint
29.03.2026 11:11Почти все XMPP/Jabber клиенты поддерживают групповые чаты (конференции), многие поддерживают голосовые звонки. Гуглите по "xmpp jabber client", их достаточно много. Для андроида есть Xabber (ищите на F-Droid). Для Win/Lin - Pidjin или Gajim. А вообще, есть такой web-сайт: https://xmpp.org/software/
Еще одна прелесть XMPP сервера состоит в том, что к нему можно приделать шлюзы в другие сети. В своё время у нас был шлюз в ICQ, MSN и Yahoo. Сейчас есть шлюзы в SMTP, Matrix и Telegram.

neodavinchi
29.03.2026 11:11Единственный порт, который открыт наружу, — UDP 51820 для WireGuard
Как вы оцениваете риски потери связи клиента с сервером из-за временной блокировки протокола WireGuard через DPI? 2,5 года назад, когда только начинали блокировать VPN-ы, WireGuard внутри РФ уже попадал под раздачу (не знаю как с этим сейчас).

restoniich Автор
29.03.2026 11:11Вроде пришли к тому, что как раз внутри России не должны wireguard и прочие впны блочить. На практике оно конечно всяко может быть, и просто при очередных тестах отваливаться, понимаю. Время покажет, пока смотрим, что еще можно поднять. Тут даже не очень понятно, как ориентироваться и понять, что разрешено и в какой-то перспективе не запретят.

domix32
29.03.2026 11:11Zulip хостить не пробовали?

restoniich Автор
29.03.2026 11:11Интересный вариант, у него довольно уникальная модель общения через топики, как понимаю. У вас есть опыт использования? Как оно в жизни?

domix32
29.03.2026 11:11В среднем видел/использовал его используют в качестве альтернативы слака/дискорда в некоторых опенсорсных коммунити. Функционально они вроде не слишком отличаются, если не считать нефункциоанальные свистоперделки. Авторизация там соотвественно через Oauth гугла или гитхаба, но наверняка есть что-нибудь и про интеграцию с LDAP, а может и вообще RADIUS, может даже с 2fa, тут надо уточнять. С точки зрения админа/модератора не знаю как выглядит. Из преимуществ - отлично адресуется и ищется и можно шарить ссылки на конкретные топики, в отличие от того же слака/дискорда, где в среднем стратегия "написал и забыл".
Насколько это удобно для корпоративной работы вопрос конечно открытый и пока не приходилось в таком формате использовать.

sinwinz
29.03.2026 11:11Тоже развернул в корпоративной среде. Вынес бд на postgresql на отдельный сервак, тоже самое с coturn. wireguard не посчитал нужным, люди устали от впна и хочется просто открыть рабочее приложение и общаться. Под вопросом остаются уведомления и тем более уведомления о звонках - у меня работает через раз, видимо это боль всех опенсорс чатов.
Так же не совсем корректно работают видеоконференции - присоединиться в группу больше двух становится больно. Как у вас дела с этим обстоят?
restoniich Автор
29.03.2026 11:11А вот кстати видеоконференции пока не тестировали, надо будет проверить.
Уведомления работают, но тоже ощущение, что не очень стабильно. При этом у нас и впн всегда включен что не очень удобно.
Уже выше здесь обсуждали мороку с впн, особенно на телефонах. Как опыт пользования без него? Как обезопасились?

bogusa
29.03.2026 11:11Про плохую защиту я бы ещё упоминул почту на yandex.ru. со своим доменом естественно. Файерволы, Впн, а в окне web - дырка в виде почты.
runaway
Знаете, все ваши "боли" от того, что вы спутали "Телеграм" с неким корпоративным мессенджером. Телега никогда и никому не обещала, что она создана для рабочего общения (в отличие от, скажем, Teams).
Поэтому недовольство "Телеграмом", что он не соответствует вашим желаниям, довольно спорно.
oriental_nova
ну не соглашусь здесь на 100%, а супергруппы, возможность ставить рабочие часы и тд что доступно в бизнес-аккаунтах, интеграции с срмками всякими через ботов? это же не функции для дружеской коммуникации, а явно движение в сторону чего-то рабочего ?
куча команд используют его как корпмессенджер, потому что удобно/было удобно. разрабы телеги на протяжении лет не игнорировали этот момент и делали обновления для этого сценария
SpiderEkb
Полноценный корпмессенджер должен быть sefhosted с аутентификацией через собственный сервер. Потому что там могут быть какие-то чувствительные данные публиковаться (а их можно публиковать только во внутреннем контуре).
Те, кто ориентированы на этот сектор, всегда предлагают такие решения. Это и у слака было и у рокета и у K-Talk и у Cisco.
Okeu
Кому он должен?
Могут быть, а могут не быть. А может для бизнеса затраты на администрирование онпрема сильно превышают риски нахождения в облаке.
Многие мало того что сидели в телеге, есть куча компаний, которые сидели и продолжают сидеть в дискорде.
Причем в дискорде я видел не только корп. общение, но даже как service desk вели, и тикеты на kanban досках)
у слака разве когда-то был онпрем? Сколько его знаю, он всегда сидел в облаке...
zlorange
Персональные данные и коммерческая тайна. Если хватает мозгов держать такое в чужих левых облаках - туда вам и дорога... Репутация, УК - не, не слышали?
Okeu
а у вас кроме большого энтерпрайза ничего в мире не существует?
Знаю команду из 10 человек, которые на полном альтруизме и собственные средства решили разрабатывать игру и организовали инди студию - им уже нужно арендовать стойку, чтобы поставить на ней mattermost или rocket chat? Или они могут использовать облачный корпоративный месседжер а то и вовсе работать в дискорде? Вы серьезно сейчас считаете, что good practice большого БАНКИНГА (а спикер выше из Альфа-банка) является мастхев практикой абсолютно для любого бизнеса?
Поспрашивайте у импортозамещенных коллег - сколько компаний сидит в облаке К-талк и в VK Teams.
Полагаю у многих из них и с УК и с репутацией - все хорошо и без ваших советов. Мозгов скорее нет у тех, кто готов опыт Альфа-банка проецировать на любой бизнес.
zlorange
Пилить индюшатину на полном альтруизме это хобби, а не коммерческий проект, который может содержать чувствительную инормацию с дорогими во всех смыслах последствиями ее потери. Хоть на стенах в сортире обсуждайте, хоть форум на phpBB на ukoz создайте. See, no one cares! Там (на форуме) кстати и разделы можно создавать любые, и треды разводить, и вложения, и даже доступы по группам и темам нарезать. А необъяснимая любовь по любому чиху создавать групповые созвоны с пушами и свистоперделками на 100500 человек большей части из них только работать мешает.
Умение подбирать адекватные задаче решения - довольно важный навык в этом мире. Арендовать стойку на мессендер для 10 человек пилящих индюшатину можно, и может даже что-то получится... с запасом...надежно (как-бы, но нет если собрать это будут люди с такими взглядами на цифровую гигиену)... Нафига только? Одного хоста для начала не хватит?
Hardware requirements for team deployments
Most small to medium Mattermost team deployments can be supported on a single server with the following specifications based on registered users:
1 - 1,000 users - 1 vCPU/cores, 2 GB RAM
1,000 - 2,000 users - 2 vCPUs/cores, 4 GB RAM
Ну вы либо трусы наденьте, либо крестик снимите. Играть в гениальных игроделов за свой счет и "в бизнесе работать" это сильно разные вещи и подходы к хобби на работу с реально ценной информацией перекладывать не стоит.
Okeu
это вы так сказали? А если проект инвестиции принимает, находит себе издателя - это все еще хобби? И что, если они, находясь не в РФ юрисдикции заезжают в Slack - в котором есть требуемый функционал, отсутствующий в любом другом решении - это тоже другое?
именно, о чем мой изначальный тейк и пошел - не все живут в мире BIG ENTERPRISE, многие не могут себе позволить содержать onprem.
Вы вообще понимаете как живет средний\мелкий бизнес?
Покупка платного slack'a сопоставима с тратами на железо для селф-хостед решения, при условии, что само ПО будет бесплатное. А ведь еще нужен человек, кто будет это содержать? Человекочасы и стоимость обслуживания и допом стоимость лицензии онпрем посчитаем?
Давайте не ограничимся месседжером и скажем - что облачный Trello\Asana им не подходит - ТРУЪ бизнесы сидят только на Jira Data Center селф хостед. Google cloud им категорически нельзя использовать, только Exchange... Так можно бесконечно продолжать - любое onprem решение - это дополнительная финансовая нагрузка, облако всегда будет дешевле и мелкий бизнес себе позволить этого часто не может. Грамотный админ - обозначит риски о рамки ответственности - если бизнес их принимает - то любое решение хорошее, даже облако. Риски и вендорлок, которые тянет за собой облако - это отдельная тема для обсуждения, но заявлять, что "настоящий труъ корпоративная %система_нейм% должна быть только онпрем" - это еще большая глупость, чем брать облако, не оценивая вообще никаких рисков)))
Снова и снова одно и тоже, главное надуть еще брутально губы и с пафосом это выговаривать "бииизнес".
ок, отступаем от инди студии - компания ~250 человек - разработка ПО. Продукт, представляющий ценность - на своих серверах. репозитории - все на своих серверах. Тасктрекер, 1С - все локально. А вот месседжер, гуглодоки, почта - все в клауде. Так же в клауде и менеджер паролей ака bitwarden - что они, дураки, по вашему?
УПД:
вот Slack - это настоящий корпоративный месседжер, и он облачный - это основной и главный его недостаток. А все остальное - это боль, страдания и полумеры. Жалкие бледные тени того, каким должен быть функционал для удобного корпоративного юза.
runaway
Ну так-то и электронную почту можно притянуть в корпоративное стойло: они ведь не спроста дали возможность автоматической сортировки писем по папкам, отвечать сразу нескольким адресатам, а ещё цитировать предыдущие сообщения и просматривать PDF с XLS прямо в почтовике? Вот то-то же.
Нет. Иногда возможность прикрутить CRM через бота и папки в чатах -- это просто фича, которая есть, но не целенаправленная история В2В. ТГ никогда не позиционировался как мессенджер для бизнеса.
SpiderEkb
Да. Почта тоже своя. И есть прямой запрет обсуждения рабочих вопросов вне контура. Аотому ято коммерческая тайна, банковская тайна, персональные данные...
Vasjen
Не соглашусь. Дело не в корпоративном мессенджере, а просто вещах, которые в телеграмме плохи by design. Телеграм изначально создавался как мессенджер и как мессенджер он скорее хорош, чем плох. Он хорош для небольших чатов, например семейные, друзья, домовой чат и т.д. Но он категорически плох для сообществ, которые сам телеграм продвигает и развивает, но архитектурно ничего не меняет.
Попробуйте создать чат владельцев любого авто, даже если вы создадите топики - масло, мультимедиа, запчасти и т.д., это все равно будет большой помойкой, в котором ничего нельзя найти, поэтому у вас в каждом таком топике будут по 5-10 закрепов с самыми частыми вопросами, и все каждый раз придется туда направлять люедй.
Попробуйте создать чат студентов, у меня 170 одногруппников, сообщений - тысячи. И реально невозможно найти что-то, о чем была речь 2-3 месяца назад, кроме как руками просто сидеть и отматывать, ну или фильтр по дате выставить. А тебе нужно найти имя препода по дисциплине, и поиск не найдет по поиску "препод". Хотя прям это слово есть в нужном сообщении.
Нет веток как здесь в комментариях, да и в любых сообществах. Дискусси вести неудбно, какую ветку пометить как интересной, чтобы в нее именно вернуться - тоже нельзя.
Реально, телегой вообще не удобно пользоваться в каких-то активных чатах и живых сообществах. Единственный нормальный сценарий, это что-то пообсуждать здесь и сразу забыть, и никогда больше не возвращаться. А если вам нужно что-то хранить, какие-то гайды, статьи, какие-то примеры (или хотя бы просто ссылки на них), то тут релаьно огромная беда, на мой взгляд, при этом не важно это "корпоративное" использование или бытовое, суть от этого не меняется.