【仮想環境】Ubuntu + Rails + PostgreSQL＠ニフティクラウド　備忘録

#概要
タイトル通りの環境を構築するまでの備忘録です。
Railsアプリケーション + WEB_API構築のための本番環境用VPC設定までの
ニフティクラウドに本番環境を構築して、Railsアプリを起動できるようにしたいと思います。
2015.06.02時点　Ubuntuインストールまで
2015.06.04時点　Ubuntuインストールまでを再確認して修正
2015.06.05時点　Rails設定まで追記
2015.06.06時点　PostgreSQLの設定まで追記
2015.06.08 とりあえずSSL設定まで終了。ここまで。

#手順
##1.ニフティクラウドに仮想環境を構築する。
今回はトライアルカードを利用してます。
普通に契約した場合とは手順が違うはずなのであまり気にせずに行きます。

###・コントロールパネルを新しい画面に変更する
現時点（2015/06/01）だと古い画面なので、ヘッダあたりのコントロールパネル切り替えをクリックする
特に必要ないが、新し物好きなので。
⇨と思ったけどいろいろ使いづらくなってるので元に戻しました。

###・サーバー⇨サーバー作成を選択
気になったところだと
○サーバー名は英数15文字。アンダーバーとかハイフンも使えないので、名前のつけ方を考える
　一台だけのつもりなら適当でも問題無し

○SSHキーはちゃんとローカルに保存する。接続方法については後述

○ファイアーウォールはあとからでもつけられるので後からしてもいいと思う。
　間違ってキャンセルとかすると手順が全部キャンセルされるし。

○プランは変えられるので、とりあえず最小プランで動作を確認してみる。
　⇨と思ったけど、動きが遅いのでトライアルなら多少いいスペックで構築したあと最小に戻したほうが効率的かも。

###・SSHの接続方法について
Macの場合は、ホームディレクトリ直下に.sshってフォルダを作ってその中に以下のようなファイルを配置
ダウンロードしたキーも同じ場所に置いとけば

```text:config
Host hoge
	HostName 'グローバルIP'
	Port 22
	User root
	IdentityFile ~/.ssh/xxxxxxxx.pem
```

ってしとけば、ターミナルで
$ ssh hoge
でつながると思います。
パスワード入力はSSHキーを作成するときに打ったパスワード。
試してないけど.sshフォルダじゃなくてsshフォルダでも動く？？

@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
ってエラーが出た場合は
chmod 0600 キーファイルのパス

.から始まるのは不可視項目なので、GUIで操作したいなら不可視項目を有効にするコマンドを叩く必要がある。
僕は[xtraFinder](http://www.softantenna.com/wp/mac/xtra-finder/)を使ってて、
xtraFinderの設定で不可視項目を表示ってのにチェックを入れれば、Finderの表示メニューに不可視項目を表示のメニューが追加される。チェックをつければその時だけ不可視項目が表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/bded0270-d873-300c-ef4e-7125543fbf26.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/69919/2cb376eb-116b-a4c9-a2cf-91d8de3da1d4.png)

###・FWの設定について
僕は今の所
IN 22 SSH
IN 5901 VNC
IN 80 HTTP
IN 443 HTTPS
OUT ANY
ってルールを設定してます
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/8f9e63e0-08e0-c348-9a8a-ed15a5249bba.png)
特にIPを制限しないのであれば、接続種別以降は規定値でいいと思います。
基本的に１台のサーバのみで運用ならIPによるフィルタリングは必要ないんじゃないかと。

※WEBrickで動作確認をするなら以下のルールを設定する。
IN 3000 Rails

##2.Ununtuの初期設定
###・rootのパスワードを設定する
`$ sudo passwd root`

###・とりあえず最初にいろいろいじりたいので、GUIを有効にする
> ローカルのSSH接続から可能です。
> `$ ssh hoge`
> `$ sudo aptitude update`
> `$ sudo tasksel`
> Ubuntu desktopの場所でスペースキー
> ※マークがつくので、エンターすれば処理が進む。

