Django CMS บน Cloud Run

1. บทนำ

89eb4723767d4525.png

Cloud Run เป็นแพลตฟอร์มคำนวณที่มีการจัดการซึ่งทำให้คุณเรียกใช้คอนเทนเนอร์แบบไม่เก็บสถานะที่เรียกใช้ผ่านคำขอ HTTP ได้ Cloud Run เป็นแบบ Serverless ด้วยการตัดการจัดการโครงสร้างพื้นฐานทั้งหมดออก คุณจึงมุ่งเน้นไปที่การสร้างแอปพลิเคชันที่ยอดเยี่ยม ซึ่งเป็นสิ่งที่สำคัญที่สุดได้

นอกจากนี้ยังเชื่อมต่อกับส่วนอื่นๆ ของระบบนิเวศ Google Cloud ได้โดยตรง ซึ่งรวมถึง Cloud SQL สำหรับฐานข้อมูลที่มีการจัดการ, Cloud Storage สำหรับที่เก็บข้อมูลออบเจ็กต์แบบรวม และ Secret Manager สำหรับการจัดการข้อมูลลับ

Django CMS คือระบบจัดการเนื้อหา (CMS) ระดับองค์กรที่สร้างขึ้นบน Django Django เป็นเฟรมเวิร์กเว็บ Python ระดับสูง

ในบทแนะนำนี้ คุณจะได้ใช้คอมโพเนนต์เหล่านี้เพื่อทำให้โปรเจ็กต์ Django CMS ขนาดเล็กใช้งานได้

หมายเหตุ: Codelab นี้ได้รับการยืนยันครั้งล่าสุดกับ Django CMS 4.1.2 ผ่าน django-cms/cms-template v4.1

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใช้ Cloud Shell
  • วิธีสร้างฐานข้อมูล Cloud SQL
  • วิธีสร้างที่เก็บข้อมูล Cloud Storage
  • วิธีสร้างข้อมูลลับของ Secret Manager
  • วิธีใช้ Secret จากบริการต่างๆ ของ Google Cloud
  • วิธีเชื่อมต่อคอมโพเนนต์ Google Cloud กับบริการ Cloud Run
  • วิธีใช้ Container Registry เพื่อจัดเก็บคอนเทนเนอร์ที่สร้างขึ้น
  • วิธีทำให้ใช้งานได้กับ Cloud Run
  • วิธีเรียกใช้การย้ายข้อมูลสคีมาฐานข้อมูลใน Cloud Build

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยทั่วไปจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่มีค่าใช้จ่ายมากนัก หรืออาจไม่มีค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

Google Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากแล็ปท็อปได้จากระยะไกล แต่ใน Codelab นี้เราจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

เปิดใช้งาน Cloud Shell

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell d1264ca30785e435.png

cb81e7c8e34bc8d.png

หากคุณเริ่มใช้ Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอระดับกลางที่อธิบายว่า Cloud Shell คืออะไร หากเห็นหน้าจอระดับกลาง ให้คลิกต่อไป

d95252b003979716.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

7833d5e1c5d18f54.png

เครื่องเสมือนนี้โหลดเครื่องมือพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานส่วนใหญ่หรือทั้งหมดในโค้ดแล็บนี้ได้ด้วยเบราว์เซอร์

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์และระบบได้ตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์ของคุณ

  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list

เอาต์พุตของคำสั่ง

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project

เอาต์พุตของคำสั่ง

[core]
project = <PROJECT_ID>

หากไม่ได้ตั้งค่าไว้ คุณตั้งค่าได้ด้วยคำสั่งนี้

gcloud config set project <PROJECT_ID>

เอาต์พุตของคำสั่ง

Updated property [core/project].

3. เปิดใช้ Cloud API

จาก Cloud Shell ให้เปิดใช้ Cloud API สำหรับคอมโพเนนต์ที่จะใช้

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

