MAATRIX / Блог / Lemmy вместо форума приносит трафик из федерации и спам оттуда же

Lemmy вместо форума приносит трафик из федерации и спам оттуда же

MAATRIX

Классический форум живёт ровно теми пользователями, которых вы сами привели: рекламой, SEO, сарафанным радио. Lemmy — федеративная альтернатива Reddit — устроена иначе: как только вы поднимаете инстанс и подключаетесь к федерации fediverse, к вам начинают стекаться посты и комментарии с тысяч других серверов, а заодно и их проблемы. Мы держим небольшой тематический инстанс Lemmy почти год и расскажем, что из этого вышло — с цифрами там, где они есть, и без них там, где это был бы просто угадайка.

Чем Lemmy отличается от форума и от Mastodon

Прежде чем разбирать плюсы и минусы, стоит развести три вещи, которые в голове у новичка легко слипаются в одну «федеративную платформу».

Классический форум (phpBB, Discourse, самописное решение) — изолированный остров: все темы, все пользователи, вся модерация только ваши, никто не появится без того, чтобы вы его сами не привели. Если вы уже сравнивали движки для форума, у нас есть отдельный разбор Discourse и Flarum — там же и вопрос ресурсов на сервере.

Lemmy — тоже форум по сути интерфейса: сообщества (community, аналог сабреддита), треды, голосование за посты и комментарии, сортировка по горячему/новому/топу. Но технически это узел сети ActivityPub — того же протокола, на котором работает Mastodon. Ваш инстанс федерируется с другими инстансами Lemmy (и в теории с любым ActivityPub-совместимым софтом), обмениваясь постами, комментариями, голосами и модераторскими действиями.

Mastodon — тоже ActivityPub, но по форме это микроблог: лента коротких постов, подписки на людей, а не на тематические сообщества с тредами. Разница принципиальна: Lemmy заточен под структурированные обсуждения с иерархией комментариев (как Reddit или старый форум), Mastodon — под поток коротких сообщений (как Twitter). Оба тянут трафик из федерации, оба огребают спам оттуда же, но векторы атаки разные — в Mastodon это спам-аккаунты с однотипными постами и хэштег-флуд, в Lemmy — спам-сообщества, накрутка голосов и заливка контента ботами в существующие треды.

Практический вывод: нужна структура «тема → ответы → подветки» — берите Lemmy и получаете форум с бонусом федерации; нужна лента коротких статусов и подписки на людей — это Mastodon, и сравнение уже не корректно, это разные форматы взаимодействия под одним протоколом.

Зачем вообще переходить с форума на Lemmy

У нас было тематическое сообщество на Discourse — около 400 активных пользователей в месяц, органический трафик рос медленно: весь контент варился внутри закрытого контура, поисковики индексировали, но межсайтовой циркуляции не было вообще.

Перенос на Lemmy дал три эффекта, недостижимых на форуме физически:

  1. Кросспостинг из федерации. Если на другом инстансе Lemmy создают сообщество с похожей тематикой и кто-то подписывается на него с вашего инстанса, посты начинают показываться вашим локальным пользователям в общей ленте «Все сообщества» — контент, который никогда бы не появился на закрытом форуме.
  2. Обнаружение через инстансы-агрегаторы. Сайты вроде lemmyverse.net индексируют все известные инстансы и сообщества федерации. Попадание туда — бесплатный источник новых подписчиков, аналог каталога форумов, только автоматический.
  3. Комментарии подтягиваются с других инстансов. Если ваш пост попал в чужое сообщество (или наоборот), обсуждение идёт распределённо: комментаторы зарегистрированы на десятке разных серверов, но видят единый тред — читателю это выглядит как один живой форум.

Численно: за первые три месяца после переезда на Lemmy у нас число уникальных посетителей в месяц выросло примерно в полтора раза относительно последних месяцев на Discourse — но это ориентир по конкретному инстансу с конкретной тематикой, у вас может быть заметно иначе в зависимости от ниши и от того, какие сообщества федерации решат репостить ваш контент.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать VPS под Lemmy