> しばらく待てば有効になる。

> http://www.server-world.info/query?os=Ubuntu_14.04&p=x

`$ sudo apt-get install --no-install-recommends ubuntu-desktop`
このコマンドでGUIが有効になるみたいです。
こっちの方が簡単でイイネ！

##3.コンソールログインをする
WindowsPCからのみ対応ですが管理画面からコンソールログインできるので、確認。
IEはバージョンが新しいと無理なので、FireFoxをインストール。プラグインもインストールする必要あり。
インストール後にもう一回開けばプラグインを有効にすることが可能。
その後もう一回開けば許可するかのダイアログが出てくるのでAllow。


##4.Macからのリモートデスクトップ接続を可能にする
<hr>
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆↓以下の操作はしなくても接続できるようでした。☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

###・WindowsからコンソールでGUIでデスクトップ共有設定を変更
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/990ea416-7adf-c4cf-6ee4-735f12a49a35.png)
DesktopSharingを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/132ffe40-584a-9b21-222c-74cbdcb5761f.png)

デスクトップ共有設定の変更のコマンド操作方法がわからなかった。
WindowsPCがない場合はどうしよう。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
<hr>

###・vncserverのインストール、設定
`$ sudo apt-get install vnc4server`

起動時にGUIが立ち上がるようにする
`$ vncserver` で一回起動すればフォルダが出来上がる。
`$ cd .vnc`
`$ rm xstartup`
`$ ln -s /etc/X11/Xsession xstartup`

起動時にvncserverが立ち上がるようにする
`$ vi /etc/rc.local`
...
 
**su -l root -c "vncserver"**
exit 0

これでFinder画面で⌘+Kを入力した画面にip:ポートを指定すればログイン可能。
viは使ったことなければいくらでも使い方が出てきますが
起動後「i」を入力でINSERTモードに変更
編集が終わったら「ESC」でコマンドモードに
「:w」で上書き保存
「ZZ」で終了


###・注意
ニフティクラウドのコンソールを開いてると、エラーになるかも？
サーバを再起動して、コンソールを開かないようにしたほうがいい。

iptables(OSのFW)が有効になってると繋がらないかも。⇨現時点では繋がらない
個人的には仮想FWで全部ルーティングはいいのではないかという考え。
どうせ同じルールを設定するでしょう。

一応設定確認方法として
1.GUIのインストール
`$ sudo apt-get install ufw`

2.アプリが入ってくるのでそこで設定確認
or
`$ sudo ufw status`

activeになってたら
`$ sudo ufw disable`

###・標準のVNCクライアントではサーバとのクリップボード共有ができない？
できなかったので、有料アプリを検討しようかと思います。
なくても問題ないんですが、いちいち面倒なので。
Mac-Ubuntu間のファイル転送、クリップボード共有があれば教えてください・・・・

##5.Railsをインストールする
###・Rubyインストール
前準備
`& sudo apt-get install build-essential git curl zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev sqlite3 libsqlite3-dev nodejs  `
※不要なものがあるかも。抜くとRubyがインストールできないものもあったので、調査はいつか。

rbenv準備
`$ git clone git://github.com/sstephenson/rbenv.git .rbenv`
`$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc`
`$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc`
`$ exec $SHELL`

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

Rubyインストール
開発環境のRubyのバージョンに合わせればいいと思う。
数分Installにかかるかも。
`$ rbenv install -l`
`$ rbenv install x.x.x`
`$ rbenv rehash`
`$ rbenv global x.x.x`

gemオプションの指定
`$ echo "install: --no-rdoc --no-ri" >> ~/.gemrc`
`$ echo "update: --no-rdoc --no-ri" >> ~/.gemrc`

`$ gem update`
`$ gem i bundler`
`$ gem i rails`
開発環境のRailsのバージョンに合わせればいいと思う。
数分Installにかかるかも。

