Как подключить postgresql к django ubuntu

Обновлено: 04.07.2024

In this post, we will install Django in a Python virtual environment using PostgreSQL. We will then install and configure Gunicorn to serve applications. Next, we will use Nginx as a reverse proxy to the Gunicorn application server.

5 months ago • 5 min read

Introduction

Prerequisites

  • A server running Ubuntu 20.04.
  • A valid domain name pointed with your server IP.
  • A root password is configured on your server.

Install Required Packages

First, you will need to install Nginx and other Python dependencies on your server. You can install all the packages with the following command:

apt-get install python3-pip python3-dev libpq-dev curl nginx -y

Once all the packages are installed, start the Nginx service and enable it to start at system reboot:

systemctl start nginx

systemctl enable nginx

Install and Configure PostgreSQL

Next, you will need to install the PostgreSQL server on your server. You can install it with the following command:

apt-get install postgresql postgresql-contrib -y

After the installation, log in to PostgreSQL shell with the following command:

Next, create a database and user for Django with the following command:

Next, grant some required roles with the following command:

Next, exit from the PostgreSQL shell using the following command:

Create a Python Virtual Environment

Next, you will need to create a Python virtual environment for the Django project.

First, upgrade the PIP package to the latest version:

Next, install the virtualenv package using the following command:

Next, create a directory for the Django project using the command below:

Next, change the directory to django_project and create a Django virtual environment:

Next, activate the Django virtual environment:

Next, install the Django, Gunicorn, and other packages with the following command:

Install and Configure Django

Next, run the following command to create a Django project:

Next, edit the settings.py and define your database settings:

Find and change the following lines:

Save and close the file then migrate the initial database schema to the PostgreSQL database:

Next, create an admin user with the following command:

Set your admin username and password as shown below:

Next, gather all the static content into the directory

Test the Django Development Server

Now, start the Django development server using the following command:

You should see the following output:

django admin login page

Provide your admin username, password and click on the Login. You should see the Django dashboard on the following page:

django admin dashboard

Now, go back to your terminal and press CTRL + C to stop the Django development server.

Test Gunicorn

Next, you will need to test whether the Gunicorn can serve the Django or not. You can start the Gunicorn server with the following command:

If everything is fine, you should get the following output:

Press CTRL + C to stop the Gunicorn server.

Next, deactivate the Python virtual environment with the following command:

Create a Systemd Service File for Gunicorn

It is a good idea to create a systemd service file for the Gunicorn to start and stop the Django application server.

To do so, create a socket file with the following command:

Add the following lines:

Save and close the file then create a service file for Gunicorn:

Add the following lines that match your Django project path:

Save and close the file then set proper permission to the Django project directory:

Next, reload the systemd daemon with the following command:

Next, start the Gunicorn service and enable it to start at system reboot:

To check the status of the Gunicorn, run the command below:

You should get the following output:

Configure Nginx as a Reverse Proxy to Gunicorn Application

Next, you will need to configure Nginx as a reverse proxy to serve the Gunicorn application server.

To do so, create an Nginx configuration file:

Add the following lines:

Save and close the file then verify the Nginx for any configuration error:

Finally, restart the Nginx service to apply the changes:

Conclusion

In the above guide, you learned how to deploy a Django application with Gunicorn and Nginx as a reverse proxy. You can now use this setup in the production environment for deploying secure and high-performance Python applications.

Подключение PostgreSQL к Django

Приветствую! В прошлой статье мы выполнили деплой приложения Django на сервере с операционной системой Ubuntu 20.04. В этой статье мы продолжим эту инструкцию, а именно установим и подключим мощную и функциональную базу данных PostgreSQL к нашему Django приложению.

По-умолчанию Django использует базу данных SQLite, но это не самый лучший вариант для хранения информации. Поэтому работать мы будем именно с PostgreSQL.

1. Добавление PPA

PostgreSQL - популярный сервер баз данных и он имеется в официальных репозиториях. Но мы хотим использовать самую последнюю версию программы. Для этого нужно добавить в систему PPA (Personal Package Archive) с помощью команд:

2. Обновляем пакеты

3. Устанавливаем PostgreSQL

На момент написания статьи последней актуальной версий являлась PostgreSQL-12. Проверить последнюю версию можно на официальном сайте БД. В случае обновления можно просто заменить версию в команде, например, sudo apt install postgresql-13.

