Django CMS trên Cloud Run

1. Giới thiệu

89eb4723767d4525.png

Cloud Run là một nền tảng điện toán được quản lý, cho phép bạn chạy các vùng chứa không trạng thái có thể gọi được thông qua các yêu cầu HTTP. Cloud Run là dịch vụ không máy chủ: dịch vụ này loại bỏ mọi hoạt động quản lý cơ sở hạ tầng, nhờ đó bạn có thể tập trung vào những việc quan trọng nhất – xây dựng các ứng dụng tuyệt vời.

Nền tảng này cũng có giao diện gốc với nhiều phần khác của hệ sinh thái Google Cloud, bao gồm cả Cloud SQL cho cơ sở dữ liệu được quản lý, Cloud Storage cho bộ nhớ đối tượng hợp nhất và Secret Manager để quản lý các bí mật.

Django CMS là một hệ thống quản lý nội dung (CMS) dành cho doanh nghiệp, được xây dựng dựa trên Django. Django là một khung web Python cấp cao.

Trong hướng dẫn này, bạn sẽ sử dụng các thành phần này để triển khai một dự án nhỏ trên Django CMS.

Lưu ý: Lớp học lập trình này được xác minh lần gần đây nhất bằng Django CMS 4.1.2 thông qua django-cms/cms-template v4.1.

Kiến thức bạn sẽ học được

  • Cách sử dụng Cloud Shell
  • Cách tạo cơ sở dữ liệu Cloud SQL
  • Cách tạo bộ chứa Cloud Storage
  • Cách tạo bí mật Secret Manager
  • Cách sử dụng Bí mật từ các dịch vụ khác nhau của Google Cloud
  • Cách kết nối các thành phần của Google Cloud với một dịch vụ Cloud Run
  • Cách sử dụng Container Registry để lưu trữ các vùng chứa đã tạo
  • Cách triển khai lên Cloud Run
  • Cách chạy quy trình di chuyển giản đồ cơ sở dữ liệu trong Cloud Build

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.

Google Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên Đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Nếu đây là lần đầu tiên bạn khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

d95252b003979716.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

7833d5e1c5d18f54.png

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Đầu ra của lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

3. Bật Cloud API

Từ Cloud Shell, hãy bật API Cloud cho các thành phần sẽ được dùng:

gcloud services enable \
  run.googleapis.com \
  sql-component.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  cloudbuild.googleapis.com \
  secretmanager.googleapis.com \
  artifactregistry.googleapis.com

Vì đây là lần đầu tiên bạn gọi API từ gcloud, nên bạn sẽ được yêu cầu uỷ quyền bằng thông tin xác thực của mình để thực hiện yêu cầu này. Thao tác này sẽ diễn ra một lần cho mỗi phiên Cloud Shell.

Thao tác này có thể mất vài phút để hoàn tất.

Sau khi hoàn tất, bạn sẽ thấy một thông báo thành công tương tự như thông báo này:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

4. Tạo dự án mẫu

Bạn sẽ dùng cms-template của Django CMS làm dự án mẫu của Django CMS.

Để tạo dự án mẫu này, hãy dùng Cloud Shell để tạo một thư mục mới có tên djangocms-cloudrun rồi chuyển đến thư mục đó:

mkdir ~/djangocms-cloudrun
cd ~/djangocms-cloudrun

Cài đặt gói django-cms vào một môi trường ảo tạm thời:

virtualenv venv
source venv/bin/activate
pip install djangocms-frontend\[cms-4]

Tạo bản sao của dự án cms-template:

django-admin startproject --template https://github.com/django-cms/cms-template/archive/4.1.zip myproject .

Đổi tên tệp requirements.in thành requirements.txt. (Tệp .in là của pip-tools để tạo tệp requirements.txt, nhưng bạn có thể sử dụng tệp này như hiện tại nếu thay đổi đuôi tệp. Trong các bước sau, pip dự kiến sẽ có tiện ích .txt.)

mv requirements.in requirements.txt

