Mastodon bei Hostsharing: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
K (accounts create: Admin muss großen Anfangsbuchstaben haben)
 
(11 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 23: Zeile 23:


Verwendete IP-Ports der Server-Dienste:
Verwendete IP-Ports der Server-Dienste:
# Monit: localhost:32001
# Redis: localhost:32002
# Redis: localhost:32002
# Mastodon-Web: localhost:32003
# Mastodon-Web: localhost:32003
Zeile 32: Zeile 31:
Anlegen einer Datei ''/home/pacs/xyz00/users/mastodon/redis/etc/redis.conf'' mit folgendem Inhalt:
Anlegen einer Datei ''/home/pacs/xyz00/users/mastodon/redis/etc/redis.conf'' mit folgendem Inhalt:


    daemonize yes
<syntaxhighlight lang="ini" line>
    pidfile /home/pacs/xyz00/users/mastodon/redis/var/redis-server.pid
daemonize yes
    requirepass <hierhin-gehoert-ein-redis-passwort>
pidfile /home/pacs/xyz00/users/mastodon/redis/var/redis-server.pid
    port 32002
requirepass <hierhin-gehoert-ein-redis-passwort>
    tcp-backlog 128
port 32002
    bind 127.0.0.1
tcp-backlog 128
    timeout 300
bind 127.0.0.1
    loglevel notice
timeout 300
    logfile /home/pacs/xyz00/users/mastodon/redis/var/redis.log
loglevel notice
    databases 16
logfile /home/pacs/xyz00/users/mastodon/redis/var/redis.log
    save 900 1
databases 16
    save 300 10
save 900 1
    save 60 10000
save 300 10
    slave-serve-stale-data yes
save 60 10000
    appendonly no
slave-serve-stale-data yes
    dbfilename dump.rdb
appendonly no
    dir /home/pacs/xyz00/users/mastodon/redis/var
dbfilename dump.rdb
dir /home/pacs/xyz00/users/mastodon/redis/var
</syntaxhighlight>


== Installation von NodeJS ==
== Installation von NodeJS ==


Als User 'xyz00-mastodon'': Installation von ''nvm'' und ''nodejs'' (Version 12) nach der Anleitung [[NodeJS]]
Als User 'xyz00-mastodon'': Installation von ''nvm'' und ''nodejs'' (Version 20) nach der Anleitung [[NodeJS]]


Installation von ''yarn'' mit:
Installation von ''yarn'' mit:


    npm install -g yarn
<syntaxhighlight lang="bash">
npm install -g yarn
</syntaxhighlight>


== Installation von Ruby ==
== Installation von Ruby ==
Zeile 64: Zeile 67:
Zunächst ''rbenv'' and ''ruby-build'':
Zunächst ''rbenv'' and ''ruby-build'':


    git clone https://github.com/rbenv/rbenv.git ~/.rbenv
<syntaxhighlight lang="bash">
    cd ~/.rbenv && src/configure && make -C src
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
cd ~/.rbenv && src/configure && make -C src
    echo 'eval "$(rbenv init -)"' >> ~/.profile
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.profile
</syntaxhighlight>


starte neue Shell:
starte neue Shell:


    exec bash
<syntaxhighlight lang="bash">
exec bash
</syntaxhighlight>


Überprüfe rbenv-Installation
Überprüfe rbenv-Installation


    type rbenv
<syntaxhighlight lang="bash">
type rbenv
</syntaxhighlight>


Installiere ruby-build als rbenv-Plugin
Installiere ruby-build als rbenv-Plugin


    git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
<syntaxhighlight lang="bash">
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
</syntaxhighlight>


Nun kann die benötigte Ruby-Version installiert werden:
Nun kann die benötigte Ruby-Version installiert werden:


    rbenv install 2.7.2
<syntaxhighlight lang="bash">
rbenv install 3.2.3
</syntaxhighlight>


== Installation der Mastodon Software ==
== Installation der Mastodon Software ==
Zeile 89: Zeile 102:
Weiterhin Als User ''xyz00-mastodon'':   
Weiterhin Als User ''xyz00-mastodon'':   


    cd ~
<syntaxhighlight lang="bash">
    git clone https://github.com/tootsuite/mastodon.git live
cd ~
    cd ~/live
git clone https://github.com/tootsuite/mastodon.git live
cd ~/live
</syntaxhighlight>


Die stabile Version auschecken:
Die stabile Version auschecken:


    git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
<syntaxhighlight lang="bash">
git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
</syntaxhighlight>


Ruby Pakete installieren:
Ruby Pakete installieren:


    gem install bundler
<syntaxhighlight lang="bash">
    bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test
gem install bundler
bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test
</syntaxhighlight>


Node.js Pakete installieren:
Node.js Pakete installieren:


    yarn install --pure-lockfile
<syntaxhighlight lang="bash">
yarn install --pure-lockfile
</syntaxhighlight>


== Konfiguration der Mastodon Software ==
== Konfiguration der Mastodon Software ==
Zeile 110: Zeile 131:
Anlegen einer Datei ''/home/pacs/xyz00/users/mastodon/live/.env.production'' mit dem folgenden Inhalt:
Anlegen einer Datei ''/home/pacs/xyz00/users/mastodon/live/.env.production'' mit dem folgenden Inhalt:


    REDIS_HOST=localhost
<syntaxhighlight lang=ini line>
    REDIS_PORT=32002
REDIS_HOST=localhost
    REDIS_PASSWORD=<hierhin-gehoert-ein-redis-passwort>
REDIS_PORT=32002
    DB_HOST=localhost
REDIS_PASSWORD=<hierhin-gehoert-ein-redis-passwort>
    DB_USER=xyz00_mastuser
DB_HOST=localhost
    DB_NAME=xyz00_mastdb
DB_USER=xyz00_mastuser
    DB_PASS=meinPasswort
DB_NAME=xyz00_mastdb
    DB_PORT=5432
DB_PASS=meinPasswort
    LOCAL_DOMAIN=beispiel.social
DB_PORT=5432
    SECRET_KEY_BASE=12ab..
LOCAL_DOMAIN=beispiel.social
    OTP_SECRET=34ef..
SECRET_KEY_BASE=12ab..
    VAPID_PRIVATE_KEY=ABCD..
OTP_SECRET=34ef..
    VAPID_PUBLIC_KEY=EFGH..
VAPID_PRIVATE_KEY=ABCD..
    DEFAULT_LOCALE=de
VAPID_PUBLIC_KEY=EFGH..
    SMTP_SERVER=localhost
DEFAULT_LOCALE=de
    SMTP_PORT=25
SMTP_SERVER=localhost
    SMTP_FROM_ADDRESS=notifications@beispiel.social
SMTP_PORT=25
    SMTP_AUTH_METHOD=none
SMTP_FROM_ADDRESS=notifications@beispiel.social
    SMTP_OPENSSL_VERIFY_MODE=none
SMTP_AUTH_METHOD=none
    STREAMING_CLUSTER_NUM=1
SMTP_OPENSSL_VERIFY_MODE=none
STREAMING_CLUSTER_NUM=1
</syntaxhighlight>


Die Zufallswerte für die Variablen SECRET_KEY_BASE und OTP_SECRET erzeugt man durch zwei Aufrufe des Kommandos
Die Zufallswerte für die Variablen SECRET_KEY_BASE und OTP_SECRET erzeugt man durch zwei Aufrufe des Kommandos


    RAILS_ENV=production bundle exec rake secret
<syntaxhighlight lang="bash">
RAILS_ENV=production bundle exec rake secret
</syntaxhighlight>


Die Werte für VAPID_PRIVATE_KEY und VAPID_PUBLIC_KEY erzeugt das Kommando
Die Werte für VAPID_PRIVATE_KEY und VAPID_PUBLIC_KEY erzeugt das Kommando


    RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key
<syntaxhighlight lang="bash">
 
RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key
</syntaxhighlight>


Initialisieren der Datenbank:
Initialisieren der Datenbank:


    export SAFETY_ASSURED=1
<syntaxhighlight lang="bash">
    RAILS_ENV=production bundle exec rails db:schema:load
export SAFETY_ASSURED=1
    RAILS_ENV=production bundle exec rails db:seed
RAILS_ENV=production bundle exec rails db:schema:load
RAILS_ENV=production bundle exec rails db:seed
</syntaxhighlight>


Erzeugen der Web-Resourcen
Erzeugen der Web-Resourcen


    RAILS_ENV=production bundle exec rails assets:precompile
<syntaxhighlight lang="bash">
yarn set version classic
RAILS_ENV=production bundle exec rails assets:precompile
</syntaxhighlight>


== Starten der Dienste  ==
== Starten der Dienste  ==


Zum Start aller notwendigen Dienste wird in dieser Anleitung ''monit'' benutzt. Hier ein Beispiel für eine Datei ''.monitrc'' (überlange Zeilen werden hier im Wiki umgebrochen)
Zum Start aller notwendigen Dienste wird in dieser Anleitung ''systemctl'' benutzt.
 
Die Datei <code>~/.config/systemd/user/redis.service</code> kann so aussehen:
 
<syntaxhighlight lang=shell line>
[Unit]
Description=Redis User Service
 
[Service]
WorkingDirectory=%h/var/redis
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
ExecStart=/usr/bin/redis-server %h/etc/redis.conf
Restart=always
PrivateTmp=true
NoNewPrivileges=true
 
[Install]
WantedBy=default.target
</syntaxhighlight>
 
Die Datei <code>~/.config/systemd/user/puma.service</code> kann so aussehen:
 
<syntaxhighlight lang=shell line>
[Unit]
Description=Mastodon Web Service Puma
After=redis.service
 
[Service]
WorkingDirectory=%h/live
Environment="RAILS_ENV=production"
ExecStart=%h/.rbenv/shims/bundle exec puma -C config/puma.rb -e production -b tcp://127.0.0.1:32003
StandardError=append:%h/var/log/puma.log
StandardOutput=append:%h/var/log/puma.log
Restart=always
PrivateTmp=true
NoNewPrivileges=true
 
[Install]
WantedBy=default.target
</syntaxhighlight>
 
Die Datei <code>~/.config/systemd/user/sidekiq.service</code> kann so aussehen:


    set daemon 60
<syntaxhighlight lang=shell line>
        with start delay 120
[Unit]
    set logfile /home/pacs/xyz00/users/mastodon/monit/var/monit.log
Description=Mastodon Sidekiq Service
    set idfile /home/pacs/xyz00/users/mastodon/monit/var/monit.id
After=redis.service
    set statefile /home/pacs/xyz00/users/mastodon/monit/var/monit.state
 
    set mailserver localhost
[Service]
    set mail-format { from: monit@beispiel.social }
WorkingDirectory=%h/live
    set alert mastodon@beispiel.social
Environment="RAILS_ENV=production"
    set httpd port 32001 address xyz00.hostsharing.net
Environment="DB_POOL=5"
        allow mostodon:monitpassword
ExecStart=%h/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push -q scheduler
    check process redis with pidfile /home/pacs/xyz00/users/mastodon/redis/var/redis-server.pid
StandardError=append:%h/var/log/sidekiq.log
        start program "/usr/bin/redis-server /home/pacs/xyz00/users/mastodon/redis/etc/redis.conf"
StandardOutput=append:%h/var/log/sidekiq.log
        stop program "/bin/bash -c '/bin/kill $( cat /home/pacs/xyz00/users/mastodon/redis/var/redis-server.pid )'"
Restart=always
    check process mstdn_web with pidfile /home/pacs/xyz00/users/mastodon/live/var/puma.pid
PrivateTmp=true
        depends redis
NoNewPrivileges=true
        start program "/bin/bash -c 'export RAILS_ENV=production && export HOME=/home/pacs/xyz00/users/mastodon && cd $HOME/live && ( $HOME/.rbenv/shims/bundle exec puma -C config/puma.rb -e production -b tcp://127.0.0.1:32003 >$HOME/live/var/puma.log 2>&1 &  echo $! > $HOME/live/var/puma.pid  )'"
 
        stop program "/bin/bash -c '/bin/kill $( cat /home/pacs/xyz00/users/mastodon/live/var/puma.pid )'"
[Install]
    check process mstdn_sidekiq with pidfile /home/pacs/xyz00/users/mastodon/live/var/sidekiq.pid
WantedBy=default.target
        depends redis
</syntaxhighlight>
        start program "/bin/bash -c 'export RAILS_ENV=production && export DB_POOL=5 && export HOME=/home/pacs/xyz00/users/mastodon && cd $HOME/live && ( $HOME/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push -q scheduler >$HOME/live/var/sidekiq.log 2>&1 &  echo $! > $HOME/live/var/sidekiq.pid  )'"
 
        stop program "/bin/bash -c '/bin/kill $( cat /home/pacs/xyz00/users/mastodon/live/var/sidekiq.pid )'"
Die Datei <code>~/.config/systemd/user/streaming.service</code> kann so aussehen:
    check process mstdn_streaming with pidfile /home/pacs/xyz00/users/mastodon/live/var/streaming.pid
 
        depends redis
<syntaxhighlight lang=shell line>
        start program "/bin/bash -c 'export HOME=/home/pacs/xyz00/users/mastodon && export NVM_DIR="$HOME/.nvm" && export NVM_BIN=/home/pacs/xyz00/users/mastodon/.nvm/versions/node/v12.22.1/bin && export NODE_ENV=production && export PORT=32004 && export BIND=127.0.0.1 && cd $HOME/live && ( $HOME/.nvm/versions/node/v12.22.1/bin/node streaming/index.js >$HOME/live/var/streaming.log 2>&1 &  echo $! > $HOME/live/var/streaming.pid  )'"
[Unit]
        stop program "/bin/bash -c '/bin/kill $( cat /home/pacs/xyz00/users/mastodon/live/var/streaming.pid )'"
Description=Mastodon Streaming Service
After=redis.service
 
[Service]
WorkingDirectory=%h/live
Environment="NVM_DIR=%h/.nvm"
Environment="NVM_BIN=%h/.nvm/versions/node/v20.14.0/bin"
Environment="NODE_ENV=production"
Environment="PORT=32004"
Environment="BIND=127.0.0.1"
 
ExecStart=%h/.nvm/versions/node/v20.14.0/bin/node streaming/index.js
StandardError=append:%h/var/log/streaming.log
StandardOutput=append:%h/var/log/streaming.log
Restart=always
PrivateTmp=true
NoNewPrivileges=true
 
[Install]
WantedBy=default.target
</syntaxhighlight>
 
Die Dienste werden dann aktiviert und gestartet:
<syntaxhighlight lang=shell line>
systemctl --user enable redis --now
systemctl --user enable puma --now
systemctl --user enable streaming --now
systemctl --user enable sidekiq --now
</syntaxhighlight>


== Einrichten des Apache VHost ==
== Einrichten des Apache VHost ==
Zeile 190: Zeile 290:
folgende Konfiguration einfügen:
folgende Konfiguration einfügen:


    DirectoryIndex disabled
<syntaxhighlight lang=apache line>
    RewriteEngine On
DirectoryIndex disabled
    RewriteBase /
RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/api/v1/streaming    [NC]
RewriteBase /
    RewriteRule .* ws://localhost:32004%{REQUEST_URI}  [proxy]
RewriteCond %{REQUEST_URI}  ^/api/v1/streaming    [NC]
    RequestHeader set X-Forwarded-Proto "https"
RewriteRule .* ws://localhost:32004%{REQUEST_URI}  [proxy]
    RewriteCond %{REQUEST_FILENAME} !-f
RequestHeader set X-Forwarded-Proto "https"
    RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .* http://localhost:32003%{REQUEST_URI} [proxy]
RewriteCond %{REQUEST_FILENAME} !-l
    RequestHeader set X-Forwarded-Proto "https"
RewriteRule .* http://localhost:32003%{REQUEST_URI} [proxy]
RequestHeader set X-Forwarded-Proto "https"
</syntaxhighlight>
 
== Systemd Timer ==
 
Mit einem systemd Timer werden alte Ressourcen aufgeräumt.
 
<code>~/.config/systemd/user/mastodon_cleanup.env</code>
<syntaxhighlight lang=bash line>
HOME=/home/pacs/xyz00/users/mastodon
MAILTO=mastodon@beispiel.social
RAILS_ENV=production
NUM_DAYS=31
</syntaxhighlight>
 
<code>~/.config/systemd/user/mastodon_cleanup.service</code>
<syntaxhighlight lang=ini line>
[Unit]
Description=fetch mail from remote server
 
[Service]
EnvironmentFile=/home/pacs/xyz00/users/mastodon/.config/systemd/user/mastodon_cleanup.env
WoringDirectory=/home/pacs/xyz00/users/mastodon/live
Type=oneshot
ExecStart=/home/pacs/xyz00/users/mastodon/live/bin/tootctl media remove
</syntaxhighlight>


== Cronjobs ==
<code>~/.config/systemd/user/mastodon_cleanup.timer</code>
<syntaxhighlight lang=ini line>
[Unit]
Description=fetch mail every five minutes


''Cron'' wird für zwei Aufgaben genutzt:
[Timer]
* Start von monit nach einem Server Reboot
OnCalendar=4:18
* Aufräumen von alten Resourcen
Persistent=True


Einrichten der crontab mit ''cronttab -e''
[Install]
WantedBy=timers.target
</syntaxhighlight>


    HOME=/home/pacs/xyz00/users/mastodon
Timer aktivieren und starten:
    MAILTO=mastodon@beispiel.social
<syntaxhighlight lang=shell line>
    RAILS_ENV=production
$ systemctl --user enable mastodon_cleanup.timer
    NUM_DAYS=31
$ systemctl --user start mastodon_cleanupl.timer
   
</syntaxhighlight>
    @reboot /usr/bin/monit -c $HOME/.monitrc
    18 4 * * * cd $HOME/live && $HOME/live/bin/tootctl media remove


== Volltextsuche ==
== Volltextsuche ==
Zeile 229: Zeile 358:
Auf der Kommandozeile:
Auf der Kommandozeile:


RAILS_ENV=production bin/tootctl accounts create \
<syntaxhighlight lang="bash">
  alice \
RAILS_ENV=production bin/tootctl accounts create \
  --email alice@example.com \
  alice \
  --confirmed \
  --email alice@example.com \
  --role Admin
  --confirmed \
  --role Admin
</syntaxhighlight>


Weitere Einrichtung sollte vorgenommen werden, z.B. eine Beschreibung der Instanz hinterlegen, siehe https://docs.joinmastodon.org/admin/setup/
Weitere Einrichtung sollte vorgenommen werden, z.B. eine Beschreibung der Instanz hinterlegen, siehe https://docs.joinmastodon.org/admin/setup/
Zeile 242: Zeile 373:
* https://github.com/tootsuite/mastodon/releases
* https://github.com/tootsuite/mastodon/releases


(hier für das Update auf die Mastodon Version v2.8.0 mit Ruby 2.6.1)
(hier für das Update auf die Mastodon Version v4.2.9 mit Ruby 3.2.3)


=== Ruby ===
=== Ruby ===


    cd ~/.rbenv
<syntaxhighlight lang="bash">
    git pull
cd ~/.rbenv
    cd ~/.rbenv/plugins/ruby-build
git pull
    git pull
cd ~/.rbenv/plugins/ruby-build
    cd
git pull
    rbenv install -l
cd
    rbenv install 2.6.1
rbenv install -l
    rbenv global 2.6.1
rbenv install 3.2.3
rbenv global 3.2.3
</syntaxhighlight>


=== Mastodon ===
=== Mastodon ===


    cd ~/mastodon/live
<syntaxhighlight lang="bash">
    git fetch
cd ~/mastodon/live
    git checkout v2.8.0
git fetch
    gem update --system
git checkout v4.2.9
    bundle install
gem update --system
    yarn install
bundle install
    RAILS_ENV=production bundle exec rails db:migrate
yarn install
    RAILS_ENV=production bundle exec rails assets:precompile
RAILS_ENV=production bundle exec rails db:migrate
yarn set version classic
RAILS_ENV=production bundle exec rails assets:precompile
</syntaxhighlight>


Restart Mastodon!
Restart Mastodon!
Zeile 274: Zeile 410:
* aktuell: https://docs.joinmastodon.org/admin/install/
* aktuell: https://docs.joinmastodon.org/admin/install/
* https://krinetzki.de/2017/04/installation-von-mastodon-auf-debian-8-jessie/
* https://krinetzki.de/2017/04/installation-von-mastodon-auf-debian-8-jessie/
* [https://github.com/tpokorra/Hostsharing-Ansible-Mastodon Ansible Playbook für Hostsharing]
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/mastodon Ansible Playbook für Hostsharing]


[[Kategorie:Installationsanleitungen]]
[[Kategorie:Installationsanleitungen]]

Aktuelle Version vom 3. Dezember 2024, 14:37 Uhr

Mastodon ist ein verteilter Microblogging Dienst, der das ActivityPub-Protokoll verwendet.

Wenn man nur wenige Nutzer oder gar nur für sich selbst einen Einstiegspunkt ins "Fediverse" schaffen will, kann sich auch die Ressourcen-schonende Alternative Pleroma anbieten.

Diese Anleitung beschreibt, wie man Mastodon auf der Managed Hosting Plattform von Hostsharing installieren kann.

Hostsharing selbst nutzt die Hosting Plattform und betreibt zwei Mastodon Instanzen:

Der Autor dieser Seite betreibt:

Für Managed Server

Ein funktionierender Mastodon-Server erfordert mehrere laufende Server-Dienste. Für den Betrieb ist ein Managed Server sinnvoll.


Vorbereitungen

Mit Hilfe von HSAdmin wird angelegt:

  1. Ein User als Service-User mit /bin/bash als Shell, zum Beispiel Beispiel: xyz00-mastodon
  2. Eine Domain mit xyz00-mastodon als Domain-Administrator, zum Beispiel beispiel.social
  3. Einen Postgresql-User xyz00_mastuser mit Passwort meinPasswort
  4. Eine Postgresql-Datenbank xyz00_mastdb mit Datenbank-Owner xyz00_mastuser

Verwendete IP-Ports der Server-Dienste:

  1. Redis: localhost:32002
  2. Mastodon-Web: localhost:32003
  3. Mastodon-Streaming: localhost:32004

Konfiguration des Redis Server

Anlegen einer Datei /home/pacs/xyz00/users/mastodon/redis/etc/redis.conf mit folgendem Inhalt:

daemonize yes
pidfile /home/pacs/xyz00/users/mastodon/redis/var/redis-server.pid
requirepass <hierhin-gehoert-ein-redis-passwort>
port 32002
tcp-backlog 128
bind 127.0.0.1
timeout 300
loglevel notice
logfile /home/pacs/xyz00/users/mastodon/redis/var/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
slave-serve-stale-data yes
appendonly no
dbfilename dump.rdb
dir /home/pacs/xyz00/users/mastodon/redis/var

Installation von NodeJS

Als User 'xyz00-mastodon: Installation von nvm und nodejs (Version 20) nach der Anleitung NodeJS

Installation von yarn mit:

npm install -g yarn

Installation von Ruby

Als User xyz00-mastodon: Installation von Ruby mit rbenv mit folgenden Befehlen:

Zunächst rbenv and ruby-build:

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.profile

starte neue Shell:

exec bash

Überprüfe rbenv-Installation

type rbenv

Installiere ruby-build als rbenv-Plugin

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

Nun kann die benötigte Ruby-Version installiert werden:

rbenv install 3.2.3

Installation der Mastodon Software

Weiterhin Als User xyz00-mastodon:

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

Die stabile Version auschecken:

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

Ruby Pakete installieren:

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

Node.js Pakete installieren:

yarn install --pure-lockfile

Konfiguration der Mastodon Software

Anlegen einer Datei /home/pacs/xyz00/users/mastodon/live/.env.production mit dem folgenden Inhalt:

REDIS_HOST=localhost
REDIS_PORT=32002
REDIS_PASSWORD=<hierhin-gehoert-ein-redis-passwort>
DB_HOST=localhost
DB_USER=xyz00_mastuser
DB_NAME=xyz00_mastdb
DB_PASS=meinPasswort
DB_PORT=5432
LOCAL_DOMAIN=beispiel.social
SECRET_KEY_BASE=12ab..
OTP_SECRET=34ef..
VAPID_PRIVATE_KEY=ABCD..
VAPID_PUBLIC_KEY=EFGH..
DEFAULT_LOCALE=de
SMTP_SERVER=localhost
SMTP_PORT=25
SMTP_FROM_ADDRESS=notifications@beispiel.social
SMTP_AUTH_METHOD=none
SMTP_OPENSSL_VERIFY_MODE=none
STREAMING_CLUSTER_NUM=1

Die Zufallswerte für die Variablen SECRET_KEY_BASE und OTP_SECRET erzeugt man durch zwei Aufrufe des Kommandos

RAILS_ENV=production bundle exec rake secret

Die Werte für VAPID_PRIVATE_KEY und VAPID_PUBLIC_KEY erzeugt das Kommando

RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key

Initialisieren der Datenbank:

export SAFETY_ASSURED=1
RAILS_ENV=production bundle exec rails db:schema:load
RAILS_ENV=production bundle exec rails db:seed

Erzeugen der Web-Resourcen

yarn set version classic
RAILS_ENV=production bundle exec rails assets:precompile

Starten der Dienste

Zum Start aller notwendigen Dienste wird in dieser Anleitung systemctl benutzt.

Die Datei ~/.config/systemd/user/redis.service kann so aussehen:

[Unit]
Description=Redis User Service

[Service]
WorkingDirectory=%h/var/redis
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
ExecStart=/usr/bin/redis-server %h/etc/redis.conf
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target

Die Datei ~/.config/systemd/user/puma.service kann so aussehen:

[Unit]
Description=Mastodon Web Service Puma
After=redis.service

[Service]
WorkingDirectory=%h/live
Environment="RAILS_ENV=production"
ExecStart=%h/.rbenv/shims/bundle exec puma -C config/puma.rb -e production -b tcp://127.0.0.1:32003
StandardError=append:%h/var/log/puma.log
StandardOutput=append:%h/var/log/puma.log
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target

Die Datei ~/.config/systemd/user/sidekiq.service kann so aussehen:

[Unit]
Description=Mastodon Sidekiq Service
After=redis.service

[Service]
WorkingDirectory=%h/live
Environment="RAILS_ENV=production"
Environment="DB_POOL=5"
ExecStart=%h/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push -q scheduler
StandardError=append:%h/var/log/sidekiq.log
StandardOutput=append:%h/var/log/sidekiq.log
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target

Die Datei ~/.config/systemd/user/streaming.service kann so aussehen:

[Unit]
Description=Mastodon Streaming Service
After=redis.service

[Service]
WorkingDirectory=%h/live
Environment="NVM_DIR=%h/.nvm"
Environment="NVM_BIN=%h/.nvm/versions/node/v20.14.0/bin"
Environment="NODE_ENV=production"
Environment="PORT=32004"
Environment="BIND=127.0.0.1"

ExecStart=%h/.nvm/versions/node/v20.14.0/bin/node streaming/index.js
StandardError=append:%h/var/log/streaming.log
StandardOutput=append:%h/var/log/streaming.log
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target

Die Dienste werden dann aktiviert und gestartet:

systemctl --user enable redis --now
systemctl --user enable puma --now
systemctl --user enable streaming --now
systemctl --user enable sidekiq --now

Einrichten des Apache VHost

   cd ~/doms/beispiel.social
   rm -rf htdocs-ssl subs/www subs-ssl/www
   ln -s ~/live/public htdocs-ssl
   touch htdocs-ssl/.htaccess

Dann die htdocs-ssl/.htaccess mit dem Editor der Wahl öffnen und folgende Konfiguration einfügen:

DirectoryIndex disabled
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI}  ^/api/v1/streaming    [NC]
RewriteRule .* ws://localhost:32004%{REQUEST_URI}  [proxy]
RequestHeader set X-Forwarded-Proto "https"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* http://localhost:32003%{REQUEST_URI} [proxy]
RequestHeader set X-Forwarded-Proto "https"