4. Открываем консоль PostgreSQL

5. Задаем пароль для администратора БД

6. Создадим суперпользователя

Создадим и настроим пользователя, при помощи которого будем соединяться с базой данных из Django (делать все через суперпользователя - не самая хорошая идея). Также укажем значения по умолчанию для кодировки, уровня изоляции транзакций и временного пояса. Вводим поочередно следующие команды:

Здесь hostgeek_db - это имя пользователя, а testpassword18 - пароль. Указывайте свои индивидуальные значения.

7. Создаем базу данных для нашего проекта

Здесь first_db - это название базы данных, а hostgeek_db - имя пользователя, который был создан в предыдущем пункте.

8. Выходим из консоли PostgreSQL команой:

9. Активируем виртуальное окружение (если оно не активировано)

Подробно об этом было расписано в прошлой статье по деплою Django. Активируется виртуальное окружение командой:

Конечно, эта команда зависит от пути, в который вы установили виртуальное окружение. Но у меня оно активируется таким образом.

10. В виртуальное окружение проекта устанавливаем бэкэнд для PostgreSQL

11. Отредактируем файл настроек Django

Полностью удаляем раздел DATABASES = <. >и заменяем на следующий код:

12. Перезапускаем Gunicorn

Для активизации этих изменений нужно перезапустить Gunicorn. Для этого вводим команду:

Жмем F4 (Filter) и вводим слово gunicorn. Так мы из общей массы отсортируем только процессы Gunicorn. Жмем на клавиатуре стрелку вниз и "киляем" все процессы поочередным нажатием клавиш F9 - 1 (SIGHUP) - Enter. Как видно, после "убийства" процессов они тут же запускаются автоматически, значит все работает правильно

Процессы Gunicorn

Выходим из htop нажатием клавиши F10.

13. Выполним миграцию базы данных

Перейдем в папку

/myapps/parser/siteparser (папка, в которой лежит файл manage.py):

Выполним команду миграции БД:

Миграция базы данных Python

14. Создадим суперпользователя Django

Под этим пользователем мы будем авторизовываться в админ-панели Django.

Создание суперпользователя базы данных Django

15. Перезапускаем Gunicorn (повторяем пункт 12 этой статьи)

16. Авторизуемся в админке

Админка Django без стилей

Для подключения стилей откроем конфигурационный файл Nginx:

Добавим в него следующий код и сохраним файл:

После этого админка будет отображаться корректно:

Админка Django с подключенными стилями

На этом подключение базы данных PostgreSQL к фреймворку Django завершено. В следующей статье разберем настройку Memcached.

Если у вас возникли какие-либо вопросы по этой статье, то задавайте их в комментариях, мы обязательно ответим. Спасибо за внимание!

На данный момент вы можете начать разработку веб приложения на Django, потому что единственное требование Django — работающий экземпляр интерпретатора Python. Тем не менее, эта книга сфокусирована на одной из возможностей среды разработки, а именно на разработке сайтов с поддержкой базы данных. Следовательно, вам потребуется установить сервер базы данных, который будет хранить ваши данные.

Если вы просто желаете посмотреть Django, пропустите всё до раздела « Новый проект » . Но имейте в виду, что все примеры в книге предполагают, что у вас есть база данных.

Django поддерживает четыре системы управления базами данных:

По большей части движки для перечисленных баз данных хорошо работают с ядром среды Django. Заметным исключением является необязательная поддержка GIS, которая лучше работает совместно с PostgreSQL, чем с другими базами данных. Если вы не привязаны к какой-либо унаследованной системе и у вас есть свобода выбора базы данных, мы рекомендуем PostgreSQL, который имеет отличный баланс между стоимостью, возможностями, скоростью и стабильностью.

Настройка базы данных происходит в два шага:

Во-первых, вам потребуется установить и настроить сам сервер базы данных. Этот процесс не попадает в область рассмотрения данной книги, но каждая из упомянутых баз данных имеет хорошую документацию на собственном сайте. Если вы используете сторонних хостинг, наверняка, его администраторы уже настроили всё для вас.

