Come installare Mastodon su Debian 8

Articolo pubblicato originariamente sul sito Angristan in francese.

Mascotte MastodonVisto il recente interesse mediatico su Mastodon ho deciso di valutare in modo più approfondito di cosa si tratta non solo dal punto di vista di un utilizzatore ma anche come gestore di questa piattaforma che permette di creare la propria versione di Twitter.

Per ulteriori informazioni sulla nascita e la sua adozione da parte di centinaia di migliaia di utenti potete leggere i seguenti link:

Installazione su Debian 8

L'installazione di Mastodon su Debian Jessie è generalmente una semplice operazione di copia/incolla dei comandi riportati qui sotto.

Vi possono essere variazioni dipendenti dall'utilizzo di tool come Virtualmin, che generalmente semplificano/velocizzano diverse operazioni, o da modifiche/limitazioni che posso esser state implementate in versioni fornite da alcuni service provider. Fateci sapere se incontrate problemi.

Per coloro che preferiscono creare un ambiente di prova è anche possibile effettuare l'installazione con Docker (EN).

E' fortemente consigliata l'installazione su un server nuovo per evitare di interferire con applicativi esistenti.

Installazione dei pacchetti di base

I seguenti comandi devono essere eseguiti come root.

In Debian Jessie il pacchetto "ffmpeg" non è presente per cui bisogna aggiungere il repository dei backport.

echo "deb http://httpredir.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
apt update && apt full-upgrade -y
apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file curl git

Installazione di Node.js

curl -sL https://deb.nodesource.com/setup_4.x | bash -
apt install nodejs
npm install -g yarn

Installazione di Redis

apt install redis-server redis-tools

Installazione di PostgreSQL

apt-get install postgresql postgresql-contrib

Creazione dell'utente "mastodon" con i permessi utente per creare dei nuovi database:

su - postgres
psql
CREATE USER mastodon CREATEDB;
\q
exit

Creazione dell'utente Mastodon

L'utente "mastodon" verrà utilizzato per l'installazione e la gestione dei pacchetti necessari. L'utente creato non ha permessi per fare il login diretto sul server, riducendo i rischi di sicurezza, ma per comodità utilizzerà la shell "bash" che permette di configurare variabili utente e di utilizzare altre funzionalità utili.

adduser --disabled-password --disabled-login mastodon -s /bin/bash

Per cambiare dall'utente corrente all'utente mastodon:

su - mastodon

Per tornare all'utente precedente:

exit

Installazione di Ruby

Installazione dei pacchetti (come root):

apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev

Installazione di rbenv

In questa sezione eseguire i comandi come utente mastodon

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

La sezione qui sopra configura delle variabili utente che devono essere "attivate" uscendo dall'utente mastodon e rieffettuando il login come descritto qui sotto.

exit
su - mastodon

Assicurarsi di aver effettuato il login come mastodon prima di continuare.

Installazione di ruby-build

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

Installazione di Ruby

rbenv install 2.4.1

Andate a prepararvi un caffè visto che questa operazione richiederà qualche minuto

Installazione di Mastodon

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

Per evitare di utilizzare versioni non stabili che possono contenere codice non verificato vengono utilizzate solo versioni "taggate"

Nota : $(git tag | tail -n 1) è il comando che seleziona automaticamente l'ultima versione taggata ossia pronta per ambienti in produzione.

git checkout $(git tag | tail -n 1)

Installazione del pacchetti rimanenti:

gem install bundler
bundle install --deployment --without development test
yarn install

Configurazione

Creazione e modifica del file di configurazione .env.production :

cp .env.production.sample .env.production
nano .env.production

Modificare le seguenti righe:

REDIS_HOST=localhost
DB_HOST=/var/run/postgresql
DB_USER=mastodon
DB_NAME=mastodon_production
LOCAL_DOMAIN=mastodon.partecipa.digital # questo deve corrispondere al vostro dominio
LOCAL_HTTPS=true # assicurarsi che questo sia =true

Utilizzare il comando bundle exec rake secret 3 volte per generare le 3 chiavi come la seguente:

d250201baf31243159865836db1826b8cf1d442ea5cc37119908cadde0d160b3f248b6e47a8035c62d7fd9538fb3a5bcec6bc808040bc4995426a5c27b230420

incollare le chiavi generate, dopo il = e senza spazi, nelle seguenti righe:

PAPERCLIP_SECRET=
SECRET_KEY_BASE=
OTP_SECRET=

