servers:nginx:mastodon
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
servers:nginx:mastodon [2019/01/18 13:15] – [Background Queue] Sean Rhone | servers:nginx:mastodon [2019/02/25 23:52] (current) – [Timer] Sean Rhone | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Information ====== | ||
+ | * Mastodon ((https:// | ||
+ | * [[Information: | ||
+ | * https:// | ||
+ | |||
+ | ===== Prerequisites ===== | ||
+ | |||
+ | * [[distros: | ||
+ | * [[servers: | ||
+ | * [[servers: | ||
+ | |||
+ | ====== Repositories ====== | ||
+ | |||
+ | ===== Node.js ===== | ||
+ | |||
+ | wget -O '/ | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | ===== Yarn ===== | ||
+ | |||
+ | wget -O '/ | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | ====== Dependencies ====== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo apt install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf bison build-essential libssl-dev libyaml-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev redis-server redis-tools postgresql postgresql-contrib yarn libidn11-dev libicu-dev libjemalloc-dev | ||
+ | |||
+ | ====== Create User ====== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo useradd --comment ' | ||
+ | |||
+ | ====== Download Source ====== | ||
+ | |||
+ | ===== Switch User ===== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo su ' | ||
+ | |||
+ | ===== Download Source ===== | ||
+ | |||
+ | * Clones into ''/ | ||
+ | |||
+ | cd ~ && git clone --branch ' | ||
+ | |||
+ | ====== Additional Dependencies ====== | ||
+ | |||
+ | ===== Switch User ===== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo su ' | ||
+ | |||
+ | ===== rbenv ===== | ||
+ | |||
+ | ==== Download Source ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | cd ~ && git clone --branch ' | ||
+ | |||
+ | ==== Compile ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | cd ~/' | ||
+ | |||
+ | ==== PATH ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | echo -e '\n# rbenv\nexport PATH=" | ||
+ | |||
+ | ===== Ruby ===== | ||
+ | |||
+ | ==== Download Source ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | cd ~ && git clone --branch ' | ||
+ | |||
+ | ==== Compile ==== | ||
+ | |||
+ | * Change '' | ||
+ | |||
+ | RUBY_CONFIGURE_OPTS=' | ||
+ | |||
+ | ===== Gem ===== | ||
+ | |||
+ | **** | ||
+ | |||
+ | gem update --system | ||
+ | |||
+ | ===== Bundler ===== | ||
+ | |||
+ | ==== Install ==== | ||
+ | |||
+ | * :!: Mastodon' | ||
+ | |||
+ | gem install bundler --no-document | ||
+ | |||
+ | ==== Dependencies ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | cd ~/' | ||
+ | |||
+ | ===== Yarn ===== | ||
+ | |||
+ | **** | ||
+ | |||
+ | cd ~/' | ||
+ | |||
+ | ===== Exit User ===== | ||
+ | |||
+ | **** | ||
+ | |||
+ | exit | ||
+ | |||
+ | ====== Database ====== | ||
+ | |||
+ | ===== Service ===== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo systemctl enable ' | ||
+ | |||
+ | ===== Database ===== | ||
+ | |||
+ | sudo -u ' | ||
+ | |||
+ | CREATE USER mastodon CREATEDB; | ||
+ | |||
+ | \q | ||
+ | |||
+ | ====== Redis ====== | ||
+ | |||
+ | ===== Service ===== | ||
+ | |||
+ | * TODO: See if this is needed; Mastodon' | ||
+ | |||
+ | sudo systemctl enable ' | ||
+ | |||
+ | ====== nginx Configuration ====== | ||
+ | |||
+ | ===== Mastodon Proxies ===== | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | 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:// | ||
+ | proxy_buffering on; | ||
+ | proxy_redirect off; | ||
+ | proxy_http_version 1.1; | ||
+ | proxy_set_header Upgrade $http_upgrade; | ||
+ | proxy_set_header Connection $connection_upgrade; | ||
+ | |||
+ | proxy_cache CACHE; | ||
+ | proxy_cache_valid 200 7d; | ||
+ | proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; | ||
+ | add_header X-Cached $upstream_cache_status; | ||
+ | add_header Strict-Transport-Security " | ||
+ | |||
+ | tcp_nodelay on; | ||
+ | } | ||
+ | |||
+ | location / | ||
+ | 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:// | ||
+ | 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; | ||
+ | }</ | ||
+ | |||
+ | ===== Server Block ===== | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | map $http_upgrade $connection_upgrade { | ||
+ | default upgrade; | ||
+ | '' | ||
+ | } | ||
+ | |||
+ | proxy_cache_path / | ||
+ | |||
+ | server { | ||
+ | listen ' | ||
+ | server_name ' | ||
+ | root '/ | ||
+ | |||
+ | include '/ | ||
+ | include '/ | ||
+ | |||
+ | client_max_body_size ' | ||
+ | |||
+ | #access_log / | ||
+ | #error_log / | ||
+ | |||
+ | location / { | ||
+ | try_files $uri @proxy; | ||
+ | } | ||
+ | |||
+ | location ~ ^/ | ||
+ | try_files $uri @proxy; | ||
+ | } | ||
+ | |||
+ | location /sw.js { | ||
+ | try_files $uri @proxy; | ||
+ | } | ||
+ | |||
+ | error_page 500 501 502 503 504 /500.html; | ||
+ | }</ | ||
+ | |||
+ | ==== Enable Server Block ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo rm -f '/ | ||
+ | |||
+ | ====== Initial Setup ====== | ||
+ | |||
+ | ===== Switch User ===== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo su ' | ||
+ | |||
+ | ===== Initial Setup ===== | ||
+ | |||
+ | **** | ||
+ | |||
+ | cd ~/' | ||
+ | |||
+ | ==== Settings ==== | ||
+ | |||
+ | * Domain name: '' | ||
+ | * Yes single user mode | ||
+ | * No Docker | ||
+ | * Default PostgresSQL details | ||
+ | * Default Redis details | ||
+ | * No uploaded files on cloud | ||
+ | * No emails from localhost | ||
+ | |||
+ | ====== Post Setup ====== | ||
+ | |||
+ | ===== Logo ===== | ||
+ | |||
+ | ==== Hero image ==== | ||
+ | |||
+ | * 600x100 | ||
+ | * RoE | Social text centered in font '' | ||
+ | * Gray background with HTML color notation ''# | ||
+ | * White text for '' | ||
+ | * Blue text for '' | ||
+ | |||
+ | ==== Instance thumbnail ==== | ||
+ | |||
+ | * 1200x630 | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * Gray background with HTML color notation ''# | ||
+ | |||
+ | ===== Documentation ===== | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | ===== Rake Tasks ===== | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | ====== Services ====== | ||
+ | |||
+ | ===== Web Workers ===== | ||
+ | |||
+ | * Background daemon ran at system startup | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Web Workers | ||
+ | After=network-online.target | ||
+ | Wants=network-online.target | ||
+ | |||
+ | [Service] | ||
+ | Type=simple | ||
+ | User=mastodon | ||
+ | Group=mastodon | ||
+ | WorkingDirectory=/ | ||
+ | Environment=' | ||
+ | Environment=' | ||
+ | Environment=' | ||
+ | ExecStart='/ | ||
+ | ExecReload=/ | ||
+ | TimeoutSec=15 | ||
+ | Restart=always | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target</ | ||
+ | |||
+ | ===== Background Queue ===== | ||
+ | |||
+ | * :!: '' | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Background Queue | ||
+ | After=network-online.target | ||
+ | Wants=network-online.target | ||
+ | |||
+ | [Service] | ||
+ | Type=simple | ||
+ | User=mastodon | ||
+ | Group=mastodon | ||
+ | WorkingDirectory=/ | ||
+ | Environment=' | ||
+ | Environment=' | ||
+ | Environment=' | ||
+ | Environment=' | ||
+ | ExecStart='/ | ||
+ | TimeoutSec=15 | ||
+ | Restart=always | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target</ | ||
+ | |||
+ | ===== Streaming API ===== | ||
+ | |||
+ | * Background daemon ran at system startup | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Streaming API | ||
+ | After=network-online.target | ||
+ | Wants=network-online.target | ||
+ | |||
+ | [Service] | ||
+ | Type=simple | ||
+ | User=mastodon | ||
+ | Group=mastodon | ||
+ | WorkingDirectory=/ | ||
+ | Environment=' | ||
+ | Environment=' | ||
+ | Environment=' | ||
+ | ExecStart='/ | ||
+ | TimeoutSec=15 | ||
+ | Restart=always | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target</ | ||
+ | |||
+ | ===== Updater ===== | ||
+ | |||
+ | ==== Service ==== | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Service] | ||
+ | User=mastodon | ||
+ | Group=mastodon | ||
+ | Type=oneshot | ||
+ | WorkingDirectory=/ | ||
+ | Environment=' | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStartPost='/ | ||
+ | |||
+ | |||
+ | |||
+ | ==== Timer ==== | ||
+ | |||
+ | * Every day at '' | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Updater | ||
+ | After=network-online.target | ||
+ | Wants=network-online.target | ||
+ | |||
+ | [Timer] | ||
+ | OnCalendar=*-*-* 02:00:00 | ||
+ | Persistent=true | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target</ | ||
+ | |||
+ | ===== Ruby Updater ===== | ||
+ | |||
+ | ==== Service ==== | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Service] | ||
+ | User=mastodon | ||
+ | Group=mastodon | ||
+ | Type=oneshot | ||
+ | WorkingDirectory=/ | ||
+ | Environment=' | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStartPost='/ | ||
+ | |||
+ | ==== Timer ==== | ||
+ | |||
+ | * Every day at '' | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Ruby Updater | ||
+ | After=network-online.target | ||
+ | Wants=network-online.target | ||
+ | |||
+ | [Timer] | ||
+ | OnCalendar=*-*-* 01:30:00 | ||
+ | Persistent=true | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target</ | ||
+ | |||
+ | ===== Maintenance ===== | ||
+ | |||
+ | ==== Service ==== | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Service] | ||
+ | User=mastodon | ||
+ | Group=mastodon | ||
+ | Type=oneshot | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStartPost='/ | ||
+ | |||
+ | ==== Timer ==== | ||
+ | |||
+ | * '' | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Maintenance | ||
+ | After=network-online.target | ||
+ | Wants=network-online.target | ||
+ | |||
+ | [Timer] | ||
+ | OnCalendar=*-*-01 02:20:00 | ||
+ | Persistent=true | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target</ | ||
+ | |||
+ | ===== Restarter ===== | ||
+ | |||
+ | ==== Service ==== | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Service] | ||
+ | Type=oneshot | ||
+ | ExecStartPre='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStart='/ | ||
+ | ExecStartPost='/ | ||
+ | ExecStartPost='/ | ||
+ | ExecStartPost='/ | ||
+ | ExecStartPost='/ | ||
+ | |||
+ | ==== Timer ==== | ||
+ | |||
+ | * Every day at '' | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Service Restarter | ||
+ | After=network-online.target | ||
+ | Wants=network-online.target | ||
+ | |||
+ | [Timer] | ||
+ | OnCalendar=*-*-* 02:10:00 | ||
+ | Persistent=true | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target</ | ||
+ | |||
+ | ===== Backup ===== | ||
+ | |||
+ | ==== Information ==== | ||
+ | |||
+ | * :!: This differs from the usual backup scheme and **should not** be used copy/ | ||
+ | * Because '' | ||
+ | * So to avoid having to run another service just to move the database dump, it's integrated into the files backup service | ||
+ | |||
+ | ==== Database ==== | ||
+ | |||
+ | === Service === | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Service] | ||
+ | Type=oneshot | ||
+ | User=mastodon | ||
+ | Group=mastodon | ||
+ | ExecStart='/ | ||
+ | ExecStartPost='/ | ||
+ | |||
+ | === Timer === | ||
+ | |||
+ | * Every day at '' | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Database Dump | ||
+ | After=postgresql.service | ||
+ | |||
+ | [Timer] | ||
+ | OnCalendar=*-*-* 02:45:00 | ||
+ | Persistent=true | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target</ | ||
+ | |||
+ | ==== Files ==== | ||
+ | |||
+ | === Service === | ||
+ | |||
+ | mkdir -p ~/' | ||
+ | |||
+ | < | ||
+ | [Service] | ||
+ | Type=oneshot | ||
+ | WorkingDirectory=/ | ||
+ | ExecStart='/ | ||
+ | ExecStartPost='/ | ||
+ | |||
+ | === Timer === | ||
+ | |||
+ | * Every day at '' | ||
+ | |||
+ | sudo -e '/ | ||
+ | |||
+ | < | ||
+ | [Unit] | ||
+ | Description=Mastodon Files and Database Backup | ||
+ | |||
+ | [Timer] | ||
+ | OnCalendar=*-*-* 02:50:00 | ||
+ | Persistent=true | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target</ | ||
+ | |||
+ | ====== Backup ====== | ||
+ | |||
+ | * Create backup archive on server and transfer to client computer | ||
+ | |||
+ | ===== Server ===== | ||
+ | |||
+ | ==== Stop Services ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo systemctl stop mastodon-web mastodon-sidekiq mastodon-streaming redis-server | ||
+ | |||
+ | ==== Backup Files ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | cd '/ | ||
+ | |||
+ | ==== Backup Database ==== | ||
+ | |||
+ | === Backup Database === | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo -u ' | ||
+ | |||
+ | ==== Start Services ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo systemctl start mastodon-web mastodon-sidekiq mastodon-streaming redis-server | ||
+ | |||
+ | ===== Client ===== | ||
+ | |||
+ | ==== Transfer Files To Client ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | scp espionage724@192.168.1.153: | ||
+ | |||
+ | ====== Restore ====== | ||
+ | |||
+ | * :!: This is untested as of 2019/01/18 | ||
+ | |||
+ | ===== Client ===== | ||
+ | |||
+ | ==== Transfer Files To Server ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | scp ~/' | ||
+ | |||
+ | ==== Remove Files ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | rm -f ~/' | ||
+ | |||
+ | ===== Server ===== | ||
+ | |||
+ | ==== Stop Services ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo systemctl stop mastodon-web mastodon-sidekiq mastodon-streaming redis-server | ||
+ | |||
+ | ==== Restore Files ==== | ||
+ | |||
+ | === Extract === | ||
+ | |||
+ | **** | ||
+ | |||
+ | mkdir -p '/ | ||
+ | |||
+ | === Move === | ||
+ | |||
+ | == system Folder == | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo rm -Rf '/ | ||
+ | |||
+ | == Settings == | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo rm -f '/ | ||
+ | |||
+ | == Redis Database == | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo rm -f '/ | ||
+ | |||
+ | ==== Restore Database ==== | ||
+ | |||
+ | === Create Database === | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo -u ' | ||
+ | |||
+ | === Restore === | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo -u ' | ||
+ | |||
+ | ==== Start Services ==== | ||
+ | |||
+ | **** | ||
+ | |||
+ | sudo systemctl start mastodon-web mastodon-sidekiq mastodon-streaming redis-server | ||
+ | |||
+ | ==== Remove Backups ==== | ||
+ | |||
+ | * Verify that Mastodon works before running | ||
+ | |||
+ | rm ~/' |