Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Di chuyển Dự án Django của bạn sang Heroku

Trong hướng dẫn này, chúng ta sẽ thực hiện một dự án Django cục bộ đơn giản, được hỗ trợ bởi cơ sở dữ liệu MySQL và chuyển đổi nó để chạy trên Heroku. Amazon S3 sẽ được sử dụng để lưu trữ các tệp tĩnh của chúng tôi, trong khi Fabric sẽ tự động hóa quá trình triển khai.

Dự án là một hệ thống tin nhắn đơn giản. Nó có thể là một ứng dụng todo hoặc một blog hoặc thậm chí là một bản sao của Twitter. Để mô phỏng một kịch bản thực tế, trước tiên Dự án sẽ được tạo với phần phụ trợ MySQL, sau đó được chuyển đổi thành Postgres để triển khai trên Heroku. Cá nhân tôi đã có năm hoặc sáu dự án mà tôi phải làm điều chính xác này:chuyển đổi một Dự án cục bộ, được hỗ trợ bằng MySQL, thành một ứng dụng trực tiếp trên Heroku.


Thiết lập


Điều kiện tiên quyết

  1. Đọc hướng dẫn Bắt đầu nhanh Django chính thức tại Heroku. Chỉ cần đọc nó. Điều này sẽ giúp bạn cảm nhận được những gì chúng tôi sẽ hoàn thành trong hướng dẫn này. Chúng tôi sẽ sử dụng hướng dẫn chính thức làm hướng dẫn cho quy trình triển khai nâng cao hơn của riêng chúng tôi.
  2. Tạo tài khoản AWS và thiết lập nhóm S3 đang hoạt động.
  3. Cài đặt MySQL.


Hãy bắt đầu

Bắt đầu bằng cách tải xuống Dự án thử nghiệm tại đây, giải nén, sau đó kích hoạt virtualenv:

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

Tạo một kho lưu trữ mới trên Github:

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

Đảm bảo thay thế tất cả chữ hoa KEYWORDS bằng cài đặt của riêng bạn. Ví dụ:curl -u 'mjhea0' https://api.github.com/user/repos -d '{"name":"django-deploy-heroku-s3"}'

Thêm tệp readme, khởi tạo repo Git cục bộ, sau đó PUSH bản sao cục bộ vào 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

Đảm bảo thay đổi URL thành URL của kho lưu trữ mà bạn đã tạo ở bước trước.

Thiết lập cơ sở dữ liệu MySQL mới có tên là 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

Cập nhật settings.py :

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

Cài đặt các phụ thuộc:

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

Chạy máy chủ tại http:// localhost:8000 / admin / và đảm bảo rằng bạn có thể đăng nhập vào quản trị viên. Thêm một vài mục vào Whatever vật. Hủy máy chủ.




Chuyển đổi từ MySQL sang Postgres

Lưu ý: Trong tình huống giả định này, hãy giả sử rằng bạn đã làm việc trên Dự án này một thời gian bằng cách sử dụng MySQL và bây giờ bạn muốn chuyển đổi nó thành Postgres.

Cài đặt phần phụ thuộc:

$ pip install psycopg2
$ pip install py-mysql2pgsql

Thiết lập cơ sở dữ liệu Postgres:

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

Di chuyển dữ liệu:

$ py-mysql2pgsql

Lệnh này tạo một tệp có tên là mysql2pgsql.yml , chứa thông tin sau:

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

Cập nhật điều này cho cấu hình của bạn. Ví dụ này chỉ bao gồm chuyển đổi cơ bản. Bạn cũng có thể bao gồm hoặc loại trừ một số bảng nhất định. Xem ví dụ đầy đủ tại đây.

Chuyển dữ liệu:

$ py-mysql2pgsql -v -f mysql2pgsql.yml

Sau khi dữ liệu được chuyển, hãy nhớ cập nhật settings.py của bạn tệp:

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

Cuối cùng, đồng bộ hóa lại cơ sở dữ liệu, chạy máy chủ thử nghiệm và thêm một mục khác vào cơ sở dữ liệu để đảm bảo chuyển đổi thành công.



Thêm tệp local_settings.py

Bằng cách thêm một local_settings.py , bạn có thể mở rộng settings.py tệp với các cài đặt có liên quan đến môi trường cục bộ của bạn, trong khi settings.py chính tệp chỉ được sử dụng cho môi trường dàn dựng và sản xuất của bạn.

Đảm bảo rằng bạn thêm local_settings.py tới .gitignore của bạn để giữ cho tệp không nằm trong kho lưu trữ của bạn. Sau đó, những người muốn sử dụng hoặc đóng góp cho dự án của bạn có thể sao chép repo và tạo local_settings.py của riêng họ tệp cụ thể cho môi trường cục bộ của riêng họ.

Mặc dù phương pháp sử dụng hai tệp cài đặt này đã được quy ước trong một số năm, nhiều nhà phát triển Python hiện sử dụng một mẫu khác được gọi là Một cách thực sự. Chúng tôi có thể xem xét mô hình này trong một hướng dẫn trong tương lai.


Cập nhật cài đặt.py

