サーバセットアップ - pjmtdw/kagetra GitHub Wiki

概要

以下はLightsailで景虎をセットアップしたときの手順書である. sshでサーバログインしてcdやlsしたりvimでのファイル編集ぐらいはできることが前提なので,前提条件を満たさない人はLPICのLinux標準教科書あたりを読んでおくといいかも.

Lightsail

使っているインスタンスプランは月5$(USD)でメモリ1GB,ディスク40GBと安い割にかなり高性能なプランとなっている. バックアップ(コンテナのスナップショット)も自由に取ることができる(0.05$/GB). OSはCentOS7を選択した.

VultrのVPSの同じ料金のプランではメモリは変わらないが,ディスクサイズが25GBと少し小さくなってしまう. ただし,障害時にgrubメニューからリカバリできる.

景虎起動までの手順

  1. サーバの基本的な設定
  2. PostgreSQLの設定
  3. Ruby周りの設定
  4. 景虎の設定と起動
  5. nginx+unicornの設定

1. サーバの基本的な設定

SSHとファイアウォールの設定

VPSを契約したとにきにまず始めにすべきことはsshのポート番号を変えることである. 22番ポートは中国などから常時攻撃を受けており,仮に突破されないとしてもログに残るので超ウザい. という訳で /etc/ssh/sshd_config を編集する.

Port <Port Number> # 適当な番号に変える
PermitRootLogin no # rootログインを拒否
PasswordAuthentication no # パスワードを使ったログインも拒否(sshのみにする)

SELinuxがデフォルトでONなので semanage port -a -t ssh_port_t -p tcp <Port Number> した後, systemctl restart sshd しよう.

また,Lightsailではコンソールからファイアウォールを設定でき,初期設定ではSSH用のTCP22番とHTTP用の80番だけがオープンになっている. ここも22番を閉じて必要なポートを開けておく.

Timezone の設定

デフォルトでは日本になっていないの設定する.ちなみにVPSサーバはコンテナの中であり,ホスト側で時刻は設定してくれてるっぽいのでntpは必要ない.以下のコマンドを打つだけ.

# timedatectl set-timezone Asia/Tokyo

swap領域の設定

デフォルトではスワップ領域は0になっているのでスワップ領域を確保する.

(2GBをスワップ領域として設定する)
# dd if=/dev/zero of=/swapfile bs=1M count=2048
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile

(再起動時に自動設定する)
# vi /etc/fstab
(以下の行を追加)
/swapfile  swap   swap    defaults   0 0

景虎の実行に必要なソフトをインストール

まずは yum update で各ソフトをupdateしておこう.

# yum -y install bzip2 gcc-c++ patch epel-release ruby-devel ruby openssl-devel readline-devel sqlite-devel ImageMagick-devel postgresql postgresql-server postgresql-devel git nginx

node.jsはCentOSの公式rpmは提供されていないのでyumリポジトリを追加してインストール

# curl -sL https://rpm.nodesource.com/setup_8.x | bash -
# yum -y install nodejs

2. PostgreSQLの設定

景虎はSequelというORMを使用していてバックエンドには色々なRDBMSが使えるが,フリーソフトかつ性能や実績の観点から言うと実質MySQLとPostgreSQLの二択になる.

locale指定しないとcollateとかがen_USになって日本語でorder byするときにメチャクチャになる.

# su - postgres
$ initdb -E UTF8 --locale=ja_JP.UTF-8
$ pg_ctl start -D /var/lib/pgsql/data -s -w -t 300
$ psql
postgres=# ALTER USER postgres PASSWORD 'postgres';
(Ctrl-D で終了)
$ vim /var/lib/pgsql/9.4/data/pg_hba.conf
(methodを md5 に変更)
$ pg_ctl restart -D /var/lib/pgsql/data -s -w -t 300
( psql -U postgres で接続確認 )

pgbouncer の設定

景虎はぶっちゃけそこまで頻繁に使われるサービスじゃないのでidleな時にはPostgreSQLへの通信を切断しておきたい. 通信の維持にもメモリはそこそこかかって,VPSは1GBしかメモリないのでちょっとでも節約しておきたい. そこで pgbouncer というソフトを使う.PostgreSQLへのProxy的なもので,idleな通信は自動的に切断してくれる.

$ rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.2/redhat/rhel-7-x86_64/pgdg-centos92-9.2-3.noarch.rpm
$ yum install pgbouncer

$ vim /etc/pgbouncer/pgbouncer.ini
[databases]
kagetra = host=127.0.0.1 port=5432 dbname=kagetra
hiroshima = host=127.0.0.1 port=5432 dbname=hiroshima
[pgbouncer]
auth_type = md5
server_idle_timeout = 180
pool_mode = transaction
listen_addr = 127.0.0.1
listen_port = 6432

$ vim /etc/pgbouncer/userlist.txt
"postgres" "postgres"

# systemctl start pgbouncer

これで景虎のDBの接続先を localhost:5432 から localhost:6432 に変えれば180秒以上DBへの接続がない場合は自動的に切断される.

自動起動の設定

systemctl enable postgresql
systemctl enable pgbouncer

あと /etc/rc.local に

