sql >> Databáze >  >> RDS >> Database

Migrace vašeho projektu Django na Heroku

V tomto tutoriálu si vezmeme jednoduchý místní projekt Django, podporovaný databází MySQL, a převedeme jej tak, aby běžel na Heroku. Amazon S3 bude použit k hostování našich statických souborů, zatímco Fabric bude proces nasazení automatizovat.

Projekt je jednoduchý systém zpráv. Může to být aplikace úkolů nebo blog nebo dokonce klon Twitteru. Pro simulaci reálného scénáře bude projekt nejprve vytvořen s backendem MySQL a poté převeden na Postgres pro nasazení na Heroku. Osobně jsem měl pět nebo šest projektů, kde jsem musel udělat přesně tuto věc:převést místní projekt podporovaný MySQL na živou aplikaci na Heroku.


Nastavení


Předpoklady

  1. Přečtěte si oficiálního průvodce rychlým startem Django na Heroku. Jen si to přečtěte. To vám pomůže získat představu o tom, čeho v tomto tutoriálu dosáhneme. Oficiální výukový program budeme používat jako průvodce pro náš vlastní, pokročilejší proces nasazení.
  2. Vytvořte si účet AWS a nastavte aktivní segment S3.
  3. Nainstalujte MySQL.


Začněme

Začněte stažením testovacího projektu zde, rozbalte jej a poté aktivujte virtuální prostředí:

$ cd django_heroku_deploy
$ virtualenv --no-site-packages myenv
$ source myenv/bin/activate

Vytvořte nové úložiště na Github:

$ curl -u 'USER' https://api.github.com/user/repos -d '{"name":"REPO"}'

Ujistěte se, že jste nahradili všechna velká písmena KEYWORDS svým vlastním nastavením. Například:curl -u 'mjhea0' https://api.github.com/user/repos -d '{"name":"django-deploy-heroku-s3"}'

Přidejte soubor readme, inicializujte místní úložiště Git a poté PUSH místní kopii do 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

Nezapomeňte změnit adresu URL na adresu URL vašeho úložiště, kterou jste vytvořili v předchozím kroku.

Nastavte novou databázi MySQL s názvem django_deploy :

$ 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

Aktualizujte settings.py :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_deploy',
        'USER': 'root',
        'PASSWORD': 'your_password',
    }
}

Nainstalujte závislosti:

$ pip install -r requirements.txt
$ python manage.py syncdb
$ python manage.py runserver

Spusťte server na http://localhost:8000/admin/ a ujistěte se, že se můžete přihlásit k adminovi. Přidejte několik položek do Whatever objekt. Zabijte server.




Převést z MySQL na Postgres

Poznámka: V této hypotetické situaci předstírejme, že na tomto projektu nějakou dobu pracujete pomocí MySQL a nyní jej chcete převést na Postgres.

Instalovat závislosti:

$ pip install psycopg2
$ pip install py-mysql2pgsql

Nastavení databáze Postgres:

$ psql -h localhost
psql (9.2.4)
Type "help" for help.
michaelherman=# CREATE DATABASE django_deploy;
CREATE DATABASE
michaelherman=# \q

Migrace dat:

$ py-mysql2pgsql

Tento příkaz vytvoří soubor s názvem mysql2pgsql.yml , obsahující následující informace:

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

Aktualizujte toto pro vaši konfiguraci. Tento příklad pokrývá pouze základní převod. Můžete také zahrnout nebo vyloučit určité tabulky. Podívejte se na úplný příklad zde.

Přeneste data:

$ py-mysql2pgsql -v -f mysql2pgsql.yml

Jakmile budou data přenesena, nezapomeňte aktualizovat settings.py soubor:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "NAME": "your_database_name",
        "USER": "foo",
        "PASSWORD": "bar",
        "HOST": "localhost",
        "PORT": "5432",
    }
}

Nakonec znovu synchronizujte databázi, spusťte testovací server a přidejte do databáze další položku, abyste zajistili úspěšnost převodu.



Přidejte soubor local_settings.py

Přidáním souboru local_settings.py můžete rozšířit soubor settings.py soubor s nastavením relevantním pro vaše místní prostředí, zatímco hlavní settings.py se používá výhradně pro vaše pracovní a produkční prostředí.

Nezapomeňte přidat local_settings.py na váš .gitignore soubor, aby byl soubor mimo vaše úložiště. Ti, kteří chtějí používat nebo přispívat k vašemu projektu, pak mohou naklonovat repo a vytvořit si vlastní local_settings.py soubor specifický pro jejich vlastní místní prostředí.