Giờ đây, bạn sẽ có một dự án Django CMS mẫu trong một thư mục có tên là myproject:

ls -F
manage.py*  media/  myproject/  project.db requirements.txt  static/ venv/

Giờ đây, bạn có thể thoát và xoá môi trường ảo tạm thời:

deactivate
rm -rf venv

Từ đây, Django CMS sẽ được gọi trong vùng chứa.

5. Tạo các dịch vụ hỗ trợ

Bây giờ, bạn sẽ tạo các dịch vụ hỗ trợ: một tài khoản dịch vụ chuyên dụng, một Artifact Registry, một cơ sở dữ liệu Cloud SQL, một bộ chứa Cloud Storage và một số giá trị Secret Manager.

Việc bảo mật các giá trị của mật khẩu được dùng trong quá trình triển khai là rất quan trọng đối với tính bảo mật của mọi dự án, đồng thời đảm bảo rằng không ai vô tình đặt mật khẩu ở những nơi không phù hợp (ví dụ: trực tiếp trong tệp cài đặt hoặc nhập trực tiếp vào thiết bị đầu cuối nơi mật khẩu có thể được truy xuất từ nhật ký).

Để bắt đầu, hãy đặt 2 biến môi trường cơ bản, một cho mã dự án:

PROJECT_ID=$(gcloud config get-value core/project)

Và một cho khu vực:

REGION=us-central1

Tạo một tài khoản dịch vụ

Để hạn chế quyền truy cập của dịch vụ vào các phần khác của Google Cloud, hãy tạo một tài khoản dịch vụ chuyên dụng:

gcloud iam service-accounts create cloudrun-serviceaccount

Bạn sẽ tham chiếu tài khoản này bằng email trong các phần sau của lớp học lập trình này. Đặt giá trị đó trong một biến môi trường:

SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
    --filter cloudrun-serviceaccount --format "value(email)")

Tạo Artifact Registry

Để lưu trữ hình ảnh vùng chứa đã tạo, hãy tạo một sổ đăng ký vùng chứa trong khu vực bạn chọn:

gcloud artifacts repositories create containers --repository-format docker --location $REGION

Bạn sẽ tham chiếu sổ đăng ký này theo tên trong các phần sau của lớp học lập trình này:

ARTIFACT_REGISTRY=${REGION}-docker.pkg.dev/${PROJECT_ID}/containers

Tạo cơ sở dữ liệu

Tạo một phiên bản Cloud SQL:

gcloud sql instances create myinstance --project $PROJECT_ID \
  --database-version POSTGRES_14 --tier db-f1-micro --region $REGION

Thao tác này có thể mất vài phút để hoàn tất.

Trong phiên bản đó, hãy tạo một cơ sở dữ liệu:

gcloud sql databases create mydatabase --instance myinstance

Trong cùng một phiên bản đó, hãy tạo một người dùng:

DJPASS="$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1)"
gcloud sql users create djuser --instance myinstance --password $DJPASS

Cấp cho tài khoản dịch vụ quyền kết nối với phiên bản:

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/cloudsql.client

Tạo bộ chứa lưu trữ

Tạo một bộ chứa Cloud Storage (lưu ý rằng tên phải là duy nhất trên toàn cầu):

GS_BUCKET_NAME=${PROJECT_ID}-media
gcloud storage buckets create gs://${GS_BUCKET_NAME} --location ${REGION} 

Cấp quyền cho tài khoản dịch vụ để quản trị bộ chứa:

gcloud storage buckets add-iam-policy-binding gs://${GS_BUCKET_NAME} \
    --member serviceAccount:${SERVICE_ACCOUNT} \
    --role roles/storage.admin

Vì các đối tượng được lưu trữ trong vùng lưu trữ sẽ có nguồn gốc khác (URL vùng lưu trữ thay vì URL Cloud Run), nên bạn cần định cấu hình chế độ cài đặt Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS).

Tạo một tệp mới có tên là cors.json, với nội dung sau:

touch cors.json
cloudshell edit cors.json

cors.json

[
    {
      "origin": ["*"],
      "responseHeader": ["Content-Type"],
      "method": ["GET"],
      "maxAgeSeconds": 3600
    }
]

Áp dụng cấu hình CORS này cho bộ chứa lưu trữ mới tạo:

gsutil cors set cors.json gs://$GS_BUCKET_NAME

Lưu trữ cấu hình dưới dạng khoá bí mật

Sau khi thiết lập các dịch vụ hỗ trợ, giờ đây, bạn sẽ lưu trữ những giá trị này trong một tệp được bảo vệ bằng Secret Manager.

Secret Manager cho phép bạn lưu trữ, quản lý và truy cập vào các dữ liệu bí mật dưới dạng các blob nhị phân hoặc chuỗi văn bản. Tính năng này hoạt động hiệu quả khi lưu trữ thông tin cấu hình, chẳng hạn như mật khẩu cơ sở dữ liệu, khoá API hoặc chứng chỉ TLS mà ứng dụng cần trong thời gian chạy.

Trước tiên, hãy tạo một tệp có các giá trị cho chuỗi kết nối cơ sở dữ liệu, nhóm nội dung nghe nhìn, khoá bí mật cho Django (dùng để ký mã hoá các phiên và mã thông báo) và để bật tính năng gỡ lỗi:

echo DATABASE_URL=\"postgres://djuser:${DJPASS}@//cloudsql/${PROJECT_ID}:${REGION}:myinstance/mydatabase\" > .env

echo GS_BUCKET_NAME=\"${GS_BUCKET_NAME}\" >> .env

echo SECRET_KEY=\"$(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 50 | head -n 1)\" >> .env

echo DEBUG=True >> .env

Sau đó, hãy tạo một mã bí mật có tên là application_settings, sử dụng tệp đó làm mã bí mật:

gcloud secrets create application_settings --data-file .env

Cho phép tài khoản dịch vụ truy cập vào khoá bí mật này:

gcloud secrets add-iam-policy-binding application_settings \
  --member serviceAccount:${SERVICE_ACCOUNT} --role roles/secretmanager.secretAccessor

Xác nhận rằng bạn đã tạo khoá bí mật bằng cách liệt kê các khoá bí mật:

gcloud secrets versions list application_settings

Sau khi xác nhận rằng khoá bí mật đã được tạo, hãy xoá tệp cục bộ:

rm .env

6. Định cấu hình ứng dụng

Với các dịch vụ hỗ trợ mà bạn vừa tạo, bạn cần thực hiện một số thay đổi đối với dự án mẫu cho phù hợp.

Điều này bao gồm việc giới thiệu django-environ để sử dụng các biến môi trường làm chế độ cài đặt cấu hình. Bạn sẽ gieo các biến này bằng những giá trị mà bạn đã xác định là bí mật. Để triển khai việc này, bạn sẽ mở rộng chế độ cài đặt mẫu. Bạn cũng cần thêm các phần phụ thuộc bổ sung của Python.

Định cấu hình chế độ cài đặt

Di chuyển tệp settings.py và đổi tên thành basesettings.py:

mv myproject/settings.py myproject/basesettings.py

Khi dùng trình chỉnh sửa web Cloud Shell, hãy tạo một tệp settings.py mới bằng mã sau:

touch myproject/settings.py
cloudshell edit myproject/settings.py

myproject/settings.py

import io
import os
from urllib.parse import urlparse

import environ

# Import the original settings from each template
from .basesettings import *

# Load the settings from the environment variable
env = environ.Env()
env.read_env(io.StringIO(os.environ.get("APPLICATION_SETTINGS", None)))

# Setting this value from django-environ
SECRET_KEY = env("SECRET_KEY")

# Ensure myproject is added to the installed applications
if "myproject" not in INSTALLED_APPS:
    INSTALLED_APPS.append("myproject")

# If defined, add service URLs to Django security settings
CLOUDRUN_SERVICE_URLS = env("CLOUDRUN_SERVICE_URLS", default=None)
if CLOUDRUN_SERVICE_URLS:
    CSRF_TRUSTED_ORIGINS = env("CLOUDRUN_SERVICE_URLS").split(",")
    # Remove the scheme from URLs for ALLOWED_HOSTS
    ALLOWED_HOSTS = [urlparse(url).netloc for url in CSRF_TRUSTED_ORIGINS]
else:
    ALLOWED_HOSTS = ["*"]

# Default false. True allows default landing pages to be visible
DEBUG = env("DEBUG", default=False)

# Set this value from django-environ
DATABASES = {"default": env.db()}

# Change database settings if using the Cloud SQL Auth Proxy
if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

# Define static storage via django-storages[google]
GS_BUCKET_NAME = env("GS_BUCKET_NAME")
STATICFILES_DIRS = []
GS_DEFAULT_ACL = "publicRead"
STORAGES = {
    "default": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
    "staticfiles": {
        "BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
    },
}

Hãy dành thời gian đọc phần bình luận được thêm vào về từng cấu hình.

Xin lưu ý rằng bạn có thể thấy lỗi linting trên tệp này. Lỗi này có thể xảy ra. Cloud Shell không có ngữ cảnh về các yêu cầu đối với dự án này, do đó có thể báo cáo các mục nhập không hợp lệ và các mục nhập không dùng đến.

Phần phụ thuộc Python

Tìm tệp requirements.txt rồi thêm các gói sau:

cloudshell edit requirements.txt

requirements.txt (append)

gunicorn
psycopg2-binary
django-storages[google]
django-environ

Xác định hình ảnh ứng dụng

Cloud Run sẽ chạy mọi vùng chứa miễn là vùng chứa đó tuân thủ Hợp đồng vùng chứa Cloud Run. Hướng dẫn này chọn bỏ qua Dockerfile, nhưng thay vào đó sử dụng Cloud Native Buildpacks. Buildpack hỗ trợ tạo các vùng chứa cho các ngôn ngữ phổ biến, bao gồm cả Python.

Hướng dẫn này chọn tuỳ chỉnh Procfile dùng để khởi động ứng dụng web.

Để chứa dự án mẫu, trước tiên, hãy tạo một tệp mới có tên là Procfile ở cấp cao nhất của dự án (trong cùng thư mục với manage.py) rồi sao chép nội dung sau:

touch Procfile
cloudshell edit Procfile

Procfile

web: gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 myproject.wsgi:application

7. Định cấu hình, tạo và chạy các bước di chuyển

Để tạo giản đồ cơ sở dữ liệu trong cơ sở dữ liệu Cloud SQL và điền vào bộ chứa Cloud Storage bằng các tài sản tĩnh, bạn cần chạy migratecollectstatic.

Bạn cần chạy các lệnh di chuyển Django cơ bản này trong ngữ cảnh của hình ảnh vùng chứa đã tạo có quyền truy cập vào cơ sở dữ liệu của bạn.

Bạn cũng cần chạy createsuperuser để tạo tài khoản quản trị viên nhằm đăng nhập vào trang quản trị Django.

Để thực hiện việc này, bạn sẽ dùng Cloud Run Jobs để thực hiện các tác vụ này. Các công việc trên Cloud Run cho phép bạn chạy các quy trình có điểm kết thúc xác định, giúp các công việc này trở nên lý tưởng cho các tác vụ quản trị.

Xác định mật khẩu người dùng cấp cao Django

Để tạo siêu người dùng, bạn sẽ sử dụng phiên bản không tương tác của lệnh createsuperuser. Lệnh này yêu cầu một biến môi trường có tên đặc biệt để sử dụng thay cho lời nhắc nhập mật khẩu.

Tạo một khoá bí mật mới bằng mật khẩu được tạo ngẫu nhiên:

echo -n $(cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 30 | head -n 1) | gcloud secrets create django_superuser_password --data-file=-

