2018年8月版 mastodon v2.4.3 インスタンスをnon Dockerで一から構築する

2019年11月4日IT,mastodonmastodon,壊れた

コピペでできるマストドンインスタンス構築

前回Dockerのインスタンスが吹き飛んでいったので今回は非Docker環境でマストドンインスタンスを作ります。

基本的なmastodonインスタンス構築は公式が不完全なドキュメントを出しているので参考にしてください。

なんか変なエラーが多くて大変でした(感想)

環境について

さくらのVPN メモリ2GB HDD200GB

ubuntu 18.04 amd64

メールは立てるのもmailgunも面倒なのでgmailとかyahooメールのSMTPを使います。

 

必要なコマンドと解説

必要パッケージのインストール

sudo apt install emacs

sudo apt install software-properties-common

sudo add-apt-repository multiverse
sudo add-apt-repository restricted
sudo apt update

node.jsとかなんか必要な物ののインストール

sudo apt -y install curl
curl -sL https://deb.nodesource.com/setup_8.x | bash –

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo  apt-key add –
echo “deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update

sudo apt -y install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev nginx redis-server redis-tools postgresql postgresql-contrib certbot yarn libidn11-dev libicu-dev

mastodonユーザの追加とrbenvの設定

adduser mastodon

sudo 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"' >> ~/.bashrc
echo 'eval “$(rbenv init -)"' >> ~/.bashrc
exec bash
type rbenv
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

rbenv install 2.5.1
rbenv global 2.5.1

mastodonのソースコード取得とインストール

cd ~
git clone https://github.com/tootsuite/mastodon.git live
cd ~/live
git checkout v2.4.3
gem install bundler
bundle install -j$(getconf _NPROCESSORS_ONLN) –deployment –without development test
yarn install –pure-lockfile

exit

重要! postgresqlの文字コード設定

ここで一回詰みました。なぜかデフォルトの文字コードがLATIN1とかいうのになっていて後々困るのでここで設定しておきます。

sudo systemctl stop postgresql

sudo pg_dropcluster –stop 10 main

export LANGUAGE="en_US.UTF-8″
export LANG="en_US.UTF-8″
export LC_ALL="en_US.UTF-8″

sudo systemctl start postgresql

sudo pg_createcluster -e UTF8 –start 10 main

データベースの作成

sudo -u postgres psql

CREATE USER mastodon CREATEDB;

#↓このコードは説明には入っていませんでしたがちゃんとmastodon_productionのデータベースを作っておかないとこの後のmigrateで詰みます。

CREATE DATABASE mastodon_production WITH ENCODING 'UTF8’ OWNER mastodon;

\q

nginxの設定

cd /etc/nginx/sites-available

sudo emacs /etc/nginx/sites-available/mdn.crows.tokyo.conf(ここは自分のドメインに置き換えてください)

mdn.crows.tokyo.confの内容

map $http_upgrade $connection_upgrade {
default upgrade;
" close;
}

server {
listen 80;
listen [::]:80;
server_name mdn.crows.tokyo; (自分のドメインに置き換えてください。)
root /home/mastodon/live/public;
# Useful for Let’s Encrypt
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mdn.crows.tokyo; (自分のドメインに置き換えてください)

ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

ssl_certificate /etc/letsencrypt/live/mdn.crows.tokyo/fullchain.pem; (自分のドメインに書き換えてください)
ssl_certificate_key /etc/letsencrypt/live/mdn.crows.tokyo/privkey.pem; (自分のドメインに書き換えてください)

keepalive_timeout 70;
sendfile on;
client_max_body_size 8m;

root /home/mastodon/live/public;

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 Strict-Transport-Security “max-age=31536000";

location / {
try_files $uri @proxy;
}

location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
add_header Cache-Control “public, max-age=31536000, immutable";
try_files $uri @proxy;
}

location /sw.js {
add_header Cache-Control “public, max-age=0";
try_files $uri @proxy;
}

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://127.0.0.1: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;
}

 

sites-enableにリンクを張る

ここでミスっていてしばらく立ち上がりませんでした。後で詳しく書きます。

cd /etc/nginx/sites-enabled

sudo ln -s ../sites-available/mdn.crows.tokyo.com.conf

SSLの設定

sudo systemctl stop nginx

sudo certbot certonly –standalone -d mdn.crows.tokyo

sudo systemctl start nginx

sudo certbot certonly –webroot -d mdn.crows.tokyo -w /home/mastodon/live/public/

sudo emacs /etc/cron.daily/letsencrypt-renew

#!/usr/bin/env bash
certbot renew
systemctl reload nginx

sudo chmod +x /etc/cron.daily/letsencrypt-renew

sudo systemctl restart cron

mastodonの自動設定

sudo su – mastodon

cd ~/live

RAILS_ENV=production bundle exec rake mastodon:setup

 