Во-вторых, вам потребуется установить библиотеку Python для поддержки вашей базы данных. Это сторонний код, который позволяет Python получать интерфейс к базе данных. Мы рассмотрим требования каждой базы данных в следующих разделах.

Если вы только начали разбираться с Django и не желаете устанавливать сервер баз данных, рассмотрите возможность использования SQLite. SQLite отличается от всех остальных баз данных, упомянутых выше, тем, что он не требует вышеописанных шагов, если вы используете Python 2.5. SQLite просто читает и пишет данные в единственный файл на файловой системе, а Python 2.5 имеет встроенную поддержку для него.

На Windows получение драйвера для работы с базой данных является не таким простым процессом. Таким образом, мы рекомендуем начинать работу с Django, используя Python версии 2.5 и его поддержку SQLite.

Использование Django с PostgreSQL

Если вы используете Linux, проверьте через пакетную систему вашего дистрибутива наличие пакета с именем python-psycopg2 , psycopg2-python , python-postgresql или аналогичным им.

Использование Django с SQLite 3

Если вы используете интерпретатор Python версии 2.5 или выше, вам повезло: никакой установки вам не потребуется, так как Python уже содержит поддержку SQLite. Переходите к чтению следующего раздела.

На Windows вы можете пропустить установку отдельных исполняемых файлов SQLite, так как они статически слинкованы с pysqlite .

Если вы используете Linux, проверьте через пакетную систему вашего дистрибутива наличие пакета с именем python-sqlite3 , sqlite-python , pysqlite или аналогичным им.

Например, на Debian Linux, Ubuntu и т.д. этот пакет можно поставить так:

Использование Django с MySQL

Django работает с MySQL, начиная с версии 4.0. Версии MySQL ниже 4.0 не поддерживают вложенные запросы и некоторые стандартные SQL операторы.

Если вы используете Linux, проверьте через пакетную систему вашего дистрибутива наличие пакета с именем python-mysql , python-mysqldb , mysql-python или аналогичным им.

Использование Django без базы данных

Как упоминалось ранее, Django не требует наличия базы данных. Если вы просто желаете обрабатывать динамические страницы, которые не обращаются к базе данных, всё это реально.

Следует принять во внимание, что некоторые дополнительные инструменты поставляемые с Django требуют наличия базы данных. Соответственно, если вы отказываетесь от использования базы данных, вы также отказываетесь от использования этих инструментов. Мы отдельно выделим их в книге.

В этой статье будет рассмотрена установка фреймворка Django, вместе с базой данных PostgreSQL, веб сервером Gunicorn и Nginx на контейнерах Docker с Compose. У вас уже должен быть установлен Docker и Compose. Так же, желательно, иметь хотя бы поверхностное представление о перечисленных технологиях. Так как в подобной настройке легко ошибиться - рекомендуется повторять все в точности.

В рамках статьи мы рассматриваем создание образа для локальной разработки и, с существующими наработками, создание образа для продакшена. На готовые образ, со всеми файлами и комментариями, можно посмотреть на GitHub.

Я буду использовать python3.8 для создания проекта на django 3+, но все операции (с оговорками в определенных местах) подойдут и для python 3.6+ и django 2+.

Навигация по посту

Создание проекта Django для тестирования

Во время создания проектов Python (в т.ч. Django) используется модель виртуального окружения. Виртуальное окружение помогает изолировать версии установленных пакетов и легко их переносить на другие компьютеры и проекты. Вообще этот модуль нужен только для конкретного тестового проекта и не будет переноситься в контейнер.

Следующей командой мы создадим окружение и активируем его:

Активирование виртуально окружения в Python

Теперь установим Django через менеджер пакетов pip:

Миграции Django - это процесс создания таблиц в базе данных. По умолчанию используется база SQLite. Учитывая, что мы будем использовать PostgreSQL вы можете их не проводить, но это способ проверки, что Django установлен и работает:

Следующей командой мы запустим сервер Django:

Проверка работы фреймворка Python Django

Выполнение запроса через curl

Так же рекомендую сравнить структуру папок, которая должна быть у вас на этом моменте.

Структура проекта для Django на Docker

Установка и настройка Django 3 с Nginx, PostgreSQL, Gunicorn на Ubuntu 20

Создание контейнера Django

Обратите внимание на следующие вещи:

Мы по-разному определим значения этих переменных для разных версий Django. Версию вашего Django можно посмотреть, например, так:

Файл requirements.txt

Откроем файл settings.py:

Если версия Django меньше или равна 3, то в settings.py уже используется библиотека os и вы должны будете заменить значения следующих переменных так:

Начиная с версии Django 3.1 вместо os используется библиотека pathlib и нам нужно выполнить дополнительный импорт:

Определение глобальных переменных в Django 3.1

Настройки в файле env.dev говорят, что сервер будет запускаться в режиме "отладки" и принимать подключения с 127.0.0.1 или localhost.

Теперь, каждый раз выполняя сборку контейнеров, у нас будут выполняться следующий процесс:

  1. При запуске контейнера будет читаться файл .env.dev, содержащий какие-то значения;
  2. Значения из файла будут помещены как глобальные переменные проекта (переменные окружения);
  3. Django, через библиотеку os.eviron, читает некоторые переменные из окружения и подставляет где нужно.

Запуск контейнеров на Django

Выполнение тестового запроса через curl к localhost

Если у вас какие-то ошибки - проверьте соответствует ли у вас структура папок:

Структура проекта для запуска Django с PostgreSQL на Docker

Дополнительно вы можете посмотреть на вывод логов докера:

PostgreSQL

Что бы мы могли работать с PostgreSQL нам нужно создать пользователя и базу данных, а так же установить некоторые зависимости для самого Django. За счет них мы сможем выполнять подключения к базе и выполнять запросы.

Для создания базы данных мы обновим файл docker-compose.yml добавив блок под названием db. В этом блоке мы пропишем учетные данные пользователя и имя базы (образ Postgres подхватывает эти переменные сам) и том, на котором будем хранить базу. Обратите внимание на версию образа postgres, возможно вы захотите ее изменить:

Django тоже нужно знать какой логин и пароль, а так же имя базы, использует Postgres. Что бы мы этим могли удобно управлять - обновим файл где храним переменные окружения:

Если вы используете Django 3.0 или меньше

Если у вас Django 3.1 или больше:

Настройка Django для работы на Docker с PostgreSQL

Установка зависимостей для Django и PostgreSQL на Docker

Вы можете установить библиотеку правильным способом, через pip и виртуальное окружение:

Или не очень правильным, добавив жесткую версию библиотеки, как в команде ниже:

Создание файла requirements.txt через pip

Проблема прописывания версии напрямую в том, что у вас может быть проблема с зависимостями.

Выполним билд и запуск наших контейнеров еще раз:

Выполнение запроса к Django

Теперь проверим работу подключения к базе данных. Выполним миграции при которых будут созданы таблицы самим Django:

Выполнение миграций для Django и PostgreSQL на Docker

Мы можем подключиться к контейнеру с базой данных и посмотреть созданные базы, пользователей и таблицы. Замените пользователя и название базы если использовали другие:

Затем, последовательно, выполните следующие команды:

Просмотр созданных таблиц и баз на PostgreSQL

У нас вывелась база для джанго (2) и список созданных через миграцию таблиц (1). Выйдем из режима работы с базой:

Проверить, что у нас был создан том для базы можно так:

Просмотр созданного тома через docker-compose

Дополнительные настройки для PostgreSQL

Мы можем создать скрипт, который будет проверять запущен ли сервер с базой, дожидаться этого ответа и выполнять миграции автоматически. Для этого мы создадим файл entrypoint.sh по следующему пути:

Поместите в него следующий текст:

Для работы этого скрипта нам изменить права на файл:

Так же изменим Dockerfile и добавим запуск этого скрипта при запуске контейнера:

Создание Dockerfile для проекта Django

Не забудьте добавить переменную DATABASE в файл с переменными:

Создание файла с пакетами Python requirements.txt

Перед тестированием шагов выше - остановите контейнеры и удалите том, который был создан для базы раннее:

Создадим образы и запустим контейнеры:

Миграции должны выполнится автоматически:

Просмотр логов миграций через Docker

Если вы получили ошибку (показанную ниже) или не увидели миграций, то скорее всего это связано с тем что вы не удалили предыдущий том:

  • FATAL: database "django_database" does not exist
Создание первого приложения во фреймворке Python Django 3

Gunicorn

