4 Install Mastodon
Izorkin edited this page 1 year ago

Mastodon - некоммерческая децентрализованная социальная сеть, которая предоставляет функции микро-блоггинга, на подобии Twitter. Видимые другим краткие сообщения пользователей здесь называются "гудками"("toots"). Ограничением является длина поста в 500 символом, а мне хотелось бы чтобы была возможность изменить эти ограничения.

Основным преимуществом Mastodon является то, что любой желающий может поднять свой сервис на собственном ресурсе и присоединиться к уже существующим узлам. На текущий момент насчитывается около 5,5 тысяч узлов, 3,2 млн. пользователей и более 470 млн. гудков. Статистику можно глянуть на сайте - https://mastopeek.app-dist.eu

У Mastodon отсутствует централизованный сервер, и каждый узел может иметь свои правила, условия использования и политику модерации. Пользователям предоставляется возможность выбрать любой узел для регистрации, с политикой которого они согласны. Выбор сервера не влияет на возможности общения с пользователями, зарегистрированным на других узлах. Это похоже на работу почтового сервера - у каждого пользователя имеется адрес с именем пользователя и доменом в конце, например - Mastodon@mastodon.social, по которому осуществляется межсерверный обмен сообщениями и другой информацией (подписка, продвижения, закладки и т.п.).

Так же Mastodon входит в состав Fediverse и позволяет взаимодействовать с другими открытыми платформами, поддерживающих протокол ActivityPub.

Список серверов, где можно зарегистрироваться можно посмотреть тут - https://joinmastodon.org/communities. Русское сообщество присутствует тут - https://fedi.inex.dev/communities/.

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

ActivityPub - открытый и децентрализованный протокол социальных сетей, основанный на протоколе ActivityPump. Предоставляет API для клиента/сервера для создания, обновления и удаления контента, а также объединённый API для доставки уведомлений и контента с одного сервера на другой. Готовый стандарт опубликован в январе 2018 года в качестве рекомендации. В Mastodon поддержка ActivityPub добавлена в версии 1.6, выпущенная 10 сентября 2017 года.

В NIxOS поддержку Mastodon внедрили 12 февраля 2021 года - https://github.com/NixOS/nixpkgs/pull/112898. Теперь свой узел Mastodon достаточно легко поднять у себя, всего-лишь необходимо прописать в конфигурации параметры узла Mastodon, базы данных PostgreSQL и Redis, указать почтовый ящик, с которого будут приходить уведомления.

Первым делом устанавливаем ОС NixOS, можно по этой инструкции - https://git.elven.pw/Rebrain/basic-nixos/wiki/Basic-NixOS-setup. Mastodon в обязательном порядке использует https соединения, поэтому нам потребуется реальный домен, либо создавать само-подписанный сертификат:

sudo mkdir /var/lib/cert
sudo openssl req -new -newkey rsa:4096 -sha256 -nodes -x509 -days 10000 -subj '/CN=AutoGeneratedCert/O=NixOS Service/C=US' -out "/var/lib/cert/default.crt" -keyout "/var/lib/cert/default.key"

В файерволле nftables открываем 80 и 443 порты и добавляем конфигурационный файл для Mastodon:

diff --git a/nix-config/servers/example/configuration.nix b/nix-config/servers/example/configuration.nix
index da117ed..a655965 100644
--- a/nix-config/servers/example/configuration.nix
+++ b/nix-config/servers/example/configuration.nix
@@ -3,6 +3,7 @@
     ./../../core.nix
     ./services/fail2ban.nix
     ./services/firefall-nft.nix
+    ./services/mastodon.nix
     ./users.nix
   ];

diff --git a/nix-config/servers/example/services/firefall-nft.nix b/nix-config/servers/example/services/firefall-nft.nix
index afbab23..46715b6 100644
--- a/nix-config/servers/example/services/firefall-nft.nix
+++ b/nix-config/servers/example/services/firefall-nft.nix
@@ -16,6 +16,7 @@
           iif "lo" notrack accept
           ip protocol icmp icmp type { echo-request} ct state new accept
           tcp dport { 22 } ct state new accept