เนื่องจากคุณเรียก API จาก gcloud เป็นครั้งแรก ระบบจะขอให้คุณให้สิทธิ์โดยใช้ข้อมูลเข้าสู่ระบบเพื่อส่งคำขอนี้ โดยจะเกิดขึ้น 1 ครั้งต่อเซสชัน Cloud Shell

การดำเนินการนี้อาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์

เมื่อเสร็จสมบูรณ์แล้ว คุณควรเห็นข้อความแสดงความสำเร็จที่คล้ายกับข้อความนี้

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

4. สร้างโปรเจ็กต์เทมเพลต

คุณจะใช้ Django CMS cms-template เป็นโปรเจ็กต์ Django CMS ตัวอย่าง

หากต้องการสร้างโปรเจ็กต์เทมเพลตนี้ ให้ใช้ Cloud Shell เพื่อสร้างไดเรกทอรีใหม่ชื่อ djangocms-cloudrun แล้วไปที่ไดเรกทอรีดังกล่าว

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

ติดตั้งแพ็กเกจ django-cms ในสภาพแวดล้อมเสมือนชั่วคราวโดยทำดังนี้

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

สร้างสำเนาโปรเจ็กต์ cms-template

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

เปลี่ยนชื่อไฟล์ requirements.in เป็น requirements.txt (.in ไฟล์นี้สร้างขึ้นโดย pip-tools เพื่อสร้างไฟล์ requirements.txt แต่สามารถใช้ได้เลยหากเปลี่ยนนามสกุล ในขั้นตอนต่อๆ ไป pip คาดหวังส่วนขยาย .txt)

mv requirements.in requirements.txt

ตอนนี้คุณจะมีโปรเจ็กต์เทมเพลต Django CMS ในโฟลเดอร์ชื่อ myproject

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

ตอนนี้คุณสามารถออกและนำสภาพแวดล้อมเสมือนชั่วคราวออกได้โดยทำดังนี้

deactivate
rm -rf venv

จากนั้นจะเรียกใช้ Django CMS ภายในคอนเทนเนอร์

5. สร้างบริการแบ็กเอนด์

ตอนนี้คุณจะสร้างบริการสนับสนุน ได้แก่ บัญชีบริการเฉพาะ, Artifact Registry, ฐานข้อมูล Cloud SQL, ที่เก็บข้อมูล Cloud Storage และค่า Secret Manager จำนวนหนึ่ง

การรักษาความปลอดภัยของค่ารหัสผ่านที่ใช้ในการติดตั้งใช้งานเป็นสิ่งสำคัญต่อความปลอดภัยของโปรเจ็กต์ และช่วยให้มั่นใจได้ว่าจะไม่มีใครป้อนรหัสผ่านในตำแหน่งที่ไม่ควร (เช่น ในไฟล์การตั้งค่าโดยตรง หรือพิมพ์ลงในเทอร์มินัลโดยตรง ซึ่งอาจดึงข้อมูลจากประวัติได้)

เริ่มต้นด้วยการตั้งค่าตัวแปรสภาพแวดล้อมพื้นฐาน 2 ตัว โดยตัวแปรหนึ่งสำหรับรหัสโปรเจ็กต์

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

และอีก 1 รายการสำหรับภูมิภาค

REGION=us-central1

สร้างบัญชีบริการ

หากต้องการจำกัดสิทธิ์เข้าถึงที่บริการจะมีต่อส่วนอื่นๆ ของ Google Cloud ให้สร้างบัญชีบริการเฉพาะ

gcloud iam service-accounts create cloudrun-serviceaccount

คุณจะอ้างอิงบัญชีนี้ด้วยอีเมลในส่วนต่างๆ ของโค้ดแล็บนี้ในอนาคต ตั้งค่าดังกล่าวในตัวแปรสภาพแวดล้อม

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

สร้าง Artifact Registry

หากต้องการจัดเก็บอิมเมจคอนเทนเนอร์ที่สร้างขึ้น ให้สร้างรีจิสทรีคอนเทนเนอร์ในภูมิภาคที่คุณเลือก

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

