ちょくちょくDjangoを触っている && 構成などメモ
6月くらいからちょくちょくDjangoでWebサイトを作っているので、 詰まったところとかハマったところをメモしていこうと思う。 Python3.4 + Django1.8 で構成している。
ディレクトリ構成について
ざっくりと、こんな感じ。
├── django_project │ ├── manage.py │ ├── pytest.ini │ ├── django_project │ ├── appA │ ├── appB │ └── templates ├── requirements.txt ├── reqs │ ├── common.txt │ ├── dev.txt │ └── prod.txt ├── Dockerfile ├── docker-compose.yml └── run_web.sh
こちら、参考にしたのは以下のページや書籍である。
上のページは、ありがたいことにディレクトリ構成以外にも詳しく述べられており、大変参考になった。 Two Scoops of Djangoはちょうど1.8版が出ていたので、購入してみた。
Docker-composeを試している。 今のところのdocker-compose.ymlはこのような感じ。 開発しながら、nginxやredisを追加する予定
storage: image: busybox volumes: - /var/lib/postgresql/data - /data command: "true" db: image: postgres volumes_from: - storage web: build: . command: ./run_web.sh volumes: - /vagrant:/code ports: - "80:8080" links: - db volumes_from: - storage
run_web.sh
にはmigration関連のコマンドとrunserverのコマンドが書いてある。gunicornやらを導入する際には書き換える。
その他メモる予定の事柄
- py.testについて
テストにはpy.testを用いる。python標準のunittestしか使ったことがないので、練習も兼ねている。 - jinja2 について
テンプレートエンジンにはJinja2を用いる。Django1.8からは標準でJinja2を選べるようになったが、設定でいろいろ困ることになったので、結局1.7以前のように
django-jinja
パッケージを用いた。 - CIについて wercker か drone を用いるので、それについても書く。droneは試したが、CIサービスを使うほうがラクかもしれない。
- CSS, JSについて 直接Djangoとは関係がないが、メモは残そうと思う。
- Git 運用について こちらも直接Djangoとは関係がないが、メモは残そうと思う。
Dockerを使ってDigitalOceanにShinyアプリを公開する
こんにちは。冷やし中華を今年になって3回食べているのですが、友人は4回食べたそうです。
先日作成した「確率分布を動かして遊ぶShinyアプリ」ですが、 おかげさまでけっこうな数のかたに見ていただいているようです。 たいへん嬉しいのですが、ShinyApps.ioに公開しているため、 すぐに「THIS APPLICATION IS CURRENTLY UNAVAILABLE」となってしまいます。
せっかく紹介していただける機会も多いので、このたびDigitalOceanで公開することにいたしました。 こちらです↓
前のURLでも見られるようにしておくつもりなので、 今後はお好きな方をごらんください。
ここからが本題です。 公開するにあたり、勉強がてらDockerを使ってみました。 ここでは、その作業手順を記しておきます。
DigitalOceanでサーバ作成
これに関してはメインではないので触れません。 僕はこちらのブログを参考にしました。
大事なのは、 Docker入りImage を選択することですね。
ちなみに、こちらのリンクからサインアップしていただけると お互いにメリットがあります。 https://www.digitalocean.com/?refcode=6dbd71c2251f
スワップを増やす
ワナがあります。このままの状態だと、メモリ不足でパッケージがインストールできないという事態に陥ります。 なので、こちらの記事を上から実行し、Ubuntuのスワップ領域を増やしましょう。
How To Add Swap on Ubuntu 12.04 https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-12-04
Shiny用コンテナの作成
Dockerfileの作成
もうShinyアプリは完成している前提とします。
ありがたいことに、ShinyServerがインストール済のDockerイメージが公開されているので、
そちらを使わせていただきましょう。
https://registry.hub.docker.com/u/rocker/shiny/
↑のGithubリポジトリ
上記のrocker/shinyイメージだけでもShinyは動かせるのですが、 このイメージはRのパッケージが「Shiny」「rmarkdown」しかインストールされていません。
なので、rocker/shinyイメージをもとに、 自分のアプリに合わせたDockerfileを作成しましょう。
私のDockerfileは以下のようになっています。
FROM rocker/shiny:latest RUN R -e "install.packages(c('shinydashboard', 'hypergeo'), repos='http://cran.rstudio.com/')" COPY /ShinyDistributionsApp/ /srv/shiny-server/ CMD exec shiny-server >> /var/log/shiny-server.log 2>&1
FROM 句でrocker/shinyを指定し、
RUN句で僕のアプリに必要な'shinydashboard'と'hypergeo'パッケージをインストールしています。 そして、COPY句でShinyアプリのソースをコピーし、CMD句でshinyを実行しています。単純ですね。
ビルド、そして実行
Dockerfileができたらビルドします。
DegitalOcean内にログインし、適当な名前をつけてビルド。
sudo docker build -t yourname/shiny-yourapp:latest .
初回は時間がかかります。 ビルドが完了したら、-d オプションをつけ、バックグラウンドで実行します。 rocker/shinyは、デフォルトでは3838ポートをEXPOSEしているようです。
sudo docker run -d -p 80:3838 yourname/shiny-yourapp:latest
これでバックグラウンドで実行されているので、 自分のドメインやIPアドレスをブラウザに入力してみましょう。 アプリが動いているはずです。
ちなみに、大量アクセスが来た場合のことを何も考えていません。 おそらく、こちらのスライドのような対処が必要となることでしょう。
このスライドにおける方法①を試す場合、 Docker-Composeを使ってShinyとNginxのコンテナを立てることで実現可能ではないかと目論んでいます。 時期がきたら試してみます。
以上です。えんじょい。
Docker入門 Immutable Infrastructureを実現する
- 作者: 松原豊,米林正明
- 出版社/メーカー: 技術評論社
- 発売日: 2014/04/25
- メディア: Kindle版
- この商品を含むブログ (5件) を見る
Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)
- 作者: 杉山貴章,大瀧隆太,Yugui(Yuki Sonoda),中津川篤司,前佛雅人,松原豊,米林正明,松本勇気
- 出版社/メーカー: 技術評論社
- 発売日: 2015/06/18
- メディア: 大型本
- この商品を含むブログ (1件) を見る
OSS版Drone+Vagrant+Bitbucket を試す
OSS 版 Drone がようやく動いたので、メモします。 Vagrant で Ubuntu を立てて、Bitbucket のプライベートレポジトリと連携するところまで。 今回はPython3+Django です。
Vagrant
ubuntu を使います。
vagrant init ubuntu/trusty64
Vagrantfile は以下の通りです。ふつうです。
Vagrant.configure(2) do |config| config.vm.box = "ubuntu/trusty64" config.vm.network "forwarded_port", guest: 80, host: 8080 config.vm.network "private_network", ip: "192.168.33.10" config.ssh.forward_agent = true end
vagrant を起動して入ります。
vagrant up vagrant ssh
Docker のインストール
sudo apt-get install docker.io sqlite
Drone のインストール
README に書いてある通りにインストールして起動します。
# Ubuntu, Debian wget downloads.drone.io/master/drone.deb sudo dpkg -i drone.deb sudo start drone
http://localhost:8080 にアクセスして、Drone の画面が出るか確認
ngrok
ngrok を使って、 Vagrant内で起動している Drone を外部公開する必要があります。
wget https://dl.ngrok.com/ngrok_2.0.17_linux_amd64.zip unzip ngrok_2.0.17_linux_amd64.zip
ngrok をダウンロードしたら、お好きなサブドメインを決めて、バックグラウンドで実行します。 ここでは適当に ksmzndrone とします。
./ngrok http -subdomain=ksmzndrone -log=stdout 80 > .ngrok2/ngrok.log &
https://ksmzndrone.ngrok.io にアクセスして、さっきと同じ画面になればOK。
Bitbucket の設定
コンシューマキーの登録
今回は Bitbucket のレポジトリを指定します。 まず、「アカウントの管理」→「OAuth」で コンシューマキーを登録します。
名前を適当に「drone」とし、 URLを先ほどngrokで指定したURL+「api/auth/bitbucket.org」とします。 今回は「https://ksmzndrone.ngrok.io/api/auth/bitbucket.org」ですね。
登録すると、「鍵」と「Secret」がもらえます。
これを /etc/drone/drone.toml の bitbucket の欄に記載し、 さらに「open=false」→「open=true」とします。
記載したら保存し、drone を再起動します。
sudo restart drone
アカウントの登録
https://ksmzndrone.ngrok.io を開くと、Bitbucketの設定ができるはずなので、 アカウントを登録し、レポジトリをアクティベートします。
フックの設定
その後、レポジトリの「Setting」→「フック」を開き、 POST の URL のドメインが「https://ksmzndrone.ngrok.io」になっているか確認します。 もし URL が localhost から始まっていたら、その部分を「https://ksmzndrone.ngrok.io」に変更し、 最終的に「https://ksmzndrone.ngrok.io/api/hook/bitbucket.org/****************」 となっていればOK。
Docker の設定
では、Docker の設定を行いましょう。 まず、Drone のベースとなる image を pull します。
sudo docker pull bradrydzewski/ubuntu sudo docker pull bradrydzewski/base
次に、自分のアプリのビルドに必要なものを用意します。 今回は Python3+Django ということで、 Python3 の image を用意します。
sudo docker pull bradrydzewski/python:3.3
.drone.yml
自分のレポジトリのルートディレクトリに .drone.yml を配置し、ビルドの設定を書きます。
image: bradrydzewski/python:3.3 script: - echo 'Hello, Drone!'
とりあえず今回は、ただ echo するだけの .drone.yml にしました。
実行
では、この状態で Bitbucket のレポジトリに Push してみましょう。 無事に echo されれば、OK です。
参考
- drone/drone
- Vagrant で OSS 版 drone を試す
- Vagrant で drone オープンソース版を試す(1)〜 terraform のコードを CI してインフラ CI 入門 〜
AR.Drone 2.0 Power Edition (「HDバッテリー」×2本、「カラープロペラ」×3色同梱)
- 出版社/メーカー: パロット
- 発売日: 2014/02/26
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
- 作者: エディトル
- 出版社/メーカー: インプレス
- 発売日: 2015/06/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る