プロジェクト

全般

プロフィール

丼鯖の建てかた » 履歴 » バージョン 8

白林檎 美和, 2021/08/31 02:01

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 8 白林檎 美和
# don_pkgs='databases/gdbm databases/postgresql13-server databases/postgresql13-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 8 白林檎 美和
1. データ置き場を分けた方は, `postgresql_data="/usr/home/postgres/data13"` も追加。既に /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
    ```
67
# su - mastodon
68
```
69
1. 丼鯖の最新リリースを取得。
70
    ```
71
$ git clone https://github.com/tootsuite/mastodon.git live
72
$ cd live
73
$ git checkout <最新リリースのタグ>
74
```
75
1. 丼鯖が使う, rubyや農奴のパッケージを, live以下へ配置。`getconf _NPROCESSORS_ONLN` は,ホストのCPUのスレッド数を返す。
76
    ```
77
$ bundle config deployment 'true'
78
$ bundle config without 'development test'
79
$ bundle install -j$(getconf _NPROCESSORS_ONLN)
80
$ yarn install --pure-lockfile
81
```
82
1. 初回設定。
83
  * DBはUNIX domain socketではなく, localhostを指定。前者では, socketのパス名がUbuntu標準と合わず失敗。
84
  * adminのパスワードがランダムに生成されるので,控えておく。
85
86
    ```
87
$ export RAILS_ENV=production
88
$ bundle exec rake mastodon:setup
89
```
90 3 白林檎 美和
1. dist/nginx.conf を /usr/local/etc/nginx/mastodon.conf へコピー。
91
1. /usr/local/etc/nginx に nginx.conf がなかったら,nginx.conf-dist をコピー。
92
    ```
93
# cp -p dist/nginx.conf /usr/local/etc/nginx/mastodon.conf
94
# cd /usr/local/etc/nginx
95
# cp -p nginx.conf-dist nginx.conf
96
```
97
1. nginx.conf の `http { ... }` から, `server { ... }` を削除。末尾に `include mastodon.conf;` を追加。
98
1. mastodon.conf を編集。
99
   1. `server_name` に,ホストのFQDNを記載。
100
   1. IPv6を使わない環境 ⇒ `listen [::]:80;`, `listen [::]:443 ssl http2;` をコメントアウト。
101
   1. /usr/local/etc/letsencrypt/options-ssl-nginx.conf と重複する,次の行をコメントアウト。
102
103
        ```
104
ssl_protocols TLSv1.2 TLSv1.3;
105
ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
106
ssl_prefer_server_ciphers on;
107
        ```
