このチュートリアルでは、MySQLデータベースに支えられた単純なローカルDjangoプロジェクトを取得し、Herokuで実行できるように変換します。 Amazon S3は静的ファイルをホストするために使用され、Fabricはデプロイプロセスを自動化します。
プロジェクトはシンプルなメッセージシステムです。それは、todoアプリやブログ、さらにはTwitterのクローンである可能性があります。実際のシナリオをシミュレートするために、プロジェクトは最初にMySQLバックエンドを使用して作成され、次にHerokuにデプロイするためにPostgresに変換されます。個人的には、5つまたは6つのプロジェクトがあり、まさにこれを実行する必要がありました。MySQLを使用するローカルプロジェクトをHerokuのライブアプリに変換します。
セットアップ
前提条件
- Herokuで公式のDjangoクイックスタートガイドをお読みください。読んでください。これは、このチュートリアルで達成することを理解するのに役立ちます。公式チュートリアルを、独自のより高度な導入プロセスのガイドとして使用します。
- AWSアカウントを作成し、アクティブなS3バケットを設定します。
- MySQLをインストールします。
始めましょう
ここからテストプロジェクトをダウンロードし、解凍してから、virtualenvをアクティブにします。
$ cd django_heroku_deploy
$ virtualenv --no-site-packages myenv
$ source myenv/bin/activate
Githubに新しいリポジトリを作成します:
$ curl -u 'USER' https://api.github.com/user/repos -d '{"name":"REPO"}'
必ずすべて大文字のKEYWORDSを独自の設定に置き換えてください。例:
curl -u 'mjhea0' https://api.github.com/user/repos -d '{"name":"django-deploy-heroku-s3"}'
readmeファイルを追加し、ローカルGitリポジトリを初期化してから、ローカルコピーをGithubにプッシュします。
$ touch README.md
$ git init
$ git add .
$ git commit -am "initial"
$ git remote add origin https://github.com/username/Hello-World.git
$ git push origin master
URLは、必ず前の手順で作成したリポジトリのURLに変更してください。
django_deployという新しいMySQLデータベースをセットアップします :
$ mysql.server start
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
mysql> CREATE DATABASE django_deploy;
Query OK, 1 row affected (0.01 sec)
mysql>
mysql> quit
Bye
settings.pyを更新します :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_deploy',
'USER': 'root',
'PASSWORD': 'your_password',
}
}
依存関係をインストールします:
$ pip install -r requirements.txt
$ python manage.py syncdb
$ python manage.py runserver
サーバーをhttp:// localhost:8000 / admin /で実行し、管理者にログインできることを確認します。 Whatever
にいくつかのアイテムを追加します 物体。サーバーを強制終了します。
MySQLからPostgresに変換
注: この架空の状況で、MySQLを使用してこのプロジェクトにしばらく取り組んでいて、それをPostgresに変換したいとします。
依存関係のインストール:
$ pip install psycopg2
$ pip install py-mysql2pgsql
Postgresデータベースを設定します:
$ psql -h localhost
psql (9.2.4)
Type "help" for help.
michaelherman=# CREATE DATABASE django_deploy;
CREATE DATABASE
michaelherman=# \q
データの移行:
$ py-mysql2pgsql
このコマンドは、 mysql2pgsql.ymlというファイルを作成します 、次の情報が含まれています:
mysql:
hostname: localhost
port: 3306
socket: /tmp/mysql.sock
username: foo
password: bar
database: your_database_name
compress: false
destination:
postgres:
hostname: localhost
port: 5432
username: foo
password: bar
database: your_database_name
構成に合わせてこれを更新します。この例では、基本的な変換についてのみ説明します。特定のテーブルを含めたり除外したりすることもできます。こちらの完全な例をご覧ください。
データを転送する:
$ py-mysql2pgsql -v -f mysql2pgsql.yml
データが転送されたら、必ず settings.pyを更新してください。 ファイル:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": "your_database_name",
"USER": "foo",
"PASSWORD": "bar",
"HOST": "localhost",
"PORT": "5432",
}
}
最後に、データベースを再同期し、テストサーバーを実行し、データベースに別のアイテムを追加して、変換が成功したことを確認します。
local_settings.pyファイルを追加します
local_settings.pyを追加する ファイルの場合、 settings.pyを拡張できます メインのsettings.pyが、ローカル環境に関連する設定を含むファイル ファイルは、ステージング環境と本番環境でのみ使用されます。
必ずlocal_settings.pyを追加してください .gitignoreに ファイルをリポジトリから除外するためにファイルします。プロジェクトを使用または貢献したい人は、リポジトリのクローンを作成して、独自の local_settings.pyを作成できます。 独自のローカル環境に固有のファイル。
2つの設定ファイルを使用するこの方法は何年も前から慣例となっていますが、多くのPython開発者は現在The OneTrueWayと呼ばれる別のパターンを使用しています。このパターンは、将来のチュートリアルで見る可能性があります。
settings.pyを更新
現在のsettings.pyに3つの変更を加える必要があります ファイル:
DEBUG
を変更します モードをfalseに設定:
DEBUG = False
次のコードをファイルの最後に追加します。
# Allow all host hosts/domain names for this site
ALLOWED_HOSTS = ['*']
# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES = { 'default' : dj_database_url.config()}
# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# try to load local_settings.py if it exists
try:
from local_settings import *
except Exception as e:
pass
データベース設定を更新します:
# we only need the engine name, as heroku takes care of the rest
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
}
}
local_settings.pyを作成します ファイル:
$ touch local_settings.py
$ pip install dj_database_url
次に、次のコードを追加します。
from settings import PROJECT_ROOT, SITE_ROOT
import os
DEBUG = True
TEMPLATE_DEBUG = True
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": "django_deploy",
"USER": "foo",
"PASSWORD": "bar",
"HOST": "localhost",
"PORT": "5432",
}
}
テストサーバーを起動して、すべてが引き続き機能することを確認します。データベースにさらにいくつかのレコードを追加します。
Herokuのセットアップ
Procfileをメインディレクトリに追加します:
$ touch Procfile
次のコードをファイルに追加します:
web: python manage.py runserver 0.0.0.0:$PORT --noreload
Herokuツールベルトをインストールします:
$ pip install django-toolbelt
依存関係を凍結します:
$ pip freeze > requirements.txt
wsgi.pyを更新します ファイル:
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
Heroku設定をローカルでテストします:
$ foreman start
http:// localhost:5000/に移動します。
よさそう? AmazonS3を実行してみましょう。
Amazon S3
Herokuリポジトリで静的ファイルをホストすることは仮想的に可能ですが、特に顧客向けのアプリケーションがある場合は、サードパーティのホストを使用することをお勧めします。 S3は使いやすく、 settings.pyにわずかな変更を加えるだけで済みます。 ファイル。
依存関係のインストール:
$ pip install django-storages
$ pip install boto
storages
を追加します およびboto
INSTALLED_APPS
に 「settings.py」で
「settings.py」の下部に次のコードを追加します。
# Storage on S3 settings are stored as os.environs to keep settings.py clean
if not DEBUG:
AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL
AWSの環境に依存する設定は、環境変数として保存されます。したがって、開発サーバーを実行するたびにターミナルからこれらを設定する必要はありません。これらは、virtualenv activate
で設定できます。 脚本。 S3からAWSバケット名、アクセスキーID、シークレットアクセスキーを取得します。 myenv/bin/activate
を開きます 次のコードを追加します(S3から取得した特定の情報を必ず追加してください):
# S3 deployment info
export AWS_STORAGE_BUCKET_NAME=[YOUR AWS S3 BUCKET NAME]
export AWS_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX
virtualenvを非アクティブ化して再アクティブ化し、ローカルサーバーを起動して、変更が有効になったことを確認します。
$ foreman start
サーバーを強制終了してから、 requirements.txtを更新します ファイル:
$ pip freeze > requirements.txt
GithubとHerokuにプッシュ
Herokuにプッシュする前に、ファイルをGithubにバックアップしましょう:
$ git add .
$ git commit -m "update project for heroku and S3"
$ git push -u origin master
Herokuプロジェクト/リポジトリを作成する:
$ heroku create <name>
好きな名前を付けてください。
Herokuへのプッシュ:
$ git push heroku master
AWS環境変数をHerokuに送信します
$ heroku config:set AWS_STORAGE_BUCKET_NAME=[YOUR AWS S3 BUCKET NAME]
$ heroku config:set AWS_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX
$ heroku config:set AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX
静的ファイルを収集してAmazonに送信します:
$ heroku run python manage.py collectstatic
開発データベースの追加:
$ heroku addons:add heroku-postgresql:dev
Adding heroku-postgresql on deploy_django... done, v13 (free)
Attached as HEROKU_POSTGRESQL_COPPER_URL
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pgbackups:restore.
Use `heroku addons:docs heroku-postgresql` to view documentation.
$ heroku pg:promote HEROKU_POSTGRESQL_COPPER_URL
Promoting HEROKU_POSTGRESQL_COPPER_URL to DATABASE_URL... done
DBを同期します:
$ heroku run python manage.py syncdb
データ転送
ローカルデータベースから本番データベースにデータを転送する必要があります。
Heroku PGBackupsアドオンをインストールします:
$ heroku addons:add pgbackups
ローカルデータベースをダンプします:
$ pg_dump -h localhost -Fc library > db.dump
Herokuがdbdumpにアクセスするには、インターネットのどこかにアップロードする必要があります。個人のWebサイト、ドロップボックス、またはS3を使用できます。 S3バケットにアップロードしただけです。
ダンプをHerokuにインポートします:
$ heroku pgbackups:restore DATABASE http://www.example.com/db.dump
テスト
すべてが機能することを確認するためにテストしましょう。
まず、許可されたホストを settings.pyで特定のドメインに更新します :
ALLOWED_HOSTS = ['[your-project-name].herokuapp.com']
アプリをチェックしてください:
$ heroku open
ファブリック
ファブリックは、アプリケーションのデプロイを自動化するために使用されます。
インストール:
$ pip install fabric
fabfileを作成します:
$ touch fabfile.py
次に、次のコードを追加します。
from fabric.api import local
def deploy():
local('pip freeze > requirements.txt')
local('git add .')
print("enter your git commit comment: ")
comment = raw_input()
local('git commit -m "%s"' % comment)
local('git push -u origin master')
local('heroku maintenance:on')
local('git push heroku master')
local('heroku maintenance:off')
テスト:
$ fab deploy
質問やコメントがありますか?以下のディスカッションに参加してください。