Table des matières
Service pouet.chapril.org
Service de microbloging Mastodon.
Maintenance
Mise à jour
Nous mettons à jour en suivant les grandes lignes indiquées dans la doc officielle et en prenant soin de vérifier à chaque les instructions spécifiques à chaque version indiquées sur les pages release correspondantes.
En gros, ça donne ceci :
sudo -iu mastodon cd live RELEASE=4.1.6 && git fetch --all && git checkout v${RELEASE?} && git checkout -b live-${RELEASE?} bundle install && yarn install exit systemctl restart mastodon-streaming systemctl reload mastodon-web # et redémarrer éventuellement le ou les autres services mastodon-* qui pourraient en avoir besoin selon les instructions particulières pour une version donnée
Installation
Installation du système de la vm
La machine a été installée en repectant les procédures d'installations de VM.
Installation des services
Installation inspirée de ce tuto.
Configuration APT :
- /etc/apt/sources.list.d/nodejs.list (stretch pas encore dispo, mais fonctionnel avec paquet jessie)
deb https://deb.nodesource.com/node_6.x jessie main deb-src https://deb.nodesource.com/node_6.x jessie main
Installation des dépendances :
apt update apt install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git curl #laisser les configurations par défaut dans les boites de dialogue apt install nodejs npm install -g yarn apt install redis-server redis-tools apt-get install postgresql postgresql-contrib
Création de la base postgres :
su - postgres psql CREATE USER mastodon CREATEDB; \q exit
Installation des dépendances Ruby :
apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev rbenv bundler
Configuration de l'environnement Ruby :
su - mastodon echo 'export PATH="$HOME/.rbenv/bin:/usr/sbin:$PATH"' >> ~/.bash_profile echo 'eval "$(rbenv init -)"' >> ~/.bash_profile exit
On a besoin de Ruby 2.4.1 (au moins), d'après la doc, cette version n'est présente dans aucun dépot Debian… installation manuelle :
su - mastodon git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build rbenv install 2.4.1
Clonage de Mastodon :
cd ~ git clone https://github.com/tootsuite/mastodon.git live cd live #positionnement sur la dernière branche stable : git checkout v1.4.1 git checkout -b stable bundle install --deployment --without development test yarn install
Configuration de Mastodon :
cp .env.production.sample .env.production vim .env.production # modifier ces champs : REDIS_HOST=127.0.0.1 REDIS_PORT=6379 DB_HOST=/var/run/postgresql DB_USER=mastodon DB_NAME=mastodon-production DB_PASS= DB_PORT=5432 LOCAL_DOMAIN=pouet.chapril.org LOCAL_HTTPS=true # générer trois chaines aléatoires pour ces champs avec la commande "bundle exec rake secret : #PAPERCLIP_SECRET= #SECRET_KEY_BASE= #OTP_SECRET= DEFAULT_LOCALE=fr SMTP_SERVER=localhost SMTP_PORT=25 SMTP_FROM_ADDRESS=mastodon@chapril.org SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail SMTP_AUTH_METHOD=none SMTP_OPENSSL_VERIFY_MODE=none SMTP_ENABLE_STARTTLS_AUTO=false
La configuration a été déplacée dans /etc pour pouvoir la suivre avec etckeeper.
cp /home/mastodon/live/.env.production /etc/mastodon.conf ln -sf /etc/mastodon.conf /home/mastodon/live/.env.production
Configuration de la base de donnée pgsql :
RAILS_ENV=production bundle exec rails db:setup
Préparation des js et css :
RAILS_ENV=production bundle exec rails assets:precompile
Configuration des services systemd :
- Web : /etc/systemd/system/mastodon-web.service
[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
- Backend : /etc/systemd/system/mastodon-sidekiq.service
[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
- API : /etc/systemd/system/mastodon-streaming.service
[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
Activation des services :
systemctl enable /etc/systemd/system/mastodon-*.service
Configuration http pour dossier public
Les démons de Mastodon ne servent pas les éléments statiques (avatar, js, css, png etc), il faut les servir avec un démon HTTP. Un nginx a été configuré sur pouet avec la configuration suivante :
server { listen 80 default_server; listen [::]:80 default_server; root /home/mastodon/live/public; server_name pouet.chapril.org _; location / { try_files $uri $uri/; } }
Configuration proxy http sur Bastion
La vm bastion redirige le traffic vers la vm sur les ports 3000 et 4000, avec quelques éléments statiques. La configuration nginx sur bastion est la suivante :
map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name pouet.chapril.org; # On redirige tout en HTTPS return 301 https://pouet.chapril.org$request_uri; access_log /var/log/nginx/pouet.chapril.org-access.log; error_log /var/log/nginx/pouet.chapril.org-error.log; } server { listen 443 ssl; server_name pouet.chapril.org; access_log /var/log/nginx/pouet.chapril.org-access.log; error_log /var/log/nginx/pouet.chapril.org-error.log; add_header Referrer-Policy "strict-origin-when-cross-origin"; 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://pouet.chapril.org; frame-ancestors 'none';"; # HTTPS ssl_certificate /var/lib/dehydrated/certs/pouet.chapril.org/fullchain.pem; ssl_certificate_key /var/lib/dehydrated/certs/pouet.chapril.org/privkey.pem; ssl_protocols TLSv1.2; ssl_ecdh_curve prime256v1; ssl_ciphers EECDH+AESGCM:EECDH+AES; ssl_prefer_server_ciphers on; location / { add_header Referrer-Policy "strict-origin-when-cross-origin"; 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://pouet.chapril.org; frame-ancestors 'none';"; try_files $uri @proxy_static @proxy; } location ~ ^/(packs|assets|system/media_attachments/files|system/accounts/avatars|avatars|emoji|headers|sounds) { add_header Cache-Control "public, max-age=31536000, immutable"; add_header Referrer-Policy "strict-origin-when-cross-origin"; 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://pouet.chapril.org; frame-ancestors 'none';"; try_files $uri @proxy_static; } location @proxy_static { add_header Referrer-Policy "strict-origin-when-cross-origin"; 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://pouet.chapril.org; frame-ancestors 'none';"; 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_pass_header Server; proxy_pass http://192.168.1.194:80; proxy_buffering off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } location @proxy { add_header Referrer-Policy "strict-origin-when-cross-origin"; 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://pouet.chapril.org; frame-ancestors 'none';"; 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_pass_header Server; proxy_pass http://192.168.1.194:3000; proxy_buffering off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } 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_pass http://192.168.1.194:4000; proxy_buffering off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } error_page 500 501 502 503 504 /500.html; }