sql >> データベース >  >> RDS >> Database

DjangoプロジェクトをHerokuに移行する

    このチュートリアルでは、MySQLデータベースに支えられた単純なローカルDjangoプロジェクトを取得し、Herokuで実行できるように変換します。 Amazon S3は静的ファイルをホストするために使用され、Fabricはデプロイプロセスを自動化します。

    プロジェクトはシンプルなメッセージシステムです。それは、todoアプリやブログ、さらにはTwitterのクローンである可能性があります。実際のシナリオをシミュレートするために、プロジェクトは最初にMySQLバックエンドを使用して作成され、次にHerokuにデプロイするためにPostgresに変換されます。個人的には、5つまたは6つのプロジェクトがあり、まさにこれを実行する必要がありました。MySQLを使用するローカルプロジェクトをHerokuのライブアプリに変換します。


    セットアップ


    前提条件

    1. Herokuで公式のDjangoクイックスタートガイドをお読みください。読んでください。これは、このチュートリアルで達成することを理解するのに役立ちます。公式チュートリアルを、独自のより高度な導入プロセスのガイドとして使用します。
    2. AWSアカウントを作成し、アクティブなS3バケットを設定します。
    3. 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
    

    質問やコメントがありますか?以下のディスカッションに参加してください。



    1. postgresでテーブル(インデックスを含む)をコピーします

    2. SQL固有のvarchar大文字と小文字の区別に関する質問

    3. MariaDBでのCEILING()のしくみ

    4. MicrosoftAccessIDEに愛を与える時が来ました