108
1. nginxを起動。
109
    ```
110
# service nginx start
111
```
112
1. Let's encryptからSSL証明書を貰う。
113
    ```
114
# certbot --nginx -d <ホストのFQDN>
115
```
116
1. mastodon.conf に次の行が足されたのを確認。
117
    ```
118
ssl_certificate /usr/local/etc/letsencrypt/live/<ホストのFQDN>/fullchain.pem;
119
ssl_certificate_key /usr/local/etc/letsencrypt/live/<ホストのFQDN>/privkey.pem;
120
include /usr/local/etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
121
ssl_dhparam /usr/local/etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
122
```
123
1. nginxを再起動。
124
    ```
125
# service nginx restart
126
```
127
1. /etc/periodic.conf に `weekly_certbot_enable="YES"` を追加。同ファイルがなければ作る。
128
1. dist/*.service の内容を基に,丼鯖の各種サービスの起動/終了用スクリプト /usr/local/etc/rc.d/mastodon を作成。最低限start, stop, restartができればよい。
129
130
``` shell
131
#!/bin/sh
132
133
# PROVIDE: mastodon
134
# REQUIRE: nginx postgresql redis
135
136
. /etc/rc.subr
137
138
name="mastodon"
139
rcvar="${name}_enable"
140
141
load_rc_config $name
142
: ${mastodon_enable="NO"}
143
: ${mastodon_user="mastodon"}
144
: ${mastodon_group="<ユーザーmastodonの所属グループ>"}
145 7 白林檎 美和
start_cmd="${name}_start &"
146 1 白林檎 美和
stop_cmd="${name}_stop"
147 7 白林檎 美和
restart_cmd="${name}_restart &"
148
status_cmd="${name}_status"
149
extra_commands="status"
150 3 白林檎 美和
151
MASTODON_HOME=/usr/home/mastodon/live
152
BUNDLE=/usr/local/bin/bundle
153
NODE=/usr/local/bin/node
154 1 白林檎 美和
DAEMON="/usr/sbin/daemon -u $mastodon_user"
155 3 白林檎 美和
PROCS="puma sidekiq node"
156 7 白林檎 美和
REQUIRED_PIDS="/var/db/postgres/data12/postmaster.pid /var/run/redis/redis.pid /var/run/nginx.pid"
157 3 白林檎 美和
158
export RAILS_ENV=production
159
export NODE_ENV=production
160
export DB_POOL=25
161
export MALLOC_ARENA_MAX=2
162
export STREAMING_CLUSTER_NUM=1
163 1 白林檎 美和
164
mastodon_start() {
165 7 白林檎 美和
	for i in $REQUIRED_PIDS; do
166
		while [ ! -f $i ]; do
167
			echo "$i is not ready."
168
			sleep 1
169
		done
170
	done
171
	sleep 1
172 3 白林檎 美和
	cd $MASTODON_HOME
173
	for i in $PROCS; do
174
		pidfile=$i.pid
175
		if [ -f $pidfile ]; then
176
			echo "$i is running as pid $(cat $pidfile)."
177
		else
178
			touch $pidfile
179
			chmod 644 $pidfile
180
			case $i in
181
				puma ) PORT=3000 $DAEMON -p puma.pid -o log/puma.log $BUNDLE exec puma -C config/puma.rb ;;
182
				sidekiq ) $DAEMON -p sidekiq.pid -o log/sidekiq.log $BUNDLE exec sidekiq -c 25 ;;
183
				node ) PORT=4000 $DAEMON -p node.pid -o log/node.log $NODE ./streaming ;;
184
			esac
185
			echo "Started $i."
186
		fi
187
	done
188
}
189
190
mastodon_stop() {
191
	cd $MASTODON_HOME
192
	for i in $PROCS; do
193
		pidfile=$i.pid
194
		if [ -f $pidfile ]; then
195
			pid=$(cat $pidfile)
196
			kill -s TERM $pid
197
			while kill -0 $pid 2> /dev/null; do
198
				sleep 1
199
			done
200
			rm -f $pidfile
201
			echo "Stopped $i."
202
		else
203
			echo "$i is not running."
204
		fi
205
	done
206
	stty echo
207
}
208
209
mastodon_restart() {
210 1 白林檎 美和
	$stop_cmd
211
	$start_cmd
212 7 白林檎 美和
}
213
214
ippandon_status() {
215
	cd $IPPANDON_HOME
216
	for i in $PROCS; do
217
		pidfile=$i.pid
218
		if [ -f $pidfile ]; then
219
			echo "$i is running as pid $(cat $pidfile)."
220
		else
221
			echo "$i is not running."
222
		fi
223
	done
224 3 白林檎 美和
}
225
226
run_rc_command "$1"
227
```
228
1. /etc/rc.conf へ `mastodon_enable="YES"` を追加。
229 1 白林檎 美和
1. 丼鯖のサービスを起動。
230 3 白林檎 美和
231
    ```
232
# service mastodon start
233
```
234 5 白林檎 美和
1. WWWブラウザから https://*ホストのFQDN*/ を開き, adminのメアドと初期パスワードでログイン。あとはページ内から,各種設定を進める。
235 4 白林檎 美和
236
## ログ回し
237
nginxと丼サービスのログを1週間周期で固めて回すよう, newsyslogを設定。
238
1. /usr/local/etc/newsyslog.conf.d に次のファイルを作成。
239
   * nginx.conf
240
241
        ```
242
# logfilename         [owner:group]  mode  count  size  when   flags  [/pid_file]         [sig_num]
243
/var/log/nginx/*.log                 644   100    *     $W0D0  GX     /var/run/nginx.pid  SIGUSR1
244
```
245
   * mastodon.conf: “usuaji” は,ユーザーmastodonの所属グループに読み替え。
246
        ```
247
# logfilename                  [owner:group]    mode  count  size  when   flags  [/pid_file]                    [sig_num]
248
/home/mastodon/live/log/*.log  mastodon:usuaji  644   100    *     $W0D0  GRX    /usr/home/mastodon/restart.sh
249
```
250
1. /usr/home/mastodon/restart.sh を作成。
251
    ``` shell
252
#!/bin/sh
253
service mastodon restart
254
```
255
1. newsyslogを再起動。
256
    ```
257
# service newsyslog restart
258
```