(Dokku v0.3.26の話)
Herokuで1日6時間止めたくないし、30分でスリーブしたくないアプリがあるとき、VPS on Dokkuは最高のソリューションかもしれないです。
プロダクションには無理がありそうですが、社内とか個人用途には良さそうですね、nginxとかのセットアップをやってくれますし、Herokuのbuildpackを使えるので便利便利です。
VPSにはIDCFクラウドの一番安いのを使います。Dokkuを入れる前に、
にあるようなセットアップが済んでいるものとします。
Dokkuのインストール
$ wget https://raw.github.com/progrium/dokku/v0.3.26/bootstrap.sh$ sudo DOKKU_TAG=v0.3.26 bash bootstrap.sh
続いてサーバにログインしている状態で、ホスト名の設定。(root権限で実行)
VHOSTとHOSTNAMEに、持っているDNSの名前を設定する。(サブドメインでも良い)
(仮に、foo.barを設定したとする。)
# echo "foo.bar" > /home/dokku/VHOST
# echo "foo.bar" > /home/dokku/HOSTNAME
("http://foo.bar"にアクセスしてもdokkuの初期設定画面が出てきたので、そちらで設定できるみたい)
次に、git pushできるようにするために、SSHの公開鍵を設定する。公開鍵のある場所で以下のコマンドを実行する。
(ローカル) $ cat ~/.ssh/id_rsa.pub | ssh root@<your_ip> "sudo sshcommand acl-add dokku <name>"
(サーバ内) $ cat ~/.ssh/id_rsa.pub | sudo sshcommand acl-add dokku <name>
Dokkuの下準備はこれだけ、次にドメインの設定する。
ドメインの設定(お名前.com)
Dokkuはnginxを使ってサブドメインにデプロイしてくれるので、ワイルドカードを設定してみる。
お名前.comでは、サブドメインにワイルドカードが使えないので、*.
しょうがないので、DNSレコード設定で以下のようにAレコードを設定する。
A record | IP | TTL |
---|---|---|
foo.bar | 3600 | |
*.foo.bar | 3600 |
これで、例えば"dokku@foo.bar:sample"にpushしたとき、"http://sample.foo.bar"にデプロイされる。
Dokkuにサンプルアプリをデプロイ
Pythonのサンプルをデプロイしてみる。
ローカル環境にgit cloneして、remoteにdokkuを追加。
$gitclonehttps://github.com/heroku/python-sample.git$cdpython-sample$gitremoteadddokkudokku@foo.bar:python-sample$gitpushdokkumasterCountingobjects:21,done.Deltacompressionusingupto8threads.Compressingobjects:100%(17/17),done.Writingobjects:100%(21/21),1.81KiB|0bytes/s,done.Total21(delta6),reused0(delta0)----->Cleaningup...----->Buildingpython-samplefromherokuish...remote:Unabletofindimage'gliderlabs/herokuish:latest'locallyremote:latest:Pullingfromgliderlabs/herokuishremote:835c565d00e2:Pullingfslayerremote:c5c659229e15:Pullingfslayer(中略)remote:359e311e765f:Pullcompleteremote:359e311e765f:Alreadyexistsremote:Digest:sha256:7aaa5dd65a7f90a47f2bb1266375b27d4f273ff94495527949536c9e944a871aremote:Status:Downloadednewerimageforgliderlabs/herokuish:latest----->AddingBUILD_ENVtobuildenvironment...----->Pythonappdetected----->Installingruntime(python-2.7.10)----->InstallingdependencieswithpipCollectingFlask==0.9(from-rrequirements.txt(line1))DownloadingFlask-0.9.tar.gz(481kB)CollectingJinja2==2.6(from-rrequirements.txt(line2))DownloadingJinja2-2.6.tar.gz(389kB)CollectingWerkzeug==0.8.3(from-rrequirements.txt(line3))DownloadingWerkzeug-0.8.3.tar.gz(1.1MB)Installingcollectedpackages:Werkzeug,Jinja2,FlaskRunningsetup.pyinstallforWerkzeugRunningsetup.pyinstallforJinja2Runningsetup.pyinstallforFlaskSuccessfullyinstalledFlask-0.9Jinja2-2.6Werkzeug-0.8.3remote:Youareusingpipversion7.0.3,howeverversion7.1.2isavailable.remote:Youshouldconsiderupgradingviathe'pipinstall--upgradepip'command.----->DiscoveringprocesstypesProcfiledeclarestypes->web----->Releasingpython-sample...----->Deployingpython-sample...----->DOKKU_SCALEfilenotfoundinappimage.Defaultingtoasinglewebprocess----->NewDOKKU_SCALEfilegenerated----->Runningpre-flightchecksFormoreefficientzerodowntimedeployments,createafileCHECKS.Seehttp://progrium.viewdocs.io/dokku/checks-examples.md for examplesCHECKSfilenotfoundincontainer:Runningsimplecontainercheck...----->Waitingfor10seconds...----->Defaultcontainerchecksuccessful!=====>python-samplecontaineroutput:*Runningonhttp://0.0.0.0:5000/=====>endpython-samplecontaineroutput----->Runningpost-deploy----->Creatingnew/home/dokku/python-sample/VHOST...----->Configuringpython-sample.muuny-blue.info...----->Creatinghttpnginx.conf----->Runningnginx-pre-reloadReloadingnginx=====>Applicationdeployed:http://python-sample.foo.barTodokku@foo.bar:python-sample*[newbranch]master->master
初回はDockerのイメージとかを色々落としてくるので時間がかかるが、いい感じにデプロイされている様子を見れる。
Aレコードがちゃんと設定されていれば、ブラウザでも見れます。
Dokkuの様子を、サーバにSSHして確認。
$ dokku apps=====> My Apps
python-sample$ dokku ps python-sample
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 60641632 ? Ssl 00:11 0:00 /start web
root 10 0.0 0.0 1484920 ? S 00:11 0:00 /root/.basher/bash -c main 'web'
u3135 136 0.0 1.4 17952014716 ? S 00:11 0:00 python app.py
root 137 0.0 0.0 4440652 ? Ss+ 00:21 0:00 /bin/sh -c ps auxwww
root 143 0.0 0.1 155641156 ? R+ 00:21 0:00 ps auxwww$ ls -la /home/dokku | grep python-sample
drwxrwxr-x 8 dokku dokku 4096 XXX XX XX:XX python-sample
Dockerの様子も確認。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a63daf76bcb3 dokku/python-sample:latest "/start web"4 minutes ago Up 4 minutes insane_leakey$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
dokku/python-sample latest d8025105f0c0 4 minutes ago 1.421 GB
gliderlabs/herokuish latest 359e311e765f 6 weeks ago 1.263 GB
okぽい。
アプリに対して、操作するときはdokkuコマンドから操作する。詳しくはdokku --help。
まとめ
IDCFフロンティアの一番安いのにもDokkuちゃんとのせられたし、ちゃんと動いた。個人用途には申し分なさそう。
メモリ使用量の様子。
アプリ1つしかデブロイしてないけど、あまり無茶させなければ大丈夫そうな気配。
入れたあとにDokkuAlternativeってのがあることを知った、こっちは、メジャーどころのDB連携がデフォルトでついていたりWebコンソールがあるみたい、こっちのほうがなにかとよさそう。
dokku-altに関しては日本語で丁寧にまとまってる記事があったのでそちらを見るといいかもしれない。
(今のところ不便はないので素のdokkuを運用しいています)
参考資料
- progrium/dokku
- dokku
- DigitalOceanでUbuntu 12.04 + dokkuを構築した際のメモ - Qiita
- 橋本商会 » DockerとdokkuをMacにインストールして自分をHeroku化した
- DockerでミニHeroku!「Dokku」をさくらのクラウドで試す - さくらのナレッジ
- dokkuのつらいところとつかいどころ
- docker - Vagrantでdokkuを動かす - Qiita
- MacのVagrant上にDocker&Dokku環境入れてローカルmini-Heroku環境構築してみる - Qiita
- Setting up Dokku with DigitalOcean and Namecheap