คุณจะอ้างอิงรีจิสทรีนี้ตามชื่อในส่วนต่างๆ ของโค้ดแล็บนี้ในอนาคต

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

สร้างฐานข้อมูล

สร้างอินสแตนซ์ Cloud SQL

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

การดำเนินการนี้อาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์

ในกรณีดังกล่าว ให้สร้างฐานข้อมูลโดยทำดังนี้

gcloud sql databases create mydatabase --instance myinstance

ในอินสแตนซ์เดียวกัน ให้สร้างผู้ใช้โดยทำดังนี้

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

ให้สิทธิ์บัญชีบริการในการเชื่อมต่อกับอินสแตนซ์

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

สร้างที่เก็บข้อมูล

สร้างที่เก็บข้อมูล Cloud Storage (โปรดทราบว่าชื่อต้องไม่ซ้ำกันทั่วโลก)

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

ให้สิทธิ์แก่บัญชีบริการในการดูแลที่เก็บข้อมูลโดยทำดังนี้

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

เนื่องจากออบเจ็กต์ที่จัดเก็บไว้ในที่เก็บข้อมูลจะมีต้นทางที่แตกต่างกัน (URL ของที่เก็บข้อมูลแทนที่จะเป็น URL ของ Cloud Run) คุณจึงต้องกำหนดค่าการตั้งค่าการแชร์ทรัพยากรข้ามโดเมน (CORS)

สร้างไฟล์ใหม่ชื่อ cors.json โดยมีเนื้อหาดังนี้

touch cors.json
cloudshell edit cors.json

cors.json

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

ใช้การกำหนดค่า CORS นี้กับที่เก็บข้อมูลที่สร้างขึ้นใหม่

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

จัดเก็บการกำหนดค่าเป็นข้อมูลลับ

เมื่อตั้งค่าบริการสนับสนุนแล้ว ตอนนี้คุณจะจัดเก็บค่าเหล่านี้ไว้ในไฟล์ที่ได้รับการปกป้องโดยใช้ Secret Manager

Secret Manager ช่วยให้คุณจัดเก็บ จัดการ และเข้าถึงข้อมูลลับเป็น Blob แบบไบนารีหรือสตริงข้อความได้ ซึ่งเหมาะสำหรับการจัดเก็บข้อมูลการกำหนดค่า เช่น รหัสผ่านฐานข้อมูล คีย์ API หรือใบรับรอง TLS ที่แอปพลิเคชันต้องการในขณะรันไทม์

ก่อนอื่นให้สร้างไฟล์ที่มีค่าสำหรับสตริงการเชื่อมต่อฐานข้อมูล ถังสื่อ คีย์ลับสำหรับ Django (ใช้สำหรับการลงนามแบบเข้ารหัสของเซสชันและโทเค็น) และเพื่อเปิดใช้การแก้ไขข้อบกพร่อง ให้ทำดังนี้

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

จากนั้นสร้างข้อมูลลับชื่อ application_settings โดยใช้ไฟล์ดังกล่าวเป็นข้อมูลลับ

gcloud secrets create application_settings --data-file .env

อนุญาตให้บัญชีบริการเข้าถึงข้อมูลลับนี้

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

ยืนยันว่ามีการสร้างข้อมูลลับโดยแสดงรายการข้อมูลลับ

gcloud secrets versions list application_settings

หลังจากยืนยันว่าสร้างข้อมูลลับแล้ว ให้นำไฟล์ในเครื่องออกโดยทำดังนี้

rm .env

6. กำหนดค่าแอปพลิเคชัน

เนื่องจากบริการแบ็กเอนด์ที่คุณเพิ่งสร้าง คุณจะต้องทำการเปลี่ยนแปลงบางอย่างกับโปรเจ็กต์เทมเพลตเพื่อให้เหมาะสม