Установка Lemmy: минимальный рабочий стек

Официальный способ развернуть Lemmy — Docker Compose. Стек: lemmy (бэкенд на Rust), lemmy-ui (фронтенд), postgres (база, ядро всего инстанса), pictrs (хранение и обработка изображений) и reverse proxy перед всем этим для маршрутизации и TLS.

Пример упрощённого docker-compose.yml (актуальные образы и переменные всегда проверяйте в официальном репозитории LemmyNet/lemmy-ansible или LemmyNet/lemmy-docker перед деплоем — версии со временем меняются):

services:
  lemmy:
    image: dessalines/lemmy:latest
    restart: always
    environment:
      - RUST_LOG="warn"
    volumes:
      - ./lemmy.hjson:/config/config.hjson:Z
    depends_on: [postgres, pictrs]

  lemmy-ui:
    image: dessalines/lemmy-ui:latest
    restart: always
    environment:
      - LEMMY_UI_LEMMY_INTERNAL_HOST=lemmy:8536
      - LEMMY_UI_LEMMY_EXTERNAL_HOST=forum.example.com
      - LEMMY_UI_HTTPS=true
    depends_on: [lemmy]

  pictrs:
    image: asonix/pictrs:0.5
    restart: always
    user: 991:991
    volumes:
      - ./volumes/pictrs:/mnt

  postgres:
    image: postgres:16-alpine
    restart: always
    environment:
      - POSTGRES_USER=lemmy
      - POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
      - POSTGRES_DB=lemmy
    volumes:
      - ./volumes/postgres:/var/lib/postgresql/data
    secrets: [postgres_password]

secrets:
  postgres_password:
    file: ./postgres_password.txt

Файл lemmy.hjson задаёт hostname, лимиты регистрации и федерацию:

{
  hostname: "forum.example.com"
  federation: {
    enabled: true
    # для белого списка вместо федерации со всеми — см. allowed_instances
    # и blocked_instances в актуальной документации
  }
}

Перед nginx или Traefik ставится reverse proxy с TLS — если вы никогда не разбирали, как запрос проходит от клиента до контейнера, у нас есть отдельный материал про то, как работает reverse proxy. Для Postgres сразу настройте регулярные дампы — база растёт быстрее, чем кажется на старте, когда федерация начинает синхронизировать чужие посты и комментарии, а восстановление без бэкапа означает потерю всего инстанса. Общий подход к автоматизации дампов и ротации разобран в статье про резервное копирование баз данных — для Lemmy логика та же, только база одна и растёт монотонно.

По железу: на старте достаточно 2 vCPU и 4 ГБ RAM для небольшого инстанса без активной федерации. Как только вы включаете федерацию и подписываетесь на активные сообщества, Postgres начинает получать заметный поток записи — посты, комментарии, голоса, обновления профилей с чужих серверов синхронизируются постоянно, даже если у вас самих нет активности. На практике для инстанса с федерацией комфортнее закладывать от 4 vCPU и 8 ГБ RAM.

Есть два места, где Lemmy съедает ресурсы быстрее, чем ожидаешь, именно из-за федерации. Диск под Postgres растёт не только от вашего контента, но и от реплицированных постов/комментариев из подписанных сообществ — причём даже после отписки старые данные автоматически не удаляются. Второе место — диск и трафик под pictrs: изображения из чужих постов кэшируются локально при первом просмотре, и без отдельного лимита объём хранилища растёт монотонно — стоит сразу настроить параметр retention (сверяйтесь с актуальной документацией, он менялся между версиями) на удаление неиспользуемых файлов через фиксированный срок. При активной федерации закладывайте вертикальное масштабирование VPS заранее или выносите Postgres на отдельный сервер — всё на минимальной конфигурации работает только для тихого нишевого сообщества без подписки на крупные внешние сообщества.

