App Platform 및 S3 Space를 사용한 Django 배포
머리말
최근에 개인 블로그에 사용할 호스팅 솔루션을 결정해야 했습니다. 블로그는 Dev-Case의 도움으로 개발되었으며 Django를 기반으로 합니다.
최근에 Django와 관련하여 PaaS에 대한 좋은 글을 많이 읽어서 빠르게 결정을 내렸습니다.
선택할 수 있는 공급자는 다음과 같습니다.
결국 여기(VPS, Space)에서 이미 좋은 경험을 했기 때문에 DigitalOcean을 선택했습니다. DO의 또 다른 장점은 S3-Storage에 대해 다른 공급자가 필요하지 않다는 것입니다.
준비
App-Platform으로 Django 프로젝트를 호스팅할 수 있도록 다음과 같은 준비를 했습니다.
환경 변수
이를 위해 django-environ을 사용합니다.
다음은 몇 가지 기본 설정입니다.
import os
from pathlib import Path
from django.core.management.utils import get_random_secret_key
import environ
BASE_DIR = Path(__file__).resolve().parent.parent
env = environ.Env()
env_file = os.path.join(BASE_DIR, ".env")
if os.path.isfile(env_file):
env.read_env(env_file)
SECRET_KEY = env.str("SECRET_KEY", default=get_random_secret_key())
DEBUG = env.bool("DEBUG", default=False)
ALLOWED_HOSTS = env.list(
"ALLOWED_HOSTS",
default=[
"127.0.0.1",
],
)
데이터 베이스
여기서 나는 Postgres를 사용하기로 결정했습니다.
django-environ 덕분에 여기서
DATABASE_URL
를 사용할 수 있습니다.SQLite를 사용할 가능성은 여전히 존재하지만 개인 취향의 문제입니다.
DATABASE_URL = env.str("DATABASE_URL", default=False)
if DATABASE_URL:
DATABASES = {"default": env.db()}
else:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
S3 스토리지
나중에 S3 호환 스토리지를 사용하려면(DO Space):
USE_S3_STORAGE = env.bool("USE_S3_STORAGE", default=False)
AWS_ACCESS_KEY_ID = env.str("AWS_ACCESS_KEY_ID", default="")
AWS_SECRET_ACCESS_KEY = env.str("AWS_SECRET_ACCESS_KEY", default="")
AWS_STORAGE_BUCKET_NAME = env.str("AWS_STORAGE_BUCKET_NAME", default="")
AWS_S3_REGION_NAME = env.str("AWS_S3_REGION_NAME", default="")
AWS_S3_ENDPOINT_URL = env.str("AWS_S3_ENDPOINT_URL", default="")
AWS_S3_CUSTOM_DOMAIN = env.str("AWS_S3_CUSTOM_DOMAIN", default="")
AWS_LOCATION = env.str("AWS_LOCATION", default="")
AWS_IS_GZIPPED = env.bool("AWS_IS_GZIPPED", default=False)
AWS_S3_FILE_OVERWRITE = env.bool("AWS_S3_FILE_OVERWRITE", default=True)
AWS_DEFAULT_ACL = env.str("AWS_DEFAULT_ACL", default="public-read")
STATICFILES_DIRS = (str(BASE_DIR.joinpath("static")),)
STATIC_ROOT = str(BASE_DIR.joinpath("staticfiles"))
MEDIA_ROOT = str(BASE_DIR.joinpath("media"))
if USE_S3_STORAGE:
DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
STATIC_URL = f"https://{AWS_S3_ENDPOINT_URL}/{STATIC_ROOT}/"
MEDIA_URL = f"https://{AWS_S3_ENDPOINT_URL}/{MEDIA_ROOT}/"
else:
STATICFILES_STORAGE = "django.contrib.staticfiles.storage.StaticFilesStorage"
STATIC_URL = "static/"
MEDIA_URL = "/media/"
SSL
유효한 SSL 인증서가 자동으로 제공됩니다.
SECURE_SSL_REDIRECT = env.bool("SECURE_SSL_REDIRECT", default=False)
SECURE_HSTS_SECONDS = env.int("SECURE_HSTS_SECONDS", default=0)
SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool(
"SECURE_HSTS_INCLUDE_SUBDOMAINS", default=False
)
SECURE_HSTS_PRELOAD = env.bool("SECURE_HSTS_PRELOAD", default=False)
SESSION_COOKIE_SECURE = env.bool("SESSION_COOKIE_SECURE", default=False)
CSRF_COOKIE_SECURE = env.bool("CSRF_COOKIE_SECURE", default=False)
PIP 요구 사항
다음 패키지가 필요합니다.
django
gunicorn
django-environ
psycopg2-binary
boto3
django-storages
requirements.txt 파일의 도움으로 buildtool은 나중에 이것이 Python 프로젝트임을 인식합니다.
앱 플랫폼
이제 모든 것이 준비되었으므로 DO에서 Django 프로젝트 생성을 시작할 수 있습니다. 문서와 인터넷에 대한 추가 게시물이 매우 훌륭하기 때문에 이 시점에서 자세한 지침을 저장합니다.
중요한 설정은 다음과 같습니다(예: Dev-Case).
gunicorn dev_case.wsgi:application --bind 0.0.0.0:8080 --worker-tmp-dir /dev/shm
8080
프로젝트 구조에 따라:
routes:
- path: /
source_dir: /
"dev"데이터베이스를 사용하면 동적 변수를 환경 변수로 사용할 수 있습니다. 예:
${db.DATABASE_URL}
. 이 경우 데이터베이스 이름은 db
입니다.DO에서 관리되는 데이터베이스를 사용하는 경우 GUI를 통하지 않고 수동으로 데이터베이스를 만들어야 합니다. 그렇지 않으면 재배포 시 오류가 발생할 수 있습니다. 여기에 대한 게시물을 곧 링크하겠습니다.
빌드 프로세스가 완료된 후:
콘솔 탭을 통해 앱의 콘솔에 액세스하고 다음 명령을 실행합니다.
python3 manage.py migrate
초기 데이터베이스 마이그레이션용python3 manage.py createsuperuser
관리 사용자 생성S3 및 CORS
나중에 CORS 오류를 방지하려면 공간 설정에서 다음과 같이 조정하십시오.
내 공간 -> 설정 -> CORS 구성(추가):
*ondigitalocean.app
*example.com
이렇게 하면 글꼴, 스크립트 등의 문제가 해결됩니다(헤더 누락, Access-Control-Allow-Origin).
결론
지금까지 DO의 APP-Platform에 매우 만족하고 있습니다. 성능도 좋고 안심이 됩니다. 곧 로그 전달을 테스트합니다. 그것에 대해 쓸 것이 있으면 여기에 링크하겠습니다. ;)
Reference
이 문제에 관하여(App Platform 및 S3 Space를 사용한 Django 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rob32/django-deployment-with-app-platform-s3-space-3ijf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)