Cloud Run'da Django CMS

1. Giriş

89eb4723767d4525.png

Cloud Run, HTTP istekleriyle çağrılabilen durum bilgisiz container'lar çalıştırmanıza olanak tanıyan yönetilen bir işlem platformudur. Cloud Run sunucusuzdur: Tüm altyapı yönetimini soyutladığı için en önemli işe, yani harika uygulamalar geliştirmeye odaklanabilirsiniz.

Ayrıca, yönetilen veritabanları için Cloud SQL, birleştirilmiş nesne depolama için Cloud Storage ve gizli anahtarları yönetmek için Secret Manager dahil olmak üzere Google Cloud ekosisteminin diğer birçok bölümüyle yerel olarak arayüz oluşturur.

Django CMS, Django üzerine kurulu bir kurumsal içerik yönetim sistemidir (İYS). Django, üst düzey bir Python web çerçevesidir.

Bu eğiticide, küçük bir Django CMS projesi dağıtmak için bu bileşenleri kullanacaksınız.

Not: Bu codelab, django-cms/cms-template v4.1 aracılığıyla en son Django CMS 4.1.2 ile doğrulandı.

Neler öğreneceksiniz?

  • Cloud Shell'i kullanma
  • Cloud SQL veritabanı oluşturma
  • Cloud Storage paketi oluşturma
  • Secret Manager gizli anahtarları oluşturma
  • Farklı Google Cloud hizmetlerindeki gizli anahtarları kullanma
  • Google Cloud bileşenlerini Cloud Run hizmetine bağlama
  • Oluşturulan kapsayıcıları depolamak için Container Registry'yi kullanma
  • Cloud Run'a dağıtma
  • Cloud Build'de veritabanı şeması taşımalarını çalıştırma

2. Kurulum ve şartlar

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Google Cloud Shell

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i d1264ca30785e435.png tıklayın.

cb81e7c8e34bc8d.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

d95252b003979716.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

7833d5e1c5d18f54.png

Bu sanal makine, ihtiyaç duyulan tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list

Komut çıkışı

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Cloud API'lerini etkinleştirme

Cloud Shell'den, kullanılacak bileşenler için Cloud API'lerini etkinleştirin:

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

gcloud'dan API'leri ilk kez çağırdığınız için bu isteği yapmak üzere kimlik bilgilerinizi kullanarak yetkilendirme yapmanız istenir. Bu işlem, Cloud Shell oturumu başına bir kez gerçekleşir.

Bu işlemin tamamlanması birkaç dakika sürebilir.

İşlem tamamlandığında şuna benzer bir başarı mesajı görünür:

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

4. Şablon proje oluşturma

Örnek Django CMS projeniz olarak Django CMS cms-template'i kullanacaksınız.

Bu şablon projesini oluşturmak için Cloud Shell'i kullanarak djangocms-cloudrun adlı yeni bir dizin oluşturun ve bu dizine gidin:

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

django-cms paketini geçici bir sanal ortama yükleyin:

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

cms-template projesinin bir kopyasını oluşturun:

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

requirements.in dosyasını requirements.txt olarak yeniden adlandırın. (.in dosyası, pip-tools tarafından requirements.txt dosyaları oluşturmak için kullanılır ancak uzantısı değiştirilirse olduğu gibi kullanılabilir. Sonraki adımlarda pip, .txt uzantısını bekler.)

mv requirements.in requirements.txt

Artık myproject adlı klasörde bir şablon Django CMS projeniz olacak:

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

Artık çıkış yapabilir ve geçici sanal ortamınızı kaldırabilirsiniz:

deactivate
rm -rf venv

Django CMS, buradan container içinde çağrılır.

5. Destekleyici hizmetleri oluşturma

Şimdi destek hizmetlerinizi oluşturacaksınız: özel bir hizmet hesabı, bir Artifact Registry, bir Cloud SQL veritabanı, bir Cloud Storage paketi ve bir dizi Secret Manager değeri.

Dağıtımda kullanılan şifrelerin değerlerinin güvenliğini sağlamak, herhangi bir projenin güvenliği için önemlidir ve kimsenin şifreleri yanlışlıkla ait olmadıkları yerlere (ör. doğrudan ayar dosyalarına veya geçmişten alınabilecekleri terminalinize) girmemesini sağlar.

Başlamak için iki temel ortam değişkeni ayarlayın. Bunlardan biri proje kimliği için olmalıdır:

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

Bölge için bir tane:

REGION=us-central1

Hizmet hesabı oluşturma

Hizmetin Google Cloud'un diğer bölümlerine erişimini sınırlamak için özel bir hizmet hesabı oluşturun:

gcloud iam service-accounts create cloudrun-serviceaccount

Bu codelab'in ilerleyen bölümlerinde bu hesaba e-postasıyla referans vereceksiniz. Bu değeri bir ortam değişkeninde ayarlayın:

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