Your instance is identified by its domain name. Changing it afterward will break things.
Domain name: mdn.crows.tokyo

Single user mode disables registrations and redirects the landing page to your public profile.
Do you want to enable single user mode? No

Are you using Docker to run Mastodon? no

PostgreSQL host: /var/run/postgresql
PostgreSQL port:
Name of PostgreSQL database: mastodon_production
Name of PostgreSQL user:
Password of PostgreSQL user:
Database configuration works! 🎆

Redis host: localhost
Redis port: 6379
Redis password:
Redis configuration works! 🎆

Do you want to store uploaded files on the cloud? No

Do you want to send e-mails from localhost? (y/N) yAborting. Bye!
tuptodon@ik1-301-10814:~/live$ RAILS_ENV=production bundle exec rake mastodon:set
Your instance is identified by its domain name. Changing it afterward will break things.
Domain name: mdn.crows.tokyo

Single user mode disables registrations and redirects the landing page to your public profile.
Do you want to enable single user mode? No

Are you using Docker to run Mastodon? no

PostgreSQL host: /var/run/postgresql
PostgreSQL port: 5432
Name of PostgreSQL database: mastodon_production
Name of PostgreSQL user: mastodon
Password of PostgreSQL user:
Database configuration works! 🎆

Redis host: localhost
Redis port: 6379
Redis password:
Redis configuration works! 🎆

Do you want to store uploaded files on the cloud? No

Do you want to send e-mails from localhost? No
SMTP server: smtp.gmail.com
SMTP port: 587
SMTP username: gmailアドレス
SMTP password:パスワード
E-mail address to send e-mails “from": Mastodon <notifications@mdn.crows.tokyo>
Send a test e-mail with this configuration right now? Yes
Send test e-mail to: 自分のメールアドレス

This configuration will be written to .env.production
Save configuration? Yes

 

setupでミスった方へ

たぶんここで何かがつまずくと思います。

v2.4.3はなにやら色々バグっぽい動きをするみたいです。

以下の二点でつまづきました。

  • mastodon_productionのdbが作られていない(上記コマンドで対策済)
  • dbの文字コードがUTF8じゃない(上記コマンドで対策済)
  • index_status_20180106がすでに存在している
  • node.jsのエラーでmastodon_streaming.serviceが動かない(uws)

一つ一つなんとかしていきます。

index_status_20180106がすでに存在している

これなんかコード側の問題のようです。2.4.3だけでなく2.1以降のmigrateファイルに変なのが混ざっているので自力で書き換えます。

そのうち公式側のパッケージに反映されると思います。

githubで議論されていた#8026に従って書き換えます。

正直こんなのさっさと適用してほしいですね。

emacs db/migrate/20180514140000_revert_index_change_on_statuses_for_api_v1_accounts_account_id_statuses.rb

7行目付近を以下の通り書き換えます。unless のあたりです。

add_index :statuses, [:account_id, :id, :visibility, :updated_at], order: { id: :desc }, algorithm: :concurrently, name: :index_statuses_20180106 unless index_name_exists?(:statuses, “index_statuses_20180106")
end

USWのエラーでmastodon_streaming.serviceが立ち上がらない

以下のようなエラーが出ます。

/mastodon/node_modules/uws/uws.js:38
throw new Error('Compilation of µWebSockets has failed and there is no pre-compiled binary ' +
^

Error: Compilation of µWebSockets has failed and there is no pre-compiled binary available for your system. Please install a supported C++11 compiler and reinstall the module 'uws’.

これもよくわかりません。#7710に従って直します。

sudo apt install npm

RAILS_ENV=production SAFETY_ASSURED=1 bundle exec rails db:setup

npm install -g webpack webpack-dev-server

npm init

npm install

npm rebuild uws

yarn install

sudo apt install g++-4.8

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash –

curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add –

echo “deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

sudo apt update

sudo apt install nodejs yarn build-essential

どうもuwsのrebuildだと治らないようです。

emacs streaming/index.js

uwsを削除してwsに変えます。

//const WebSocket = require('uws’);
const WebSocket = require('ws’);
const fs = require('fs’);

503行目付近の

wss.on('connection’, ws => {
const req = ws.upgradeReq;

を削除

wss.on('connection’, (ws, req) => {
if (ws.upgradeReq === undefined) {
ws.upgradeReq = req;
}

を追加します。

connection refusedの原因

これらを直したあと、ブラウザでアクセスしたところconnection refusedとなり表示されませんでした。

原因としてはsites-enable内に正しくリンクが張られていなかったことのようです。

sudo

sudo ln -s ../sites-available/example.com.conf

動作がおかしいときのためのコマンド

sudo systemctl status mastodon-*

sudo systemctl status nginx

systemjournal -xf -u mastodon-*

あとは必要なところのログを見る感じです。

このサイトを確認したりする

広告