###・起動のテストをする
`$ mkdir /rails`
`$ cd /rails`
`$ rails new workspace`
`$ rails s -b x.x.x.x`
グローバルIPを指定
ない場合はrails sのみでローカルで起動する
http://x.x.x.x:3000でアクセス
おなじみの画面が出て来ればアクセス確認完了。
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/ad424d7f-84f0-39a6-423c-6b2a6fe7f50d.png)
アクセスできなくてコンソールにログも出ないようならファイアーウォールの設定が間違ってるかも。

##6.本番プロジェクトを起動（PosggreSQL）
###・PostgreSQLのインストール設定
`& sudo apt-get install postgresql`
`$ sudo apt-get install libpq-dev`
PostgreSQLのパスワード、データベース作成
`$ sudo sudo -u postgres psql`
`$ \password`
パスワードは自分がconfig/database.ymlに設定したもの
`$ create database "xxxx";`
データベース名は自分が設定したもの
大文字小文字を区別したい場合は"で囲む。

###・サーバにプロジェクトデータを転送する。
本当は公開サーバでgitサーバを構築してにプロジェクトをリモートリポジトリに登録したいんですが
１台環境を作るだけならコピーするだけで十分な気がします。
僕はrailsフォルダ配下にプロジェクトを格納

`$ scp -i ~/.ssh/maruno_private.pem /Users/xxx/Desktop/projectfile.tar.gz root@x.x.x.x:/rails`
`$ tar xzvf /rails/projectfile.tar.gz -C /rails`
`$ rm /rails/authtest.tar.gz`


###・本番プロジェクトを起動
`$ cd /rails/projectfolder`
`$ bundle ins`
`$ rake db:migrate`

db:migrateがちゃんと動けばpostgresqlの設定は問題無いと思う。

`$ rails s -b x.x.x.x`

##7.PostgreSQLにGUIでアクセス
いろいろデータをいじる時はGUIでアクセスできると楽ですよね。
GUI操作についてはSQLServerのManagementStudioとかすごい楽でした。
Windowsだといいツールがあったんですが、とりあえずPGAdminを使って接続してみます。

###・注意
以下の手順はサーバーの5432ポートをどこからでもアクセスできるようします。
準備の時以外は閉じるか、ちゃんと指定のIPからのみListenするようにしましょう。
ポートが空いてたら攻撃されますしね！

###・pgadminをインストール
`$ sudo service postgresql stop`
サーバのpostgresql.confを編集
入れたバージョンのフォルダになってると思うので、Tabでフォルダ確認しながらカレントフォルダを切り替えて動かしたほうがいいかも。
`$ vi /etc/postgresql/9.1/maiin/postgresql.conf`
`#listen_addresses = 'localhost'`を
`listen_adress = '*'`

`$ vi /etc/postgresql/9.1/maiin/pg_hba.conf`
`host all all 127.0.0.1/32 md5`の下に
`host all all 0.0.0.0/0 md5`追記

confを書き換えたらリスタート
`$ sudo service postgresql start`

netstat -ant　でlisten中のポートを確認すると5432がガン開きしてます。
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/e004a4cf-e7f0-443e-0db6-5d91fd7354a1.png)
隠すとこ間違えた。ipv6のとこだけど、まぁv4と設定分けてるわけじゃないしいっか。

###・接続設定
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/7c746d4e-7792-5670-b5b5-d59c0c2fa1ac.png)

##8.Apacheで起動
`$ gem install passenger`
`$ sudo apt-get install apache2-mpm-worker apache2-threaded-dev libapr1-dev  libaprutil1-dev libcurl4-openssl-dev`
`$ passenger-install-apache2-module`

以下の表示が出てくるので、LoadModule以下をコピーする

Please edit your Apache configuration file, and add these lines:
```text:httpd.conf
LoadModule passenger_module /root/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.9/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /root/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.9
     PassengerDefaultRuby /root/.rbenv/versions/2.2.2/bin/ruby
   </IfModule>
```
上でコピーしたものを末尾に貼り付ける。また、ホストの設定を追加