Ačkoli tato metoda použití dvou konfiguračních souborů byla již řadu let konvenční, mnoho vývojářů Pythonu nyní používá jiný vzor nazvaný The One True Way. Na tento vzor se můžeme podívat v budoucím tutoriálu.


Aktualizujte nastavení.py

V našem aktuálním souboru settings.py musíme provést tři změny soubor:

Změňte DEBUG režim na hodnotu false:

DEBUG = False

Přidejte následující kód na konec souboru:

# 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

Aktualizujte nastavení databáze:

# we only need the engine name, as heroku takes care of the rest
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
    }
}

Vytvořte local_settings.py soubor:

$ touch local_settings.py
$ pip install dj_database_url

Poté přidejte následující kód:

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",
    }
}

Spusťte testovací server, abyste se ujistili, že vše stále funguje. Přidejte do databáze několik dalších záznamů.




Nastavení Heroku

Přidejte Procfile do hlavního adresáře:

$ touch Procfile

a přidejte do souboru následující kód:

web: python manage.py runserver 0.0.0.0:$PORT --noreload

Nainstalujte Heroku toolbelt:

$ pip install django-toolbelt

Zmrazit závislosti:

$ pip freeze > requirements.txt

Aktualizujte wsgi.py soubor:

from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

Otestujte své nastavení Heroku lokálně:

$ foreman start

Přejděte na http://localhost:5000/.

Vypadáš dobře? Pojďme spustit Amazon S3.



Amazon S3

Ačkoli je hypoteticky možné hostovat statické soubory ve vašem úložišti Heroku, je nejlepší použít hostitele třetí strany, zvláště pokud máte aplikaci pro zákazníky. S3 se snadno používá a vyžaduje jen několik změn v souboru settings.py soubor.

Instalovat závislosti:

$ pip install django-storages
$ pip install boto

Přidejte storages a boto do vašich INSTALLED_APPS v „settings.py“

Přidejte následující kód na konec „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

Nastavení AWS závislá na prostředí jsou uložena jako proměnné prostředí. Nemusíme je tedy nastavovat z terminálu pokaždé, když spouštíme vývojový server, můžeme je nastavit v našem virtualenv activate skript. Získejte název bloku AWS, ID přístupového klíče a tajný přístupový klíč z S3. Otevřete myenv/bin/activate a připojte následující kód (nezapomeňte přidat své konkrétní informace, které jste právě stáhli z 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

Deaktivujte a znovu aktivujte své virtuální prostředí a poté spusťte místní server, abyste se ujistili, že se změny projevily:

$ foreman start

Zabijte server a poté aktualizujte requirements.txt soubor:

$ pip freeze > requirements.txt


Push to Github a Heroku

Před PUSH do Heroku si zálohujme naše soubory na Github:

$ git add .
$ git commit -m "update project for heroku and S3"
$ git push -u origin master

Vytvořte projekt/repo Heroku:

$ heroku create <name>

Pojmenujte si to, jak chcete.

PUSH to Heroku:

$ git push heroku master

Odešlete proměnné prostředí AWS do 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

Sbírejte statické soubory a odešlete je na Amazon:

$ heroku run python manage.py collectstatic

Přidat vývojovou databázi:

$ 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

Nyní synchronizujte DB:

$ heroku run python manage.py syncdb


Přenos dat

Potřebujeme přenést data z místní databáze do produkční databáze.

Nainstalujte doplněk Heroku PGBackups:

$ heroku addons:add pgbackups

Vypište místní databázi:

$ pg_dump -h localhost  -Fc library  > db.dump

Aby se Heroku dostalo k db dump, musíte ho někam nahrát na internet. Můžete použít osobní web, schránku nebo S3. Jednoduše jsem to nahrál do bucketu S3.

Import výpisu do Heroku:

$ heroku pgbackups:restore DATABASE http://www.example.com/db.dump


Test

Pojďme otestovat, abychom se ujistili, že vše funguje.

Nejprve aktualizujte povolené hostitele na vaši konkrétní doménu v settings.py :

ALLOWED_HOSTS = ['[your-project-name].herokuapp.com']

Podívejte se na svou aplikaci:

$ heroku open


Tkanina

Fabric se používá k automatizaci nasazení vaší aplikace.

Instalace:

$ pip install fabric

Vytvořte fabfile:

$ touch fabfile.py

Poté přidejte následující kód:

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')

Test:

$ fab deploy

Máte dotazy nebo připomínky? Zapojte se do diskuze níže.



  1. Tipy pro migraci z replikace MySQL na MySQL Galera Cluster 4.0

  2. Najděte záznamy SQL obsahující podobné řetězce

  3. GIS:PostGIS/PostgreSQL vs. MySql vs. SQL Server?

  4. Jak na čísla pater v SQL