Переменные окружения позволят прописать значения, такие, как логин и пароль базы данных, секретный ключ или данные от почтового сервера, в специальном файле .env (dotenv). Таким образом можно собрать все важные данные в одном файле без необходимости прописывать их непосредственно в коде (хардкодить).

Для того чтобы всё продолжало работать локально, установим библиотеку python-dotenv, выполнив команду:

pip install python-dotenv

Не забудьте добавить установленную библиотеку в файл requirements.txt!

В корне проекта создадим файл .env и откроем файл settings.py в директории проекта.

В самом начале файла settings.py после импортов добавим вызов функции load_dotenv(). Это необходимо, чтобы данные из .env-файла подтягивались при локальном запуске. На сервере это не нужно.

from dotenv import load_dotenv  

load_dotenv()

Для получения данных из переменных окружения мы воспользуемся методом .get('ключ') из функции environ() в пакете os – os.environ.get('ключ'), где ключ – это переменная в .env-файле.

Нам необходимо заменить значения следующих переменных на указанную выше строку, сделав ключом имя переменной, а её текущее содержимое прописать в .env-файле:

  • SECRET_KEY.
  • NAME.
  • USER.
  • PASSWORD.
  • HOST.
  • PORT.
  • EMAIL_HOST.
  • EMAIL_HOST_USER.
  • EMAIL_HOST_PASSWORD.

Пример замены в settings.py:

SECRET_KEY = os.environ.get('SECRET_KEY')

DATABASES = {  
    "default": {  
        "ENGINE": "django.db.backends.postgresql",  
        "NAME": os.environ.get('DB_NAME'),  
        "USER": os.environ.get('DB_USER'),  
        "PASSWORD": os.environ.get('DB_PASSWORD'),  
        "HOST": os.environ.get('DB_HOST'),  
        "PORT": int(os.environ.get('DB_PORT')),  
    }  
}

Обратите внимание на параметр PORT. Он приведён к типу int, поскольку по умолчанию все данные из переменных окружения – строки.

Пример .env-файла:

SECRET_KEY=abcde...
DB_NAME=db_name
DB_USER=db_user
DB_PASSWORD=db_password
DB_HOST=postgres
DB_PORT=5432

Обратите внимание на формат имя_переменной=значение_переменной, без кавычек.

Кроме того, необходимо изменить параметр ALLOWED_HOSTS, прописав в него IP-адрес VPS, локальный адрес (127.0.0.1) и адрес домена, если он подключен к VPS. Должно быть примерно так:

ALLOWED_HOSTS = ["127.0.0.1", "pressanybutton.ru", "0.0.0.0"]
# Вместо 0.0.0.0 пропишите IP-адрес вашего VPS.

После того, как вынесли все важные данные из settings.py в .env, можете проверить, что всё работает как прежде, запустив проект локально.

Dockerfile. Следующим шагом будет создание Dockerfile. Это специальный файл с набором инструкции по сборке Docker-образа.

Создайте файл Dockerfile без расширения со следующим содержимым:

FROM python:3.11.4-buster

ENV PYTHONDONTWRITEBYTECODE=1  
ENV PYTHONUNBUFFERED=1  

WORKDIR /code  

RUN pip install --upgrade pip  
COPY requirements.txt /code/  
RUN pip install -r requirements.txt  

COPY . /code/  

EXPOSE 8000  

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Разберём по порядку:

  • FROM python:3.11.4-buster - В этой строке указываем на используемый при сборке базовый образ. В нашем случае это Python 3.11.4. Можно взять любую версию, включая 3.12, однако учитывайте совместимости библиотек! В нашем проекте используется Django 4.2.2, поэтому и используется Python 3.11.