Django CMS trên Cloud Run

Django CMS trên Cloud Run

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 1 31, 2024
account_circleTác giả: Katie McLaughlin

1. Giới thiệu

894762ebb681671c.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 có trạng thái có thể gọi qua các yêu cầu HTTP. Cloud Run là giải pháp không máy chủ: loại bỏ mọi hoạt động quản lý cơ sở hạ tầng, vì vậy, bạn có thể tập trung vào công việc quan trọng nhất — xây dựng các ứng dụng tuyệt vời.

Dịch vụ này cũng kết nối vốn với nhiều phần khác trong hệ sinh thái Google Cloud, trong đó 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 (Trình quản lý bí mật) để quản lý thông tin 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 Django CMS nhỏ.

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 3.11.4 đến django-cms/cms-template v3.11.

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 mã bí mật cho Người quản lý bí mật
  • Cách sử dụng Khoá bí mật trong nhiều dịch vụ 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ữ vùng chứa đã đóng
  • Cách triển khai Cloud Run
  • Cách chạy 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 tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.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ự không được API của Google sử dụng. Bạn luôn có thể cập nhật ứng dụng.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án của mình (thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án), mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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í 300 USD.

Google Cloud Shell

Mặc dù bạn 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 trong Đá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 853e55310c205094.pngs.

3c1dabeca90e44e5.png.

Nếu đây là lần đầu tiê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 nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.pngS

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.pngs

Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự á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

Kết quả 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

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể đặt chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Bật Cloud API

Từ Cloud Shell, hãy bật Cloud API cho những thành phần sẽ được sử 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 các API từ gcloud, nên bạn sẽ được yêu cầu cho phép bằng thông tin đăng nhập của mình để đưa ra yêu cầu này. Quá trình này sẽ chỉ 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, một thông báo thành công tương tự như thông báo này sẽ xuất hiện:

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

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

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

Để 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 là 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ôi trường ảo tạm thời:

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

Tạo bản sao của dự án mẫu cms:

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

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

ls -F
manage.py*  media/  myproject/  project.db  requirements.in 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.

Bạn cũng có thể xoá tệp yêu cầu được sao chép tự động (do pip-tools sử dụng để tạo tệp yêu cầu.txt). Phương thức này sẽ không được dùng cho lớp học lập trình này:

rm requirements.in

5. Tạo dịch vụ sao lưu

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

Việc bảo mật giá trị của các mật khẩu 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 ở nơi không thuộc về (ví dụ: trực tiếp trong tệp cài đặt hoặc được nhập trực tiếp vào thiết bị đầu cuối nơi có thể truy xuất mật khẩu từ lịch sử).

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

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

Và một tuỳ chọn cho khu vực:

REGION=us-central1

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

Để giới hạn quyền truy cập mà dịch vụ sẽ phải truy cập 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 khảo tài khoản này bằng email của tài khoản 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 một Artifact Registry

Để lưu trữ hình ảnh vùng chứa đã tạo, hãy tạo 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 thực thể 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 trường hợp đó, hãy tạo một cơ sở dữ liệu:

gcloud sql databases create mydatabase --instance myinstance

