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"
];
};
Теперь можно пользоваться персональным микро-блогом!