ซึ่งรวมถึงการแนะนํา django-environ เพื่อใช้ตัวแปรสภาพแวดล้อมเป็นการตั้งค่าการกําหนดค่า ซึ่งคุณจะเริ่มต้นด้วยค่าที่กําหนดเป็นข้อมูลลับ หากต้องการใช้ฟีเจอร์นี้ คุณจะต้องขยายการตั้งค่าเทมเพลต นอกจากนี้ คุณยังต้องเพิ่มการอ้างอิง Python เพิ่มเติมด้วย

กำหนดการตั้งค่า

ย้ายไฟล์ settings.py แล้วเปลี่ยนชื่อเป็น basesettings.py:

mv myproject/settings.py myproject/basesettings.py

สร้างไฟล์ settings.py ใหม่โดยใช้โปรแกรมแก้ไขเว็บของ Cloud Shell ด้วยโค้ดต่อไปนี้

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

โปรดสละเวลาอ่านความคิดเห็นที่เพิ่มเกี่ยวกับการกำหนดค่าแต่ละรายการ

โปรดทราบว่าคุณอาจเห็นข้อผิดพลาดในการตรวจสอบโค้ดในไฟล์นี้ กรณีนี้เป็นสิ่งที่คาดว่าจะเกิดอยู่แล้ว Cloud Shell ไม่มีบริบทของข้อกำหนดสำหรับโปรเจ็กต์นี้ จึงอาจรายงานการนำเข้าที่ไม่ถูกต้องและการนำเข้าที่ไม่ได้ใช้

ทรัพยากร Dependency ของ Python

ค้นหาไฟล์ requirements.txt แล้วเพิ่มแพ็กเกจต่อไปนี้

cloudshell edit requirements.txt

requirements.txt (ต่อท้าย)

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

กำหนดรูปภาพแอปพลิเคชัน

Cloud Run จะเรียกใช้คอนเทนเนอร์ใดก็ได้ตราบใดที่เป็นไปตามสัญญาคอนเทนเนอร์ของ Cloud Run บทแนะนำนี้เลือกที่จะไม่ใช้ Dockerfile แต่ใช้ Cloud Native Buildpacks แทน Buildpack ช่วยในการสร้างคอนเทนเนอร์สำหรับภาษาที่ใช้กันทั่วไป ซึ่งรวมถึง Python

บทแนะนำนี้เลือกที่จะปรับแต่งProcfileที่ใช้เพื่อเริ่มเว็บแอปพลิเคชัน

หากต้องการสร้างคอนเทนเนอร์โปรเจ็กต์เทมเพลต ให้สร้างไฟล์ใหม่ชื่อ Procfile ในระดับบนสุดของโปรเจ็กต์ก่อน (ในไดเรกทอรีเดียวกับ manage.py) แล้วคัดลอกเนื้อหาต่อไปนี้

touch Procfile
cloudshell edit Procfile

Procfile

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

7. กำหนดค่า สร้าง และเรียกใช้ขั้นตอนการย้ายข้อมูล

หากต้องการสร้างสคีมาฐานข้อมูลในฐานข้อมูล Cloud SQL และป้อนข้อมูลลงในที่เก็บข้อมูล Cloud Storage ด้วยชิ้นงานแบบคงที่ คุณต้องเรียกใช้ migrate และ collectstatic

คำสั่งการย้ายข้อมูล Django พื้นฐานเหล่านี้ต้องเรียกใช้ภายในบริบทของอิมเมจคอนเทนเนอร์ที่สร้างขึ้นพร้อมสิทธิ์เข้าถึงฐานข้อมูล

นอกจากนี้ คุณยังต้องเรียกใช้ createsuperuser เพื่อสร้างบัญชีผู้ดูแลระบบสำหรับเข้าสู่ระบบผู้ดูแลระบบ Django

โดยคุณจะใช้ Cloud Run Jobs เพื่อทำงานเหล่านี้ งาน Cloud Run ช่วยให้คุณเรียกใช้กระบวนการที่มีจุดสิ้นสุดที่กำหนดไว้ได้ จึงเหมาะสำหรับงานด้านการดูแลระบบ