Trong cùng trường hợp đó, hãy tạo 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 quyền cho tài khoản dịch vụ để kết nối với thực thể:

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 hệ thống):

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 lý 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 bộ chứa sẽ có một nguồn gốc khác (URL của bộ chứa thay vì URL trên 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 có nội dung như 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ạng bí mật

Sau khi thiết lập các dịch vụ sao lưu, bạn sẽ lưu trữ các giá trị này trong một tệp được bảo vệ bằng Trình quản lý bí mật.

Secret Manager cho phép bạn lưu trữ, quản lý và truy cập vào các khoá bí mật dưới dạng blob nhị phân hoặc chuỗi văn bản. Thư viện này hoạt động tốt để 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 chứa các giá trị cho chuỗi kết nối cơ sở dữ liệu, bộ chứa phương tiện, khoá bí mật cho Django (dùng để ký phiên và mã thông báo bằng mật mã) 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 khoá bí mật có tên là application_settings, 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 mã thông báo 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 khoá bí mật đã được tạo 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 khoá bí mật đã được tạo, hãy xoá tệp trên máy bằng cách làm như sau:

rm .env

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

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

Quá trình này sẽ 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ẽ bắt đầu cung cấp những giá trị mà bạn đã xác định là khoá 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 sẽ cần thêm các phần phụ thuộc Python khác.

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

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

mv myproject/settings.py myproject/basesettings.py

Sử dụng trình chỉnh sửa web Cloud Shell, tạo một tệp settings.py mới có 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 URL to Django security settings
CLOUDRUN_SERVICE_URL
= env("CLOUDRUN_SERVICE_URL", default=None)
if CLOUDRUN_SERVICE_URL:
    ALLOWED_HOSTS
= [urlparse(CLOUDRUN_SERVICE_URL).netloc]
    CSRF_TRUSTED_ORIGINS
= [CLOUDRUN_SERVICE_URL]
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
= []
DEFAULT_FILE_STORAGE
= "storages.backends.gcloud.GoogleCloudStorage"
STATICFILES_STORAGE
= "storages.backends.gcloud.GoogleCloudStorage"
GS_DEFAULT_ACL
= "publicRead"

Dành thời gian đọc phần bình luận được thêm về mỗi cấu hình.

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

Các 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 (nối thêm)

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

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

Cloud Run sẽ chạy bất kỳ vùng chứa nào, miễn là nó tuân thủ Hợp đồng vùng chứa Cloud Run. Hướng dẫn này chọn bỏ qua Dockerfile mà thay vào đó sử dụng Cloud Native Buildpacks (Gói bản dựng gốc trên đám mây). Các bản dựng hỗ trợ việc tạo 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 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

Tệp 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 tài sản tĩnh vào bộ chứa của Cloud Storage, bạn cần chạy migratecollectstatic.

Các lệnh di chuyển Django cơ sở này cần được chạ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 sẽ cần chạy createsuperuser để tạo tài khoản quản trị viên nhằm đăng nhập vào quản trị viên Django.

Để thực hiện việc này, bạn sẽ dùng Cloud Run Job để thực hiện các tác vụ này. Các công việc trong Cloud Run giúp bạn chạy các quy trình có phần kết thúc xác định, giúp đảm bảo tính phù hợp cho các công việc quản trị.

Xác định mật khẩu dành cho siêu người dùng 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 sử dụng một biến môi trường được đặt tên đặc biệt 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 mã thông báo 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 trên Cloud Run trở nên rõ ràng hơn, hãy tạo lối tắt trong Procfile của bạn, thêm các điểm nhậ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

Bây giờ, bạn sẽ có 3 mục nhập: điểm truy cập web mặc định, điểm truy cập migrate để áp dụng việc 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

Với các bản cập nhật Procfile tại chỗ, hãy tạo hình ảnh:

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

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

Giờ đây, hình ảnh này đã tồn tại, bạn có thể sử dụng hình ảnh này để tạo các công việc trên Cloud Run.

Các công việc 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. Các đối tượng này liên kết với các giá trị trong Procfile.

Tạo một công việc để 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 tác vụ cho 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ông việc trên Cloud Run

Sau khi thiết lập xong cấu hình công việc, hãy tiến hành quá trình di chuyển:

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

Đảm bảo rằng kết quả 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 vào lúc khác 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 rằng kết quả 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 các dịch vụ sao lưu được tạo và điền sẵn, giờ đây bạn có thể tạo dịch vụ Cloud Run để truy cập vào các dịch vụ đó.

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

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

Hãy đợ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 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-...-uc.a.run.app

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

e54d1a1486427431.png

Do đây là bả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 Bảng điều khiển dành cho quản trị viên của Django

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

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

Django cung cấp các biện pháp bảo vệ chống lại Hành vi giả mạo yêu cầu trên nhiều trang web (CSRF). Bất cứ khi nào biểu mẫu được gửi trên trang web Django của bạn, bao gồm cả việc đăng nhập vào quản trị viên Django, 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 đó sẽ được dùng trong 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 thuộc tính này vì đây là yêu cầu bắt buộc đối với CSRF_TRUSTED_ORIGINS.

Vì cần có URL dịch vụ 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 mã thông báo này vào mã bí mật application_settings hoặc thêm trực tiếp dưới dạng biến môi trường.

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

CLOUDRUN_SERVICE_URL=$(gcloud run services describe djangocms-cloudrun \
  --platform managed \
  --region $REGION  \
  --format "value(status.url)")
echo $CLOUDRUN_SERVICE_URL

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

gcloud run services update djangocms-cloudrun \
  --region $REGION \
  --update-env-vars CLOUDRUN_SERVICE_URL=$CLOUDRUN_SERVICE_URL

Đăng nhập vào Bảng điều khiển dành cho quản trị viên của Django

Để truy cập vào giao diện quản trị của 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 ""

13d77046e2e7427.pngS

10. Đang áp dụng các 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ị. Để làm được việc đó, bạn cần kết nối với cơ sở dữ liệu Cloud SQL ("bản chính thức") hoặc cơ sở dữ liệu cục bộ ("kiểm thử").

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 thực thể Cloud SQL bằng cách sử dụng Proxy xác thực Cloud SQL. Ứng dụng này tạo kết nối từ máy cục bộ của bạn với cơ sở dữ liệu.

Sau khi bạn cài đặt Proxy xác thực Cloud SQL, 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 --instances=${PROJECT_ID}:${REGION}:myinstance=tcp:5432

# 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

Hãy nhớ xoá tệp temp_settings sau khi hoàn thành 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 của mình. Django hỗ trợ cả cơ sở dữ liệu PostgreSQL và SQLite. Có một số tính năng PostgreSQL có mà SQLite không có, nhưng trong nhiều trường hợp, chức năng giống hệt nhau.

Để thiết lập SQLite, bạn sẽ phải cập nhật các chế độ cài đặt ứng dụng của mình để trỏ đến một cơ sở dữ liệu cục bộ, sau đó bạn sẽ phải áp dụng việc 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

Hãy nhớ xoá tệp temp_settings sau khi hoàn thành công việc.

Tạo quá trình di chuyển

Khi thay đổi mô hình cơ sở dữ liệu, có thể bạn 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 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

Đang áp dụng các bản cập nhật ứng dụng

Để áp dụng các thay đổi cho đơn đăng ký, bạn cần phải:

  • tạo thay đổi thành một hình ảnh mới,
  • áp dụng bất kỳ cơ sở dữ liệu hoặc quá trình di chuyển tĩnh nào, sau đó
  • hãy 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ần áp dụng quy trình di chuyển, hãy chạy công việc trên Cloud Run:

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

Cách cập nhật dịch vụ của bạn 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 trên Cloud Run!

  • Cloud Run tự động mở rộng và điều chỉnh tỷ lệ hình ảnh vùng chứa theo chiều ngang để xử lý các yêu cầu đã nhận được, sau đó thu nhỏ lại khi nhu cầu giảm. Bạn chỉ phải thanh toán cho CPU, bộ nhớ và kết nối mạng được tiêu thụ 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ý, được quản lý tự động và tích hợp sẵn vào nhiều hệ thống của Google Cloud.
  • Cloud Storage hỗ trợ 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 giúp bạn lưu trữ các thông tin bí mật và cho phép bạn truy cập bằng một số phần của Google Cloud mà không phải các phần khác.

Dọn dẹp

Để tránh phát sinh phí vào tài khoản Google Cloud Platform của bạn cho các tài nguyên được sử dụng trong hướng dẫn này:

  • 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 rồi nhấp vào Delete (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