OSQA on Heroku

processes

$ mkdir osqa
$ cd osqa

$ brew install mysql
$ unset TMPDIR
$ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
$ mysql.server start
$ mysql -uroot
mysql> CREATE USER 'osqa'@'localhost' IDENTIFIED BY '***';
mysql> CREATE DATABASE osqa DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci;
mysql> GRANT ALL ON osqa.* to 'osqa'@'localhost';

$ svn co http://svn.osqa.net/svnroot/osqa/trunk .
$ virtualenv venv --distribute
$ source ./venv/bin/activate
$ pip install South django==1.3 django-debug-toolbar mysql-python markdown html5lib python-openid gunicorn
$ cp settings_local.py.dist settings_local.py

$ emacs settings_local.py
import os.path
import os
import sys
import urlparse
...
↓消す
DATABASES = {
...
↓heroku 用の DB 設定を追加
# Register database schemes in URLs.
urlparse.uses_netloc.append('mysql')

try:

    # Check to make sure DATABASES is set in settings.py file.
    # If not default to {}

    if 'DATABASES' not in locals():
        DATABASES = {}

    if 'CLEARDB_DATABASE_URL' in os.environ:
        url = urlparse.urlparse(os.environ['CLEARDB_DATABASE_URL'])

        # Ensure default database exists.
        DATABASES['default'] = DATABASES.get('default', {})

        # Update with environment configuration.
        DATABASES['default'].update({
            'NAME': url.path[1:].split('?')[0],
            'USER': url.username,
            'PASSWORD': url.password,
            'HOST': url.hostname,
            'PORT': url.port,
        })
        if url.scheme == 'postgres':
            DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'

        if url.scheme == 'mysql':
            DATABASES['default']['ENGINE'] = 'django.db.backends.mysql'
except Exception:
    print 'Unexpected error:', sys.exc_info()

↓ローカルでのテスト用に MySQL を設定しておく
if not 'default' in DATABASES:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'osqa',
            'USER': 'osqa',
            'PASSWORD': '***',
            'HOST': 'localhost',
            'PORT': '3306',
        }
    }

...
APP_URL = 'http://0.0.0.0/' # 後で Heroku 用に修正する
...
TIME_ZONE = 'Asia/Tokyo'
...
LANGUAGE_CODE = 'ja'

DJANGO_VERSION = 1.3

$ emacs Procfile
web: python manage.py run_gunicorn 0.0.0.0:$PORT

$ python manage.py syncdb --all
...
("ImportError: No module named MySQLdb" は無視)
...
Would you like to create one now? (yes/no): no
$ python manage.py migrate forum --fake
...
("ImportError: No module named MySQLdb" は無視)
$ foreman start
...
こんな感じのログが出ているはず
15:36:08 web.1     | 2012-05-05 15:36:08 [11384] [INFO] Listening at: http://0.0.0.0:5000 (11384)
...
(Control-C でいったん終了)
^C

$ pip freeze -l > requirements.txt
$ emacs settings_local.py
heroku では任意の場所にログが出せるわけではない.
https://devcenter.heroku.com/articles/read-only-filesystem
heroku では stdio や stderr に書き出すと, ./log 以下にログとして記録してくれる.
ref: https://devcenter.heroku.com/articles/logging

以下の設定にすると FileHandler ではなく, StreamHandler が使われる.
logging.basicConfig(
#    filename=os.path.join(SITE_SRC_ROOT, 'log', LOG_FILENAME),
    level=logging.ERROR,
    format='%(pathname)s TIME: %(asctime)s MSG: %(filename)s:%(funcName)s:%(lineno)d %(message)s',
)
$ emacs .gitignore
venv
*.pyc
.svn
$ git init
$ git add .
$ git commit -m "osqa web application"

$ heroku login
$ heroku create --stack cedar
ここで表示される URL を記録しておく
$ heroku addons:add cleardb:ignite
MySQL を使いたいので, ClearDB の MySQL 無料プランの addon を追加
$ heroku config
追加を確認
CLEARDB_DATABASE_URL => mysql://...
$ git remote show heroku
heroku がリモートレポジトリとして登録されている
$ git push heroku master
git push に成功したことを確認
ファイルの転送後に Django サーバの実行が試みられる
まだ DB を初期化していないので, エラーを出しているはず
$ heroku ps
プロセスがあるか確認 (おそらく無い)
$ heroku logs
ログを確認 (おそらく異常終了)
$ heroku open
ブラウザで開く (おそらく動いていない)

ここでアプリケーションが動いている URL を確認
↓
$ emacs settings_local.py
実際に動く URL に修正
APP_URL = 'http://url.for.application/'

$ heroku run python manage.py syncdb --all
$ heroku run python manage.py migrate forum --fake
$ heroku ps:scale web=1
Scaling web processes... done, now running 1
$ heroku ps
Process  State      Command
-------  ---------  ------------------------------------
web.1    up for 1s  python manage.py run_gunicorn 0.0...
$ heroku logs
動いていることを確認
...
2012-05-05T06:40:24+00:00 app[web.1]: 2012-05-05 15:40:24 [1] [INFO] Listening at: http://0.0.0.0:47223 (1)
...
$ heroku open
無事起動を確認

メール送信サーバは Gmail のものを使いました.

SendGrid を使うように変更しました.

$ heroku addons:add sendgrid:starter
$ emacs settings_local.py
...
EMAIL_HOST_USER = os.environ['SENDGRID_USERNAME']
EMAIL_HOST= 'smtp.sendgrid.net'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_PASSWORD = os.environ['SENDGRID_PASSWORD']

$ git commit -am "added send grid"
$ git push heroku master

# んー, 結局上手く動かなかったので, 以下のコマンドの出力を OSQA の管理ページから設定しました.
$ heroku config

Comments

blog comments powered by Disqus

Licenses