กำหนดรหัสผ่านของผู้ดูแลระบบ Django

หากต้องการสร้างผู้ใช้ขั้นสูง คุณจะต้องใช้คำสั่ง createsuperuser เวอร์ชันที่ไม่โต้ตอบ คำสั่งนี้ต้องใช้ตัวแปรสภาพแวดล้อมที่มีชื่อเฉพาะเพื่อใช้แทนพรอมต์ในการป้อนรหัสผ่าน

สร้างข้อมูลลับใหม่โดยใช้รหัสผ่านที่สร้างขึ้นแบบสุ่ม

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=-

อนุญาตให้บัญชีบริการเข้าถึงข้อมูลลับนี้

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

อัปเดต Procfile

หากต้องการช่วยให้งาน Cloud Run ชัดเจนยิ่งขึ้น ให้สร้างทางลัดใน Procfile โดยต่อจุดแรกเข้าต่อไปนี้เข้ากับ Procfile

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

ตอนนี้คุณควรมีรายการ 3 รายการ ได้แก่ จุดแรกเข้า web เริ่มต้น จุดแรกเข้า migrate เพื่อใช้การย้ายข้อมูลฐานข้อมูล และจุดแรกเข้า createuser เพื่อเรียกใช้คำสั่ง createsuperuser

สร้างรูปภาพแอปพลิเคชัน

เมื่ออัปเดต Procfile แล้ว ให้สร้างอิมเมจโดยทำดังนี้

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

สร้างงาน Cloud Run

เมื่อมีอิมเมจแล้ว คุณจะสร้างงาน Cloud Run โดยใช้อิมเมจดังกล่าวได้

งานเหล่านี้จะใช้รูปภาพที่สร้างไว้ก่อนหน้านี้ แต่ใช้ค่า command ที่แตกต่างกัน ซึ่งจะแมปกับค่าใน Procfile

สร้างงานสำหรับการย้ายข้อมูล

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

สร้างงานสำหรับการสร้างผู้ใช้

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

เรียกใช้งานงาน Cloud Run

เมื่อกำหนดค่างานแล้ว ให้เรียกใช้การย้ายข้อมูลโดยทำดังนี้

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

ตรวจสอบว่าเอาต์พุตของคำสั่งนี้ระบุว่าการดำเนินการ "เสร็จสมบูรณ์แล้ว"

คุณจะเรียกใช้คำสั่งนี้ในภายหลังเมื่ออัปเดตแอปพลิเคชัน

เมื่อตั้งค่าฐานข้อมูลแล้ว ให้สร้างผู้ใช้โดยใช้คำสั่งต่อไปนี้

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

ตรวจสอบว่าเอาต์พุตของคำสั่งนี้ระบุว่าการดำเนินการ "เสร็จสมบูรณ์แล้ว"

คุณไม่ต้องเรียกใช้คำสั่งนี้อีก

8. ทำให้ใช้งานได้กับ Cloud Run

เมื่อสร้างและป้อนข้อมูลบริการสนับสนุนแล้ว คุณจะสร้างบริการ Cloud Run เพื่อเข้าถึงบริการเหล่านั้นได้

การทําให้แอปพลิเคชันที่อยู่ในคอนเทนเนอร์ใช้งานได้ครั้งแรกใน Cloud Run จะสร้างขึ้นโดยใช้คําสั่งต่อไปนี้

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

โปรดรอสักครู่จนกว่าการติดตั้งใช้งานจะเสร็จสมบูรณ์ เมื่อสำเร็จ บรรทัดคำสั่งจะแสดง URL ของบริการดังนี้

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

ตอนนี้คุณสามารถไปที่คอนเทนเนอร์ที่ติดตั้งใช้งานได้โดยเปิด URL นี้ในเว็บเบราว์เซอร์

e1fb6858bf11626a.png

