Mastodon

Обновлено 2 августа 2021

Установка и настройка Mastodon

Mastodon - это бесплатная децентрализованная платформа микроблогов, входящая в федеративную сеть.

Подготовка LXC-контейнера

Мы рекомендуем выполнить установку Mastodon в отдельном контейнере, настроив его согласно инструкции.

Установка и настройка PostgreSQL

Установите и настройте PostgreSQL согласно руководству.

Настройте авторизацию методом peer только для локальных подключений:

/etc/postgresql-12/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
#host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     all                                     trust
#host    replication     all             127.0.0.1/32            trust
#host    replication     all             ::1/128                 trust

Создайте пользователя mastodon с правом создания базы данных:

su postgres -c psql
psql (12.2)
Type "help" for help.

postgres=# CREATE USER mastodon CREATEDB;
CREATE ROLE
postgres=# \q

Установка Mastodon

Установка системных пакетов

Установите вспомогательное программное обеспечение:

emerge -a dev-db/redis dev-libs/icu dev-libs/protobuf dev-python/nodeenv dev-util/pkgconfig media-gfx/imagemagick media-video/ffmpeg net-dns/libidn

Запуск Redis

Запустите Redis и добавьте его в автозагрузку:

/etc/init.d/redis start

rc-update add redis

Создание системного пользователя

Создайте системного пользователя mastodon:

mkdir -p /var/calculate/www

useradd -d /var/calculate/www/mastodon mastodon

Установка и настройка rbenv и rbenv-build

Установите и настройте rbenv и rbenv-build в директорию пользователя:

su mastodon

cd

git clone https://github.com/rbenv/rbenv.git ~/.rbenv

cd ~/.rbenv && src/configure && make -C src

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc

echo 'eval "$(rbenv init -)"' >> ~/.bashrc

exec bash

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

Установка Ruby

Установите необходимую версию Ruby 2.7.2:

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.7.2

rbenv global 2.7.2

Версия по умолчанию gem, связанная с ruby_2.7.2, несовместима с последней версией bundler. Поэтому обновите gem:

gem update --system

И установите bundler:

gem install bundler -f --no-document

Установка Node.js и Yarn

Установите Node.js и Yarn в директорию пользователя:

nodeenv --node=12.22.4 .node-12

ln -sfT .node-12 .node-live

source .node-live/bin/activate

npm install -g yarn

echo 'source ~/.node-live/bin/activate' >> ~/.bashrc

Загрузка репозитория Git с Mastodon

Установите исходный код сервера:

git clone https://github.com/tootsuite/mastodon.git live

cd live

git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)

Установка зависимостей Ruby и Node.js

Установите Ruby-зависимости:

bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test

Установите Node.js-зависимости:

yarn install --pure-lockfile

Установка и настройка Mastodon

Сгенерируйте конфигурацию для mastodon.example.org, выполнив команду:

RAILS_ENV=production bundle exec rake mastodon:setup
Your instance is identified by its domain name. Changing it afterward will break things.
Domain name: mastodon.example.org

Single user mode disables registrations and redirects the landing page to your public profile.
Do you want to enable single user mode? No

Are you using Docker to run Mastodon? no

PostgreSQL host: /var/run/postgresql
PostgreSQL port: 5432
Name of PostgreSQL database: mastodon_production
Name of PostgreSQL user: mastodon
Password of PostgreSQL user:
Database configuration works! 🎆

Redis host: localhost
Redis port: 6379
Redis password:
Redis configuration works! 🎆

Do you want to store uploaded files on the cloud? No

Do you want to send e-mails from localhost? No
SMTP server: mail.example.org
SMTP port: 465
SMTP username:
SMTP password:
SMTP authentication: starttls
SMTP OpenSSL verify mode: none
E-mail address to send e-mails "from": Mastodon <notifications@mastodon.example.org>
Send a test e-mail with this configuration right now? Yes
Send test e-mail to: admin@example.org

This configuration will be written to .env.production
Save configuration? Yes

Now that configuration is saved, the database schema must be loaded.
If the database already exists, this will erase its contents.
Prepare the database now? Yes
Running `RAILS_ENV=production rails db:setup` ...

Created database 'mastodon_production'
...
Done!