Федерация: как включить и чем она обрастает

Федерация не «одна большая сеть, к которой вы просто подключились». Технически: как только пользователь вашего инстанса подписывается на сообщество с другого инстанса (например !linux@lemmy.world), ваш сервер начинает получать через ActivityPub все новые посты и комментарии этого сообщества — постоянно, пока хоть один ваш пользователь подписан. Обратный процесс работает так же: подписался пользователь чужого инстанса на ваше сообщество — весь его контент начинает реплицироваться туда.

Это даёт кросспостинг бесплатно, но есть нюансы:

  • Задержка синхронизации — от нескольких секунд до пары минут, в зависимости от нагрузки на оба инстанса и очередь activitypub-воркеров.
  • Модерация не синхронизируется полностью. Удаление поста модератором чужого инстанса у вас отражается, но локальная блокировка пользователя на вашем инстансе на других серверах не действует.
  • Instance blocking работает в обе стороны. Проблемный инстанс можно внести в чёрный список федерации (blocked_instances), и контент оттуда вообще перестанет к вам попадать — основной инструмент защиты от спама и токсичного контента.
  • Есть публичные списки проблемных инстансов, которые ведёт сообщество Lemmy (в духе списков блокировки для email), но мониторить их приходится самостоятельно — автоматической подписки на такой список из коробки нет.

Спам и мусорный контент из федерации: с чем реально столкнулись

Обратная сторона того же механизма: спам к нам пришёл не через регистрацию ботов на своём инстансе (с этим справляется обычная капча и rate limiting), а через федерацию — контент с чужих серверов, где модерация слабая или отсутствует.

Конкретные паттерны, с которыми мы разбирались:

  • Спам-сообщества с чужих инстансов, реплицирующиеся в общую ленту «Все сообщества» как только на них подписался хоть один локальный пользователь — решение не полагаться на общую ленту по умолчанию, а модерировать список сообществ в рекомендациях.
  • Накрутка голосов ботами на постах из определённых инстансов — характерный признак: резкий скачок upvote за секунды без роста комментариев. Помогает blocked_instances для серверов с историей накрутки.
  • NSFW и спам-контент через подписку на, казалось бы, безобидное сообщество, которое затем меняет тематику или подвергается захвату (community takeover) на исходном инстансе — предугадать это на старте подписки невозможно.
  • Фишинговые ссылки в комментариях — приходят так же, как обычный спам в почте, только через федеративный канал, минуя вашу собственную регистрацию.

Практический набор мер, которые снизили поток до управляемого:

  1. Список заблокированных инстансов — в lemmy.hjson или через админку задаётся blocked_instances, конкретные домены, федерация с которыми полностью отключается. Радикальная, но самая надёжная мера.
  2. Модерация на уровне сообществ, а не только инстанса — у каждого сообщества свои модераторы, локальные админы снимают посты и баны независимо от происхождения контента.
  3. Rate limiting на уровне nginx перед pictrs и API — та же логика, что и для защиты от паразитного трафика на любом VPS: ограничение частоты запросов с адреса и по User-Agent.
  4. Фильтрация по ключевым словам — Lemmy поддерживает список запрещённых слов на уровне инстанса (slur_filter_regex), но это узкий инструмент против откровенного мусора, а не осмысленного спама.
  5. ИИ-модерация контента как дополнительный слой — классификатор оценивает пост до того, как он станет виден всем. Мы разбирали такую связку (LiteLLM как шлюз к внешней модели плюс локальный классификатор на случай отказа) в статье про ИИ-модерацию контента на сервере — применимо и к контенту из федерации.

Честно: полностью убрать проблему нельзя — источник контента не в вашем периметре. Форум с закрытой регистрацией и капчей в этом смысле спокойнее: весь спам пришёл через вашу же форму регистрации, барьер входа полностью в ваших руках. У Lemmy барьер входа для контента — это чужая администрация, на которую вы не влияете.