เนื่องจากเป็นการติดตั้งใหม่ ระบบจะเปลี่ยนเส้นทางคุณไปยังหน้าเข้าสู่ระบบโดยอัตโนมัติ

9. การเข้าถึง Django Admin

ฟีเจอร์หลักอย่างหนึ่งของ Django CMS คือผู้ดูแลระบบแบบโต้ตอบ

การอัปเดตการตั้งค่า CSRF

Django มีการป้องกันการปลอมแปลง Cross-Site Request (CSRF) ทุกครั้งที่มีการส่งแบบฟอร์มในเว็บไซต์ Django รวมถึงการเข้าสู่ระบบผู้ดูแลระบบ Django ระบบจะตรวจสอบการตั้งค่าแหล่งที่มาที่เชื่อถือได้ หากไม่ตรงกับต้นทางของคำขอ Django จะแสดงข้อผิดพลาด

ในไฟล์ mysite/settings.py หากมีการกำหนดตัวแปรสภาพแวดล้อม CLOUDRUN_SERVICE_URL จะมีการใช้ตัวแปรดังกล่าวในการตั้งค่า CSRF_TRUSTED_ORIGINS และ ALLOWED_HOSTS แม้ว่าการกำหนด ALLOWED_HOSTS จะไม่บังคับ แต่คุณควรเพิ่มพารามิเตอร์นี้เนื่องจากจำเป็นสำหรับ CSRF_TRUSTED_ORIGINS อยู่แล้ว

เนื่องจากคุณต้องใช้ URL ของบริการ จึงจะเพิ่มการกำหนดค่านี้ได้หลังจากที่ติดตั้งใช้งานครั้งแรก

คุณจะต้องอัปเดตบริการเพื่อเพิ่มตัวแปรสภาพแวดล้อมนี้ โดยอาจเพิ่มลงในข้อมูลลับ application_settings หรือเพิ่มเป็นตัวแปรสภาพแวดล้อมโดยตรงก็ได้

การติดตั้งใช้งานด้านล่างใช้ประโยชน์จากการจัดรูปแบบและการหลีกของ gcloud

เรียกดู URL ของบริการ

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

ตั้งค่านี้เป็นตัวแปรสภาพแวดล้อมในบริการ Cloud Run

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

การเข้าสู่ระบบ Django Admin

หากต้องการเข้าถึงอินเทอร์เฟซผู้ดูแลระบบ Django ให้ต่อท้าย /admin ใน URL ของบริการ

ตอนนี้ให้เข้าสู่ระบบด้วยชื่อผู้ใช้ "admin" และดึงรหัสผ่านโดยใช้คำสั่งต่อไปนี้

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

da10a148bc1c7994.png

10. การใช้การอัปเดตแอปพลิเคชัน

ในระหว่างการพัฒนาแอปพลิเคชัน คุณอาจต้องการทดสอบแอปพลิเคชันในเครื่อง โดยคุณจะต้องเชื่อมต่อกับฐานข้อมูล Cloud SQL ("การผลิต") หรือฐานข้อมูลภายใน ("การทดสอบ")

เชื่อมต่อกับฐานข้อมูลที่ใช้งานจริง

คุณเชื่อมต่อกับอินสแตนซ์ Cloud SQL ได้โดยใช้พร็อกซีการตรวจสอบสิทธิ์ Cloud SQL แอปพลิเคชันนี้สร้างการเชื่อมต่อจากเครื่องภายในไปยังฐานข้อมูล

เมื่อติดตั้งพร็อกซีการตรวจสอบสิทธิ์ Cloud SQL แล้ว ให้ทำตามขั้นตอนต่อไปนี้

# 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

โปรดตรวจสอบว่าคุณได้นำไฟล์ temp_settings ออกหลังจากทำงานเสร็จแล้ว

เชื่อมต่อกับฐานข้อมูล SQLite ในเครื่อง

หรือจะใช้ฐานข้อมูลในเครื่องเมื่อพัฒนาแอปพลิเคชันก็ได้ Django รองรับทั้งฐานข้อมูล PostgreSQL และ SQLite และมีฟีเจอร์บางอย่างที่ PostgreSQL มีแต่ SQLite ไม่มี แต่ในหลายๆ กรณี ฟังก์ชันการทำงานจะเหมือนกัน

หากต้องการตั้งค่า SQLite คุณจะต้องอัปเดตการตั้งค่าแอปพลิเคชันให้ชี้ไปยังฐานข้อมูลในเครื่อง จากนั้นจึงจะใช้การย้ายข้อมูลสคีมาได้

วิธีตั้งค่าการชำระเงินด้วยวิธีนี้

# 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

โปรดตรวจสอบว่าคุณได้นำไฟล์ temp_settings ออกหลังจากทำงานเสร็จแล้ว

การสร้างการย้ายข้อมูล

เมื่อทำการเปลี่ยนแปลงโมเดลฐานข้อมูล คุณอาจต้องสร้างไฟล์การย้ายข้อมูลของ Django โดยเรียกใช้ python manage.py makemigrations

คุณเรียกใช้คำสั่งนี้ได้หลังจากตั้งค่าการเชื่อมต่อฐานข้อมูลการทดสอบหรือการเชื่อมต่อฐานข้อมูลที่ใช้งานจริง หรือจะสร้างไฟล์การย้ายข้อมูลโดยไม่ต้องใช้ฐานข้อมูลด้วยการตั้งค่าที่ว่างเปล่าก็ได้

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

การใช้การอัปเดตแอปพลิเคชัน

หากต้องการใช้การเปลี่ยนแปลงกับแอปพลิเคชัน คุณจะต้องทำดังนี้

  • สร้างการเปลี่ยนแปลงเป็นรูปภาพใหม่
  • ใช้การย้ายข้อมูลฐานข้อมูลหรือการย้ายข้อมูลแบบคงที่ แล้ว
  • อัปเดตบริการ Cloud Run ให้ใช้อิมเมจใหม่

วิธีสร้างอิมเมจ

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

หากมีการย้ายข้อมูลที่ต้องใช้ ให้เรียกใช้ Cloud Run Job ดังนี้

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

วิธีอัปเดตบริการด้วยรูปภาพใหม่

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

11. ยินดีด้วย

คุณเพิ่งติดตั้งใช้งานโปรเจ็กต์ที่ซับซ้อนใน Cloud Run

  • Cloud Run จะปรับขนาดรูปภาพคอนเทนเนอร์ในแนวนอนโดยอัตโนมัติเพื่อจัดการคำขอที่ได้รับ จากนั้นจะปรับขนาดลงเมื่อความต้องการลดลง คุณจะจ่ายเฉพาะค่า CPU, หน่วยความจำ และเครือข่ายที่ใช้ไปในระหว่างการจัดการคำขอ
  • Cloud SQL ช่วยให้คุณจัดสรรอินสแตนซ์ PostgreSQL ที่มีการจัดการซึ่งได้รับการบำรุงรักษาโดยอัตโนมัติ และผสานรวมเข้ากับระบบ Google Cloud หลายระบบได้โดยตรง
  • Cloud Storage ช่วยให้คุณมีพื้นที่เก็บข้อมูลระบบคลาวด์ในลักษณะที่เข้าถึงได้ใน Django อย่างราบรื่น
  • Secret Manager ช่วยให้คุณจัดเก็บข้อมูลลับและทำให้บางส่วนของ Google Cloud เข้าถึงได้ แต่บางส่วนเข้าถึงไม่ได้

ล้างข้อมูล

โปรดดำเนินการดังนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud Platform สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

  • ใน Cloud Console ให้ไปที่หน้าจัดการทรัพยากร
  • เลือกโปรเจ็กต์ในรายการโปรเจ็กต์ แล้วคลิกลบ
  • ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์

ดูข้อมูลเพิ่มเติม