PostgreSQL

Ваш Django-проект хранит данные в предустановленной базе SQLite. Она нормально работает, если к ней не происходит одновременных обращений от нескольких пользователей. Эта база будет эффективна при локальной работе, например, в приложении для смартфона (тогда единственным пользователем этой базы будет владелец смартфона) или при разработке проекта (к ней будет обращаться только разработчик).
Но для веб-проекта на боевом сервере этот вариант не подходит: к такому сервису одновременно могут обращаться тысячи пользователей, и SQLite не успеет обработать эти запросы, не выдержит нагрузки и просто перестанет работать, «упадёт».
Есть много вариантов «боевых» БД. В этом курсе вы настроите PostgreSQL — это современная свободно распространяемая СУБД, удовлетворяющая всем требованиям вашего проекта.
У PostgreSQL отличная документация, актуальная и подробная, и она очень неплохо переведёна на русский язык.

Краткая история PostgreSQL

Современная реализация PostgreSQL происходит от проекта POSTGRES, над которым в Калифорнийском университете с 1985 года работал Майкл Стоунбрейкер.
В те годы язык SQL ещё не был стандартом для СУБД, и разработчики POSTGRES создали свой язык запросов POSTQUEL. Над проектом работали в течение многих лет, но в 1993 году проект был официально закрыт.
Несмотря на это, двое выпускников того же университета, Эндрю Ю и Джоли Чену, решили продолжить работу над проектом: исходный код был открыт, и лицензия позволяла такую разработку. Они заменили язык запросов на SQL, ставший к тому времени стандартом, и дали СУБД новое имя — PostgreSQL, чтобы подчеркнуть переход на общепринятый стандарт.
Проект стал набирать популярность и постепенно сформировалось команда разработчиков, развивающих и поддерживающих проект.

Настройка локали сервера

Подключитесь по ssh к вашему удаленному серверу на Яндекс.Облаке.
Для начала проверьте настройки локализации, установленные на сервере.
Настройки локализации (или, сокращенно, «локаль») — это набор параметров операционной системы вашего сервера: язык, страна, часовой пояс, метрические характеристики и прочее, а также кодировка, применяемая в системе для правильного отображения символов (обычно это UTF-8).
Для проверки настроек локализации введите команду:
Скопировать кодBASH
locale
Команда выдаст примерно такой результат:
Скопировать кодBASH
LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" ...
Чтобы работать с данными на русском языке, значением переменных LC_CTYPE и LC_COLLATE должно быть ru_RU.UTF-8. Если ваш сервер настроен иначе — установите русскую локализацию с помощью встроенной утилиты dpkg-reconfigure:
Скопировать кодBASH
sudo dpkg-reconfigure locales
В открывшемся интерфейсе найдите локаль ru_RU.UTF-8 и отметьте её, нажав пробел, затем нажмите Tab, чтобы переместиться на Ок, затем нажмите Enter:
image
В следующем окне укажите локаль по умолчанию: выберите ru_RU.UTF-8 и нажимайте Enter:
image
Окно закроется: настройка локали завершена. В терминале появится надпись Generation complete.
После этого перезапустите сервер:
Скопировать кодBASH
sudo reboot
После выполнения этой команды соединение с сервером прервется и нужно будет подождать пару минут перед тем, как подключиться к нему снова.
Затем подключитесь к серверу снова и проверьте локаль:
Скопировать кодBASH
locale
Если вы видите ru_RU.UTF-8 — значит, всё получилось.
Предварительные настройки завершены, можно ставить PostgreSQL.

Установка PostgreSQL

Перед установкой обновите индекс пакетов APT: sudo apt update и после этого установите необходимые для работы PostgreSQL пакеты:
Скопировать кодBASH
sudo apt install postgresql postgresql-contrib -y
После установки пакетов в операционной системе будет автоматически создан пользователь postgres, который имеет все права для работы с PostgreSQL: от его имени запускаются все процессы, обслуживающие базу данных и ему принадлежат все файлы, относящиеся к ней.
Теперь кроме веб-сервера, где развёрнут Django-проект, в вашем Яндекс.Облаке работает отдельный сервер баз данных.
После установки будет автоматически создан юнит для сервера PostgreSQL и настроена его конфигурация: теперь демон systemd будет поддерживать постоянную работу сервера PostgreSQL (как это уже происходит с nginx и Gunicorn); загрузка PostgreSQL будет автоматически происходить при запуске системы.
Управлять сервером базы данных можно стандартными командами systemd:
Скопировать кодBASH
sudo systemctl stop postgresql # остановить sudo systemctl start postgresql # запустить sudo systemctl restart postgresql # перезапустить sudo systemctl status postgresql # узнать статус, текущее состояние
Если что-то вдруг пошло не так — сервер базы данных не запускается или возвращает какие-то ошибки — можно посмотреть записи в логах, которые пишутся в файл /var/log/postgresql/postgresql-12-main.log. В зависимости от версии, имя файла может отличаться, в примере имя файла соответствует двенадцатой версии PostgreSQL.
Лог будет выглядеть примерно так:
Скопировать кодBASH
2020-06-06 12:55:47.912 UTC [27649] LOG: starting PostgreSQL 12.2 (Ubuntu 12.2-4) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-8ubuntu1) 9.3.0, 64-bit 2020-06-06 12:55:47.913 UTC [27649] LOG: listening on IPv4 address "127.0.0.1", port 5432 2020-06-06 12:55:47.919 UTC [27649] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 2020-06-06 12:55:47.943 UTC [27655] LOG: database system was shut down at 2020-06-06 12:55:45 UTC 2020-06-06 12:55:47.950 UTC [27649] LOG: database system is ready to accept connections 2020-06-06 16:09:23.765 UTC [27649] LOG: received fast shutdown request 2020-06-06 16:09:23.832 UTC [27649] LOG: aborting any active transactions 2020-06-06 16:09:23.839 UTC [27649] LOG: background worker "logical replication launcher" (PID 27661) exited with exit code 1 2020-06-06 16:09:23.861 UTC [27656] LOG: shutting down 2020-06-06 16:09:24.044 UTC [27649] LOG: database system is shut down 2020-06-06 16:10:08.862 UTC [676] LOG: starting PostgreSQL 12.2 (Ubuntu 12.2-4) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-8ubuntu1) 9.3.0, 64-bit 2020-06-06 16:10:08.865 UTC [676] LOG: listening on IPv4 address "127.0.0.1", port 5432 2020-06-06 16:10:08.870 UTC [676] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" 2020-06-06 16:10:08.991 UTC [677] LOG: database system was shut down at 2020-06-06 16:09:24 UTC 2020-06-06 16:10:09.079 UTC [676] LOG: database system is ready to accept connections
По этим записям можно понять, что происходит на сервере БД. Держите в голове, что вам всегда доступен этот лог-файл: это своего рода «чёрный ящик», он всегда поможет разобраться в причинах аварии.

Системные файлы PostgreSQL

Файлы базы данных хранятся в директории /var/lib/postgresql/12/main/.
В ней же расположены два конфигурационных файла, которые определяют настройки сервера базы данных: это postgresql.conf и pg_hba.conf.
postgres.conf содержит настройки сервера базы данных.
pg_hba.conf определяет настройки доступа к БД. Доступ к этому файлу разрешён только пользователю системы, имя которого совпадает с именем пользователя базы данных.
Чтобы проверить, что установка прошла успешно, запустите такую команду:
Скопировать кодBASH
sudo -u postgres psql -c 'select now()'
В ответ вы получите текущее время в формате UTC. now() — это встроенная функция PostgreSQL, которая возвращает текущее время. Её успешный вызов говорит о том, что всё работает.

Управление базой через psql

При установке PostgreSQL был автоматически создан суперпользователь postgres. У него есть полные права на управление базами данных.
Поуправляем немного.
В командной строке от имени пользователя postgres вызовите утилиту psql, это программа-клиент для подключения и управления СУБД:
Скопировать кодBASH
sudo -u postgres psql
Утилита psql запущена, в ней вы можете выполнять SQL-команды для работы с базами данных. Приглашение для ввода команд в psql выглядит так: postgres=#.
image
На одном сервере Postgres может работать несколько независимых баз данных. Вызвать список всех баз, которые есть на сервере, можно командой \l. Выполните её:
Скопировать кодBASH
\l # выйти обратно можно с помощью клавиши q
psql отобразит перечень и описание баз:
image
По умолчанию при установке Postgres создаются три системные базы данных: postgres, template0 и template1. Для работы с проектом вы создадите собственную базу, и она тоже появится в этом списке.
Вот ещё несколько служебных команд psql:
Скопировать код
\? # справка по командам консольного клиента psql \h # справка по доступным командам SQL \h <команда> # справка по конкретной команде \l # список баз данных \du # список пользователей \dt # список таблиц \q # выйти

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

Теперь через psql создайте базу данных с именем yatube:
Скопировать кодBASH
CREATE DATABASE yatube; # при успешном создании вернется CREATE DATABASE
Для взаимодействия с базой данных ваш Django-проект будет обращаться с запросами к серверу базы данных. Для этого Django должен иметь право доступа на этот сервер, «быть залогиненным» на этом сервере.
Значит, надо определить, от имени какого пользователя Django будет подключаться к серверу Postgres и обращаться к БД. Можно подключаться от имени суперпользователя postgres (у него по умолчанию есть все права на работу со всеми базами), но это плохая практика: если злоумышленник через ваш проект получит доступ к базе — с правами суперпользователя он сможет сделать с сервером баз данных всё, на что ему хватит фантазии. С точки зрения безопасности и здравого смысла нужно создать пользователя с ограниченными правами, имеющего доступ лишь к «своей» базе.
На сервере БД создадим регистрационную запись пользователя, затем данные этого пользователя (его логин и пароль) сообщим Django. В результате Django получит доступ к базе данных под этим именем.
Создайте через psql пользователя и дайте ему нужные права:
Скопировать кодSQL
-- создайте пользователя yatube_user и придумайте свой пароль, посложнее, чем в примере CREATE USER yatube_user WITH ENCRYPTED PASSWORD 'xxxyyyzzz'; -- дайте пользователю yatube_user все права при работе с базой yatube GRANT ALL PRIVILEGES ON DATABASE yatube TO yatube_user;
Проверьте, создалась ли база: выполните команду \l. Новая база отобразится в списке.
Чтобы выйти из psql, выполните команду \q. Вы всё ещё работаете под пользователем postgres. Выполните команду exit: вы снова окажетесь под своим пользователем.

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

