CMS dla Django w Cloud Run

1. Wprowadzenie

89eb4723767d4525.png

Cloud Run to zarządzana platforma obliczeniowa, która umożliwia uruchamianie bezstanowych kontenerów wywoływanych przez żądania HTTP. Cloud Run jest rozwiązaniem bezserwerowym, które nie wymaga zarządzania infrastrukturą, dzięki czemu możesz skupić się na tym, co najważniejsze, czyli tworzeniu świetnych aplikacji.

Współpracuje też natywnie z wieloma innymi częściami ekosystemu Google Cloud, w tym z Cloud SQL do zarządzania bazami danych, Cloud Storage do ujednoliconego przechowywania obiektów i Secret Manager do zarządzania danymi tajnymi.

Django CMS to system zarządzania treścią (CMS) dla przedsiębiorstw, który jest oparty na Django. Django to zaawansowana platforma internetowa w języku Python.

W tym samouczku użyjesz tych komponentów do wdrożenia małego projektu Django CMS.

Uwaga: ten przewodnik został ostatnio zweryfikowany w przypadku Django CMS 4.1.2 za pomocą django-cms/cms-template w wersji 4.1.

Czego się nauczysz

  • Jak korzystać z Cloud Shell
  • Jak utworzyć bazę danych Cloud SQL
  • Tworzenie zasobnika Cloud Storage
  • Jak tworzyć obiekty tajne w usłudze Secret Manager
  • Jak korzystać z sekretów w różnych usługach Google Cloud
  • Łączenie komponentów Google Cloud z usługą Cloud Run
  • Jak używać Container Registry do przechowywania skompilowanych kontenerów
  • Jak wdrażać w Cloud Run
  • Jak uruchamiać migracje schematu bazy danych w Cloud Build

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się tym przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować utworzyć własny adres i sprawdzić, czy jest dostępny. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Google Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym module użyjemy Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tego środowiska. Jeśli pojawił się ekran pośredni, kliknij Dalej.

d95252b003979716.png

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

7833d5e1c5d18f54.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Włączanie interfejsów Cloud API

W Cloud Shell włącz interfejsy Cloud API dla komponentów, które będą używane:

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

Ponieważ po raz pierwszy wywołujesz interfejsy API z gcloud, pojawi się prośba o autoryzację używania Twoich danych logowania do wysłania tego żądania. Będzie to miało miejsce raz na sesję Cloud Shell.

Wykonanie tej operacji może potrwać kilka chwil.

Po zakończeniu powinien pojawić się komunikat o powodzeniu podobny do tego:

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

4. Tworzenie projektu szablonu

Jako przykładowy projekt Django CMS użyjesz cms-template.

Aby utworzyć ten projekt szablonu, użyj Cloud Shell do utworzenia nowego katalogu o nazwie djangocms-cloudrun i przejdź do niego:

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

Zainstaluj pakiet django-cms w tymczasowym środowisku wirtualnym:

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

Utwórz kopię projektu cms-template:

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

Zmień nazwę pliku requirements.in na requirements.txt. (Plik .in jest generowany przez pip-tools w celu tworzenia plików requirements.txt, ale można go używać w takiej postaci, jeśli zmieni się rozszerzenie. W dalszych krokach pip oczekuje rozszerzenia .txt).

mv requirements.in requirements.txt

W folderze o nazwie myproject znajdziesz teraz projekt szablonu Django CMS:

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

Teraz możesz zamknąć tymczasowe środowisko wirtualne i je usunąć:

deactivate
rm -rf venv

Z tego miejsca w kontenerze będzie wywoływany system Django CMS.

5. Tworzenie usług pomocniczych

Teraz utworzysz usługi pomocnicze: dedykowane konto usługi, Artifact Registry, bazę danych Cloud SQL, zasobnik Cloud Storage i wiele wartości Secret Manager.

Zabezpieczenie wartości haseł używanych we wdrożeniu jest ważne dla bezpieczeństwa każdego projektu i gwarantuje, że nikt przypadkowo nie umieści haseł w nieodpowiednich miejscach (np. bezpośrednio w plikach ustawień lub nie wpisze ich bezpośrednio w terminalu, z którego można je pobrać z historii).

Na początek ustaw 2 podstawowe zmienne środowiskowe, jedną dla identyfikatora projektu:

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

i jeden dla regionu:

REGION=us-central1

utworzyć konto usługi,

Aby ograniczyć dostęp usługi do innych części Google Cloud, utwórz dedykowane konto usługi:

gcloud iam service-accounts create cloudrun-serviceaccount

W dalszych częściach tego samouczka będziesz odwoływać się do tego konta za pomocą adresu e-mail. Ustaw tę wartość w zmiennej środowiskowej:

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

Utwórz Artifact Registry

Aby zapisać skompilowany obraz kontenera, utwórz rejestr kontenerów w wybranym regionie:

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

W dalszych sekcjach tego samouczka będziesz odwoływać się do tego rejestru po nazwie:

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

Tworzenie bazy danych

Utwórz instancję Cloud SQL:

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

Wykonanie tej operacji może potrwać kilka minut.

W tej instancji utwórz bazę danych:

gcloud sql databases create mydatabase --instance myinstance

W tej samej instancji utwórz użytkownika:

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

Przyznaj kontu usługi uprawnienia do łączenia się z instancją:

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

Tworzenie zasobnika na dane

Utwórz zasobnik Cloud Storage (pamiętaj, że nazwa musi być globalnie unikalna):

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

Przyznaj kontu usługi uprawnienia do administrowania zasobnikiem:

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

Obiekty przechowywane w zasobniku będą miały inne źródło (adres URL zasobnika zamiast adresu URL Cloud Run), dlatego musisz skonfigurować ustawienia współdzielenia zasobów między serwerami z różnych domen (CORS).

Utwórz nowy plik o nazwie cors.json z tą zawartością:

touch cors.json
cloudshell edit cors.json

cors.json

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

Zastosuj tę konfigurację CORS do nowo utworzonego zasobnika pamięci:

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

Zapisywanie konfiguracji jako obiektu tajnego

Po skonfigurowaniu usług pomocniczych zapiszesz te wartości w pliku chronionym za pomocą usługi Secret Manager.

Usługa Secret Manager umożliwia przechowywanie obiektów tajnych w postaci binarnych obiektów blob lub ciągów tekstowych, a także zarządzanie nimi i uzyskiwanie do nich dostępu. Sprawdza się w przypadku przechowywania informacji konfiguracyjnych, takich jak hasła do baz danych, klucze interfejsu API czy certyfikaty TLS potrzebne aplikacji w czasie wykonywania.

Najpierw utwórz plik z wartościami ciągu połączenia z bazą danych, zasobnika multimediów, klucza tajnego Django (używanego do kryptograficznego podpisywania sesji i tokenów) oraz włącz debugowanie:

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

Następnie utwórz obiekt tajny o nazwie application_settings, używając tego pliku jako obiektu tajnego:

gcloud secrets create application_settings --data-file .env

Zezwól kontu usługi na dostęp do tego obiektu tajnego:

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

Aby sprawdzić, czy obiekt tajny został utworzony, wyświetl listę obiektów tajnych:

gcloud secrets versions list application_settings

Po potwierdzeniu utworzenia obiektu tajnego usuń plik lokalny:

rm .env

6. Skonfiguruj aplikację

W związku z utworzonymi właśnie usługami pomocniczymi musisz wprowadzić w projekcie szablonu pewne zmiany.

Obejmuje to wprowadzenie django-environ do używania zmiennych środowiskowych jako ustawień konfiguracji, które wypełnisz wartościami zdefiniowanymi jako obiekty tajne. Aby to zrobić, rozszerz ustawienia szablonu. Musisz też dodać dodatkowe zależności Pythona.

Konfigurowanie ustawień

Przenieś plik settings.py i zmień jego nazwę na basesettings.py:.

mv myproject/settings.py myproject/basesettings.py

W edytorze internetowym Cloud Shell utwórz nowy plik settings.py z tym kodem:

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

Poświęć czas na przeczytanie komentarzy dodanych do każdej konfiguracji.

Pamiętaj, że w tym pliku mogą pojawić się błędy lintingu. To normalne. Cloud Shell nie ma kontekstu wymagań tego projektu, więc może zgłaszać nieprawidłowe i nieużywane importy.

Zależności Pythona

Znajdź plik requirements.txt i dołącz te pakiety:

cloudshell edit requirements.txt

requirements.txt (append)

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

Określ obraz aplikacji

Cloud Run uruchomi każdy kontener, o ile jest on zgodny z umową dotyczącą kontenerów Cloud Run. W tym samouczku pominięto Dockerfile, ale zamiast tego użyto Cloud Native Buildpacks. Buildpacki pomagają w tworzeniu kontenerów dla popularnych języków, w tym Pythona.

W tym samouczku wybieramy dostosowanie Procfile używanego do uruchamiania aplikacji internetowej.

Aby skonteneryzować projekt szablonu, najpierw utwórz nowy plik o nazwie Procfile w katalogu najwyższego poziomu projektu (w tym samym katalogu co manage.py) i skopiuj tę treść:

touch Procfile
cloudshell edit Procfile

Procfile

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

7. Konfigurowanie, tworzenie i uruchamianie kroków migracji

Aby utworzyć schemat bazy danych w bazie danych Cloud SQL i wypełnić zasobnik Cloud Storage statycznymi zasobami, musisz uruchomić polecenia migrate i collectstatic.

Te podstawowe polecenia migracji Django muszą być uruchamiane w kontekście utworzonego obrazu kontenera z dostępem do bazy danych.

Musisz też uruchomić polecenie createsuperuser, aby utworzyć konto administratora do logowania się w panelu administracyjnym Django.

Aby to zrobić, użyjesz zadań Cloud Run. Zadania Cloud Run umożliwiają uruchamianie procesów, które mają określone zakończenie, dzięki czemu idealnie nadają się do zadań administracyjnych.

Określ hasło superużytkownika Django

Aby utworzyć superużytkownika, użyj nieinteraktywnej wersji polecenia createsuperuser. To polecenie wymaga specjalnie nazwanej zmiennej środowiskowej, która zastępuje prośbę o wpisanie hasła.

Utwórz nowy obiekt tajny, używając losowo wygenerowanego hasła:

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

Zezwól kontu usługi na dostęp do tego obiektu tajnego:

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

Aktualizowanie pliku Procfile

Aby zwiększyć przejrzystość zadań Cloud Run, utwórz skróty w pliku Procfile i dołącz te punkty wejścia do pliku Procfile:

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

Powinny być teraz widoczne 3 wpisy: domyślny punkt wejścia web, punkt wejścia migrate do stosowania migracji bazy danych i punkt wejścia createuser do uruchamiania polecenia createsuperuser.

Tworzenie obrazu aplikacji

Po wprowadzeniu zmian w pliku Procfile skompiluj obraz:

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

Tworzenie zadań Cloud Run

Teraz, gdy obraz już istnieje, możesz tworzyć za jego pomocą zadania Cloud Run.

Te zadania używają wcześniej utworzonego obrazu, ale mają inne wartości command. Odpowiadają one wartościom w Procfile.

Utwórz zadanie migracji:

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

Utwórz zadanie tworzenia użytkownika:

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

wykonywać zadania Cloud Run,

Po skonfigurowaniu zadań uruchom migracje:

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

Sprawdź, czy w wynikach tego polecenia jest komunikat „successfully completed” (zostało wykonane).

To polecenie uruchomisz później, gdy będziesz wprowadzać zmiany w aplikacji.

Po skonfigurowaniu bazy danych utwórz użytkownika za pomocą zadania:

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

Sprawdź, czy w wynikach tego polecenia jest komunikat „successfully completed” (zostało wykonane).

Nie musisz ponownie uruchamiać tego polecenia.

8. Wdrożenie w Cloud Run

Po utworzeniu i wypełnieniu usług pomocniczych możesz utworzyć usługę Cloud Run, aby uzyskać do nich dostęp.

Początkowe wdrożenie skonteneryzowanej aplikacji w Cloud Run tworzy się za pomocą tego polecenia:

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

Poczekaj chwilę na zakończenie wdrażania. Kiedy operacja zostanie wykonana, w wierszu poleceń wyświetli się URL usługi:

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

Możesz teraz zobaczyć wdrożony kontener, otwierając ten adres URL w przeglądarce:

e1fb6858bf11626a.png

Ponieważ jest to nowa instalacja, automatycznie przekierujemy Cię na stronę logowania.

9. Dostęp do panelu administracyjnego Django

Jedną z głównych funkcji Django CMS jest interaktywny panel administracyjny.

Aktualizowanie ustawień CSRF

Django zawiera zabezpieczenia przed fałszowaniem żądań z innych witryn (CSRF). Za każdym razem, gdy w witrynie Django przesyłany jest formularz, w tym podczas logowania się w panelu administracyjnym Django, sprawdzane jest ustawienie Zaufane źródła. Jeśli nie pasuje do źródła żądania, Django zwraca błąd.

Jeśli w pliku mysite/settings.py zdefiniowana jest zmienna środowiskowa CLOUDRUN_SERVICE_URL, jest ona używana w ustawieniach CSRF_TRUSTED_ORIGINSALLOWED_HOSTS. Definiowanie parametru ALLOWED_HOSTS nie jest obowiązkowe, ale warto go dodać, ponieważ jest on już wymagany w przypadku parametru CSRF_TRUSTED_ORIGINS.

Ponieważ potrzebujesz adresu URL usługi, tej konfiguracji nie można dodać przed pierwszym wdrożeniem.

Aby dodać tę zmienną środowiskową, musisz zaktualizować usługę. Można go dodać do klucza tajnego application_settings lub bezpośrednio jako zmienną środowiskową.

Poniższe wdrożenie korzysta z formatowaniasekwencji ucieczki gcloud.

Pobierz adres URL usługi:

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

Ustaw tę wartość jako zmienną środowiskową w usłudze Cloud Run:

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

Logowanie się w panelu administracyjnym Django

Aby uzyskać dostęp do interfejsu administratora Django, dodaj /admin do adresu URL usługi.

Teraz zaloguj się przy użyciu nazwy użytkownika „admin” i odzyskaj hasło za pomocą tego polecenia:

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

da10a148bc1c7994.png

10. Instalowanie aktualizacji aplikacji

Podczas tworzenia aplikacji warto ją testować lokalnie. Aby to zrobić, musisz połączyć się z bazą danych Cloud SQL („produkcyjną”) lub lokalną („testową”).

Łączenie z produkcyjną bazą danych

Z instancjami Cloud SQL możesz łączyć się za pomocą serwera proxy uwierzytelniania Cloud SQL. Ta aplikacja tworzy połączenie z bazą danych z komputera lokalnego.

Po zainstalowaniu serwera proxy uwierzytelniania Cloud SQL wykonaj te czynności:

# 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

Po zakończeniu pracy usuń plik temp_settings.

Nawiązywanie połączenia z lokalną bazą danych SQLite

Podczas tworzenia aplikacji możesz też używać lokalnej bazy danych. Django obsługuje bazy danych PostgreSQL i SQLite. Niektóre funkcje PostgreSQL nie są dostępne w SQLite, ale w wielu przypadkach funkcjonalność jest identyczna.

Aby skonfigurować SQLite, musisz zaktualizować ustawienia aplikacji, aby wskazywały lokalną bazę danych, a następnie zastosować migracje schematu.

Aby skonfigurować tę metodę:

# 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

Po zakończeniu pracy usuń plik temp_settings.

Tworzę migracje

Wprowadzając zmiany w modelach bazy danych, może być konieczne wygenerowanie plików migracji Django przez uruchomienie polecenia python manage.py makemigrations.

To polecenie możesz uruchomić po skonfigurowaniu połączenia z bazą danych produkcyjną lub testową. Możesz też wygenerować pliki migracji bez bazy danych, podając puste ustawienia:

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

Instalowanie aktualizacji aplikacji

Aby zastosować zmiany w aplikacji, musisz:

  • wprowadzić zmiany w nowym obrazie,
  • zastosować migracje statyczne lub dotyczące baz danych, a następnie
  • zaktualizować usługę Cloud Run, aby używała nowego obrazu.

Aby utworzyć obraz:

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

Jeśli masz jakieś migracje do zastosowania, uruchom zadanie Cloud Run:

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

Aby zaktualizować usługę za pomocą nowego obrazu:

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

11. Gratulacje!

Właśnie wdrożyliśmy w Cloud Run złożony projekt.

  • Cloud Run automatycznie skaluje obraz kontenera w poziomie, aby obsługiwać otrzymane żądania, a następnie skaluje go w dół, gdy zapotrzebowanie maleje. Płacisz tylko za procesor, pamięć i sieć wykorzystywane w trakcie obsługiwania żądań.
  • Cloud SQL umożliwia udostępnianie zarządzanej instancji PostgreSQL, która jest automatycznie obsługiwana i natywnie zintegrowana z wieloma systemami Google Cloud.
  • Cloud Storage umożliwia korzystanie z pamięci w chmurze w sposób, który jest bezproblemowo dostępny w Django.
  • Usługa Secret Manager umożliwia przechowywanie obiektów tajnych i udostępnianie ich tylko określonym częściom Google Cloud.

Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud Platform opłatami za zasoby zużyte w tym samouczku:

  • W Cloud Console otwórz stronę Zarządzanie zasobami.
  • Na liście projektów wybierz projekt, a następnie kliknij Usuń.
  • W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

Więcej informacji