Systemd Timer

Mit einem systemd Timer werden alte Ressourcen aufgeräumt.

~/.config/systemd/user/mastodon_cleanup.env

HOME=/home/pacs/xyz00/users/mastodon
MAILTO=mastodon@beispiel.social
RAILS_ENV=production
NUM_DAYS=31

~/.config/systemd/user/mastodon_cleanup.service

[Unit]
Description=fetch mail from remote server

[Service]
EnvironmentFile=/home/pacs/xyz00/users/mastodon/.config/systemd/user/mastodon_cleanup.env
WoringDirectory=/home/pacs/xyz00/users/mastodon/live
Type=oneshot
ExecStart=/home/pacs/xyz00/users/mastodon/live/bin/tootctl media remove

~/.config/systemd/user/mastodon_cleanup.timer

[Unit]
Description=fetch mail every five minutes

[Timer]
OnCalendar=4:18
Persistent=True

[Install]
WantedBy=timers.target

Timer aktivieren und starten:

$ systemctl --user enable mastodon_cleanup.timer
$ systemctl --user start mastodon_cleanupl.timer

Volltextsuche

In der installierten Version gibt es noch keine Volltextsuche. Es kann lediglich nach Nutzerkennungen und Hastags gesucht werden. Für die Volltextsuche kann optional Elasticsearch installiert werden.

Instanz einrichten

Nach der Installation kann man sich auf https://beispiel.social einen Benutzer einrichten.

Auf der Kommandozeile:

RAILS_ENV=production bin/tootctl accounts create \
  alice \
  --email alice@example.com \
  --confirmed \
  --role Admin

Weitere Einrichtung sollte vorgenommen werden, z.B. eine Beschreibung der Instanz hinterlegen, siehe https://docs.joinmastodon.org/admin/setup/

Mastodon Updates

siehe:

(hier für das Update auf die Mastodon Version v4.2.9 mit Ruby 3.2.3)

Ruby

cd ~/.rbenv
git pull
cd ~/.rbenv/plugins/ruby-build
git pull
cd
rbenv install -l
rbenv install 3.2.3
rbenv global 3.2.3

Mastodon

cd ~/mastodon/live
git fetch
git checkout v4.2.9
gem update --system
bundle install
yarn install
RAILS_ENV=production bundle exec rails db:migrate
yarn set version classic
RAILS_ENV=production bundle exec rails assets:precompile

Restart Mastodon!

Links