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
- 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í.
- Vytvořte si účet AWS a nastavte aktivní segment S3.
- 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.