丼鯖の建てかた » 履歴 » バージョン 9
白林檎 美和, 2021/10/09 01:04
| 1 | 8 | 白林檎 美和 | # 丼鯖 [mastodon instance] の建てかた |
|---|---|---|---|
| 2 | 1 | 白林檎 美和 | ## 材料 |
| 3 | * 最新のFreeBSD, nginx, PostgreSQL等が走るホスト |
||
| 4 | * データ置き場のストレージ: ユーザーを増やしたり,廃人のやうにつぶやいたりする気満々の方のみ |
||
| 5 | * 80/tcp, 443/tcpへ外からアクセス可能な,イソターネット接続環境 |
||
| 6 | |||
| 7 | ## 準備 |
||
| 8 | ### OSのインスコ |
||
| 9 | 8 | 白林檎 美和 | 1. 最新のFreeBSDのディスクイメージを取ってきて,そいつからホストを起動。2021/8/31現在の最新リリースは, [13.0](http://ftp.jaist.ac.jp/pub/FreeBSD/releases/ISO-IMAGES/13.0/)。 |
| 10 | 1 | 白林檎 美和 | 1. テキストベースのウィザードを,淡々と進める。データ置き場のストレージを,ルートファイルシステムと別に設ける方は,そいつを /usr/home へマウント。 |
| 11 | 6 | 白林檎 美和 | 1. 丼インスタンスの各種プロセスを実行するためのユーザー “mastodon” を作成。プライマリ以外のグループに, wheelを指定。 |
| 12 | 1 | 白林檎 美和 | 1. 作業しやすいやう, sshdを有効化。sshdを常駐させるもよし, inetdで必要なときだけ起こすもよし。 |
| 13 | |||
| 14 | ### ホストがNATの内側にいる場合 |
||
| 15 | 1. イソターネットからの80/tcp, 443/tcpへのアクセスを,ホストへ通すよう設定。 |
||
| 16 | 1. NATの内外どちらからも,同じFQDNでホストへアクセスできるよう, DNS鯖を設定。さうしないと, SSLの証明書を取れなかったり, WWWブラウザで開いたときにSSLが有効にならなかったりする。 |
||
| 17 | |||
| 18 | ## 丼建て |
||
| 19 | ここからは基本的に,公式サイトの[Installing from source](https://docs.joinmastodon.org/admin/install/)の順番で進める。Ubuntu (Debian系Linux) 固有のコマンド等がばしばし出てきて, FreeBSDでは使えないので,読み替えていく。 |
||
| 20 | ### Pre-requisites |
||
| 21 | 1. /etc/make.conf へ, 次を追加。 |
||
| 22 | |||
| 23 | ``` |
||
| 24 | 8 | 白林檎 美和 | DEFAULT_VERSIONS+=perl5=5.34 python=3.9 python3=3.9 ruby=2.7 ssl=openssl |
| 25 | 1 | 白林檎 美和 | ``` |
| 26 | 5 | 白林檎 美和 | 1. パッケージのオプションを選択。nginxのオプションは, PASSENGERをON。丼では使わないが, Redmine等を建てるときに要る。 |
| 27 | 1 | 白林檎 美和 | ``` |
| 28 | # portsnap fetch update |
||
| 29 | 9 | 白林檎 美和 | # don_pkgs='databases/gdbm databases/postgresql14-server databases/postgresql14-contrib databases/redis devel/bison devel/git devel/protobuf devel/protobuf-c devel/bison devel/icu devel/readline dns/libidn graphics/ImageMagick7 multimedia/ffmpeg textproc/libxml2 textproc/libxslt security/openssl security/py-certbot-nginx security/sudo sysutils/rubygem-bundler www/nginx www/yarn' |
| 30 | 1 | 白林檎 美和 | # for pack in don_packs; do make -C /usr/ports/$pack config-recursive; done |
| 31 | ``` |
||
| 32 | 5 | 白林檎 美和 | 1. Portsの一括インスコや更新に便利な, portupgradeをインスコ。これがrubyを引き連れてくる。 |
| 33 | 1 | 白林檎 美和 | ``` |
| 34 | # make -C /usr/ports/ports-mgmt/portupgrade config-recursive install clean |
||
| 35 | ``` |
||
| 36 | 1. 丼が使うパッケージを, portsからごりごりインスコ。 |
||
| 37 | ``` |
||
| 38 | # portinstall $don_pkgs |
||
| 39 | ``` |
||
| 40 | 1. 既存のFreeBSDの環境へ導入する方は,ここでユーザー “mastodon” を作成。bsdconfigの [6 Login/Group Management]→[1 Add Login] なり, adduserなり,お好きな方法で。 |
||
| 41 | 6 | 白林檎 美和 | プライマリ以外のグループに, wheelを指定。 |
| 42 | 1. /usr/local/etc/sudoers の行 `# %wheel ALL=(ALL) ALL` から,先頭の `# ` を削除。 |
||
| 43 | 2 | 白林檎 美和 | |
| 44 | ### Setup |
||
| 45 | 1. /etc/rc.conf へ次を追加。 |
||
| 46 | |||
| 47 | 1 | 白林檎 美和 | ``` |
| 48 | 2 | 白林檎 美和 | nginx_enable="YES" |
| 49 | postgresql_enable="YES" |
||
| 50 | redis_enable="YES" |
||
| 51 | ``` |
||
| 52 | 9 | 白林檎 美和 | 1. データ置き場を分けた方は, `postgresql_data="/usr/home/postgres/data14"` も追加。既に /var/db/postgres が作られていたら, /usr/home へ移動。 |
| 53 | 2 | 白林檎 美和 | 1. ぽすぐれを初期化,起動。 |
| 54 | ``` |
||
| 55 | # service postgresql initdb |
||
| 56 | # service postgresql start |
||
| 57 | ``` |
||
| 58 | 1. 丼DB用のユーザーを作成。ついでに,スーパーユーザーへパスワードを付与。 |
||
| 59 | ``` |
||
| 60 | # sudo -u postgres psql |
||
| 61 | postgres=# CREATE USER mastodon WITH PASSWORD '<ぱすわぁど>' CREATEDB; |
||
| 62 | postgres=# ALTER ROLE postgres WITH PASSWORD '<ぱすわぁど>'; |
||
| 63 | postgres=# \q ← ^D |
||
| 64 | ``` |
||
| 65 | 1. ユーザーmastodonへ切り替え。 |
||
| 66 | 1 | 白林檎 美和 | ``` |
| 67 | 2 | 白林檎 美和 | # su - mastodon |
| 68 | 9 | 白林檎 美和 | Password: ←ユーザーmastodonのパスワード。 |
| 69 | 2 | 白林檎 美和 | ``` |
| 70 | 1. 丼鯖の最新リリースを取得。 |
||
| 71 | ``` |
||
| 72 | $ git clone https://github.com/tootsuite/mastodon.git live |
||
| 73 | $ cd live |
||
| 74 | $ git checkout <最新リリースのタグ> |
||
| 75 | ``` |
||
| 76 | 1 | 白林檎 美和 | 1. 丼鯖が使う, rubyや農奴のパッケージを, live以下へ配置。`getconf _NPROCESSORS_ONLN` は,ホストのCPUのスレッド数を返す。 |
| 77 | 2 | 白林檎 美和 | ``` |
| 78 | 9 | 白林檎 美和 | $ export RAILS_ENV=production |
| 79 | 2 | 白林檎 美和 | $ bundle config deployment 'true' |
| 80 | $ bundle config without 'development test' |
||
| 81 | $ bundle install -j$(getconf _NPROCESSORS_ONLN) |
||
| 82 | $ yarn install --pure-lockfile |
||
| 83 | ``` |
||
| 84 | 1. 初回設定。 |
||
| 85 | * DBはUNIX domain socketではなく, localhostを指定。前者では, socketのパス名がUbuntu標準と合わず失敗。 |
||
| 86 | * adminのパスワードがランダムに生成されるので,控えておく。 |
||
| 87 | |||
| 88 | ``` |
||
| 89 | $ bundle exec rake mastodon:setup |
||
| 90 | ``` |
||
| 91 | 3 | 白林檎 美和 | 1. dist/nginx.conf を /usr/local/etc/nginx/mastodon.conf へコピー。 |
| 92 | 1. /usr/local/etc/nginx に nginx.conf がなかったら,nginx.conf-dist をコピー。 |
||
| 93 | ``` |
||
| 94 | # cp -p dist/nginx.conf /usr/local/etc/nginx/mastodon.conf |
||
| 95 | # cd /usr/local/etc/nginx |
||
| 96 | # cp -p nginx.conf-dist nginx.conf |
||
| 97 | ``` |
||
| 98 | 1. nginx.conf の `http { ... }` から, `server { ... }` を削除。末尾に `include mastodon.conf;` を追加。 |
||
| 99 | 1. mastodon.conf を編集。 |
||
| 100 | 1. `server_name` に,ホストのFQDNを記載。 |
||
| 101 | 1. IPv6を使わない環境 ⇒ `listen [::]:80;`, `listen [::]:443 ssl http2;` をコメントアウト。 |
||
| 102 | 1. /usr/local/etc/letsencrypt/options-ssl-nginx.conf と重複する,次の行をコメントアウト。 |
||
| 103 | |||
| 104 | ``` |
||
| 105 | ssl_protocols TLSv1.2 TLSv1.3; |
||
| 106 | ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA; |
||
| 107 | ssl_prefer_server_ciphers on; |
||
| 108 | ``` |
||
| 109 | 1. nginxを起動。 |
||
| 110 | ``` |
||
| 111 | # service nginx start |
||
| 112 | ``` |
||
| 113 | 1. Let's encryptからSSL証明書を貰う。 |
||
| 114 | ``` |
||
| 115 | # certbot --nginx -d <ホストのFQDN> |
||
| 116 | ``` |
||
| 117 | 1. mastodon.conf に次の行が足されたのを確認。 |
||
| 118 | ``` |
||
| 119 | ssl_certificate /usr/local/etc/letsencrypt/live/<ホストのFQDN>/fullchain.pem; |
||
| 120 | ssl_certificate_key /usr/local/etc/letsencrypt/live/<ホストのFQDN>/privkey.pem; |
||
| 121 | include /usr/local/etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot |
||
| 122 | ssl_dhparam /usr/local/etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot |
||
| 123 | ``` |
||
| 124 | 1. nginxを再起動。 |
||
| 125 | ``` |
||
| 126 | # service nginx restart |
||
| 127 | ``` |
||
| 128 | 1. /etc/periodic.conf に `weekly_certbot_enable="YES"` を追加。同ファイルがなければ作る。 |
||
| 129 | 1. dist/*.service の内容を基に,丼鯖の各種サービスの起動/終了用スクリプト /usr/local/etc/rc.d/mastodon を作成。最低限start, stop, restartができればよい。 |
||
| 130 | |||
| 131 | ``` shell |
||
| 132 | #!/bin/sh |
||
| 133 | |||
| 134 | # PROVIDE: mastodon |
||
| 135 | # REQUIRE: nginx postgresql redis |
||
| 136 | |||
| 137 | . /etc/rc.subr |
||
| 138 | |||
| 139 | name="mastodon" |
||
| 140 | rcvar="${name}_enable" |
||
| 141 | |||
| 142 | load_rc_config $name |
||
| 143 | : ${mastodon_enable="NO"} |
||
| 144 | : ${mastodon_user="mastodon"} |
||
| 145 | : ${mastodon_group="<ユーザーmastodonの所属グループ>"} |
||
| 146 | 7 | 白林檎 美和 | start_cmd="${name}_start &" |
| 147 | 1 | 白林檎 美和 | stop_cmd="${name}_stop" |
| 148 | 7 | 白林檎 美和 | restart_cmd="${name}_restart &" |
| 149 | status_cmd="${name}_status" |
||
| 150 | extra_commands="status" |
||
| 151 | 3 | 白林檎 美和 | |
| 152 | MASTODON_HOME=/usr/home/mastodon/live |
||
| 153 | BUNDLE=/usr/local/bin/bundle |
||
| 154 | NODE=/usr/local/bin/node |
||
| 155 | 1 | 白林檎 美和 | DAEMON="/usr/sbin/daemon -u $mastodon_user" |
| 156 | 3 | 白林檎 美和 | PROCS="puma sidekiq node" |
| 157 | 7 | 白林檎 美和 | REQUIRED_PIDS="/var/db/postgres/data12/postmaster.pid /var/run/redis/redis.pid /var/run/nginx.pid" |
| 158 | 3 | 白林檎 美和 | |
| 159 | export RAILS_ENV=production |
||
| 160 | export NODE_ENV=production |
||
| 161 | export DB_POOL=25 |
||
| 162 | export MALLOC_ARENA_MAX=2 |
||
| 163 | export STREAMING_CLUSTER_NUM=1 |
||
| 164 | 1 | 白林檎 美和 | |
| 165 | mastodon_start() { |
||
| 166 | 7 | 白林檎 美和 | for i in $REQUIRED_PIDS; do |
| 167 | while [ ! -f $i ]; do |
||
| 168 | echo "$i is not ready." |
||
| 169 | sleep 1 |
||
| 170 | done |
||
| 171 | done |
||
| 172 | sleep 1 |
||
| 173 | 3 | 白林檎 美和 | cd $MASTODON_HOME |
| 174 | for i in $PROCS; do |
||
| 175 | pidfile=$i.pid |
||
| 176 | if [ -f $pidfile ]; then |
||
| 177 | echo "$i is running as pid $(cat $pidfile)." |
||
| 178 | else |
||
| 179 | touch $pidfile |
||
| 180 | chmod 644 $pidfile |
||
| 181 | case $i in |
||
| 182 | puma ) PORT=3000 $DAEMON -p puma.pid -o log/puma.log $BUNDLE exec puma -C config/puma.rb ;; |
||
| 183 | sidekiq ) $DAEMON -p sidekiq.pid -o log/sidekiq.log $BUNDLE exec sidekiq -c 25 ;; |
||
| 184 | node ) PORT=4000 $DAEMON -p node.pid -o log/node.log $NODE ./streaming ;; |
||
| 185 | esac |
||
| 186 | echo "Started $i." |
||
| 187 | fi |
||
| 188 | done |
||
| 189 | } |
||
| 190 | |||
| 191 | mastodon_stop() { |
||
| 192 | cd $MASTODON_HOME |
||
| 193 | for i in $PROCS; do |
||
| 194 | pidfile=$i.pid |
||
| 195 | if [ -f $pidfile ]; then |
||
| 196 | pid=$(cat $pidfile) |
||
| 197 | kill -s TERM $pid |
||
| 198 | while kill -0 $pid 2> /dev/null; do |
||
| 199 | sleep 1 |
||
| 200 | done |
||
| 201 | rm -f $pidfile |
||
| 202 | echo "Stopped $i." |
||
| 203 | else |
||
| 204 | echo "$i is not running." |
||
| 205 | fi |
||
| 206 | done |
||
| 207 | stty echo |
||
| 208 | } |
||
| 209 | |||
| 210 | mastodon_restart() { |
||
| 211 | 1 | 白林檎 美和 | $stop_cmd |
| 212 | $start_cmd |
||
| 213 | 7 | 白林檎 美和 | } |
| 214 | |||
| 215 | ippandon_status() { |
||
| 216 | cd $IPPANDON_HOME |
||
| 217 | for i in $PROCS; do |
||
| 218 | pidfile=$i.pid |
||
| 219 | if [ -f $pidfile ]; then |
||
| 220 | echo "$i is running as pid $(cat $pidfile)." |
||
| 221 | else |
||
| 222 | echo "$i is not running." |
||
| 223 | fi |
||
| 224 | done |
||
| 225 | 3 | 白林檎 美和 | } |
| 226 | |||
| 227 | run_rc_command "$1" |
||
| 228 | ``` |
||
| 229 | 1. /etc/rc.conf へ `mastodon_enable="YES"` を追加。 |
||
| 230 | 1 | 白林檎 美和 | 1. 丼鯖のサービスを起動。 |
| 231 | 3 | 白林檎 美和 | |
| 232 | ``` |
||
| 233 | # service mastodon start |
||
| 234 | ``` |
||
| 235 | 5 | 白林檎 美和 | 1. WWWブラウザから https://*ホストのFQDN*/ を開き, adminのメアドと初期パスワードでログイン。あとはページ内から,各種設定を進める。 |
| 236 | 4 | 白林檎 美和 | |
| 237 | ## ログ回し |
||
| 238 | nginxと丼サービスのログを1週間周期で固めて回すよう, newsyslogを設定。 |
||
| 239 | 1. /usr/local/etc/newsyslog.conf.d に次のファイルを作成。 |
||
| 240 | * nginx.conf |
||
| 241 | |||
| 242 | ``` |
||
| 243 | # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] |
||
| 244 | /var/log/nginx/*.log 644 100 * $W0D0 GX /var/run/nginx.pid SIGUSR1 |
||
| 245 | ``` |
||
| 246 | * mastodon.conf: “usuaji” は,ユーザーmastodonの所属グループに読み替え。 |
||
| 247 | ``` |
||
| 248 | # logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] |
||
| 249 | /home/mastodon/live/log/*.log mastodon:usuaji 644 100 * $W0D0 GRX /usr/home/mastodon/restart.sh |
||
| 250 | ``` |
||
| 251 | 1. /usr/home/mastodon/restart.sh を作成。 |
||
| 252 | ``` shell |
||
| 253 | #!/bin/sh |
||
| 254 | service mastodon restart |
||
| 255 | ``` |
||
| 256 | 1. newsyslogを再起動。 |
||
| 257 | ``` |
||
| 258 | # service newsyslog restart |
||
| 259 | ``` |