プロジェクト

全般

プロフィール

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

白林檎 美和, 2020/07/08 03:00

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