Как подавать медиафайлы на render.com для развернутого приложения Django?
` Ниже приведена документация render.com по обслуживанию статики и медиа при развертывании Django webapp. Все работает, кроме загрузки фотографии профиля. Ниже приведены коды setting.py, build.sh и render.yaml. Развертывание происходило через экземпляр blueprint с PostgreSQL. Также используется PGAdmin 4 GUI
Если вы обнаружите проблему, отлично. Если нет, то я потратил неделю на Linux/Ubuntu на своем ноутбуке wondows, пытаясь заставить Nginx работать с медиафайлами.
https://djangocareershifterswebsite.onrender.com (с sqlite 3 db) https://careershiftforum.onrender.com (с postgresql db)
- setting.py
import os
import dj_database_url
from django.core.management.utils import get_random_secret_key
# Generate or retrieve SECRET_KEY from environment variables
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY', default=get_random_secret_key())
# Define BASE_DIR to point to the root directory of your Django project
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG = os.getenv("DEBUG", "False").lower() == "true"
ALLOWED_HOSTS = ['careershiftforum.onrender.com', 'localhost', '127.0.0.1']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'base.apps.BaseConfig',
'rest_framework',
'corsheaders',
]
AUTH_USER_MODEL = 'base.User'
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 = 'careershiftforum.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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 = 'careershiftforum.wsgi.application'
# Use dj_database_url to parse the DATABASE_URL environment variable
DATABASE_URL = os.getenv('DATABASE_URL')
DATABASES = {
'default': dj_database_url.config(default=DATABASE_URL)
}
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# Whitenoise configuration for serving static files in production
if not DEBUG:
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# CORS settings (allow all origins for testing purposes)
CORS_ALLOW_ALL_ORIGINS = True
- render.yaml файл
databases:
- name: postgres
plan: free
databaseName: ####
user: ####
services:
- type: web
plan: free
name: careershiftforum
runtime: python
buildCommand: "./build.sh"
startCommand: "python -m gunicorn careershiftforum.asgi:application -k uvicorn.workers.UvicornWorker"
envVars:
- key: DATABASE_URL
fromDatabase:
name: postgres
property: connectionString
- key: SECRET_KEY
generateValue: true
- key: WEB_CONCURRENCY
value: 4
- build.sh
#!/usr/bin/env bash
# Exit on error
set -o errexit
# Modify this line as needed for your package manager (pip, poetry, etc.)
pip install -r requirements.txt
# Convert static asset files
python manage.py collectstatic --no-input
# Apply any outstanding database migrations
python manage.py migrate
Обслуживание файлов с помощью nginx: Основная проблема при получении SSL-сертификатов с render.com/access denied
Конфигурация Nginx: sudo nano /etc/nginx/sites-available/careershiftforum
Перенаправление HTTP на HTTPS
server {
listen 80;
server_name careershiftforum.onrender.com;
return 301 https://$host$request_uri;
}
Обслуживать HTTPS-запросы
server {
listen 443 ssl;
server_name careershiftforum.onrender.com;
ssl_certificate /etc/nginx/ssl/careershiftforum.onrender.com.crt;
ssl_certificate_key /etc/nginx/ssl/careershiftforum.onrender.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /var/www/careershiftforum/static/;
}
location /media/ {
alias /var/www/careershiftforum/media/;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
internal;
}
}
Включите конфигурацию сайта:
sudo ln -s /etc/nginx/sites-available/careershiftforum /etc/nginx/sites-enabled/
Создайте каталоги и установите разрешения: Убедитесь, что каталоги для вашего сайта, статических и мультимедийных файлов существуют, и установите правильные разрешения.
sudo mkdir -p /var/www/careershiftforum/static
sudo mkdir -p /var/www/careershiftforum/media
sudo chown -R www-data:www-data /var/www/careershiftforum
sudo chmod -R 755 /var/www/careershiftforum
Установите SSL-сертификат:
sudo mkdir -p /etc/nginx/ssl
sudo cp /path/to/your/certificate.crt /etc/nginx/ssl/careershiftforum.onrender.com.crt
sudo cp /path/to/your/private.key /etc/nginx/ssl/careershiftforum.onrender.com.key
Конфигурация сокетов Gunicorn: Убедитесь, что Gunicorn настроен на обслуживание вашего Django-приложения, и создайте файл сокета.
sudo nano /etc/systemd/system/gunicorn.service
ini
Copy code
[Unit]
Description=gunicorn daemon
After=network.target
[Сервис]
User=www-data
Group=www-data
WorkingDirectory=/path/to/your/django/project
ExecStart=/path/to/your/venv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
yourproject.wsgi:application
WantedBy=multi-user.target
Перезагрузите демон systemd и запустите службу Gunicorn:
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
Тестирование конфигурации Nginx: Проверьте конфигурацию, чтобы убедиться в отсутствии синтаксических ошибок.
sudo nginx -t
Res перезапустить Nginx: Перезапустите Nginx, чтобы применить изменения.
Откройте браузер и перейдите по адресу https://careershiftforum.onrender.com/media/your-uploaded-file.jpg
404 ошибка, и nginx не смог получить доступ к render.com! Пожалуйста, подскажите.
Я пробовал django doumentaion, render.com dumentaion и nginx. Медиа не сохраняется и даже не загружается при обновлении фотографии профиля. Проблема с доступом к конфигурации Nginx.`