Chúng tôi cần thực hiện ba thay đổi đối với settings.py hiện tại của mình tệp:

Thay đổi DEBUG chế độ thành false:

DEBUG = False

Thêm mã sau vào cuối tệp:

# 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

Cập nhật cài đặt cơ sở dữ liệu:

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

Tạo local_settings.py của bạn tệp:

$ touch local_settings.py
$ pip install dj_database_url

Sau đó, thêm mã sau:

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

Kích hoạt máy chủ thử nghiệm để đảm bảo mọi thứ vẫn hoạt động. Thêm một vài bản ghi nữa vào cơ sở dữ liệu.




Thiết lập Heroku

Thêm một Procfile vào thư mục chính:

$ touch Procfile

và thêm mã sau vào tệp:

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

Cài đặt đai công cụ Heroku:

$ pip install django-toolbelt

Cố định các phần phụ thuộc:

$ pip freeze > requirements.txt

Cập nhật wsgi.py tệp:

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

application = Cling(get_wsgi_application())

Kiểm tra cài đặt Heroku cục bộ của bạn:

$ foreman start

Điều hướng đến http:// localhost:5000 /.

Trông được? Hãy bắt đầu chạy Amazon S3.



Amazon S3

Mặc dù theo giả thuyết, có thể lưu trữ các tệp tĩnh trong đại diện Heroku của bạn, nhưng tốt nhất bạn nên sử dụng máy chủ lưu trữ của bên thứ ba, đặc biệt nếu bạn có ứng dụng dành cho khách hàng. S3 rất dễ sử dụng và nó chỉ yêu cầu một vài thay đổi đối với settings.py của bạn tệp.

Cài đặt phần phụ thuộc:

$ pip install django-storages
$ pip install boto

Thêm storagesboto vào INSTALLED_APPS của bạn trong “settings.py”

Thêm mã sau vào cuối “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

Các cài đặt phụ thuộc vào môi trường AWS được lưu trữ dưới dạng các biến môi trường. Vì vậy, chúng tôi không phải đặt các cài đặt này từ thiết bị đầu cuối mỗi khi chạy máy chủ phát triển, chúng tôi có thể đặt các cài đặt này trong activate virtualenv của chúng tôi kịch bản. Lấy tên Nhóm AWS, ID khóa truy cập và Khóa truy cập bí mật từ S3. Mở myenv/bin/activate và nối mã sau (đảm bảo thêm thông tin cụ thể của bạn mà bạn vừa lấy từ 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

Hủy kích hoạt và kích hoạt lại virtualenv của bạn, sau đó khởi chạy máy chủ cục bộ để đảm bảo các thay đổi đã thực hiện có ảnh hưởng:

$ foreman start

Gỡ máy chủ, sau đó cập nhật tệp tin yêu cầu tệp:

$ pip freeze > requirements.txt


Đẩy lên Github và Heroku

Hãy sao lưu các tệp của chúng ta vào Github trước khi PUSHing sang Heroku:

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

Tạo một dự án Heroku / Repo:

$ heroku create <name>

Đặt tên cho nó bất cứ điều gì bạn muốn.

PUSH sang Heroku:

$ git push heroku master

Gửi các biến môi trường AWS tới 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

Thu thập các tệp tĩnh và gửi đến Amazon:

$ heroku run python manage.py collectstatic

Thêm cơ sở dữ liệu phát triển:

$ 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

Bây giờ đồng bộ hóa DB:

$ heroku run python manage.py syncdb


Truyền dữ liệu

Chúng tôi cần chuyển dữ liệu từ cơ sở dữ liệu cục bộ sang cơ sở dữ liệu sản xuất.

Cài đặt tiện ích bổ sung Heroku PGBackups:

$ heroku addons:add pgbackups

Kết xuất cơ sở dữ liệu cục bộ của bạn:

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

Để Heroku có thể truy cập vào db dump, bạn cần tải nó lên Internet ở một nơi nào đó. Bạn có thể sử dụng trang web cá nhân, tài khoản đăng hoặc S3. Tôi chỉ đơn giản là tải nó lên nhóm S3.

Nhập kết xuất vào Heroku:

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


Kiểm tra

Hãy kiểm tra để đảm bảo mọi thứ đều hoạt động.

Trước tiên, hãy cập nhật các máy chủ được phép lên miền cụ thể của bạn trong settings.py :

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

Kiểm tra ứng dụng của bạn:

$ heroku open


Vải

Vải được sử dụng để tự động hóa việc triển khai ứng dụng của bạn.

Cài đặt:

$ pip install fabric

Tạo fabfile:

$ touch fabfile.py

Sau đó, thêm mã sau:

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

Kiểm tra:

$ fab deploy

Có câu hỏi hoặc nhận xét? Tham gia thảo luận bên dưới.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách các kế hoạch song song bắt đầu - Phần 2

  2. FrankenQueries:khi SQL và NoSQL xung đột

  3. Khám phá chuyên sâu về bảo mật cấp hàng

  4. Cách xóa hàng trong SQL

  5. Cách cài đặt và cấu hình ClickHouse trên Ubuntu 20.04