Cho phép tài khoản dịch vụ của bạn truy cập vào khoá bí mật này:

gcloud secrets add-iam-policy-binding django_superuser_password \
  --member serviceAccount:${SERVICE_ACCOUNT} \
  --role roles/secretmanager.secretAccessor

Cập nhật Procfile

Để giúp các công việc Cloud Run của bạn rõ ràng hơn, hãy tạo lối tắt trong Procfile, thêm các điểm truy cập sau vào Procfile:

migrate: python manage.py migrate && python manage.py collectstatic --noinput --clear
createuser: python manage.py createsuperuser --username admin --email noop@example.com --noinput

Giờ đây, bạn sẽ có 3 mục: điểm truy cập web mặc định, điểm truy cập migrate để áp dụng các hoạt động di chuyển cơ sở dữ liệu và điểm truy cập createuser để chạy lệnh createsuperuser.

Tạo hình ảnh ứng dụng

Sau khi cập nhật Procfile, hãy tạo hình ảnh:

gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage

Tạo các công việc trên Cloud Run

Giờ đây, khi đã có hình ảnh, bạn có thể tạo các công việc Cloud Run bằng hình ảnh đó.

Các lệnh này sử dụng hình ảnh đã được tạo trước đó, nhưng sử dụng các giá trị command khác nhau. Các giá trị này tương ứng với các giá trị trong Procfile.

Tạo một lệnh di chuyển:

gcloud run jobs create migrate \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --service-account $SERVICE_ACCOUNT \
  --command migrate

Tạo một công việc để tạo người dùng:

gcloud run jobs create createuser \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --set-secrets DJANGO_SUPERUSER_PASSWORD=django_superuser_password:latest \
  --service-account $SERVICE_ACCOUNT \
  --command createuser

Thực thi các công việc Cloud Run

Sau khi thiết lập cấu hình công việc, hãy chạy quy trình di chuyển:

gcloud run jobs execute migrate --region $REGION --wait

Đảm bảo đầu ra của lệnh này cho biết quá trình thực thi đã "hoàn tất thành công".

Bạn sẽ chạy lệnh này sau khi cập nhật ứng dụng.

Khi thiết lập cơ sở dữ liệu, hãy tạo người dùng bằng cách sử dụng công việc:

gcloud run jobs execute createuser --region $REGION --wait

Đảm bảo đầu ra của lệnh này cho biết quá trình thực thi đã "hoàn tất thành công".

Bạn sẽ không phải chạy lại lệnh này.

8. Triển khai lên Cloud Run

Sau khi tạo và điền sẵn các dịch vụ hỗ trợ, giờ đây, bạn có thể tạo dịch vụ Cloud Run để truy cập vào các dịch vụ đó.

Việc triển khai ban đầu ứng dụng được chứa trong vùng chứa của bạn lên Cloud Run được tạo bằng lệnh sau:

gcloud run deploy djangocms-cloudrun \
  --region $REGION \
  --image ${ARTIFACT_REGISTRY}/myimage \
  --set-cloudsql-instances ${PROJECT_ID}:${REGION}:myinstance \
  --set-secrets APPLICATION_SETTINGS=application_settings:latest \
  --service-account $SERVICE_ACCOUNT \
  --allow-unauthenticated

Đợi vài phút cho đến khi quá trình triển khai hoàn tất. Khi thành công, dòng lệnh sẽ hiển thị URL của dịch vụ:

Service [djangocms-cloudrun] revision [djangocms-cloudrun-00001-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://djangocms-cloudrun-...run.app

Giờ đây, bạn có thể truy cập vào vùng chứa đã triển khai bằng cách mở URL này trong trình duyệt web:

e1fb6858bf11626a.png

Vì đây là một lần cài đặt mới, nên bạn sẽ tự động được chuyển hướng đến trang đăng nhập.

9. Truy cập vào Trang quản trị Django

Một trong những tính năng chính của Django CMS là giao diện quản trị tương tác.

Đang cập nhật chế độ cài đặt CSRF

Django có các biện pháp bảo vệ chống lại Giả mạo yêu cầu trên nhiều trang web (CSRF). Bất cứ khi nào một biểu mẫu được gửi trên trang web Django của bạn, kể cả khi bạn đăng nhập vào trang quản trị Django, chế độ cài đặt Nguồn gốc đáng tin cậy sẽ được kiểm tra. Nếu không khớp với nguồn gốc của yêu cầu, Django sẽ trả về lỗi.

Trong tệp mysite/settings.py, nếu biến môi trường CLOUDRUN_SERVICE_URL được xác định, thì biến này sẽ được dùng trong các chế độ cài đặt CSRF_TRUSTED_ORIGINSALLOWED_HOSTS. Mặc dù không bắt buộc phải xác định ALLOWED_HOSTS, nhưng bạn nên thêm tham số này vì tham số này đã bắt buộc đối với CSRF_TRUSTED_ORIGINS.

Vì bạn cần URL dịch vụ của mình, nên bạn không thể thêm cấu hình này cho đến sau lần triển khai đầu tiên.

Bạn sẽ phải cập nhật dịch vụ của mình để thêm biến môi trường này. Bạn có thể thêm khoá này vào bí mật application_settings hoặc thêm trực tiếp dưới dạng một biến môi trường.

Phương thức triển khai bên dưới tận dụng tính năng định dạngthoát của gcloud.

Truy xuất URL dịch vụ của bạn:

CLOUDRUN_SERVICE_URLS=$(gcloud run services describe djangocms-cloudrun \
  --region $REGION  \
  --format "value(metadata.annotations[\"run.googleapis.com/urls\"])" | tr -d '"[]')
echo $CLOUDRUN_SERVICE_URLS

Đặt giá trị này làm biến môi trường trên dịch vụ Cloud Run:

gcloud run services update djangocms-cloudrun \
  --region $REGION \
  --update-env-vars "^##^CLOUDRUN_SERVICE_URLS=$CLOUDRUN_SERVICE_URLS"

Đăng nhập vào trang quản trị Django

Để truy cập vào giao diện quản trị Django, hãy thêm /admin vào URL dịch vụ của bạn.

Bây giờ, hãy đăng nhập bằng tên người dùng "admin" và truy xuất mật khẩu bằng lệnh sau:

gcloud secrets versions access latest --secret django_superuser_password && echo ""

da10a148bc1c7994.png

10. Áp dụng bản cập nhật ứng dụng

Khi phát triển ứng dụng, bạn sẽ muốn kiểm thử ứng dụng đó trên thiết bị của mình. Để làm việc đó, bạn sẽ cần kết nối với cơ sở dữ liệu Cloud SQL ("sản xuất") hoặc cơ sở dữ liệu cục bộ ("thử nghiệm").

Kết nối với cơ sở dữ liệu sản xuất

Bạn có thể kết nối với các phiên bản Cloud SQL bằng cách sử dụng Cloud SQL Auth Proxy. Ứng dụng này tạo một kết nối từ máy cục bộ đến cơ sở dữ liệu.

Sau khi bạn cài đặt Cloud SQL Auth Proxy, hãy làm theo các bước sau:

# Create a virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

# Copy the application settings to your local machine
gcloud secrets versions access latest --secret application_settings > temp_settings

# Run the Cloud SQL Auth Proxy
./cloud-sql-proxy ${PROJECT_ID}:${REGION}:myinstance

# In a new tab, start the local web server using these new settings
USE_CLOUD_SQL_AUTH_PROXY=true APPLICATION_SETTINGS=$(cat temp_settings) python manage.py runserver

Đảm bảo bạn xoá tệp temp_settings sau khi hoàn tất công việc.

Kết nối với cơ sở dữ liệu SQLite cục bộ

Ngoài ra, bạn có thể sử dụng cơ sở dữ liệu cục bộ khi phát triển ứng dụng. Django hỗ trợ cả cơ sở dữ liệu PostgreSQL và SQLite. PostgreSQL có một số tính năng mà SQLite không có, nhưng trong nhiều trường hợp, chức năng của hai cơ sở dữ liệu này là giống nhau.

Để thiết lập SQLite, bạn sẽ phải cập nhật chế độ cài đặt ứng dụng để trỏ đến một cơ sở dữ liệu cục bộ, sau đó bạn sẽ phải áp dụng các quy trình di chuyển giản đồ.

Cách thiết lập phương thức này:

# Create a virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

# Copy the application settings to your local machine
gcloud secrets versions access latest --secret application_settings > temp_settings

# Edit the DATABASE_URL setting to use a local sqlite file. For example:
DATABASE_URL=sqlite:////tmp/my-tmp-sqlite.db

# Set the updated settings as an environment variable
APPLICATION_SETTINGS=$(cat temp_settings) 

# Apply migrations to the local database
python manage.py migrate

# Start the local web server
python manage.py runserver

Đảm bảo bạn xoá tệp temp_settings sau khi hoàn tất công việc.

Tạo các lượt di chuyển

Khi thực hiện các thay đổi đối với mô hình cơ sở dữ liệu, bạn có thể cần tạo các tệp di chuyển của Django bằng cách chạy python manage.py makemigrations.

Bạn có thể chạy lệnh này sau khi thiết lập kết nối cơ sở dữ liệu kiểm thử hoặc sản xuất. Ngoài ra, bạn có thể tạo các tệp di chuyển mà không cần cơ sở dữ liệu bằng cách cung cấp chế độ cài đặt trống:

SECRET_KEY="" DATABASE_URL="" GS_BUCKET_NAME="" python manage.py makemigrations

Áp dụng bản cập nhật ứng dụng

Để áp dụng các thay đổi cho ứng dụng, bạn cần:

  • tạo các thay đổi của bạn thành một hình ảnh mới,
  • áp dụng mọi hoạt động di chuyển cơ sở dữ liệu hoặc dữ liệu tĩnh, sau đó
  • cập nhật dịch vụ Cloud Run để sử dụng hình ảnh mới.

Cách tạo hình ảnh:

gcloud builds submit --pack image=${ARTIFACT_REGISTRY}/myimage

Nếu bạn có bất kỳ hoạt động di chuyển nào cần áp dụng, hãy chạy lệnh Cloud Run:

gcloud run jobs execute migrate --region $REGION --wait

Cách cập nhật dịch vụ bằng hình ảnh mới:

gcloud run services update djangocms-cloudrun \
  --platform managed \
  --region $REGION \
  --image gcr.io/${PROJECT_ID}/myimage

11. Xin chúc mừng!

Bạn vừa triển khai một dự án phức tạp lên Cloud Run!

  • Cloud Run tự động mở rộng quy mô theo chiều ngang cho hình ảnh vùng chứa của bạn để xử lý các yêu cầu nhận được, sau đó giảm quy mô khi nhu cầu giảm. Bạn chỉ phải trả tiền cho CPU, bộ nhớ và mạng được sử dụng trong quá trình xử lý yêu cầu.
  • Cloud SQL cho phép bạn cung cấp một phiên bản PostgreSQL được quản lý và tự động duy trì cho bạn, đồng thời tích hợp nguyên bản vào nhiều hệ thống của Google Cloud.
  • Cloud Storage cho phép bạn sử dụng bộ nhớ trên đám mây theo cách có thể truy cập liền mạch trong Django.
  • Secret Manager cho phép bạn lưu trữ các dữ liệu bí mật và cho phép một số phần của Google Cloud truy cập vào các dữ liệu đó, còn những phần khác thì không.

Dọn dẹp

Để tránh bị tính phí cho tài khoản Google Cloud Platform đối với các tài nguyên được dùng trong hướng dẫn này, hãy làm như sau:

  • Trong Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  • Trong danh sách dự án, hãy chọn dự án của bạn rồi nhấp vào Xoá.
  • Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.

Tìm hiểu thêm