su - kagetra bash -c '/home/kagetra/kagetra/scripts/unicorn_ctl.sh start'

とか書いておくと良いかもしれない.

3. Ruby周りの設定

まずは実際に景虎を実行するユーザを作る.以下は特に指定しない限りこのユーザで作業する

# useradd -G wheel,nginx,postgres kagetra
# su - kagetra

rbenvをインストール

rubyのバージョン切り替えをrbenvを使って行う.まずはrbenvのインストール.

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

~/.bashrcに下記を追加してsource ~/.bashrc する

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

rbenv install 2.5.3 でRuby 2.5.3をインストールしておく.

4. 景虎の設定と起動

まずは景虎のソースを落としてきて必要なgemやnodejsモジュールをインストール.

# su - kagetra
$ git clone https://github.com/pjmtdw/kagetra.git
$ cd kagetra
$ rbenv local 2.5.3
$ gem install bundler
$ rbenv rehash
$ bundle install --path .vendor/bundle

bundle install の際に

No pg_config... trying anyway. If building fails, please try again with
--with-pg-config=/path/to/pg_config

とか出る場合は

$ bundle config build.pg --with-pg-config=/usr/pgsql-9.4/bin/pg_config --with-pg-include=/usr/pgsql-9.4/include/

を実行しておく

次にブラウザ側で使われるJavaScriptライブラリをインストールしてビルドする.

# 旧版(Backbone+CoffeeScript+Foundation)の場合
$ npm install [email protected] requirejs bower # CoffeeScriptは言語仕様が変わったため(?),最新版では動かなかった
$ ./node_modules/bower/bin/bower install
$ cd ~/kagetra/deploy
$ make clean
$ make
# views/app.scssのimportを相対パスに書き換えないとmakeできなかった.これもバージョンアップが原因(?).
# 新板(Vue)の場合
$ npm install
$ npm run build

次に設定ファイルを書く.cp conf.rb.sample conf.rb してからCONF_DB_USERNAMEなどを書き換える.

あとは共通パスワードや初期属性などの初期設定を行うために

$ bundle exec ./scripts/initial_config.rb

を実行する.

さていよいよ景虎を起動してみよう.下記のコマンドを実行すると9292番ポートで景虎が起動できる.これは実際には使わない試用専用サーバなのでページをちゃんと見られることを確認したらCtrl-Cで終了させること.

$ bundle exec rackup

ただしiptablesで9292番ポートは閉じているので画面確認するにはsshでポートフォワードする.ローカルマシンで下記を実行.

$ ssh -L 1234:localhost:9292 <VPSサーバ>

この状態でローカルマシンのブラウザで http://localhost:1234/ を見るとVPSサーバの9292番パートにアクセスできる. 景虎のログイン画面が表示されたら景虎の起動は正常に行えている.

5. nginx+unicornの設定

bundle exec rackup で起動できるSinatra組み込みサーバは遅いので実際はnginx+unicornで運営することになる.unicornがSinatraのアプリケーションを実行しnginxが80番ポートからリクエストを受け取りunicornに渡すという役割分担になっている.

景虎用のnginx設定

まずはデフォルトではnginxのgzip圧縮機能は無効になっているので有効化しておく

-- /etc/nginx/nginx.conf に以下を記述
gzip on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

次にデフォルトのServerBlock(Apacheで言うところのVirtualHostみたいなもの)を無効化して景虎の設定に差し替える.

# cd /etc/nginx/conf.d/
# cp /home/kagetra/kagetra/deploy/nginx.site.example ./kagetra.conf
-- kagetra.conf の以下の行を変更
server unix:/home/kagetra/kagetra/deploy/sock/unicorn.sock
root /home/kagetra/kagetra/public

これで sudo systemctl start nginxすれば無事nginxが起動するはずである.ただしまだunicornを起動していないのでhttp://<VPSサーバ>/にアクセスしても 502 Bad Gateway エラーが出る.

unicornの設定

kagetraユーザに戻りunicornを起動する

# su - kagetra
$ ~/kagetra/scripts/unicorn_ctl.sh start

ただしこのままではnginxが ~/kagetra/public と ~/kagetra/deploy/sock にアクセスできないのでパーミッションの設定が必要になる.とりあえず/home/kagetraのgroupをnginxに変更してアクセスできるようにする

# chgrp nginx /home/kagetra
# chmod g+rx /home/kagetra

これで http://<VPSサーバ>/ にアクセスするとちゃんと景虎のログイン画面が表示されるはずである.以上でセットアップは完了.

TIPS

an upstream response is buffered to a temporary fileという警告が /var/log/nginx/error.log に出る場合は /etc/nginx/conf.d/kagetra.conf の server{} の中に以下を追加

proxy_buffers 8 64k;
proxy_buffer_size 64k;

フォルダ/ファイルのパーミッションに問題がないのにconnect() to unix:/home/kagetra/kagetra/deploy/sock/unicorn.sock failed (13: Permission denied)というエラーが /var/log/nginx/error.log に出る場合は nginxに対するSELinuxの制限を無効化

semanage permissive -a httpd_t
⚠️ **GitHub.com Fallback** ⚠️