+          tcp dport { 80,443 } ct state new accept
         }
         chain output {
           type filter hook output priority 0; policy accept;
sudo nano /etc/nixos/nix-config/servers/example/services/mastodon.nix
{ config, lib, pkgs, ... }:
{
  services.mastodon = {
    enable = true;
    configureNginx = true;
    localDomain = "_my_domayn_";
    database = {
      name = "mastodon";
      user = "mastodon";
    };
    elasticsearch = {
      host = "127.0.0.1";
      port = 9200;
    };
    smtp = {
      createLocally = true;
      authenticate = false;
      user = "mastodon@_my_domayn_";
      fromAddress = "mastodon@_my_domayn_";
    };
    extraConfig = {
      DEFAULT_LOCALE = "ru";
      REDIS_URL = "unix:///run/redis/redis.sock";
      REDIS_NAMESPACE = "mastodon";
    };
  };

  services.nginx = {
    virtualHosts."_my_domayn_" = {
      forceSSL = lib.mkForce true;
      enableACME = lib.mkForce false;
      sslCertificate    = "/var/lib/cert/default.crt";
      sslCertificateKey = "/var/lib/cert/default.key";
    };
  };

  services.postfix = {
    hostname = "_my_domayn_";
  };

  services.redis = {
    unixSocket = "/run/redis/redis.sock";
    settings = {
      unixsocketperm = "770";
    };
  };

  services.elasticsearch = {
    enable = true;
    package = pkgs.elasticsearch;
    listenAddress = "127.0.0.1";
    port = 9200;
  };

  users.groups = {
    redis.members = [ "${config.services.mastodon.user}" ];
  };
}

Фиксируем изменения в локальном репозитории:

sudo git add nix-config/servers/example/configuration.nix
sudo git add nix-config/servers/example/services/firefall-nft.nix
sudo git add nix-config/servers/example/services/mastodon.nix
sudo git commit -m "config: add mastodon service"

В нашем примере используется встроенный почтовый сервер. Без полной настройки есть вероятность, что письмо попадет в спам-фильтр. Можно использовать внешний почтовый сервер:

diff --git a/nix-config/servers/example/services/mastodon.nix b/nix-config/servers/example/services/mastodon.nix
index 39e5b35..80c75ab 100644
--- a/nix-config/servers/example/services/mastodon.nix
+++ b/nix-config/servers/example/services/mastodon.nix
@@ -17,8 +17,10 @@
     smtp = {
       createLocally = true;
       authenticate = false;
-      user = "mastodon@_my_domayn_";
-      fromAddress = "mastodon@_my_domayn_";
+      host = "e-mail_server";
+      port = 587;
+      user = "my_mastodon@e-mail_server";
+      fromAddress = "my_mastodon@e-mail_server";
     };
     extraConfig = {
       DEFAULT_LOCALE = "ru";
@@ -36,10 +38,6 @@
     };
   };

-  services.postfix = {
-    hostname = "_my_domayn_";
-  };
-
   services.redis = {
     unixSocket = "/run/redis/redis.sock";
     settings = {

Если у нас используется реальный домен и имеется доступ в интернет для получения сертификата, то удаляем дополнительные настройки сервиса nginx:

diff --git a/nix-config/servers/example/services/mastodon.nix b/nix-config/servers/example/services/mastodon.nix
index 39e5b35..36db388 100644
--- a/nix-config/servers/example/services/mastodon.nix
+++ b/nix-config/servers/example/services/mastodon.nix
@@ -17,8 +17,10 @@
     smtp = {
       createLocally = true;
       authenticate = false;
-      user = "mastodon@_my_domayn_";
-      fromAddress = "mastodon@_my_domayn_";
+      host = "e-mail_server";
+      port = 587;
+      user = "my_mastodon@e-mail_server";
+      fromAddress = "my_mastodon@e-mail_server";
     };
     extraConfig = {
       DEFAULT_LOCALE = "ru";
@@ -27,19 +29,6 @@
     };
   };

-  services.nginx = {
-    virtualHosts."_my_domayn_" = {
-      forceSSL = lib.mkForce true;
-      enableACME = lib.mkForce false;
-      sslCertificate    = "/var/lib/cert/default.crt";
-      sslCertificateKey = "/var/lib/cert/default.key";
-    };
-  };
-
-  services.postfix = {
-    hostname = "_my_domayn_";
-  };
-
   services.redis = {
     unixSocket = "/run/redis/redis.sock";
     settings = {

Пройдёмся по основным настройкам:

  • services.mastodon - настройки сервиса Mastodon.
    • configureNginx = true; - указываем использовать предварительную конфигурация сервиса nginx для работы сервиса Mastodon.
    • localDomain = "test._my_domayn_"; - указываем домен, на котором у нас будет работать Mastodon.
    • database = - указываем имя базы данных и имя пользователя, которые будет использовать Mastodon для подключения к базе данных PostgreSQL.
    • elasticsearch = - указываем использовать elasticsearch для полнотекстового поиска гудков. По умолчанию не используется, для этого надо удалить эти строки.
    • smtp = - здесь прописываем настройки smtp сервера, рекомендуется указать внешний почтовый сервер.
    • extraConfig = - указываем дополнительные настройки Mastodon.
      • DEFAULT_LOCALE = "ru"; - используем русский язык по умолчанию.
      • REDIS_URL = "unix:///run/redis/redis.sock"; - подключаемся к сервису Redis через socket.
      • REDIS_NAMESPACE = "mastodon"; - добавляем префикс mastodon таблицам, рекомендуется если redis используется с другими службами или планируется запуск нескольких различных копий сервиса Mastodon.
  • services.nginx - здесь указываем для нашего домена отключить получение сертификата Let's Encrypt. Если у нас реальный домен - можно удалить этот блок.
  • services.postfix.hostname = "_my_domayn_"; - указываем от какого домена отправлять почту.
  • services.redis - настраиваем сервис Redis, чтобы работал через socket.
  • services.elasticsearch - настраиваем elasticsearch.
  • users.groups - здесь указываем сервису Mastodon доступ к сокету Redis.
  • services.redis = { - настраиваем сервис Redis, чтобы работал через socket;

Применяем настройки:

sudo nixos-rebuild switch
building Nix...
building the system configuration...
unpacking 'https://github.com/nix-community/NUR/archive/master.tar.gz'...
copying path '/nix/store/s4qqs3ap4p2dzf0bj0drlfq76bwi8j7w-mirrors-list' from 'https://cache.nixos.org'...
copying path '/nix/store/kd1cg8l6l8827mvh9xqs77x5m4jzdkgz-curl-7.74.0-man' from 'https://cache.nixos.org'...
copying path '/nix/store/66sjg6hcbxl1j9h3nj81dcq6vi56sd0p-c-ares-1.17.1' from 'https://cache.nixos.org'...
...
setting up tmpfiles
reloading the following units: dbus.service, nftables.service
starting the following units: systemd-sysctl.service
the following new units were started: elasticsearch.service, mastodon-sidekiq.service, mastodon-streaming.service, mastodon-web.service, nginx.service, postfix.service, postgresql.service, redis.service
Time: 0h:02m:52s

Готово! Теперь можно зарегистрироваться через сайт https://my_domayn/auth/sign_up либо через консоль с помощью утилиты tootctl:

sudo su - mastodon -s /bin/sh -c "mastodon-env tootctl accounts create _my_name_ --email=my_e-mail_@e-mail_server_ --role=admin --confirmed"
OK
New password: ...

Если зарегистрировались через сайт, то дать права администратора можно командой:

sudo su - mastodon -s /bin/sh -c "mastodon-env tootctl accounts modify _my_name_ --role admin"

Справку по командам tootctl можно посмотреть так:

sudo su - mastodon -s /bin/sh -c "mastodon-env tootctl help"
Commands:
  tootctl accounts SUBCOMMAND ...ARGS             # Manage accounts
  tootctl cache SUBCOMMAND ...ARGS                # Manage cache
  tootctl domains SUBCOMMAND ...ARGS              # Manage account domains
  tootctl email_domain_blocks SUBCOMMAND ...ARGS  # Manage e-mail domain blocks
  tootctl emoji SUBCOMMAND ...ARGS                # Manage custom emoji
  tootctl feeds SUBCOMMAND ...ARGS                # Manage feeds
  tootctl help [COMMAND]                          # Describe available commands or one specific command
  tootctl ip_blocks SUBCOMMAND ...ARGS            # Manage IP blocks
  tootctl maintenance SUBCOMMAND ...ARGS          # Various maintenance utilities
  tootctl media SUBCOMMAND ...ARGS                # Manage media files
  tootctl preview_cards SUBCOMMAND ...ARGS        # Manage preview cards
  tootctl search SUBCOMMAND ...ARGS               # Manage the search engine
  tootctl self-destruct                           # Erase the server from the federation
  tootctl settings SUBCOMMAND ...ARGS             # Manage dynamic settings
  tootctl statuses SUBCOMMAND ...ARGS             # Manage statuses
  tootctl upgrade SUBCOMMAND ...ARGS              # Various version upgrade utilities
  tootctl version                                 # Show version

Внимание: при активном использовании микро-блога со временем накапливаются статусы с соседних узлов. Для этого требуется достаточно много свободного места, от 200 Gb. Так же рекомендуется еженедельно очищать кэш Mastodon:

  services.cron = {
    enable = true;
    systemCronJobs = [
      "10 5 * * 3 root sudo su - mastodon -s /bin/sh -c 'mastodon-env tootctl media remove --days 14 --concurrency 4' > /dev/null 2>&1"
      "10 5 * * 4 root sudo su - mastodon -s /bin/sh -c 'mastodon-env tootctl preview_cards remove --concurrency 4' > /dev/null 2>&1"
      "10 2 * * * root sudo su - mastodon -s /bin/sh -c 'mastodon-env tootctl cache clear' > /dev/null 2>&1"
      "10 3 * * * root sudo su - mastodon -s /bin/sh -c 'mastodon-env tootctl cache recount accounts --concurrency 4' > /dev/null 2>&1"
      "10 4 * * * root sudo su - mastodon -s /bin/sh -c 'mastodon-env tootctl cache recount statuses --concurrency 4' > /dev/null 2>&1"
    ];
  };

Теперь можно пользоваться персональным микро-блогом!