Для работы между Django и Nginx используется gunicorn. В момент запроса пользователя, в первую очередь, он будет обработан Nginx. Nginx решит, к какому типу относится запрос (статический/динамический) и в случае динамического содержимого обратиться к Gunicorn.

Рекомендованный способ - через виртуальное окружение и pip:

Установка gunicorn

Второй способ - просто добавьте имя и версию библиотеки без установки:

Создание docker-compose.yml для Django и PostgreSQL

  1. Мы запускаем через gunicorn наш wsgi.py(создается автоматически) файл в папке django_project;
  2. Новый файл, который будет хранить наши переменные для рабочей среды;
  3. Дожидаемся загрузки базы;
  4. Переменные для базы данных.

Мы так же убрали строку, где пробрасывали содержимое папки app в контейнер т.к. это не понадобится.

Если раннее вы не создавали файл с переменными для баз данных - то создайте. Или выполните копирование:

Содержимое этого файла должно быть таким:

Выполним остановку предыдущих контейнеров и билд нового:

Все тесты должны проходить успешно.

На данный момент структура созданных файлов и папок следующая:

Структура проекта для Django и Docker

Создание Dockerfile для продакшена

Изменим разрешение на файл:

Теперь создадим образ докера для создания контейнера с Django. В примере ниже будет создан мульти-образ для экономии месте. Builder - это временный образ с помощью которого будут созданы бинарные файлы Python. После создания образа builder с него будут скопированы файлы в наш основной образ:

Так же обратите внимание на строку с flake8. С помощью этого пакета будет выполнятся проверка вашего приложения и в случае ошибок в стиле кода - билд не будет выполнен. Возможно вы захотите убрать эту строку.

Билд образа Django на Docker

Выполнение миграций через docker exec

Nginx

Настройка Nginx для Django на Docker

В примере выше мы открываем порт 1337 для посетителей сайта, который будет перенаправлять пакеты на 80 порт nginx. Вы можете изменить порт 1337 на любой другой.

Создадим папку, в которой будут хранится конфигурационный файл nginx и файл Docker:

Создадим файл конфигурации Nginx со следующим содержимым:

Что бы файл конфигурации попал в контейнер мы должны создать отдельный Dockerfile:

Открытие внутреннего порта на Docker

Запустим контейнеры еще раз и убедимся, что они работают:

Выполнение миграций для Django

Теперь у нас будет отвечать не Django, а nginx:

Тестирование работы Django с Nginx

На данный момент у вас должна быть следующая структура папок и файлов:

Структура проекта для Docker с Django, Nginx и PostgreSQL

Настройка для статических и медиа файлов

Для Django 3.0 и меньше:

Для Django 3.1 и больше:

Настройка медиа и статических файлов для Django

Чтобы у нас не было проблем с правами (эти папки будут проброшены с правами для root) мы должны создать аналогичные папки в контейнере используя Dockerfile.prod. Допишите следующие инструкции в следующем месте:

Создание папок и пользователя для Django в Docker контейнере

Так же нужно изменить файл конфигурации Nginx что он тоже обращался к этим папкам:

Тестирование работы образов и возможные ошибки

Выполним остановку предыдущих контейнеров и создадим новые. При этом выполним миграции и соберем все статические файлы:

Тестирование работы nginx

Главная страница Django

Ошибка со статическими файлами Django

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

Эти файлы должны отображаться на обоих контейнерах т.к. они работают с одним томом:

Сбор и просмотр статических файлов Django с collectstatic

Если файлов нет - возможно у вас проблемы с правами. Сравните файл Docker. Если нет таких папок, то с томом в файле docker-compose.prod.yml. Ошибка так же может быть в файле конфигурации nginx.conf или в файле setting.py Django.

Для проверки медиа файлов, которые будут загружаться через Django, вы можете создать пустой файл:

Далее выполнить к нему запрос:

Если вернется ошибка 404 - то стоит посмотреть на те же места, что в случае статических файлов.

Чаще всего помогает просмотр логов через докер:

В некоторых случаях стоит удалить том с базой, который создавался ранее.

Варианты запуска

У вас есть 2 основных файла Docker:

Для запуска образа для разработки выполните:

В случае образа для релиза выполните:

В отличие от обычного образа, в случае продакшена нужно дополнительно выполнять миграции и сбор статических файлов:

Читайте также: