Устанавливаем Mastodon
1
6402
19 марта 2021 9:01
19/03/2021
Visitors have accessed this post 6402 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.