記事一覧へ戻る 本の順番で続きを読む

デプロイと運用 - 本番環境の構築

Python3上級 | 2026/02/18 21:20

デプロイと運用

本番用settings.py

import os

# 環境変数から読み込む
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
DEBUG = False
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '').split(',')

# セキュリティ設定
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True

# データベース
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME', 'mydb'),
        'USER': os.environ.get('DB_USER', 'myuser'),
        'PASSWORD': os.environ.get('DB_PASSWORD'),
        'HOST': os.environ.get('DB_HOST', 'localhost'),
        'PORT': os.environ.get('DB_PORT', '5432'),
    }
}

Dockerfile

FROM python:3.12-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /code

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

RUN python manage.py collectstatic --noinput

EXPOSE 8000
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3"]

docker-compose.yml

version: '3.8'

services:
  web:
    build: .
    env_file: .env
    volumes:
      - static_volume:/code/staticfiles
      - media_volume:/code/media
    depends_on:
      - db
      - redis

  nginx:
    image: nginx:alpine
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - static_volume:/static
      - media_volume:/media
    depends_on:
      - web

  db:
    image: postgres:15
    env_file: .env
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine

volumes:
  postgres_data:
  static_volume:
  media_volume:

nginx設定

upstream django {
    server web:8000;
}

server {
    listen 80;
    server_name example.com;

    location /static/ {
        alias /static/;
    }

    location /media/ {
        alias /media/;
    }

    location / {
        proxy_pass http://django;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

デプロイ手順

# 1. コードをサーバーに転送
rsync -avz --exclude='.git' --exclude='venv' . user@server:/app/

# 2. Dockerイメージをビルド
ssh user@server 'cd /app && docker compose build'

# 3. マイグレーション実行
ssh user@server 'cd /app && docker compose exec web python manage.py migrate'

# 4. 静的ファイル収集
ssh user@server 'cd /app && docker compose exec web python manage.py collectstatic --noinput'

# 5. コンテナ再起動
ssh user@server 'cd /app && docker compose up -d'

環境変数管理(.env)

DJANGO_SECRET_KEY=your-secret-key-here
ALLOWED_HOSTS=example.com,www.example.com
DB_NAME=mydb
DB_USER=myuser
DB_PASSWORD=secure-password
DB_HOST=db
DB_PORT=5432

重要: .env ファイルは .gitignore に追加し、バージョン管理に含めないでください。

まとめ

  • 本番では DEBUG=False、環境変数で秘密情報を管理
  • Gunicorn + nginx の構成が標準的
  • Docker Compose でアプリ・DB・Redis・nginx を一括管理
  • SSL/HTTPS、HSTS、セキュアCookieなどのセキュリティ設定を有効化
  • collectstatic で静的ファイルをnginxから配信