Visitors have accessed this post 6396 times.

Устанавливаем Mastodon

1
0
6396
19 марта 2021 9:01
Автор: Rebrain Me
Linux

Visitors have accessed this post 6396 times.

Автор — Юрий Изоркин

Что такое Mastodon, и зачем он нужен

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

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

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

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

Список серверов, где можно зарегистрироваться, можно посмотреть тут. Русское сообщество присутствует тут.

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, указать почтовый ящик, с которого будут приходить уведомления. Это мы и попробуем сделать.

Устанавливаем узел Mastodon

Первым делом устанавливаем ОС 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"

Важно: при активном использовании микроблога со временем накапливаются статусы с соседних узлов. Для них требуется много свободного места, от 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"
  ];
};

Мы завершили процесс установки. Теперь можно пользоваться персональным микроблогом!

От редакции

Если вам интересно посещать бесплатные онлайн-мероприятия по DevOps, Kubernetes, Docker, GitlabCI и др. и задавать вопросы в режиме реального времени, подключайтесь к каналу DevOps by REBRAIN

*Анонсы мероприятий каждую неделю

Практикумы для специалистов по инфраструктуре и разработчиков — https://rebrainme.com.

Наш Youtube-канал — https://www.youtube.com/channel/UC6uIx64IFKMVmj12gKtSgBQ.

Агентство Fevlake, проектируем и поддерживаем IT-инфраструктуры с 2012 года — https://fevlake.com.

 

 

Комментарии (3)
Введено символов из возможных
Не отвечать

Вам также может понравится

HighLoad архитектура для веб-приложения – все ли тут просто и однозначно?
array(1) { [0]=> object(WP_Term)#11557 (16) { ["term_id"]=> int(9) ["name"]=> string(8) "HighLoad" ["slug"]=> string(8) "highload" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(9) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(3) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(9) ["category_count"]=> int(3) ["category_description"]=> string(0) "" ["cat_name"]=> string(8) "HighLoad" ["category_nicename"]=> string(8) "highload" ["category_parent"]=> int(0) } } HighLoad

Тема высоких нагрузок будоражит умы не хуже тайны бермудского треугольника. Вроде все знают, что современные маркетплейсы, сайты объявлений, соцсети - это тот самый пресловутый HighLoad, но чего там, собственно, “под капотом” и как оно настраивается, - это уже совсем другой уровень абстракций.  

На hackernoon.com нам встретилась статья о...

2
0
9 октября 2020
30 псевдонимов оболочки Bash в ОС Linux / Unix / Mac OS X
array(1) { [0]=> object(WP_Term)#976 (16) { ["term_id"]=> int(6) ["name"]=> string(5) "Linux" ["slug"]=> string(5) "linux" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(6) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(28) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(6) ["category_count"]=> int(28) ["category_description"]=> string(0) "" ["cat_name"]=> string(5) "Linux" ["category_nicename"]=> string(5) "linux" ["category_parent"]=> int(0) } } Linux

Оригинал статьи - https://www.cyberciti.biz/tips/bash-aliases-mac-centos-linux-unix.html

Псевдоним (он же алиас) bash - это ярлык для команд. Команда alias позволяет пользователю запускать любую команду или группу команд (включая параметры и имена файлов), вводя одно слово. Используйте команду alias, чтобы отобразить список всех определенных...

8
1
9 октября 2020
Резервное копирование и восстановление ОС Linux
array(1) { [0]=> object(WP_Term)#11557 (16) { ["term_id"]=> int(6) ["name"]=> string(5) "Linux" ["slug"]=> string(5) "linux" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(6) ["taxonomy"]=> string(8) "category" ["description"]=> string(0) "" ["parent"]=> int(0) ["count"]=> int(28) ["filter"]=> string(3) "raw" ["cat_ID"]=> int(6) ["category_count"]=> int(28) ["category_description"]=> string(0) "" ["cat_name"]=> string(5) "Linux" ["category_nicename"]=> string(5) "linux" ["category_parent"]=> int(0) } } Linux

Автор - Максим Рязанов
Предисловие
Резервное копирование и восстановление ОС - базовый навык, которым должен обладать любой системный администратор. Поэтому давайте на примере практической задачи разберем, как это сделать в ОС Linux.

Допустим, что у нас есть ОС, все данные которой хранятся в одном разделе. Эту ОС необходимо мигрировать на...

3
0
28 августа 2020