Per le linee riguardanti il server di posta, importante perché l'attivazione degli account viene effettuata cliccando su un link inviato via email, utilizzate un vostro server locale, il server Debian stesso o un servizio esterno.

SMTP_SERVER=smtp.mailgun.org # o il vostro server di posta
SMTP_PORT=587 # se utilizzate TLS o 25 se non avete un certificato di crittografia
SMTP_LOGIN=
SMTP_PASSWORD=
SMTP_FROM_ADDRESS=Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
#SMTP_DOMAIN= # defaults to LOCAL_DOMAIN
#SMTP_DELIVERY_METHOD=smtp # potreste anche utilizzare sendmail se configurato
#SMTP_AUTH_METHOD=plain
#SMTP_OPENSSL_VERIFY_MODE=peer
#SMTP_ENABLE_STARTTLS_AUTO=true

Se pensate/sperate di avere migliaia di utenti sulla vostra istanza allora potete utilizzare Mailgun, come da esempio, altrimenti configurate Postfix, ed i relativi record MX/SPF, sul vostro server.

Se la vostra istanza sarà principalmente per utenti italiani configurate la lingua di default:

DEFAULT_LOCALE=it

configurazione del database

RAILS_ENV=production bundle exec rails db:setup

precompilazione degli asset web (css/js)

RAILS_ENV=production bundle exec rails assets:precompile

Una volta terminata l'operazione di precompilazione potete tornare all'utente root:

exit

Fine della sezione in cui è necessario utilizzare l'utente mastodon.

Configurazione degli script di Systemd

Per funzionare correttamente Mastodon di 3 script.

Comandi da eseguire come root.

Servizio web

nano /etc/systemd/system/mastodon-web.service

Incollate nel file:

[Unit]
 Description=mastodon-web
 After=network.target

[Service]
 Type=simple
 User=mastodon
 WorkingDirectory=/home/mastodon/live
 Environment="RAILS_ENV=production"
 Environment="PORT=3000"
 ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb
 TimeoutSec=15
 Restart=always

[Install]
 WantedBy=multi-user.target

Gestione dei processi

nano /etc/systemd/system/mastodon-sidekiq.service

Incollate nel file:

[Unit]
 Description=mastodon-sidekiq
 After=network.target

[Service]
 Type=simple
 User=mastodon
 WorkingDirectory=/home/mastodon/live
 Environment="RAILS_ENV=production"
 Environment="DB_POOL=20"
 ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 20 -q default -q mailers -q pull -q push
 TimeoutSec=15
 Restart=always

[Install]
 WantedBy=multi-user.target

gestione delle api

nano /etc/systemd/system/mastodon-streaming.service

Incollate nel file:

[Unit]
 Description=mastodon-streaming
 After=network.target

[Service]
 Type=simple
 User=mastodon
 WorkingDirectory=/home/mastodon/live
 Environment="NODE_ENV=production"
 Environment="PORT=4000"
 ExecStart=/usr/bin/npm run start
 TimeoutSec=15
 Restart=always

[Install]
 WantedBy=multi-user.target

Attivate i servizi:

systemctl enable /etc/systemd/system/mastodon-*.service

Fate partire i servizi:

systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

Se modificate la configurazione o aggiornate Mastodon fate ripartire i servizi per ricaricare le modifiche apportate:

systemctl restart mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

Verificate che i servizi siano partiti correttamente:

systemctl status mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

Se i servizi sono active (running) allora tutto è a posto:

Stato dei servizi Systemd di Mastodon

Se vi si presentano degli errori allora verificate i log (sostituire mastodon-<nomedelservizio> con, ad esempio, mastodon-web.service):

journalctl -u mastodon-<nomedelservizio>

Creazione dei cronjob

Modificare il crontab per l'utente mastodon:

crontab -e -u mastodon

Aggiungere:

@daily cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/.rbenv/shims/bundle exec rake mastodon:daily

Installazione e configurazione di Nginx

Installazione di Nginx dai repository ufficiali in quanto Debian 8 propone ancora una versione datata:

wget -O - https://nginx.org/keys/nginx_signing.key | apt-key add -
echo "deb http://nginx.org/packages/debian/ $(lsb_release -sc) nginx" > /etc/apt/sources.list.d/nginx.list
apt update
apt install nginx

Nota: Se utilizzate Virtualmin la configurazione di Nginx richiede qualche step in più specialmente nella gesione delle directory visto che sites-available e sites-enabled non vengono create automaticamente in /etc/nginx.