База данных и пользователь готовы, теперь нужно дать Django-проекту доступ к этой базе.
Установите в виртуальное окружение драйвер для работы с postgres: psycopg2-binary
Скопировать кодBASH
pip install psycopg2-binary
Секретные данные (токены, пароли, ключи) нужно хранить отдельно от кода, для управления файлами .env потребуется пакет django-environ:
Скопировать кодBASH
pip install django-environ
Добавьте настройки в файл settings.py:
Скопировать кодPYTHON
import environ env = environ.Env() environ.Env.read_env() # импортируем ... DATABASES = { 'default': env.db(), # описываем, где искать настройки доступа к базе }
Теперь в редакторе nano создайте файл .env в директории с кодом проекта (там же, где размещены файлы settings.py и wsgi.py) и добавьте в него настройки подключения к базе данных:
Скопировать кодBASH
DATABASE_URL=psql://yatube_user:xxxyyyzzz@127.0.0.1:5432/yatube # поставьте тот пароль, который вы придумали для пользователя
Чтобы изменения вступили в силу — перезапустите Gunicorn:
Скопировать кодBASH
sudo systemctl restart gunicorn
И выполните миграции (проверьте, что виртуальное окружение активировано):
Скопировать кодBASH
python manage.py migrate
Готово! Теперь Django настроен для взаимодействия с базой данных.

Заполнить базу

В базе yatube пока что нет данных, но они есть в вашем проекте, который установлен локально, на вашем компьютере. Пора перенести их на сервер, в PostgreSQL. Выполните комнду:
Скопировать кодJSX
python manage.py dumpdata > dump.json # выполнить локально, данные сохранятся в dump.json
Для копирования файлов с локального компьютера на сервер есть утилита scp (от англ. secure copy). Она копирует файлы на сервер по протоколу SSH. Пользоваться ей весьма просто:
Скопировать кодBASH
# scp my_file username@host:<путь-на-сервере> # укажите IP своего сервера и путь до своей домашней директории на сервере scp dump.json praktikum@84.201.161.196:/home/praktikum/
После выполнения этой команды файл dump.json появится в вашей домашней директории на сервере.
Теперь нужно выполнить пару команд на сервере для переноса данных с SQLite на PostgreSQL:
Скопировать кодBASH
# закинуть dump.json на сервер через scp и выполнить там python3 manage.py shell # выполнить в открывшемся терминале: >>> from django.contrib.contenttypes.models import ContentType >>> ContentType.objects.all().delete() >>> quit() python manage.py loaddata dump.json
Готово. Теперь все данные перенесены на сервер и доступны посетителям вашего проекта. Откройте свой проект в браузере и убедитесь в этом.

Резервное копирование базы данных (бэкапы)

Администраторы серверов делятся на тех кто не делает бэкапы и тех, кто уже делает.
Потеря данных из базы — одно из самых печальных и непоправимых событий, которые могут приключиться. Программные файлы, код, систему — всё это можно восстановить, но как вернуть, например, базу клиентов, накопленную за несколько лет?
Не ждите повода: создавайте резервные копии данных, чтобы в любой момент можно было их восстановить. Это можно сделать с помощью встроенной утилиты pg_dump:
Скопировать кодBASH
sudo -u postgres pg_dump yatube > yatube_backup.dump
Эта команда создаст файл («дамп базы») yatube_backup.dump с бэкапом данных из БД yatube. В файле будут сохранены все данные из базы и команды, выполнение которых создаст копию исходной БД.
Скопировать кодBASH
createdb yatube2 # создали пустую базу данных с именем yatube2 sudo -u postgres psql -d yatube2 -f yatube_backup.dump # загрузили в неё данные из дампа
Подробная документация на русском языке по pg_dump есть на сайте https://postgrespro.ru/docs/postgrespro/12/app-pgdump.
Утилита pg_dump создаёт резервную копию только одной базы данных. Для того, чтобы сделать резервную копию всех баз данных, пользователей и служебной информации, есть встроенная утилита pg_dumpall. Она работает аналогично pg_dump. Документация по pg_dumpall доступна на сайте: https://postgrespro.ru/docs/postgrespro/12/app-pg-dumpall.