Artifact Registry oluşturma

Oluşturulan container görüntüsünü depolamak için seçtiğiniz bölgede bir container registry oluşturun:

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

Bu kayıt defterine, bu codelab'in ilerleyen bölümlerinde adıyla referans vereceksiniz:

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

Veritabanını oluşturma

Cloud SQL örneği oluşturun:

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

Bu işlemin tamamlanması birkaç dakika sürebilir.

Bu durumda bir veritabanı oluşturun:

gcloud sql databases create mydatabase --instance myinstance

Aynı örnekte bir kullanıcı oluşturun:

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

Hizmet hesabına örneğe bağlanma izni verin:

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

Storage paketi oluşturma

Cloud Storage paketi oluşturun (adın global olarak benzersiz olması gerektiğini unutmayın):

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

Hizmet hesabına paketi yönetme izni verin:

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

Pakette depolanan nesnelerin farklı bir kaynağı (Cloud Run URL'si yerine paket URL'si) olacağından merkezler arası kaynak paylaşımı (CORS) ayarlarını yapılandırmanız gerekir.

Aşağıdaki içeriklere sahip cors.json adlı yeni bir dosya oluşturun:

touch cors.json
cloudshell edit cors.json

cors.json

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

Bu CORS yapılandırmasını yeni oluşturulan depolama paketine uygulayın:

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

Yapılandırmayı gizli olarak depolama

Destek hizmetlerini ayarladıktan sonra bu değerleri Secret Manager kullanılarak korunan bir dosyada depolayacaksınız.

Secret Manager, gizli anahtarları ikili blob'lar veya metin dizeleri olarak depolamanıza, yönetmenize ve bunlara erişmenize olanak tanır. Çalışma zamanında bir uygulama tarafından ihtiyaç duyulan veritabanı şifreleri, API anahtarları veya TLS sertifikaları gibi yapılandırma bilgilerini depolamak için uygundur.

Öncelikle veritabanı bağlantı dizesi, medya paketi, Django için gizli anahtar (oturumların ve jetonların kriptografik olarak imzalanması için kullanılır) değerlerini içeren bir dosya oluşturun ve hata ayıklamayı etkinleştirin:

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

Ardından, bu dosyayı gizli anahtar olarak kullanarak application_settings adlı bir gizli anahtar oluşturun:

gcloud secrets create application_settings --data-file .env

Hizmet hesabının bu gizli değere erişmesine izin verin:

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

Gizli anahtarları listeleyerek gizli anahtarın oluşturulduğunu onaylayın:

gcloud secrets versions list application_settings

Gizli dizenin oluşturulduğunu onayladıktan sonra yerel dosyayı kaldırın:

rm .env

6. Uygulamanızı yapılandırın

Yeni oluşturduğunuz destek hizmetleri göz önüne alındığında, şablon projesinde uygun değişiklikler yapmanız gerekir.

Bu kapsamda, yapılandırma ayarlarınız olarak ortam değişkenlerini kullanmak için django-environ tanıtılacak. Bu değişkenleri, gizli anahtar olarak tanımladığınız değerlerle dolduracaksınız. Bunu uygulamak için şablon ayarlarını genişleteceksiniz. Ayrıca ek Python bağımlılıkları da eklemeniz gerekir.

Ayarları yapılandırma

settings.py dosyasını basesettings.py: olarak yeniden adlandırıp taşıyın.

mv myproject/settings.py myproject/basesettings.py

Cloud Shell web düzenleyicisini kullanarak aşağıdaki kodu içeren yeni bir settings.py dosyası oluşturun:

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

Her yapılandırma hakkında eklenen yorumları okumak için zaman ayırın.

Bu dosyada linting hataları görebileceğinizi unutmayın. Bu beklenen bir durumdur. Cloud Shell, bu projenin gereksinimleri hakkında bağlama sahip olmadığından geçersiz içe aktarmaları ve kullanılmayan içe aktarmaları bildirebilir.

Python bağımlılıkları

requirements.txt dosyasını bulun ve aşağıdaki paketleri ekleyin:

cloudshell edit requirements.txt

requirements.txt (append)

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

Uygulama resminizi tanımlama

Cloud Run, Cloud Run Container Sözleşmesi'ne uygun olduğu sürece tüm container'ları çalıştırır. Bu eğitimde Dockerfile atlanmış ve bunun yerine Cloud Native Buildpacks kullanılmıştır. Buildpack'ler, Python da dahil olmak üzere yaygın diller için kapsayıcılar oluşturmaya yardımcı olur.

Bu eğitimde, web uygulamasını başlatmak için kullanılan Procfile özelleştirilmektedir.

Şablon projesini kapsayıcılaştırmak için öncelikle projenizin en üst düzeyinde (manage.py ile aynı dizinde) Procfile adlı yeni bir dosya oluşturun ve aşağıdaki içeriği kopyalayın:

touch Procfile
cloudshell edit Procfile

Procfile

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

7. Taşıma adımlarını yapılandırma, oluşturma ve çalıştırma

Cloud SQL veritabanınızda veritabanı şeması oluşturmak ve Cloud Storage paketinizi statik öğelerinizle doldurmak için migrate ve collectstatic komutlarını çalıştırmanız gerekir.

Bu temel Django taşıma komutlarının, veritabanınıza erişimi olan, oluşturulmuş container görüntünüzün bağlamında çalıştırılması gerekir.

Django yöneticisine giriş yapmak için yönetici hesabı oluşturmak üzere createsuperuser komutunu da çalıştırmanız gerekir.

Bunu yapmak için bu görevleri gerçekleştirmek üzere Cloud Run Jobs'u kullanacaksınız. Cloud Run işleri, tanımlanmış bir sonu olan süreçleri çalıştırmanıza olanak tanır. Bu nedenle, yönetim görevleri için idealdir.

Django süper kullanıcı şifrenizi tanımlama

Süper kullanıcıyı oluşturmak için createsuperuser komutunun etkileşimli olmayan sürümünü kullanırsınız. Bu komut, şifre girme istemi yerine kullanılmak üzere özel olarak adlandırılmış bir ortam değişkeni gerektirir.

Rastgele oluşturulmuş bir şifre kullanarak yeni bir gizli anahtar oluşturun:

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

Hizmet hesabınızın bu gizli değere erişmesine izin verin:

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

Procfile'ınızı güncelleme

Cloud Run işlerinizin netliğini artırmak için Procfile'ınızda kısayollar oluşturun ve Procfile öğesine aşağıdaki giriş noktalarını ekleyin:

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

Artık üç girişiniz olmalıdır: varsayılan web giriş noktası, veritabanı taşıma işlemlerini uygulamak için migrate giriş noktası ve createsuperuser komutunu çalıştırmak için createuser giriş noktası.

Uygulama resminizi oluşturma

Procfile güncellemelerinizle birlikte görüntüyü oluşturun:

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

Cloud Run işleri oluşturma

Görüntü oluşturulduğuna göre artık bu görüntüyü kullanarak Cloud Run işleri oluşturabilirsiniz.

Bu işlerde daha önce oluşturulan resim kullanılır ancak farklı command değerleri kullanılır. Bunlar, Procfile içindeki değerlerle eşlenir.

Taşıma işlemi için bir iş oluşturun:

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

Kullanıcı oluşturma için bir iş oluşturun:

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 işlerini yürütme

İş yapılandırmaları tamamlandıktan sonra taşıma işlemlerini çalıştırın:

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

Bu komut çıkışında yürütmenin "başarıyla tamamlandığından" emin olun.

Bu komutu daha sonra uygulamanızda güncelleme yaptığınızda çalıştıracaksınız.

Veritabanı kurulumuyla birlikte, işi kullanarak kullanıcıyı oluşturun:

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

Bu komut çıkışında yürütmenin "başarıyla tamamlandığından" emin olun.

Bu komutu tekrar çalıştırmanız gerekmez.

8. Cloud Run'a dağıt

Destek hizmetleri oluşturulup doldurulduktan sonra artık bunlara erişmek için Cloud Run hizmetini oluşturabilirsiniz.

Container'a alınmış uygulamanızın Cloud Run'a ilk dağıtımı aşağıdaki komut kullanılarak oluşturulur:

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

Dağıtım tamamlanana kadar birkaç dakika bekleyin. İşlem başarılı olduğunda komut satırında hizmet URL'si gösterilir:

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

Artık bu URL'yi bir web tarayıcısında açarak dağıtılan kapsayıcınızı ziyaret edebilirsiniz:

e1fb6858bf11626a.png

Bu yeni bir yükleme olduğundan otomatik olarak giriş sayfasına yönlendirilirsiniz.

9. Django Admin'e erişme

Django CMS'nin temel özelliklerinden biri etkileşimli yöneticisidir.

CSRF ayarlarını güncelleme

Django, Siteler Arası İstek Sahteciliği (CSRF)'ye karşı koruma içerir. Django yöneticisine giriş yapmak da dahil olmak üzere Django sitenizde bir form gönderildiğinde Güvenilen Kaynaklar ayarı kontrol edilir. İstek kaynağıyla eşleşmezse Django hata döndürür.

mysite/settings.py dosyasında, CLOUDRUN_SERVICE_URL ortam değişkeni tanımlanmışsa CSRF_TRUSTED_ORIGINS ve ALLOWED_HOSTS ayarlarında kullanılır. ALLOWED_HOSTS tanımlamak zorunlu olmasa da CSRF_TRUSTED_ORIGINS için zaten gerekli olduğundan bunu eklemek iyi bir uygulamadır.

Hizmet URL'nize ihtiyacınız olduğundan bu yapılandırma, ilk dağıtımınızdan sonra eklenebilir.

Bu ortam değişkenini eklemek için hizmetinizi güncellemeniz gerekir. application_settings gizlisine eklenebilir veya doğrudan ortam değişkeni olarak eklenebilir.

Aşağıdaki uygulama, gcloud biçimlendirme ve kaçış özelliklerinden yararlanır.

Hizmet URL'nizi alma:

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

Bu değeri Cloud Run hizmetinizde ortam değişkeni olarak ayarlayın:

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

Django Yönetici Paneli'ne giriş yapma

Django yönetici arayüzüne erişmek için hizmet URL'nize /admin ekleyin.

Şimdi "admin" kullanıcı adıyla giriş yapın ve aşağıdaki komutu kullanarak şifrenizi alın:

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

da10a148bc1c7994.png

10. Uygulama güncellemelerini uygulama

Uygulamanızı geliştirirken yerel olarak test etmek isteyebilirsiniz. Bunu yapmak için Cloud SQL ("üretim") veritabanınıza veya yerel ("test") veritabanınıza bağlanmanız gerekir.

Üretim veritabanınıza bağlanma

Cloud SQL Auth Proxy'yi kullanarak Cloud SQL örneklerinize bağlanabilirsiniz. Bu uygulama, yerel makinenizden veritabanına bir bağlantı oluşturur.

Cloud SQL Auth Proxy'yi yükledikten sonra aşağıdaki adımları uygulayın:

# 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

Çalışmanızı tamamladıktan sonra temp_settings dosyasını kaldırdığınızdan emin olun.

Yerel bir SQLite veritabanına bağlanma

Alternatif olarak, uygulamanızı geliştirirken yerel bir veritabanı kullanabilirsiniz. Django hem PostgreSQL hem de SQLite veritabanlarını destekler. PostgreSQL'in SQLite'te bulunmayan bazı özellikleri vardır ancak işlevsellik çoğu durumda aynıdır.

SQLite'ı kurmak için uygulama ayarlarınızı yerel bir veritabanını işaret edecek şekilde güncellemeniz ve ardından şema taşımalarınızı uygulamanız gerekir.

Bu yöntemi ayarlamak için:

# 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

Çalışmanızı tamamladıktan sonra temp_settings dosyasını kaldırdığınızdan emin olun.

Taşıma işlemleri oluşturma

Veritabanı modellerinizde değişiklik yaparken python manage.py makemigrations komutunu çalıştırarak Django'nun taşıma dosyalarını oluşturmanız gerekebilir.

Bu komutu, üretim veya test veritabanı bağlantısını ayarladıktan sonra çalıştırabilirsiniz. Alternatif olarak, boş ayarlar vererek taşıma dosyalarını veritabanı olmadan da oluşturabilirsiniz:

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

Uygulama güncellemelerini uygulama

Uygulamanızda değişiklik yapmak için:

  • değişikliklerinizi yeni bir resme yansıtın,
  • veritabanı veya statik taşımaları uygulayın ve ardından
  • Cloud Run hizmetinizi yeni görüntüyü kullanacak şekilde güncelleyin.

İmajınızı oluşturmak için:

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

Uygulanacak taşıma işlemleriniz varsa Cloud Run işini çalıştırın:

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

Hizmetinizi yeni resimle güncellemek için:

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

11. Tebrikler!

Cloud Run'a karmaşık bir proje dağıttınız.

  • Cloud Run, alınan istekleri işlemek için kapsayıcı resminizi otomatik olarak ve yatay yönde ölçeklendirir, talep azaldığında ise ölçeği küçültür. Yalnızca istek işleme sırasında kullanılan CPU, bellek ve ağ iletişimi için ödeme yaparsınız.
  • Cloud SQL, sizin için otomatik olarak bakımı yapılan ve birçok Google Cloud sistemiyle yerel olarak entegre olan yönetilen bir PostgreSQL örneği sağlamanıza olanak tanır.
  • Cloud Storage, Django'da sorunsuz bir şekilde erişilebilen bulut depolama alanı sunar.
  • Secret Manager, gizli anahtarları depolamanıza ve Google Cloud'un belirli bölümlerinin bu anahtarlara erişmesine, diğer bölümlerinin ise erişememesine olanak tanır.

Temizleme

Bu eğiticide kullanılan kaynaklar için Google Cloud Platform hesabınızın ücretlendirilmesini istemiyorsanız şunları yapın:

  • Cloud Console'da Kaynakları yönetin sayfasına gidin.
  • Proje listesinde projenizi seçip Sil'i tıklayın.
  • İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.

Daha fazla bilgi