ニフティクラウド上で dokku を少し試したメモ

ニフティクラウド上のスタンダードイメージ Ubuntu 14.04 から作ったサーバーで dokku (セルフホストできるミニ heroku みたいなやつ) を少し試したメモ。

## インストール

[Getting Started with Dokku](http://dokku.viewdocs.io/dokku/getting-started/installation/) を参考にしながら。基本的にはこの 2 行で済む。

```
# wget https://raw.githubusercontent.com/dokku/dokku/v0.8.0/bootstrap.sh
# sudo DOKKU_TAG=v0.8.0 bash bootstrap.sh
```

が、なぜか名前解決できないエラーがでたので、DNS の設定を Google のやつに変更したらうまく行った。

```
# cp /etc/resolv.conf{,.org}
# sudo echo nameserver 8.8.8.8 > /etc/resolv.conf
```

インストールスクリプトが完了すると、docker が使えるようになっていて、

```
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

`http://${サーバーのグローバルIP}:80` で初期設定を行うことができるようになっている。
が、ufw が有効になっていてそのままだとアクセスできないので、無効化しておく。

```
# ufw disable
Firewall stopped and disabled on system startup
```

これで設定画面にアクセスできるようになった。

![](https://i.gyazo.com/94cb295d9a89ca2e8552791d5c1397bc.png)

`Public Key` にはデフォルトで root の公開鍵が入力されているので、git push のときにもこのサーバーにログインした秘密鍵を使いたい場合にはそのままでよい。git push のときにちがうキーを使いたい場合には書き換える必要がある。

(ちなみに [Adding SSH Keys](http://dokku.viewdocs.io/dokku/deployment/user-management/#adding-ssh-keys) にあるように公開鍵はあとから `dokku ssh-keys:add KEY_NAME path/to/id_rsa.pub` というコマンドで追加することもできる。といっても /root/.ssh/authorized_keys に公開鍵の中身が追記されるだけだけど。)

`Hostname` にはサーバーの IP アドレスが表示されているので、とりあえずそのままにした。IP にドメインを振っている場合にはドメイン名を入力すればいいと思う。

`Finish Setup` ボタンをクリックすると [Deploying to Dokku](http://dokku.viewdocs.io/dokku/deployment/application-deployment/) にリダイレクトされた。

## アプリをデプロイしてみる

[Deploying to Dokku](http://dokku.viewdocs.io/dokku/deployment/application-deployment/) を見ながらアプリをデプロイしてみる。

まず、dokku をインストールしたサーバー上での作業。アプリの作成。

```
# dokku apps:create ruby-rails-sample
Creating ruby-rails-sample... done
# dokku apps
=====> My Apps
ruby-rails-sample
```

postgres プラグインのインストール。

```
# sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git
(略)
```

データベースの作成。

```
# dokku postgres:create rails-database
       Waiting for container to be ready
       Creating container database
       Securing connection to database
=====> Postgres container created: rails-database
=====> Container Information
       Config dir:          /var/lib/dokku/services/postgres/rails-database/config
       Data dir:            /var/lib/dokku/services/postgres/rails-database/data
       Dsn:                 postgres://postgres:bb8bcc55f2e195f7bfcc3c8c3cc9688a@dokku-postgres-rails-database:5432/rails_database
       Exposed ports:       -                        
       Id:                  c3f315cc999ce770422ae664ba905c88d7377f8233c76d0449a22a800a4c63f2
       Internal ip:         172.17.0.2               
       Links:               -                        
       Service root:        /var/lib/dokku/services/postgres/rails-database
       Status:              running                  
       Version:             postgres:9.6.1
```

アプリとデータベースを link しておく。

```
# dokku postgres:link rails-database ruby-rails-sample
```

次に、手元の PC 側での作業。サンプルアプリを clone する。

```
$ git clone https://github.com/heroku/ruby-rails-sample.git
Cloning into 'ruby-rails-sample'...
remote: Counting objects: 239, done.
e: Total 239 (delta 0), reused 0 (delta 0), pack-reused 239
Receiving objects: 100% (239/239), 42.78 KiB | 0 bytes/s, done.
Resolving deltas: 100% (86/86), done.
Checking connectivity... done.
```

dokku のリポジトリを remote に登録して、アプリを push する。

```
$ cd ruby-rails-sample/
$ git remote add dokku dokku@${サーバーの IP アドレス}:ruby-rails-sample
$ git push dokku master
(heroku と同じようなログがずらずら表示されて、)
-----> Attempting to run scripts.dokku.postdeploy from app.json (if defined)        
=====> Application deployed:        
       http://${サーバーの IP アドレス}:5307
        
To dokku@${サーバーの IP アドレス}:ruby-rails-sample
 * [new branch]      master -> master
```

ブラウザで `http://${サーバーの IP アドレス}:5307` にアクセスすると、下記が正常に表示された。

![](https://i.gyazo.com/3044fb54dffac0a49d750df64d66b55c.png)

## まとめ

ニフティクラウド上で dokku をインストールしてアプリをデプロイしてみたりすることができた。

簡単にインストールできるのはいいけど、API がなくて dokku をインストールしたサーバーの中でないとアプリの作成等、各種管理操作ができないのが微妙な感じ…。

次は API もあるっぽい Deis や Flynn を試してみよう。


## 参考資料

* [Getting Started with Dokku](http://dokku.viewdocs.io/dokku/getting-started/installation/)
* [Deploying to Dokku](http://dokku.viewdocs.io/dokku/deployment/application-deployment/)
* [Dokku \- The smallest PaaS implementation you've ever seen](http://dokku.viewdocs.io/dokku/deployment/user-management/#adding-ssh-keys)
* [dokkuのつらいところとつかいどころ](http://k2nr.me/blog/2014/08/20/dokku.html)
* [docker \- Scaling out Dokku infrastructure \- Server Fault](http://serverfault.com/questions/640038/scaling-out-dokku-infrastructure)
* [Deis, Inc\. \| The Kubernetes Company](http://deis.io/)
* [Flynn ? The product that ops provides to developers](https://flynn.io/)
* [flynn/flynn: A next generation open source platform as a service \(PaaS\)](https://github.com/flynn/flynn)