Dalam tutorial ini, kita akan mengambil proyek Django lokal sederhana, didukung oleh database MySQL, dan mengonversinya agar berjalan di Heroku. Amazon S3 akan digunakan untuk menghosting file statis kami, sementara Fabric akan mengotomatiskan proses penerapan.
Proyek adalah sistem pesan sederhana. Ini bisa berupa aplikasi todo atau blog atau bahkan tiruan Twitter. Untuk mensimulasikan skenario langsung, Proyek pertama-tama akan dibuat dengan backend MySQL, kemudian dikonversi ke Postgres untuk diterapkan di Heroku. Saya pribadi memiliki lima atau enam proyek di mana saya harus melakukan hal yang tepat ini:mengonversi Proyek lokal, yang didukung dengan MySQL, menjadi aplikasi langsung di Heroku.
Penyiapan
Prasyarat
- Baca panduan resmi Mulai Cepat Django di Heroku. Baca saja. Ini akan membantu Anda merasakan apa yang akan kita capai dalam tutorial ini. Kami akan menggunakan tutorial resmi sebagai panduan untuk proses penerapan kami yang lebih canggih.
- Buat akun AWS dan siapkan bucket S3 yang aktif.
- Instal MySQL.
Mari kita mulai
Mulailah dengan mengunduh Proyek uji di sini, unzip, lalu aktifkan virtualenv:
$ cd django_heroku_deploy
$ virtualenv --no-site-packages myenv
$ source myenv/bin/activate
Buat repositori baru di Github:
$ curl -u 'USER' https://api.github.com/user/repos -d '{"name":"REPO"}'
Pastikan untuk mengganti semua KATA KUNCI huruf besar dengan pengaturan Anda sendiri. Misalnya:
curl -u 'mjhea0' https://api.github.com/user/repos -d '{"name":"django-deploy-heroku-s3"}'
Tambahkan file readme, inisialisasi repo Git lokal, lalu PUSH salinan lokal ke 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
Pastikan untuk mengubah URL ke URL repo yang Anda buat di langkah sebelumnya.
Siapkan database MySQL baru bernama 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
Perbarui settings.py :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_deploy',
'USER': 'root',
'PASSWORD': 'your_password',
}
}
Instal dependensi:
$ pip install -r requirements.txt
$ python manage.py syncdb
$ python manage.py runserver
Jalankan server di http://localhost:8000/admin/, dan pastikan Anda bisa login ke admin. Tambahkan beberapa item ke Whatever
obyek. Matikan servernya.
Konversi dari MySQL ke Postgres
Catatan: Dalam situasi hipotetis ini, mari kita berpura-pura bahwa Anda telah mengerjakan Proyek ini untuk sementara waktu menggunakan MySQL dan sekarang Anda ingin mengubahnya menjadi Postgres.
Instal dependensi:
$ pip install psycopg2
$ pip install py-mysql2pgsql
Siapkan database Postgres:
$ psql -h localhost
psql (9.2.4)
Type "help" for help.
michaelherman=# CREATE DATABASE django_deploy;
CREATE DATABASE
michaelherman=# \q
Migrasikan data:
$ py-mysql2pgsql
Perintah ini membuat file bernama mysql2pgsql.yml , yang berisi info berikut:
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
Perbarui ini untuk konfigurasi Anda. Contoh ini hanya mencakup konversi dasar. Anda juga dapat menyertakan atau mengecualikan tabel tertentu. Lihat contoh lengkapnya di sini.
Mentransfer data:
$ py-mysql2pgsql -v -f mysql2pgsql.yml
Setelah data ditransfer, pastikan untuk memperbarui settings.py your Anda berkas:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": "your_database_name",
"USER": "foo",
"PASSWORD": "bar",
"HOST": "localhost",
"PORT": "5432",
}
}
Terakhir, sinkronkan ulang database, jalankan server pengujian, dan tambahkan item lain ke database untuk memastikan konversi berhasil.
Tambahkan file local_settings.py
Dengan menambahkan local_settings.py file, Anda dapat memperluas settings.py file dengan setelan yang relevan dengan lingkungan lokal Anda, sedangkan settings.py utama file hanya digunakan untuk lingkungan pementasan dan produksi Anda.
Pastikan Anda menambahkan local_settings.py ke .gitignore . Anda file untuk menyimpan file dari repositori Anda. Mereka yang ingin menggunakan atau berkontribusi pada proyek Anda dapat mengkloning repo dan membuat local_settings.py mereka sendiri file khusus untuk lingkungan lokal mereka sendiri.
Meskipun metode menggunakan dua file pengaturan ini telah menjadi kebiasaan selama beberapa tahun, banyak pengembang Python sekarang menggunakan pola lain yang disebut The One True Way. Kita dapat melihat pola ini di tutorial mendatang.
Perbarui settings.py
Kami perlu membuat tiga perubahan pada settings.py kami saat ini berkas:
Ubah DEBUG
mode ke salah:
DEBUG = False
Tambahkan kode berikut ke bagian bawah file:
# 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
Perbarui pengaturan basis data:
# we only need the engine name, as heroku takes care of the rest
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
}
}
Buat local_settings.py your Anda berkas:
$ touch local_settings.py
$ pip install dj_database_url
Kemudian tambahkan kode berikut:
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",
}
}
Jalankan server uji untuk memastikan semuanya masih berfungsi. Tambahkan beberapa record lagi ke database.
Penyiapan Heroku
Tambahkan Procfile ke direktori utama:
$ touch Procfile
dan tambahkan kode berikut ke file:
web: python manage.py runserver 0.0.0.0:$PORT --noreload
Pasang sabuk alat Heroku:
$ pip install django-toolbelt
Membekukan dependensi:
$ pip freeze > requirements.txt
Perbarui wsgi.py berkas:
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
Uji setelan Heroku Anda secara lokal:
$ foreman start
Arahkan ke http://localhost:5000/.
Terlihat bagus? Ayo jalankan Amazon S3.
Amazon S3
Meskipun secara hipotetis mungkin untuk meng-host file statis di repo Heroku Anda, yang terbaik adalah menggunakan host pihak ketiga, terutama jika Anda memiliki aplikasi yang menghadap pelanggan. S3 mudah digunakan, dan hanya memerlukan sedikit perubahan pada settings.py your Anda berkas.
Instal dependensi:
$ pip install django-storages
$ pip install boto
Tambahkan storages
dan boto
ke INSTALLED_APPS
. Anda di “settings.py”
Tambahkan kode berikut ke bagian bawah “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
Pengaturan yang bergantung pada lingkungan AWS disimpan sebagai variabel lingkungan. Jadi kita tidak perlu mengaturnya dari terminal setiap kali kita menjalankan server pengembangan, kita dapat mengaturnya di virtualenv activate
naskah. Ambil nama Bucket AWS, ID Kunci Akses, dan Kunci Akses Rahasia dari S3. Buka myenv/bin/activate
dan tambahkan kode berikut (pastikan untuk menambahkan info spesifik yang baru saja Anda ambil dari 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
Nonaktifkan dan aktifkan kembali virtualenv Anda, lalu luncurkan server lokal untuk memastikan perubahan telah diterapkan:
$ foreman start
Matikan server, lalu perbarui requirements.txt berkas:
$ pip freeze > requirements.txt
Dorong ke Github dan Heroku
Mari kita backup file kita ke Github sebelum PUSHing ke Heroku:
$ git add .
$ git commit -m "update project for heroku and S3"
$ git push -u origin master
Buat Proyek/Repo Heroku:
$ heroku create <name>
Beri nama apa pun yang Anda suka.
PUSH ke Heroku:
$ git push heroku master
Kirim variabel lingkungan AWS ke 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
Kumpulkan file statis dan kirim ke Amazon:
$ heroku run python manage.py collectstatic
Tambahkan basis data pengembangan:
$ 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
Sekarang sinkronkan DB:
$ heroku run python manage.py syncdb
Transfer data
Kita perlu mentransfer data dari database lokal ke database produksi.
Instal add-on Heroku PGBackups:
$ heroku addons:add pgbackups
Buang database lokal Anda:
$ pg_dump -h localhost -Fc library > db.dump
Agar Heroku dapat mengakses db dump, Anda perlu mengunggahnya ke Internet di suatu tempat. Anda dapat menggunakan situs web pribadi, dropbox, atau S3. Saya cukup mengunggahnya ke ember S3.
Impor dump ke Heroku:
$ heroku pgbackups:restore DATABASE http://www.example.com/db.dump
Uji
Mari kita uji untuk memastikan semuanya berfungsi.
Pertama, perbarui host yang diizinkan ke domain spesifik Anda di settings.py :
ALLOWED_HOSTS = ['[your-project-name].herokuapp.com']
Lihat aplikasi Anda:
$ heroku open
Kain
Fabric digunakan untuk mengotomatiskan penerapan aplikasi Anda.
Instal:
$ pip install fabric
Buat file fab:
$ touch fabfile.py
Kemudian tambahkan kode berikut:
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')
Tes:
$ fab deploy
Ada pertanyaan atau komentar? Bergabunglah dengan diskusi di bawah ini.