VagrantのUbuntu14.04でdokkuを使う

# VagrantのUbuntu14.04でdokkuを使う
最近dokkuにはまっているのでせっかくなのでvagrantで使えるようにしました。
結論から言うとsshの設定にハマりましたが無事使えるようになりましたのでその手順です。

このページは以下の項目があります

- Vagrantの設定
- dokkuのインストール
- vagrant内のdokkuにsshで接続する手順
- まとめ

## Vagrant
Vagrantとはざっくり言うと仮想環境を簡単に使えるようにするツールです。
コマンド一つで仮想環境を簡単かつスピーディーに作成することができます。
Vagrantを利用するためにはまずOSのイメージを取得しておく必要があります。
[このサイト](http://www.vagrantbox.es)にOSのイメージがありますのでUbuntu14.04を以下のコマンドで入手しておきます。

```bash
$ vagrant box add base https://github.com/kraksoft/vagrant-box-ubuntu/releases/download/14.04/ubuntu-14.04-amd64.box
```

OSの入手が完了したらどこか適当なディレクトリにVagrantファイルを作成します。今回はホームディレクトリ直下にvagrant/ubuntuというフォルダを作成しました。

```bash
$ mkdir -p ~/vagrant/ubuntu 
$ cd ~/vagrant/ubuntu 
$ vagrant init
```

上記の「vagrant init」のコマンドを実行することによりubuntuフォルダ内に「Vagrantfile」が作成されます。
仮想環境の起動の前にVagrantfileを少し修正します。テキストエディタでVagrantfileを開き29行目あたりにある「#config.vm.network "private_network...」のコメントアウトを外します。

```ruby
 # config.vm.network "private_network", ip: "192.168.33.10"
```
↓

```ruby
  config.vm.network "private_network", ip: "192.168.33.10"
```

修正が済んだら以下のコマンドでvagrantを起動させます。

```bash
$ vagrant up
```

起動が済んだら以下のコマンドでsshでアクセスできるようにしておきます。

```bash
$ vagrant ssh-config >> ~/.ssh/config
```

上記のコマンドを打つことでssh defaultでvagrantにアクセスできるようになります。以上で、vagrantの準備は完了です。


## dokkuのインストール
vagrantの準備が済んだらdokkuのインストールに移ります。まずは以下のコマンドで仮想環境に接続します。

```shell-session
$ ssh default
```
上記のコマンドで仮想環境にsshで接続したら次はdokkuのインストールになります。ここのとこは私の別投稿の手順と同じです。
[GMOクラウドVPS+Ubuntu14.04にdokkuをインストールしてみた_2016/02/13](http://qiita.com/eskey_mo/items/b476691d0d5992ed2839)

```shell-session
$ cd /tmp
$ wget https://raw.githubusercontent.com/dokku/dokku/v0.4.13/bootstrap.sh
$ sudo DOKKU_TAG=v0.4.13 bash bootstrap.sh
```

上記のコマンドが済んだら仮想環境内にdokkuユーザーが作成されます。このタイミングであれば、ブラウザから「192.168.33.10」にアクセスすると以下の画面が表示されます。

Hostnameは「192.168.33.10.xip.io」に書き換えます。※xip.ioは外部のDNSサービスでxxx.xxx.xxx.xxx.xip.ioと行ったフォーマットで記述すると「xxx.xxx.xxx.xxx」のIPアドレスに置き換えてくれるサービスです。これによりアプリデプロイ後に「アプリ名.192.168.33.10.xip.io」でアプリにアクセスできるようになります。

上記の設定だけだと後でアプリデプロイを以下のエラーが出る可能性があります。私はここではまってしまってました。

```shell-session
Permission denied (publickey,password).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

上記のエラーを回避するために公開鍵をdokkuユーザーに対しても設定します。そのために以下のコマンドを入力します。

```shell-session
$ cat ~/.ssh/authorized_keys | sudo sshcommand acl-add dokku vagrant
```

上記のコマンドを入力することでvagrantユーザーに登録されている公開鍵をdokkuユーザーにも登録します。これによりのちのgit push時にエラーが出ることもなくなります。


## vagrant内のdokkuにsshで接続する手順
仮想環境にdokkuのインストールができたら次はsshの設定をします。そのために一旦仮想環境から抜けます。

```shell-session
$ exit
```
そしたら次に.ssh/configを編集し仮想環境内のdokkuにアクセスできるようにします。先ほど「~/.ssh/config」ファイルの一番最後に先ほど「vagrant ssh-config」で追加した設定(HOST名defaultの奴)があるのでそこのUserをvagrantからdokkuに変更します。修正が済んだ後、「ssh default」でdokkuのコマンド一覧が出てきたら成功です。


```shell-session
$ ssh default
Usage: dokku [--quiet|--trace|--rm-container|--rm|--force] COMMAND <app> [command-specific-options]

Options:
    apps:create <app>                                                                            Create a new app
    apps:destroy <app>                                                                           Permanently destroy an app
    apps                                                                                         List your apps
    apps:rename <old-app> <new-app>                                                              Rename an app
    backup:export [file]                                                                         Export dokku configuration files
    backup:import [file]                                                                         Import dokku configuration files
    certs:add <app> CRT KEY                                                                      Add an ssl endpoint to an app. Can also import from a tarball on stdin
    certs:chain CRT [CRT ...]                                                                    [NOT IMPLEMENTED] Print the ordered and complete chain for the given certificate.
    certs:generate <app> DOMAIN                                                                  Generate a key and certificate signing request (and self-signed certificate)
    certs:info <app>                                                                             Show certificate information for an ssl endpoint.
    certs:key <app> CRT KEY [KEY ...]                                                            [NOT IMPLEMENTED] Print the correct key for the given certificate.
    certs:remove <app>                                                                           Remove an SSL Endpoint from an app.
    certs:rollback <app>                                                                         [NOT IMPLEMENTED] Rollback an SSL Endpoint for an app.
    :
    :
```

ここまでできたら後は「git push」でアプリをデプロイできるようになります。ちなみにgit remoteのアドレスにも~/.ssh/configで設定した「default」を利用できます。
※例えばrailsアプリなら「git remote add dokku dokku@default:rails」で設定できます。
ちなみに、railsアプリの場合、rubyのインストール中にタイムアウトすることがあるので「dokku config:set --global CURL_TIMEOUT=120」と入れておくといいです。

## まとめ
以上で、vagrant内のubuntuにdokkuをインストールすることができました。私はSSHで接続するところではまってしまいましたが新めて手順を実行してみたら
何はともかくローカル環境内にdokkuの環境が用意できました。何に使うかはまだ考えておりませんが、いろいろとdokkuの実験をするにはもってこいですかね。
他には、Rails API + AngularJSの組みあわせでアプリを作る歳のクロスオリジン対応になりますかね。こちらも是非ともいつか試してます。