```text:httpd.conf
<VirtualHost *:80>
  # ServerName www.yourhost.com
  DocumentRoot /rails/workspace/public
  RailsEnv development
  <Directory /rails/workspace/public>
    AllowOverride all
    Options -MultiViews
  </Directory>
</VirtualHost>
```
※僕の環境ではhttpd.confは空でした。
　どこに書いてもいいってことなんですかね。
`$ vi /etc/apache2/apache2.conf`

そのまま起動したら権限エラーが発生したので権限の設定を変更
`$ chmod 751 /root`
`$ chmod 755 /root/.rbenv`

#以降近日追記予定
##9.SSL対応
今回は不特定多数に公開するアプリを作成するのではなくて、
特定多数に公開するアプリを作成します。
WEB_APIとしてアクセスするときはブラウザでアクセスする場合と違い
おそらく不正な証明書での警告は出ないとおもいます。
なので今回はオレオレ証明書を使いたいと思います。

選択肢として一番簡単な方法ですね。
・オレオレ証明書
・無料、安価なSSL
・一番信頼性の高いSSL

というわけでここの手順に従って設定しました。
https://kakikake2.wordpress.com/2012/05/13/ubuntu-12-04-server-apache-ssl/

###・SSLを有効化
`$ sudo a2enmod ssl`

###・証明書を作成します。
`$ sudo mkdir /etc/apache2/ssl/`
`$ sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/cert-file.crt`
以下の画面が表示されるので、localhostを消してサーバのIPを入力する
![image](https://qiita-image-store.s3.amazonaws.com/0/69919/96dbad9e-43f3-fd05-f920-f4e8efede859.png)

###・設定ファイルをコピーして展開
`$ sudo cp -p /usr/share/doc/apache2.2-common/examples/apache2/extra/httpd-ssl.conf.gz /etc/apache2/sites-available/`
`$ sudo gunzip /etc/apache2/sites-available/httpd-ssl.conf.gz`
 
###・サーバの公開フォルダを設定
`$ sudo vi /etc/apache2/sites-available/httpd-ssl.conf`
`#Listen 443`
<VirtualHost _default_:443>
DocumentRoow "/rails/workspace/public"
ServerName xxx.xxx.xxx.xxx:443
ServerAdmin daiku@mail.co.jp
SSLCertificateFile /etc/apache2/ssl/cert-file.crt
SSLCertificateKeyFile /etc/apache2/ssl/cert-file.crt

###・設定ファイルの有効化
`$ sudo a2ensite httpd-ssl.conf`
`$ sudo /etc/init.d/apache2 restart`


・本番モードで動作させるために
apacheの設定で強制的に開発モードで起動していましたが、SSLついでに本番モードに変更
RailsEnv development
を削除します。
sslの
config/secrets.ymlの
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
を
  secret_key_base: xxxxxxxxxxxxxxxxxxx
と書き換えました。
xxxの部分は
`$ rake secret`

また、ユーザ認証用のGemのDeviseがエラー。
config/initializers/devise.rb
の7行目あたりでコメントアウトされていると思われるようにkeyを登録
config.secret_key = 'xxxxxxxxxxxxxxx'

あとはdbをmigrate
`$ rake db:migrate RAILS_ENV=production`
`$ rake assets:precompile RAILS_ENV=production`



##参考Link
Railsインストール関連
http://qiita.com/saito400/items/c7e83db54f2fdc9d145a
http://www.d-wood.com/blog/2013/09/25_4699.html
http://www.oiax.jp/rails3book/setup_postgresql.html
scpコマンド　http://webkaru.net/linux/scp-command/

Apache設定関連
http://www.d-wood.com/blog/2013/09/27_4725.html
http://redmine.jp/tech_note/apache-passenger/
http://blog.sion-cojp.com/rails_passenger/

SSL・production関連
http://smokycat.info/ubuntu/440
https://kakikake2.wordpress.com/2012/05/13/ubuntu-12-04-server-apache-ssl/
http://blog.scratchpad.jp/ssl-self-certification/
http://www.workabroad.jp/tech/1116