Come installare Mastodon su Debian 8
Articolo pubblicato originariamente sul sito Angristan in francese.
Visto 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:
- The power to build communities, a response to Mark Zuckerberg
- Learning from Twitter’s mistakes
- Two reasons why organizations should switch to self-hosting social media
- Welcome to Mastodon
- Il progetto Mastodon su GitHub
- Elenco delle istanze registrate
- Mappe e statistiche relative a Mastodon
- Doumentazione Mastodon su GitHub
- Manuale per l'utente
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:
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.