Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Migrasi Proyek Django Anda ke Heroku

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

  1. 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.
  2. Buat akun AWS dan siapkan bucket S3 yang aktif.
  3. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bawa Cloud Anda Sendiri Tersedia untuk DigitalOcean

  2. Apa itu Hubungan Satu-ke-Satu dalam Basis Data?

  3. Menghubungkan ke Sage dari Jawa

  4. Lebih banyak peningkatan showplan? Ya silahkan!

  5. Aturan Codd dalam SQL