====== Service pouet.chapril.org ====== Service de microbloging Mastodon. ====== Maintenance ====== ===== Mise à jour ===== Nous mettons à jour en suivant les grandes lignes indiquées dans la [[https://docs.joinmastodon.org/admin/upgrading/|doc officielle]] et en prenant soin de vérifier à chaque les instructions spécifiques à chaque version indiquées sur les pages [[https://github.com/mastodon/mastodon/releases|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 [[:sysadm:procedures:installation_vm|procédures d'installations de VM]]. ===== Installation des services ===== Installation inspirée de [[https://angristan.fr/installer-instance-mastodon-debian-8/|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; }