heroku卒業!初心者が始めるさくらvps(CentOs)+apache+Passenger+postgresqlで作るrailsアプリのデプロイ(part1)[2016年6月]

執筆:2016年6月時点

経緯

今まで開発したRailsアプリは全てherokuにデプロイしていた。
それは、インフラ周りの知識にも乏しかったし、あまり環境構築に時間をかけられなかったから。
でもやっぱり自前のサーバーで動かしてみたいという知的好奇心と、もうちょっとコストを抑えたいという理由でheroku以外の道を模索していたところ、今の形に落ち着いた。
AWSも色々いじってみたけど、nginxとunicorn周りで詰まってしまった。勉強用に契約してからずっと放置していたさくらVPSを思い出し、さくらVPSで挑戦してみた。

目標

  • 特にこだわりはないけど、herokuでpostgresqlを使ってたので、今回さくらvpsでもpostgresqlを使いたい。
  • let’s encryptで無料のhttps使いたい。
  • Githubにプッシュしたrailsアプリをそのまま自動デプロイしたい
  • 次のために忘れないようメモっておきたい。

前提・環境

  • EC2とかRDSとかvpcとか、敷居が高くて使えない。(なんとなく高そう。。)
  • Rails4.2.6
  • Ruby2.3.1
  • javascriptそんなに使うわけでもないシンプルなrailsアプリ

ざっくりな手順

  1. さくらVPSに登録  ||||||||||今回やる||||||||||
  2. rootアカウントでひとまずログイン(日本語化、root以外のユーザーの作成)  ||||||||||今回やる||||||||||
  3. 簡単にセキュリティ対応  ||||||||||今回やる||||||||||
  4. rbenv(rubyやらrailsやらnodeやら)
  5. Postgresqlのインストール
  6. Passenger入れよう
  7. デプロイ関係
  8. アセット周りの調整
  9. herokuからのdatabaseの移行

1章 さくらVPSに登録

いきなりの割愛(すでに契約していたので。。)
以下のサイトが参考になりました。

さくらVPSの利用開始方法

さくらVPSに申し込んでみる

2章 rootアカウントでひとまずログイン(日本語化、root以外のユーザーの作成)

ひとまずログイン

ひとまず以下のコマンドをターミナルで入れて、さくらvpsからメールで送られてきたアカウント情報でサーバーにssh接続してみます。

$ ssh [email protected]
[[email protected]***.**.**.**'s password:

こんな感じでパスワードを求められたらパスワードを入力します。

アプリケーションを最新バージョンにする

無事ログインできたら、ひとまずサーバー内のアプリケーションを最新版にします。

$ yum update

途中で[yes/no]みたいに聞かれたら、yと返事します。

日本語化する

次に日本語化します。

$ vim /etc/sysconfig/i18n
# LANG="C"と描かれている部分をLANG="ja_JP.UTF-8"に変更
LANG="ja_JP.UTF-8"

vimに慣れていなかったらこちらを参考にすると捗ります。
iを押して挿入モードにして、上をコピペして、escキーを押して:wqを入力。

作業用ユーザーの作成と設定

セキュリティ的な関係でrootではログインできないようにし、代わりにroot以外の作業用のユーザーを作成し、今後作業をしていきたいと思います。ここでは適当にwebmaster(好きな名前)に設定します。
$ useradd webmaster

$ passwd   webmaster # パスワードの入力が求められるので、ここで入力。

「passwd: すべての認証トークンが正しく更新できました。」と表示されればユーザー登録とパスワード変更が完了。

$ usermod -G wheel webmaster
とすることで、ルートと同等の権限を得られるグループに追加します。

wheelグループに属するユーザにsudoコマンドの実行を許可する。

$ visudo
vi(エディタ)が立ち上がるので、
# %wheel ALL=(ALL) ALL
というところを探し、#を外します。。
ここもiを押し挿入モードにしてから、deleteし、escを押して:wqです。

以下のコマンドで、ユーザーの切り替えが可能です。

$ sudo su - webmaster

webmaster(作成したユーザー名)に切り替わればOKです。

3章 簡単にセキュリティ対応

一旦ローカルで作業するので、sshログイン中の場合は、別のターミナルのタブでlocalを開きます。

[~]$ cd .ssh
[.ssh]$ ssh-keygen -t rsa
(#公開鍵を作成)
-----------------------------
Enter file in which to save the key ():webmaster_key_rsa 
(#ここでファイルの名前を記述して、エンター)
Enter passphrase (empty for no passphrase): 
(#何もせずそのままエンター)
Enter same passphrase again: 
(#何もせずそのままエンター)
-----------------------------
[.ssh]$ ls
#「webmaster_key_rsa」と「webmaster_key_rsa.pub」が生成されたことを確認

localの ~/.ssh フォルダにwebmaster_key_rsa(秘密鍵)とwebmaster_key_rsa.pub(公開鍵)が作成される。

そして、公開鍵をauthorized_keysという名前に変えて転送。

[.ssh]cd ../
[~]$  scp  ~/.ssh/webmaster_key_rsa.pub [email protected]:~/.ssh/authorized_keys
(#鍵の中身をターミナル上に出力→ssh-rsa~~~~localまでをコピーしておく)

その後、サーバーの方のターミナルに戻り、.ssh内にauthorized_keysがあることを確認。

$ cd .ssh
$ ls

もし、authorized_keysが表示されていれば鍵認証でssh接続できるようになります。

ポート番号の変更、rootによるログイン禁止、パスワードでのログイン禁止

ポート番号はデフォルトで22になっているので、セキュリティを高めるために変更します。
また、rootによるログイン、パスワードでのログインも禁止にします。

下記コマンドをsudoで実行し、設定ファイルを編集します。


$ sudo vim /etc/ssh/sshd_config

#Port 22を10022に変更してみる
Port 10022

#PermitRootLogin yesをnoに変更する
PermitRootLogin no

#PasswordAuthentication yesをnoに変更する
PasswordAuthentication no

# 挿入モードで編集。その後escを押してから:wq。
# 変更したら、下記コマンドでsshの再起動。
$ sudo service sshd restart

ファイヤウォールの設定

iptablesファイルを作成し、デフォルトで10022番だけにオープンするように変更。


$ sudo vim  /etc/sysconfig/iptables

# 以下をコピペして保存。
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 61203 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

その後、iptablesを再起動
$ sudo /etc/rc.d/init.d/iptables restart

今回の振り返り

  1. さくらVPSに登録  ||||||||||今回やった||||||||||
  2. rootアカウントでひとまずログイン(日本語化、root以外のユーザーの作成)  ||||||||||今回やった||||||||||
  3. 簡単にセキュリティ対応  ||||||||||今回やった||||||||||
  4. rbenv(rubyやらrailsやらnodeやら) 〜〜〜次回〜〜〜
  5. Postgresqlのインストール 〜〜〜次回〜〜〜
  6. Passenger入れよう 〜〜〜次回〜〜〜
  7. デプロイ関係
  8. アセット周りの調整
  9. herokuからのdatabaseの移行

お読みいただきありがとうございました。

大変参考になったページ群

以下のページを引用させていただいています。

さくらインターネットのVPS設定マニュアル

さくらVPSの初期設定とCentOSによるWEBサーバー環境構築まとめ

さくらVPSのcentOS 6.7でrails環境を整える方法

(デプロイ編①)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで

RailsアプリをHeroku→さくらVPSに移行