デプロイと運用
本番用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から配信