丼鯖の建てかた » 履歴 » バージョン 3
白林檎 美和, 2020/07/08 02:42
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のメアドと初期パスワードでログイン。 |