Creazione della configurazione:

nano /etc/nginx/conf.d/mastodon.conf

Copiarci dentro la seguente configurazione (esempio usando il domino evidenziato come mastodon.partecipa.digital, naturalmente sostituitelo con il vostro e con le directory corrette) :

map $http_upgrade $connection_upgrade {
 default upgrade;
 '' close;
}
server {
 listen 80;
 listen [::]:80;
 server_name mastodon.partecipa.digital;
# Reindirizziamo le richieste sulla versione https location / { return 301 https://$host$request_uri; }
# Utile se utilizzate Let's Encrypt
location /.well-known/acme-challenge/ { allow all; }
access_log /dev/null; error_log /dev/null; } server { listen 443 ssl http2; listen [::]:443 ssl http2; #Se utilizzate IPv6 server_name mastodon.partecipa.digital;
root /home/mastodon/live/public; index index.html index.htm index.php;

access_log /var/log/mastodon.partecipa.digital_access_log;
error_log /var/log/mastodon.partecipa.digital_error_log;
# Se non utilizzate un sottodominio (es. mastodon.partecipa.digital) rimuovere i # qui sotto
#if ($host = www.partecipa.digital) { # return 301 https://partecipa.digital$request_uri; #}


#HTTPS
ssl on;
ssl_protocols TLSv1.2; ssl_ecdh_curve prime256v1;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_certificate /home/partecipa/domains/mastodon.partecipa.digital/ssl.cert;
ssl_certificate_key /home/partecipa/domains/mastodon.partecipa.digital/ssl.key;

keepalive_timeout    70;
sendfile             on;
client_max_body_size 0;

gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

add_header Content-Security-Policy "default-src 'none'; font-src 'self'; media-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' data:; connect-src 'self' wss://mastodon.partecipa.digital; frame-ancestors 'none';";
add_header Referrer-Policy "no-referrer";
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload;";

location / {
try_files $uri @proxy;
root /home/mastodon/live/public;
}

location ~ ^/(assets|system/media_attachments/files|system/accounts/avatars) {
add_header Cache-Control "public, max-age=31536000, immutable";
}

location @proxy {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Proxy "";
proxy_pass_header Server;
proxy_pass http://127.0.0.1:3000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
tcp_nodelay on;
}

location /api/v1/streaming {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Proxy "";
proxy_pass http://localhost:4000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
tcp_nodelay on;
}

error_page 500 501 502 503 504 /500.html;

}

Una volta salvato il file potrete far partire Nginx:

systemctl start nginx

O. se Nginx era già attivo, ricaricate la configurazione:

systemctl reload nginx

Gestione degli aggiornamenti

aggiornamento di Ruby

Puo accedere che un aggiornamento di Mastodon richieda un aggiornamento di Ruby. Leggete attentamente le note sugli aggiornamenti per verificare che operazioni sono necessarie.

Nel caso fosse necessario, per aggiornare Ruby eseguite (sostituire X.X.X con la versione di Ruby richiesta) :

su - mastodon
rbenv install X.X.X
rbenv global X.X.X
gem install bundler --no-ri

In seguito eseguire la procedura di aggiornamento di Mastodon.

Aggiornamento di Mastodon

Capita spesso, sopratutto in questo momento di forte crescita, che siano disponibili degli aggiornamenti ma non sono necessari grandi sforzi.

Ricordarsi che è sempre bene fare un backup prima di procedere ad aggiornare qualsiasi sistema.

Aggiornate i repository ed i pacchetti standard se non lo avete già fatto:

apt update && apt full-upgrade

In modo particolare se si tratta di un aggiornamento particolarmente importante fermare is servizi di Mastodon:

systemctl stop mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

Aggiornamento dei vari componenti:

(Non è sempre necessario eseguire tutti i comandi seguenti, leggere sempre le note di rilascio per ulteriori informazioni)

su - mastodon
cd live
git fetch
git checkout $(git tag | tail -n 1)
bundle install
npm upgrade yarn
yarn install
RAILS_ENV=production bundle exec rails assets:clean
RAILS_ENV=production bundle exec rails assets:precompile
RAILS_ENV=production bundle exec rails db:migrate
exit

Ed infine far ripartire tutti i servizi:

systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

 Se avete trovato errori o volete consigliare delle migliorie all'articolo contattate l'autore sulla nostra istanza Mastodon.