さくらVPSでサーバー借りてCentOS 6をインストールして初期設定からRedmineを導入するまでメモ

# はじめに

僕はフロントエンドエンジニアでありJavaScript大好きReact大好きSPAゴリゴリだぜって感じの人間で、サーバー側に関しては個人でwebアプリケーションを作るときにさくらのVPS借りてぐぐりつつ簡単な設定をしてnginxでリバースプロキシやってNode.jsのAPIサーバーつなぐくらいしかしたことのないサーバー素人です。

そろそろ毎回ぐぐってなんとか解決みたいなことはやめたいなと思っていてそんなタイミングでサーバーにredmineを導入するというタスクがやってきたので、タスクをこなしつつちゃんと理解をしてサーバー側への苦手意識克服とかの意味もこめてメモに落とし込んでいこうと思います。

参考記事：
[CentOS 6.3 にRedmine をインストールしてみた](http://letsspeak.hatenablog.com/entry/2012/10/31/025819)
[RedmineをCentOS 6上で動かすーUnicornとNginx編](http://www.torutk.com/projects/swe/wiki/Redmine%E3%82%92CentOS_6%E4%B8%8A%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%83%BCUnicorn%E3%81%A8Nginx%E7%B7%A8)

# 環境

- CentOS 6 x86_64
- Ruby 2.3.0
- MariaDB 5.5
- Nginx 1.0.15
- Unicorn
- Redmine 3.2


自社で事前に借りてあったさくらVPSのメモリ1Gのものが放置されていたので、一度CentOSを再インストールして初期設定からやります。
OSインストール欄から「標準OSインストール」を選択します。標準OSを選択すると「CentOS 6 x86_64」がインストールされます。

そもそもCentOS 6の「x86_64」が何を意味しているのかがわからなくてバージョンが6であることしかわかっていない。
[ぐぐって](http://e-words.jp/w/AMD64.html)みたところ、「AMD64」のことを意味しているようで、 *x86命令を64ビット幅のデータやメモリアドレスに対応できるよう拡張した命令セット* ということらしい。結局よくわからないけれどintelの命令セットのアーキテクチャで、こういう種類があるよってくらいに覚えておこう。他に「i386」ってのがあるらしい。

CentOSのインストールは終わっていることを前提に以下の手順で進めていきます。
あとはドメイン側で事前にDNSの設定をしておく必要があります。

# 手順

- [サーバーの初期設定をする](#サーバーの初期設定をする)
- [セキュリティのあれこれをする](#セキュリティのあれこれをする)
- [redmineを入れるのに必要なものを揃える](#redmineを入れるのに必要なものを揃える)
- [データベースの準備](#データベースの準備)
- [nginxの準備](#nginxの準備)
- [遂に本体を入れる](#遂に本体を入れる)
- [Unicornを動かす](#Unicornを動かす)
- [接続してみる](#接続してみる)

# サーバーの初期設定をする

## SSHでサーバーに接続

何はともあれサーバーに入らないとはじまらないので接続してみます。
これ以降コマンドが出てきますが、エラーが出てきたらとりあえずコマンドの頭に`sudo`をつけた状態でもう一度挑戦しましょう。sudoはroot権限で実行するよっていう意味です。超強いって意味です。

```bash
ssh root@<接続先IPアドレス>
```

<接続先IPアドレス>のところはコントロールパネルであるとかさくらVPS契約時のメールで確認できるはず。
ここでパスワードが聞かれるのでこれもメールとかで見つけ出しましょう。

## とりあえずyumをアップデートする

yumというのはパッケージを管理するツールなのですが、初期状態だとバージョンが古い可能性があるのでとりあえずupdateをしておきます。

```bash
yum update
```

## 作業用ユーザーを作る

rootで作業するのではなくとりあえず作業用のユーザーをつくるってのが慣例のようなので作ります。

```bash
useradd [ユーザー名]
passwd [ユーザー名]
usermod -G wheel [ユーザー名]
```

まずはユーザーを追加して、そのユーザーにパスワードを付与します。2回パスワードを聞かれるので同じものを入れましょう。
そして作成したユーザーでsudoが使えるように、ユーザーをwheelグループに入れます。

この状態だとまだsudoは使えないので、wheelグループがsudoを使えるようにvisudoを変更します。

```bash
visudo
```

このコメントを叩くとvimが立ち上がるので、`/`で「wheel」を検索しましょう。
そうすると以下の2行が見つかるので、下の行のコメントアウトをはずします。

```
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
```

これでwheelグループがsudoを使えるようになりました。
ここで一度サーバーから抜けて、新しく作成したユーザーでSSH接続できるか試してみましょう。

```bash
exit // サーバーから抜ける
ssh [作成したユーザー名]＠<接続先IPアドレス>
```

これでまたパスワードがきかれるので設定したパスワードを入れましょう。
無事に接続できたらおっけーです。

# セキュリティのあれこれをする

## 鍵認証方式にする

パスワード認証方式のログインだとセキュリティ的に弱いので鍵認証方式にします。
自分のPCの公開鍵をサーバーに渡して自分のPCの秘密鍵とのペアで認証をする方式です。
すでに公開鍵と秘密鍵が自分のPC上に存在する前提で進めます。

公開鍵・秘密鍵の生成ができていない場合は以下を見たら良いと思います。
[Git サーバー - SSH 公開鍵の作成](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-SSH-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90)

まずはサーバー側に公開鍵の保存場所を作って、パーミッションを変更しておきます。
作業用ユーザーでログインしている状態で以下のコマンドを叩きます。

```bash
mkdir ~/.ssh
chmod 755 ~/.ssh
```

次は自分のPCからサーバーに公開鍵を転送します。
ターミナルをもう一つ開いて以下のコマンドを叩きます。

```bash
scp ~/.ssh/id_rsa.pub [作成したユーザー名]＠<接続先IPアドレス>:~/.ssh/authorized_keys
```

ここまでで鍵認証の設定は完了です。一度サーバーから抜けてもう一度作ったユーザーでログインしてみてください。
パスワードを聞かれてしまった場合は、authorized_keysが機能していないのですが、こういうときは大体パーミッションが問題のときです。

詳しくはログを見ればよくわかります。以下を叩くと接続のログを見ることができます。

```bash
sudo cat /var/log/secure
```

*Authentication refused: bad ownership or modes for directory*って感じの文章があったらそれはパーミッションエラーなので、`/home/[ユーザー名]`か`/home/[ユーザー名]/.ssh`か`/home/[ユーザー名]/.ssh/authorized_keys`のパーミッションを変更する必要があります。
詳しくは以下を参照で。

[SSHが鍵認証されないとき、パーミッションを疑え。](http://takuya-1st.hatenablog.jp/entry/20090216/1234742055)

パスワードを聞かれずにログインできたらおっけーです。

## SSHの設定を変更する

ここからSSHの設定を編集して鍵認証以外の方法でログインできないようにして、鍵認証で使うPortをデフォルトの22から変更します。
ついでにrootでのログインも禁止にします。どれもセキュリティ向上のために必須だと思われます。
まずは以下のコマンドを叩いてファイルを編集します。

```bash
sudo vi /etc/ssh/sshd_config
```

以下の該当箇所を検索して編集して保存してください。

```
#Port 22 // コメントアウトを外して22を好きな番号(1024〜65535)に変更(デフォルトのポートから変える)
#PermitRootLogin yes // コメントアウトを外してyesをnoに変更(rootでのログイン禁止)
#RSAAuthentication yes // コメントアウトを外す(鍵認証を有効化)
#PubkeyAuthentication yes //コメントアウトを外す(公開鍵での認証を有効化)
#AuthorizedKeysFile      .ssh/authorized_keys // コメントアウトを外す(公開鍵のパスを設定)
PasswordAuthentication yes // yesをnoに変更(パスワード認証の禁止)
```

編集して保存したらSSHの設定を反映させます。

```bash
sudo /etc/init.d/sshd restart
```

エラーが出なかったらおっけーです。
再び`exit`でサーバーを抜けて再度ログインしますが、今回からはポートを指定する必要があります。

```bash
ssh [作成したユーザー名]＠<接続先IPアドレス> -p [指定したポート番号]
```

これでログインできたらSSHの設定の変更は終了です。

## ファイアーウォールの設定をする

最後にファイアーウォールの設定をしてセキュリティを高めます。
以下のコマンドを叩いてファイルを作成します。

```bash
sudo vi /etc/sysconfig/iptables
```

そして以下の内容を記述してください。

```
*filter
:INPUT   DROP   [0:0]
:FORWARD DROP   [0:0]
:OUTPUT  ACCEPT [0:0]
:SERVICES -     [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A SERVICES -p tcp --dport [指定したPort番号] -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT
COMMIT
```

[指定したPort番号]のところは書き換えてください。
これは[ドットインストール](http://dotinstall.com/lessons/basic_sakura_vps/8010)さんの設定をそのまんま使わせてもらってますが、基本的に通信を遮断するけれど指定したいくつかのポートは開けとくっていう設定のようです。

保存したら設定を反映させます。

```bash
sudo service iptables start
```

okと出てきたらおっけーな感じです。セキュリティはここまで。

# redmineを入れるのに必要なものを揃える

redmineを動かすために必要なものを入れていきます。

## Rubyのインストール

Rubyのバージョン管理ツールであるrbenvを使ってRubyを入れます。

gitが入ってなかったらインストール

```bash
sudo yum -y install git
```

rbenvのインストール

```bash
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

ruby-buildのインストール

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

そしてopensslをインストールしていないとrubyインストール時にエラーになってしまうそうなので入れます。

```bash
sudo yum -y install openssl-devel
```

さらにreadlineがないと`rails c`や`padrino c`でエラーになるそうなのでこれもまた入れます。

```bash
sudo yum -y install readline-devel
```

パスを通さないといけないです。

```bash
# PATH に追加
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
exec $SHELL -l
```

Rubyのインストール

```bash
rbenv install -v 2.3.0
```

再読み込みしてインストールされているRubyのバージョン一覧を表示

```bash
rbenv rehash
rbenv versions

2.3.0
```

さっきインストールした最新版に設定して確認

```bash
rbenv global 2.3.0
ruby -v

ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
```

Rubyのインストールはこれでおっけーです。

## 必要なパッケージのインストール

```bash
sudo yum groupinstall "Development Tools"
sudo yum install zlib-devel curl-devel libyaml-devel
sudo yum install ImageMagick ImageMagick-devel
```

これで必要なものがそろったっぽい。
一応それぞれのパッケージの用途を調べてみた。

- **zlib-devel** データの圧縮および伸張を行う
- **curl-debel** HTTPアクセスをしてコンテンツを取得できる
- **libyaml-devel** C言語でYAMLファイルを簡単に扱うようにする
- **ImageMagick** 画像を操作したり表示したりする
- **ImageMagick-devel** ImageMagickとセット

# データベースの準備

## MariaDBをインストールする

まずは以下のURLにいきます。

[https://downloads.mariadb.org/mariadb/repositories/](https://downloads.mariadb.org/mariadb/repositories/)

ここで使っている環境を選択していくとコピペ用の文字列を生成してくれます。
今回は「1. Choose a Distro」で「CentOS」を選んで「2. Choose a Release」で「CentOS 6 (64bit)」を選んで「3. Choose a Version」で「5.5」を選びます。そうすると以下の内容が生成されます。

```
# MariaDB 5.5 CentOS repository list - created 2014-06-26 11:57 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

ファイルを新たに作成してこの内容を記述して保存します。

```bash
sudo vi /etc/yum.repos.d/MariaDB.repo
```

それができたら、yumでMariaDBをインストールします。

```bash
sudo yum install MariaDB-server MariaDB-devel
```

インストールができたらちょこっと設定をします。
テーブルの言語がlatin1にならないようにutf8設定を追加します。

```bash
sudo vi /etc/my.cnf.d/server.cnf
```

コマンド叩いてファイルを開いたら以下を追加します。

```
[mysqld]
character-set-server = utf8
```

こちらも同じように。

```bash
sudo vi /etc/my.cnf.d/mysql-clients.cnf
```

コマンド叩いてファイルを開いたら以下を追加します。

```
[mysql]
default-character-set = utf8
show-warnings
```

ここまでできたらMariaDBを起動してみます。
MariaDBですがmysqlという名前になってます。

```bash
sudo service mysql start

Starting MySQL.. SUCCESS!
```

とりあえず接続してみます。
最初はrootユーザーでいけるかと思います。パスワードは設定されていない。

```bash
mysql -uroot

MariaDB [(none)]>
```

rootユーザーにパスワードを付与します。

```bash
MariaDB [(none)]> SET PASSWORD FOR root@localhost=PASSWORD('[パスワード]');

Query OK, 0 rows affected (0.01 sec)
```

パスワードが設定されたかどうかは以下のコマンドで確認することができます。

```bash
MariaDB [(none)]> SELECT user,host,password FROM mysql.user;
```

表示されるパスワードは暗号化されたあとなので入力したものとは違いますが、パスワードが設定されたことがわかるかと思います。
表示されたものを見るとrootユーザーが4つあることに気づくと思いますがとりあえずそれら全部にパスワードを付与したほうが良いっぽいです。
ここらへんあまり詳しくわかっていない状態…。

```bash
MariaDB [(none)]> UPDATE mysql.user SET password = PASSWORD('[パスワード]') WHERE user = 'root';

Query OK, 3 rows affected (0.00 sec)
Rows matched: 4  Changed: 3  Warnings: 0

MariaDB [(none)]> FLUSH PRIVILEGES;
```

`FLUSH PRIVILEGES`は権限を反映させるために必要なようです。
ここまでやったらMariaDBの設定はおっけーです。

# nginxの準備

## nginxのインストール

以下のコマンドを叩いてnginxをインストールします。

```bash
sudo yum install nginx
```

インストールができたらnginxを起動します。

```bash
sudo service nginx start
sudo chkconfig nginx on
```

## プロキシの設定をする

以下のコマンドを叩いてnginx.confを編集します。

```bash
sudo vi /etc/nginx/nginx.conf
```

以下の内容を`http {`の直下に記述します。

```
upstream redmine {
  server 127.0.0.1:5001;
}
```

のちのちredmineを5001番ポートで動かすのでそこに繋ぐための設定です。

## バーチャルホストの設定をする

以下のコマンドを叩いてvirtual.conf を編集します。

```bash
sudo vi /etc/nginx/conf.d/virtual.conf
```

以下の内容を記述します。server_nameを自分のドメインに変更してください。

```
server {
  listen 80;
  server_name redmine.[自分のドメイン];

  access_log /var/log/nginx_redmine_access.log;
  error_log /var/log/nginx_redmine_error.log;

  proxy_connect_timeout 60;
  proxy_read_timeout    60;
  proxy_send_timeout    60;

  auth_basic "Secret Area";
  auth_basic_user_file "/var/www/redmine/.htpasswd";

  location / {

    root /var/www/redmine/public;
    if (-f $request_filename){
      break;
    }

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://redmine;
    proxy_redirect off;
  }
}
```

Basic認証用のファイルを作成します。

```bash
printf "[ユーザー名]:$(openssl passwd -1 [パスワード])\n" >> .htpasswd
```

設定が終わったので再起動をします。

```
service nginx restart
```

# 遂に本体を入れる

## redmineをダウンロードする

ファイルを置きたい場所に移動してからgitでダウンロードします。

```bash
cd /var/www
sudo git clone https://github.com/redmine/redmine.git
cd redmine
sudo git checkout 3.2-stable 
```

redmineリポジトリが入りました。バージョンは現在の安定版の最新にしました。

## redmineのデータベース設定をする

設定ファイルを作成します。

```bash
sudo vi /var/www/redmine/config/database.yml
```

以下の内容を記述して保存します。
ユーザー名はredmineで、パスワードは好きにやっちゃってください。あとでDB側でユーザーとパスワードの設定をします。

```
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "[パスワード]"
  encoding: utf8
```

データベースを作成します。
MariaDBに接続して作成します。

```bash
mysql -uroot -p

MariaDB [(none)]> CREATE DATABASE redmine;
```

ユーザーとパスワードを設定します。

```bash
MariaDB [(none)]> GRANT ALL ON redmine.* TO 'redmine'@'localhost' IDENTIFIED BY '[パスワード]' WITH GRANT OPTION;

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit;
```

## メール設定をする

以下のコマンドでファイルを作成します。

```bash
sudo vi /var/www/redmine/config/configuration.yml
```

以下の内容を記述して保存します。

```
# Simple SMTP server at localhost

production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "localhost" 
      port: 25
```

## Rubyモジュール群のインストール

以下のコマンドでbundlerをインストールします。

```bash
sudo gem install bundler --no-rdoc --no-ri
```

これでbundlerを使用できるようになったので、Redmineで必要になるRubyパッケージ群をインストールします。
パッケージはredmineディレクトリの中に入れます。

```bash
sudo bundle install --path vendor/bundler --without development test
```

## Redmineの初期化

セッションデータを格納するクッキーを暗号化する鍵をランダムに生成します。改ざん防止のためのよう。

```bash
sudo bundle exec rake generate_secret_token
```

Redmineが使用するデータベースにスキーマを構築します。

```bash
sudo bundle exec rake db:migrate RAILS_ENV=production
sudo bundle exec rake redmine:load_default_data RAILS_ENV=production
```

これでDBにテーブルが作られました。

# Unicornを動かす

## Unicornのインストール

以下のコマンドを叩きます。

```bash
echo 'gem "unicorn"' > Gemfile.local
bundle install
```

## Unicornの設定

ここらへんの内容に関して以下のページのものをそのまま使わせていただいております。
ありがとうございます。

[さくらVPSで nginx + MySQL + Unicorn + Redmine の運用](http://t.nzk.me/entry/2012/12/28/144730)

以下のコマンドでファイルを作成します。

```bash
sudo vi /var/www/redmine/config/unicorn.rb
```

記述する内容は以下になります。詳しい説明は先ほどのリンク先でお願いします。

```
worker_processes 2
#working_directory /var/www/redmine

listen File.expand_path("tmp/unicorn.sock", ENV['RAILS_ROOT'])
pid File.expand_path("tmp/unicorn.pid", ENV['RAILS_ROOT'])

timeout 60

preload_app true # ダウンタイムをなくす

stdout_path File.expand_path("log/unicorn.stdout.log", ENV['RAILS_ROOT'])
stderr_path File.expand_path("log/unicorn.stderr.log", ENV['RAILS_ROOT'])

GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

  old_pid = "#{server.config[:pid]}.oldbin"
    if old_pid != server.pid
      begin
        sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
        Process.kill(sig, File.read(old_pid).to_i)
      rescue Errno::ENOENT, Errno::ESRCH
      end
    end

    sleep 1
  end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
```

ここまでできたら、以下のコマンドを叩いてRedmineを起動します。

```bash
bundle exec unicorn_rails -c config/unicorn.rb -E production -D -p 5001
```

# 接続してみる

あとはredmine.[自分のドメイン]にアクセスしたらbasic認証の画面になるので、そこを通ってredmineが表示されたら完了です。
ここで500エラーが出てくる場合は多分パーミッションの問題だと思われます。

以上で完成です。

redmineの初期設定はここが良い感じぽいです。

[Redmineを使い始めるための初期設定](http://redmine.jp/tech_note/first-step/admin/)

# まとめ

ぐぐりまくりながらやってみたら随分時間かかってしまいましたができました。
そこまで長時間はまるところもなくできたので良かったです。世の中には素晴らしい記事がすでにたくさん存在してました。感謝ですね。
サーバーへの苦手意識が克服できたかどうかはわかりませんが一応やる前よりは知識がついたので良しとします。おわり