The final step is compiling CSS/JS assets.
This may take a while and consume a lot of RAM.
Compile the assets now? Yes
Running `RAILS_ENV=production rails assets:precompile` ...

yarn install v1.15.2
...
Done!

All done! You can now power on the Mastodon server 🐘

Do you want to create an admin user straight away? Yes
Username: admin
E-mail: admin@example.org
You can login with the password: e3b316f78cbc2ec0bde5118c68414d73
You can change your password once you login.

Завершите пользовательский сеанс:

exit

Получение сертификата Let's Encrypt

Получите сертификат домена mastodon.example.org для Nginx согласно руководству.

Установка и настройка Nginx

Установите и настройте веб-сервер Nginx в качестве обратного прокси согласно руководству.

Скопируйте пример настройки Nginx для Mastodon:

cp /var/calculate/www/mastodon/live/dist/nginx.conf /etc/nginx/sites-enabled/mastodon.conf

Укажите имя сервера mastodon.example.org и пути:

/etc/nginx/sites-enabled/mastodon.conf
server {
  listen 80;
  listen [::]:80;
  server_name mastodon.example.org;
  root /var/calculate/www/mastodon/live/public;
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name mastodon.example.org;

  # Uncomment these lines once you acquire a certificate:
  ssl_certificate /etc/letsencrypt/live/mastodon.example.org/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/mastodon.example.org/privkey.pem;
  ...
  root /var/calculate/www/mastodon/live/public;
  ...
}

Запуск Mastadon

Создайте сценарии OpenRC для управления сервисами:

Сценарий запуска Mastodon Web:

/etc/init.d/mastodon-web
#!/sbin/openrc-run

name="Mastodon Web daemon"
description=""
pidfile=/run/mastodon-web.pid
extra_commands="reload"
command_user=mastodon
output_log=/var/log/mastodon-web.log
error_log=/var/log/mastodon-web.log
directory=/var/calculate/www/mastodon/live
start_stop_daemon_args="-e RAILS_ENV=production -e PORT=3000"
command=/var/calculate/www/mastodon/.rbenv/shims/bundle
command_args="exec puma -C config/puma.rb"
command_background=true

depend() {
    use postgresql net redis
}

start_pre() {
    checkpath -f -o mastodon -m 0600 /var/log/mastodon-web.log
}

reload() {
    einfo "Reload $name"
    kill -USR1 $(cat $pidfile)
}

Сценарий запуска Mastodon Streaming:

/etc/init.d/mastodon-streaming
#!/sbin/openrc-run
name="Mastodon streaming daemon"
description=""
pidfile=/run/mastodon-streaming.pid
command_user=mastodon
output_log=/var/log/mastodon-streaming.log
error_log=/var/log/mastodon-streaming.log
directory=/var/calculate/www/mastodon/live
start_stop_daemon_args="-e NODE_ENV=production -e PORT=4000 -e STREAMING_CLUSTER_NUM=1"
command=/var/calculate/www/mastodon/.node-live/bin/node
command_args="./streaming"
command_background=true

depend() {
    use postgresql net redis
}

start_pre() {
        checkpath -f -o mastodon -m 0600 /var/log/mastodon-streaming.log
}

Сценарий запуска Mastodon Sidekiq:

/etc/init.d/mastodon-sidekiq
#!/sbin/openrc-run

name="Mastodon Sidekiq daemon"
description=""
pidfile=/run/mastodon-sidekiq.pid
command_user=mastodon
output_log=/var/log/mastodon-sidekiq.log
error_log=/var/log/mastodon-sidekiq.log
directory=/var/calculate/www/mastodon/live
start_stop_daemon_args="-e RAILS_ENV=production -e DB_POOL=25 -e MALLOC_ARENA_MAX=2"
command=/var/calculate/www/mastodon/.rbenv/shims/bundle
command_args="exec sidekiq -c 25"
command_background=true

depend() {
    use postgresql net redis
}

start_pre() {
    checkpath -f -o mastodon -m 0600 /var/log/mastodon-sidekiq.log
}

Установите права на запуск сервисов Mastodon:

chmod 0755 /etc/init.d/mastodon-*

Запустите сервисы Mastodon:

/etc/init.d/mastodon-web start

/etc/init.d/mastodon-streaming start

/etc/init.d/mastodon-sidekiq start

Добавьте сервисы Mastodon в автозагрузку:

rc-update add mastodon-web

rc-update add mastodon-streaming

rc-update add mastodon-sidekiq

Обновление Mastodon

Обновление Git репозитория

Выполните обновление Git репозитория с исходным кодом Mastodon:

su - mastodon

cd ~/live

git fetch --tags

git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)

Проверьте, что версия исходного кода проекта изменилась:

git status
HEAD отделён на v2.8.0
нечего коммитить, нет изменений в рабочем каталоге

Обновление Ruby

Актуальная версия Ruby, используямая Mastodon - 2.7.2. Если ваша версия Ruby меньше, то её необходимо обновить.

Выполните вход в пользовательский сеанс:

su - mastodon

Обновите окружение для управления версиями Ruby:

cd ~/.rbenv && git pull

cd ~/.rbenv/plugins/ruby-build && git pull

cd

Установите необходимую версию Ruby 2.7.2:

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.7.2

rbenv global 2.7.2

Версия по умолчанию gem, связанная с ruby_2.7.2, несовместима с последней версией bundler. Поэтому обновите gem:

gem update --system

И установите bundler:

gem install bundler -f --no-document

Перейдите в каталог приложения Mastodon и убедитесь, что он будет использовать версию 2.7.2:

cd ~/live && cat .ruby-version

2.7.2

Для обновления Ruby-зависимостей выполните:

bundle install --deployment --without development test

Завершите пользовательский сеанс:

exit

Обновление Node.js

При обновлении Mastodon с версии ниже 3.4 убедитесь, что используемый Node.js версии не ниже 12:

node -v
v12.22.4

Если версия ниже 12, то установите версию 12.22.4 в новое окружение .node-12 и сделайте её текущей:

nodeenv --node=12.22.4 .node-12

ln -sfT .node-12 .node-live

Обновление путей при переходе с node-8

Если вы настраивали Mastodon по предыдущей версии руководства, то исправьте в скриптах /var/calculate/www/mastodon и /etc/init.d/mastodon-streaming .node-8 на .node-live.

Обновите зависимости Ruby и Node.js

Вам может потребоваться обновить Ruby и Node.js после обновления до новой версии Mastodon. В вышеупомянутых примечаниях к выпуску будет указано, нужно ли вам делать оставшуюся часть этого раздела.

Для обновления Ruby-зависимостей выполните:

bundle install --deployment --without development test

Для обновления Node.js-зависимостей выполните:

yarn install --pure-lockfile

Обновление схемы базы данных

Выполняйте обновление схемы базы данных при каждом обновлении до новой версии Mastodon. Это безопасно выполнять каждый раз, так как в случае отсутствия новой схемы обновление будет пропущено.

Для миграции базы данных выполните:

RAILS_ENV=production bundle exec rails db:migrate

Предварительная компиляция обновленных ресурсов

Возможно, вам придется предварительно скомпилировать обновленные ресурсы после обновления до новой версии Mastodon. В вышеупомянутых примечаниях к выпуску будет указано, нужно ли вам делать оставшуюся часть этого раздела.

Для предварительной компиляции выполните:

RAILS_ENV=production bundle exec rails assets:precompile

Предупреждение

Прекомпилятор ресурсов (Webpacker) может занимать значительное количество ресурсов, особенно оперативной памяти. Если вы обнаружите, что на вашем сервере не хватает оперативной памяти при выполнении предварительной компиляции, вы можете остановить службы Mastodon перед запуском предварительной компиляции.

Очистка кэша

Выполните очистку кэша:

RAILS_ENV=production bin/tootctl cache clear

Дополнительные действия при обновлении

Примечания к выпуску могут содержать специальные инструкции с отметкой Non-Docker, которые вам могут понадобиться при обновлении для любого нового выпуска Mastodon.

Завершите пользовательский сеанс:

exit

Восстановление Ruby окружения после обновления системных пакетов

Выполните вход в пользовательский сеанс:

su - mastodon

cd ~/live

Переустановите пакеты окружения Ruby:

bundle pristine

bundle install --deployment --without development test

Завершите пользовательский сеанс:

exit

Перезапуск Mastodon

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

/etc/init.d/mastodon-web restart

/etc/init.d/mastodon-streaming restart

/etc/init.d/mastodon-sidekiq restart