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
  • http_port: 8080

  • 프로젝트 구조에 따라:

    routes:
      - path: /
    source_dir: /
    


    "dev"데이터베이스를 사용하면 동적 변수를 환경 변수로 사용할 수 있습니다. 예: ${db.DATABASE_URL} . 이 경우 데이터베이스 이름은 db 입니다.

    DO에서 관리되는 데이터베이스를 사용하는 경우 GUI를 통하지 않고 수동으로 데이터베이스를 만들어야 합니다. 그렇지 않으면 재배포 시 오류가 발생할 수 있습니다. 여기에 대한 게시물을 곧 링크하겠습니다.

    빌드 프로세스가 완료된 후:

    콘솔 탭을 통해 앱의 콘솔에 액세스하고 다음 명령을 실행합니다.
  • python3 manage.py migrate 초기 데이터베이스 마이그레이션용
  • python3 manage.py createsuperuser 관리 사용자 생성

  • S3 및 CORS



    나중에 CORS 오류를 방지하려면 공간 설정에서 다음과 같이 조정하십시오.

    내 공간 -> 설정 -> CORS 구성(추가):
  • "Origin"에 도메인(와일드카드 포함)을 추가합니다. 예:
  • *ondigitalocean.app
  • *example.com

  • 허용/확인:
  • 겟, 헤드


  • 이렇게 하면 글꼴, 스크립트 등의 문제가 해결됩니다(헤더 누락, Access-Control-Allow-Origin).

    결론



    지금까지 DO의 APP-Platform에 매우 만족하고 있습니다. 성능도 좋고 안심이 됩니다. 곧 로그 전달을 테스트합니다. 그것에 대해 쓸 것이 있으면 여기에 링크하겠습니다. ;)

    좋은 웹페이지 즐겨찾기