LoginSignup
0
0

【Python】Docker、Django、PostgresqlでWebアプリを開発し、Render.comで公開する(第3回)

Posted at

はじめに

前提

前回の続きです。
【Python】Docker、Django、PostgresqlでWebアプリを開発し、Render.comで公開する(第2回)

ゴール

最終回はRender.comへのデプロイです。

開発環境

  • Macbook Air (M1, RAM:16GB)
  • Docker
  • Visual Studio Code
  • Google Chrome
  • Git・GitHub
  • Render.com

作成過程

以上のサイトを参考に進めます。
特に「Railsチュートリアルをカスタマイズしてポートフォリオを作成する方法」はかなり参考にしました。

requirements.txtの編集

Render.comへデプロイするために、追加でインストールします。

requirements.txt
asgiref==3.6.0
dj-database-url==2.0.0
Django==4.2
gunicorn==20.1.0
psycopg2==2.9.6
python-dotenv==1.0.0
sqlparse==0.4.4
typing_extensions==4.6.0
whitenoise==6.4.0
Terminal
docker compose exec web bash

(ここからコンテナ内)

# インストール
pip installl -r requirements.txt

# コンテナ内から出る
exit

VSCodeでsettings.pyの編集を行う

以下にsttings.pyの全文を記載します。

board/settings.py
import os
from pathlib import Path
from dotenv import load_dotenv
# 追加
import dj_database_url

load_dotenv()

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = os.environ.get('SECRET_KEY', default=os.environ['SECRET_KEY'])

# 追加
DEBUG = 'RENDER' not in os.environ

# 編集、追加
ALLOWED_HOSTS = []
RENDER_EXTERNAL_HOSTNAME = os.environ.get('RENDER_EXTERNAL_HOSTNAME')
if RENDER_EXTERNAL_HOSTNAME:
    ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'board.apps.BoardConfig',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # 追加
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'config.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'config.wsgi.application'

# 編集、追加
if DEBUG:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'postgres',
            'USER': 'postgres',
            'PASSWORD': 'postgres',
            'HOST': 'db',
            'PORT': 5432,
        }
    }
else:
    DATABASES = {"default": dj_database_url.config()}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_TZ = True


# 追加、編集
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
if not DEBUG:
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

LOGIN_URL = 'login'

ここまで記載したら、buildし直します。

Terminal
# buildし直す
docker compose up -d --build

build.shの作成

build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

python manage.py collectstatic --no-input
python manage.py migrate

exec "$@"

Dockerfileの編集

Dockerfile
FROM python:3.9.16
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD . /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

RUN chmod a+x build.sh
ENTRYPOINT [ "bash", "./build.sh" ]
EXPOSE 8000
CMD [ "gunicorn", "config.wsgi:application" ]

.gitignoreの作成とGitHubへのPush

.gitignoreを作成します。

.gitignore
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# Add
.DS_Store
.vscode
staticfiles

.gitignoreを作成したらGitHubへPushしてください。

Render.comにデプロイする

このサイトを参考にし、アカウント作成、DB「PostgreSQL」、Web serviceを作成してください。

注意

  1. DBの作成時やアプリをデプロイする際、RegionはOregonにしたほうが応答速度が早くなるのでおすすめです。
  2. Web seviceをデプロイする際、Advancedは以下のように設定してください。
    ScreenShot 2023-05-29 22.02.10.JPG

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0