Переменные окружения позволят прописать значения, такие, как логин и пароль базы данных, секретный ключ или данные от почтового сервера, в специальном файле .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.