Модерация: инструменты Lemmy против инструментов форума

На форуме модерация линейна: есть админы, есть модераторы разделов, есть встроенные инструменты (бан, предупреждение, скрытие темы). У Lemmy добавляется федеративное измерение.

ЗадачаКлассический форумLemmy
Забанить пользователяЛокально, мгновенноЛокально мгновенно, но пользователь может постить с другого инстанса в те же сообщества
Удалить постУдаляется у всех сразуСинхронизируется через федерацию не всегда мгновенно, чужие копии могут задержаться
Блокировать источник спамаIP-бан, капчаБлокировка целого инстанса (blocked_instances) — грубо, режет весь трафик с домена целиком
Фильтр по словамПлагин/модульВстроенный regex-фильтр на уровне инстанса
Видимость действий модерацииОбычно приватнаПо умолчанию публичный лог модерации для каждого сообщества

Последний пункт стоит подчеркнуть: прозрачность модерации против привычной для форумов приватности административных решений. Если для вашей аудитории это принципиально, обсудите с командой заранее, а не после первого запроса «почему все видят, что я забанил пользователя X».

Стоит ли вам переезжать с форума на Lemmy

Однозначного ответа нет, но есть рабочие критерии.

Lemmy имеет смысл, если: вы стартуете сообщество с нуля и органический трафик через SEO будет расти медленно (федерация даёт быстрый первичный приток); тематика достаточно нишевая, чтобы не тонуть в общем потоке, но живая, чтобы иметь аналоги на других инстансах; есть ресурс на модерацию сверх обычного — минимум один человек, регулярно просматривающий журнал федерации; вам комфортна публичная прозрачность модераторских решений.

Классический форум остаётся лучше, если: сообщество закрытое или полуприватное по смыслу (корпоративное, узкоспециализированное, с NDA-подобными темами); нет ресурса на постоянную модерацию внешнего контента; важен полный контроль над тем, что видят пользователи, без сюрпризов от чужой администрации.

Промежуточный вариант, который мы в итоге используем: держим федерацию включённой, но со списком одобренных инстансов вместо режима «федерируемся со всеми по умолчанию» — white-list вместо black-list. Это режет часть органического притока, но сильно снижает поток мусора: вы заранее выбираете, с кем обмениваетесь контентом, а не разбираете последствия постфактум.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать VPS под Lemmy

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли отключить федерацию совсем и использовать Lemmy просто как форум?

Да, флагом federation.enabled: false в lemmy.hjson. Получаете чистый форумный интерфейс с голосованием и сообществами, без внешних постов и без риска спама из федерации — но и без бонуса притока трафика.

Что произойдёт с локальными данными, если заблокированный инстанс позже станет безопасным?

Ничего автоматически — блокировка не ретроактивна для уже полученного контента. После снятия домена из blocked_instances федерация возобновится с текущего момента, старые пропущенные посты не досинхронизируются.

Нужен ли отдельный сервер под Postgres при небольшом инстансе?

Нет, для старта база спокойно живёт в том же Docker Compose стеке на одном VPS. Выносить её отдельно имеет смысл, когда федерация даёт заметный поток записи и это сказывается на отзывчивости UI.

Как быстро реагировать на инстанс, ставший источником спама?

Добавить домен в blocked_instances через админку и перезапустить федеративный воркер — новый контент оттуда перестаёт поступать в течение нескольких минут. Уже полученные посты остаются, их надо чистить вручную.

Lemmy подходит для полностью коммерческого проекта (например, форума поддержки продукта)?

Технически да, но федерация в этом случае обычно не нужна — вы не выигрываете от притока случайных пользователей fediverse на форум техподдержки, зато рискуете получить мусорный контент. Логичнее развернуть Lemmy с отключённой федерацией или остаться на классическом форуме.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →