Как подавать медиафайлы на 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)

  1. 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
  1. 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

  1. 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.`

Вернуться на верх