pgAdmin 4 | Развёртывание локально в Debian (Linux) через uWSGI за nginx в виртуальную среду virtualenv со своей службой запуска

pgAdmin 4 | Развёртывание локально в Debian (Linux) через uWSGI за nginx в виртуальную среду virtualenv со своей службой запуска

Задача

Нам нужно установить web-оболочку pgAdmin4 для удобного визуального управления СУБД PostgreSQL на операционную систему Debian (Linux).

Основная проблема заключается в том, что по умолчанию продукт pgAdmin4 предлагает конфигурацию для веб-сервера apache2. Но в нашем случае мы работаем с разными виртуальными хостами, которые управляются веб-сервером nginx.

Это говорит о том, что веб-сервер nginx уже держит в прослушивании 80 порт.

pgAdmin4 — это по сути сайт. pgAdmin4 — это по сути система управления контентом (CMS). Как WordPress. Техническая разница лишь в том, что pgAdmin4 управляется языком программирования Python, в то время как WordPress управляется PHP.

По итогу всё сводится к тому, что нужно «подружить» Python с nginx. И когда погружаешься в это впервые, то голова просто пухнет от кучи ненужной информации. Почему так? Потому что подобные настройки делаются один раз в год, а то и в 5 лет. Для самого обыкновенного пользователя это сложно.

Попытаемся разобраться.

 

Видеоинструкция без звука

Авторство не моё, поэтому без звука.

Таймкоды из видео

00:12 — Install virtualenv
00:35 — Creating pgAdmin directory
00:58 — Creating a virtual environment
02:02 — Activating a virtual environment
02:18 — Download pgAdmin
04:13 — Verify GPG signature
05:04 — Check pip version and location
06:21 — Install pgAdmin
09:47 — Install uWSGI
11:54 — Configure pgAdmin
15:08 — Leaving virtual environment
15:41 — Configure pgAdmin
17:24 — Configure firewall
18:47 — Run pgAdmin using python
19:41 — Access pgAdmin from browser
22:01 — Run pgAdmin using wsgi (wsgi-file parameter)
22:47 — Access pgAdmin from browser
25:13 — Run pgAdmin using wsgi (mount parameter)
25:53 — Access pgAdmin from browser
27:22 — Configure pgAdmin and Nginx, to run pgAdmin using WSGI
32:51 — Access pgAdmin from browser
33:35 — Connect to PostgreSQL

 

Общая идея решения задачи

Идея заключается в том, что нам нужно создать какую-то папку проекта. Эту папку мы условно обзываем «изолированной виртуальной средой». В неё устанавливаем все нужные версии дополнительного Питоновского ПО. Там же живёт свой веб-сервер, который обрабатывает запросы. Потом накидываем в эту папку рабочие файлы самого pgAdmin4. Внутри этой папки настраиваем все зависимости.

 

В чём весь геморрой? Что нужно понимать?

По умолчанию, каждый объект системы Debian будет использовать одинаковые каталоги для ХРАНЕНИЯ и РАЗРЕШЕНИЯ пакетов (сторонних библиотек). Если мы говорим о NodeJS, то это NPM. Если говорим о PHP, то это COMPOSER. Если говорим о RUBY, то это BUNDLER. Если говорим о Java, то это JPM. И вот когда мы добираемся до Python, то его пакетным менеджером является PIP (Python Package Index). Его ещё часто называют «пипка».

Стандартный набор функций, классов, констант и объектов языка Python не вызывает проблем т. к. они идут из коробки самого сервера. Но как только мы хотим использовать в СВОИХ «Python-написанных приложениях» какие-то ЧУЖИЕ пакеты и наработки, то версионность ЧУЖИХ пакетов может всё запороть.

Представим такую ситуацию. Есть два проекта: проект А и проект Б.

Оба проекта имеют зависимость от одной и той же библиотеки из проекта В.

Проблема случается в тот момент, когда мы начинаем запрашивать разные версии проекта В.

В результате проект А ждёт версию 1.0, а проект Б ждёт версию 2.0.

Это большая проблема Python, поскольку он не может различать версии в каталоге «site-packages«. Так что обе версии 1.0 и 2.0 будут находиться с тем же именем в одном каталоге.

И так как проекты хранятся в соответствии с их названиями, то нет различий между версиями. Таким образом, проект А и проект Б должны будут использовать одну и ту же версию, что во многих случаях неприемлемо.

Тут-то и вступает в игру виртуальная среда (вместе с инструментами virtualenv/ven)

 

Обновление текущего ПО

Для начала обновим индекс пакетов:

apt-get update

Теперь обновим всё системное программное обеспечение Debian до последней версии:

apt-get upgrade

 

Установка самого языка Python

Язык программирования может Python может отсутствовать в Debian, поэтому его нужно установить: Ссылка на инфо (https://packages.debian.org/bullseye/python/python3)

apt-get install python3

Как узнать версию Python в Debian?

python3 --version

Получим что-то подобное:

Python 3.7.3

 

Установка связующих пакетов для Python

Заголовочные файлы и статическая библиотека для Python (по умолчанию): Ссылка на инфо (https://packages.debian.org/bullseye/python/python3-dev)

apt-get install python3-dev

Заголовочные файлы, статическая библиотека и средства разработки для создания модулей Python, расширения интерпретатора Python или встраивания Python в приложения.

 

Расширения python-distutils для больших или сложных дистрибутивов. Что бы это ни значило: Ссылка на инфо (https://packages.debian.org/bullseye/python/python3-setuptools)

apt-get install python3-setuptools

 

Колесо представляет собой ZIP-архив со специально отформатированным именем файла и расширением `.whl`. Он предназначен для хранения всех файлов для установки, совместимой с PEP 376, в формате, очень близком к формату на диске.

Проект колеса предоставляет команду `bdist_wheel` для setuptools. Файлы колес можно установить с помощью `pip`.

Это пакет, совместимый с Python 3: Ссылка на инфо (https://packages.debian.org/bullseye/python/python3-wheel)

apt-get install python3-wheel

 

Установите утилиту pip в Debian

Прежде чем что-либо скачивать и распаковывать установите в операционную систему Debian менеджер пакетов pip для Python: Ссылка на инфо (https://packages.debian.org/stable/python/python3-pip)

apt-get install python3-pip

Как узнать версию утилиты pip в Debian?

pip -V

Получим что-то подобное:

pip 18.1 from /usr/lib/python2.7/dist-packages/pip (python 2.7)

 

Шаг № 1 — Утилита virtualenv

Первым делом нужно установить в нашу Debian утилиту virtualenv. Это можно расшифровать как «virtual environment» — виртуальная среда.

Эта утилита позволяет управлять разными версиями Python с разными приложениями. То есть мы типа можем супер-пупер точно подсаживать нужную версию Python под какой-то конкретный проект.

Как установить утилиту virtualenv в Debian?

apt-get install virtualenv

Чтобы это работало с Python нужно установить очередной «непонятный» пакет python3-virtualenv: Ссылка на инфо (https://packages.debian.org/bullseye/python/python3-virtualenv)

apt-get install python3-virtualenv

и ещё вот это до кучи: Ссылка на инфо ()

apt-get install python-virtualenv

 

Как узнать версию утилиты virtualenv в Debian?

virtualenv --version

Получим что-то вроде:

virtualenv 20.13.4 from /usr/local/lib/python3.7/dist-packages/virtualenv/__init__.py

 

Шаг № 2 — Создание директории в Debian под изолированную виртуальную среду, в которой будет жить наш будущий pgAdmin

С этого момента можно создать нового пользователя в Debian, от имени которого будут создаваться директории и производиться настройки.

В моём случае этого пользователя будут звать pgau

adduser pgau

Создаём под него пароль. Повторяем ввод пароля. Переподключаемся под новым пользователем pgau

Создаём директорию «mypgadmin» в каталоге пользователя /home/pgau/www:

mkdir /home/www/mypgadmin

 

Создание директории:

mkdir /var/www/mypgadmin

Почему мы создали папку в /var/www/ ? По умолчанию в эту папку попадают все папки сайтов и их конфигурационных файлов. Так сказать все в одной куче.

 

Шаг № 3 — Создание виртуальной среды в новой созданной директории

Папка под проект готова. Теперь можно создавать новую виртуальную среду под Python.

Переходим в каталог !!!:

cd /var/www/mypgadmin

Этот каталог пока что пустой.

Теперь при помощи утилиты virtualenv создаём виртуальную среду под названием my-env: (Вы можете использовать другое имя на свой вкус)

virtualenv my-env
virtualenv my-env в Debian
virtualenv my-env в Debian

Получим что-то вроде:

created virtual environment CPython3.7.3.final.0-64 in 205ms
creator CPython3Posix(dest=/var/www/mypgadmin/my-env, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
added seed packages: pip==22.0.4, setuptools==60.10.0, wheel==0.37.1
activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

После этого в папке «mypgadmin» появится новая папка «my-env» в которой будут лежать всякие файлы:

Создали новую виртуальную среду my-env под pgAdmin4 на Debian
Создали новую виртуальную среду my-env под pgAdmin4 на Debian
  • Папка bin – файлы, которые взаимодействуют с виртуальной средой;
  • Папка lib – копия версии Python вместе с папкой «site-packages«, в которой установлена каждая зависимость.

Далее, у нас есть копии или символические ссылки нескольких различных инструментов Python. Эти файлы используются для обеспечения того, чтобы команды и код Python выполнялись в контексте нынешней среды. Так достигается изоляция от глобальной среды.

 

При желании вы можете заглянуть в обновлённое содержимое папки «mypgadmin«:

ls -al
ls -al из папки mypgadmin в Debian
ls -al из папки mypgadmin в Debian

или папки с новой виртуальной средой «mypgadmin«:

ls -al my-env
ls -al из папки my-env в Debian
ls -al из папки my-env в Debian

или папки «bin«:

ls -al my-env/bin
ls -al из папки my-env папка bin в Debian
ls -al из папки my-env папка bin в Debian

 

Шаг № 4 — Активация виртуальной среды «my-env«, которую мы создали

Теперь в папке «my-env/bin» есть два полезных файла для управления нашей новой созданной виртуальной средой «my-env«.

Это файлы:

  • activate — включение среды (Чтобы использовать эти пакеты (или ресурсы) среды в изоляции, вам нужно «активировать» их)
  • deactivate — выключение среды (Де-активация ресурсов)

Теперь нужна команда source, которая поможет выполнить скрипт в текущем процессе оболочки bash.

cd /var/www/mypgadmin
source my-env/bin/activate

или сразу без команды cd

source /var/www/mypgadmin/my-env/bin/activate

По умолчанию для выполнения каждого скрипта запускается отдельная оболочка bash, хранящая все его переменные и функции. После завершения скрипта всё это удаляется вместе с оболочкой.

Команда source позволяет выполнить скрипт в текущем командном интерпретаторе, а это значит, что все переменные и функции, добавленные в этом скрипте, будут доступны также и в оболочке bash после его завершения.

!! ВНИМАНИЕ !!

Оболочка bash работает от my-env в Debian
Оболочка bash работает от my-env в Debian

Теперь наша оболочка bash работает от my-env в Debian. Это можно понять по записи «(my-env)«.

С этого момента, всё что мы будем устанавливать в виртуальную среду СОХРАНИТСЯ.

 

Шаг № 5 — Загрузка pgAdmin с официального сайта

Окружение готово. Теперь нужно получить сами файлы продукта «pgAdmin 4«.

Сделать это можно из репозиториев, которые лежат на официальном сайте проекта: https://www.pgadmin.org

Главная страница сайта проекта pgAdmin
Главная страница сайта проекта pgAdmin

Переходим в раздел «Download» (Загрузка): https://www.pgadmin.org/download/

Раздел Загрузок с сайта проекта pgAdmin
Раздел Загрузок с сайта проекта pgAdmin

Так как мы всё это время говорили о Python, то и зайти нам нужно в раздел Python. Ссылка (https://www.pgadmin.org/download/pgadmin-4-python/) Ссылка может измениться со временем, имейте ввиду.

На странице нас будет интересовать раздел «Manual installation with a Python Wheel package» (Ручная установка с помощью пакета Python Wheel)

Ручная установка pgAdmin с помощью пакета Python Wheel
Ручная установка pgAdmin с помощью пакета Python Wheel

Кликаем на САМУЮ НОВУЮ версию продукта «pgAdmin4«.

File Browser pgAdmin4 v6.7 март 2022
File Browser pgAdmin4 v6.7 март 2022

Нас интересует САМЫЙ ЖИРНЫЙ файл из всех. Это файл с расширением «whl». (Для Колёсного Питона)

В моем случае это файл «pgadmin4-6.7-py3-none-any.whl«.

Нам нужна ссылка на этот файл !!!

Правой кнопкой нажимаем по ссылке на сайте pgAdmin
Правой кнопкой нажимаем по ссылке на сайте pgAdmin

В моём случае это адрес «https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v6.7/pip/pgadmin4-6.7-py3-none-any.whl«. Имейте ввиду, что эта ссылка может стать неактивной.

 

Возвращаемся в нашу среду. Используя утилиту wget сохраняем себе в директорию файл с продуктом pgAdmin4.

wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v6.7/pip/pgadmin4-6.7-py3-none-any.whl
или
wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v6.11/pip/pgadmin4-6.11-py3-none-any.whl

Если у вас не установлен wget, тогда установите его.

Скачивается архив pgAdmin в виртуальную среду в Debian
Скачивается архив pgAdmin в виртуальную среду в Debian

 

Теперь скачиваем файл с расширением «.asc»

wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v6.7/pip/pgadmin4-6.7-py3-none-any.whl.asc

Файл ASC — зашифрованный файл в текстовом формате, созданный в одной из программ для шифрования Pretty Good Privacy (PGP). Содержит закодированную с помощью ключа версию исходного файла в виде символов ASCII. Для использования формата ASC в программе шифрования должна быть отмечена опция «Text output (ASCII armor)». Закодированная подобным образом информация может быть отправлена в виде обычного сообщения, например, электронного письма, и расшифрована с помощью имеющегося у получателя ключа.

Скачивается asc файл для pgAdmin в виртуальную среду в Debian
Скачивается asc файл для pgAdmin в виртуальную среду в Debian

 

Шаг № 6 — Проверить подпись GPG

Давайте ещё раз получим список файлов из директории «mypgadmin»

ls -al
Список с двумя файломи директории mypgadmin
Список с двумя файломи директории mypgadmin

GPG — инструмент с открытым исходным кодом для шифрования файлов — GNU Privacy Guard.

Нас интересует опция —verify (проверить подпись)

Проверим наш «.asc«-файл

gpg --verify pgadmin4-6.7-py3-none-any.whl.asc

Подпись сделана. Но публичный ключ отсутствует. Давайте получим его.

Для этого нам понадобится опция —receive-keys (получить ключи от сервера ключей). Для этого нам нужно скопировать RSA ключ от созданной подписи.

gpg --receive-keys 8881B2A8210976F2

Теперь связываем два файла:

gpg --verify pgadmin4-6.7-py3-none-any.whl.asc pgadmin4-6.7-py3-none-any.whl

Если у вас не получится, то хер с ним.

 

Шаг № 7 — Устанавливаем pgAdmin4 в виртуальную среду

Версия «пипки» (pip) должна подтягиваться из нашей новой созданной директории, а не откуда-то ещё. На 2022 год это версия pip 22.0.4.

pip show pip

Обязательно проверьте откуда ваша «пипка». Из-за разной версионности пакетов «пипка» может иметь не ту, что нам нужна.

Версия pip внутри виртуальной среды my-env в Debian
Версия pip внутри виртуальной среды my-env в Debian

Что-то подобное:

Name: pip
Version: 22.0.4
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: /var/www/mypgadmin/my-env/lib/python3.7/site-packages
Requires:
Required-by:

ВНИМАНИЕ!!! Как только мы узнаем ПРАВИЛЬНОЕ название пакета pip, только тогда мы сможем начать установку внутри нашей виртуальной среды. Может оказаться такая проблема, что у вас в системе зарегистрировано 5 разных пакетов pip.

Много версий pip в my-env
Много версий pip в my-env

Например:

  1. pip
  2. pip3
  3. pip-3
  4. pip3.7
  5. pip-3.7

Одному богу известно, что будет установлено в вашей системе. У меня в изолированной среде всего одна версия pip. Удобно.

Команда установки pgAdmin:

pip install pgadmin4-6.7-py3-none-any.whl
или
pip install pgadmin4-6.11-py3-none-any.whl

После этого начнётся ПРОДОЛЖИТЕЛЬНАЯ установка. Будут распаковываться файлы в новую директорию внутри проекта.

Распаковка файлов CMS pgAdmin в новую директорию внутри виртуальной среды my-env в Debian
Распаковка файлов CMS pgAdmin в новую директорию внутри виртуальной среды my-env в Debian

Все файлы окажутся в папке:

/var/www/mypgadmin/my-env/lib/python3.7/site-packages

На всякий случай. Версия ПИПКИ может устареть на вашем сервере, поэтому желательно её обновить, чтобы могли поставиться самые свежие пакеты pgAdmin. Установщик вас уведомит об этом:

WARNING: You are using pip version 22.0.4; however, version 22.1.2 is available.
You should consider upgrading via the '/var/www/mypgadmin/my-env/bin/python -m pip install --upgrade pip' command.

Скриншот:

Установщик pgAdmin просит обновить версию пакетного менеджера pip в Debian
Установщик pgAdmin просит обновить версию пакетного менеджера pip в Debian

И можем обновить по рекомендованной команде:

Успешное обновление версии pip до 22.1.2
Успешное обновление версии pip до 22.1.2

 

Шаг № 8 — Установка uWSGI

Немного справочной информации:

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

  • WSGI: спецификация Python, которая определяет стандартный интерфейс для взаимодействия приложения/фреймворка с сервером приложений/веб-сервером. Её цель – упростить и стандартизировать взаимодействие этих компонентов. По сути, WSGI определяет интерфейс API, который можно использовать с другими протоколами.
  • uWSGI: сервер приложений, который обеспечивает полноценную платформу для разработки и развертывания веб-приложений и сервисов. Этот сервер приложений может обрабатывать приложения, написанные на разных языках. Он взаимодействует с приложением согласно спецификации WSGI. Он может взаимодействовать с другими веб-серверами при помощи различных протоколов. Этот компонент трансформирует запросы стандартного веб-сервера в формат, который может обработать приложение.
  • uwsgi: быстрый бинарный протокол, который реализуется сервером uWSGI для взаимодействия с другими полнофункциональными протоколами. Это wire протокол, а не транспортный протокол. Он лучше всего подходит для взаимодействия с веб-серверами, которые проксируют запросы для uWSGI.

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

Устанавливаем сервер приложений uWSGI в нашу среду: (мы ещё внутри (my-env)!!!)

pip install uwsgi

Узнать версию uwsgi:

uwsgi --version

Получим что-то подобное:

Узнали версию uwsgi внутри изолированной среды под pgAdmin
Узнали версию uwsgi внутри изолированной среды под pgAdmin

Перезапустить сервер приложений uWSGI:

service uwsgi restart

Узнать состояние активности сервера приложений uWSGI:

service uwsgi status

Путь до папки сервера приложений uWSGI в Debian:

/etc/uwsgi

Внутри две директории:

  1. apps-enabled
  2. apps-available

 

Шаг № 9 — Настраиваем pgAdmin на сервере

У Python существует аж 4 ступени конфигурационных файлов для своих приложений.

Сперва нас интересует файл «config_distro.py» из папки:

/var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4

Его нужно отредактировать. Он должен выглядеть так: (актуально на март 2022 года!!!)

HELP_PATH = '../../docs/en_US/_build/html/'
MINIFY_HTML = False

LOG_FILE = '/var/log/pgadmin4/pgadmin4.log'
SQLITE_PATH = '/var/lib/pgadmin4/pgadmin4.db'
SESSION_DB_PATH = '/var/lib/pgadmin4/sessions'
STORAGE_DIR = '/var/lib/pgadmin4/storage'
SERVER_MODE = True

Так как мы настраиваем в операционной системе Debian, то нас интересует директива SERVER_MODE

 

Также возможно понадобиться файл «config_local.py«, в котором нужно прописать следующее:

# config_local.py

import os

DATA_DIR = os.path.realpath(os.path.expanduser(u'~/.pgadmin/'))
LOG_FILE = os.path.join(DATA_DIR, 'pgadmin4.log')
SQLITE_PATH = os.path.join(DATA_DIR, 'pgadmin4.db')
SESSION_DB_PATH = os.path.join(DATA_DIR, 'sessions')
STORAGE_DIR = os.path.join(DATA_DIR, 'storage')
SERVER_MODE = True

AZURE_CREDENTIAL_CACHE_DIR = os.path.join(DATA_DIR, 'azurecredentialcache')

 

Теперь находим две директории нашего python3.7:

  • Одна — папка с каталогом bin —  «/var/www/mypgadmin/my-env/bin/python3.7″
  • Другая — файл — «/var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/setup.py«

Вызываем установку:

/var/www/mypgadmin/my-env/bin/python3.7 /var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/setup.py

Между путями один пробельчик. Не потеряйте его.

 

Пароль для суперпользователя PGAdmin 4

После вызова команды появится надпись

"NOTE: Configuring authentication for SERVER mode."

диалоговое окно вида:

NOTE- Configuring authentication for SERVER mode - pgAdmin
NOTE- Configuring authentication for SERVER mode — pgAdmin

 

Первое о чём вас попросят — это «Введите адрес электронной почты и пароль для начальной учетной записи пользователя pgAdmin.»

В этом пункте есть валидация email-адресов. Введите любой адрес. Он будет являться логином в ваш pgAdmin.

Пароль предварительно запишите в каком-нибудь файле и сохраните. Можно забыть. Проверено!

Если всё ОК, то вы увидите надпись «pgAdmin 4 — Application Initialisation» (pgAdmin 4 — Инициализация приложения)

 

 

Шаг № 10 — Покидаем виртуальную среду

Вводим команду deactivate из под (my-env). Покидаем виртуальную среду:

deactivate

Мы вернёмся в обычное окружение.

Нам останется только указать права на файлы из директорий «/var/lib/pgadmin4» и «/var/log/pgadmin4»

 

Предоставление прав на изменения файлов

!!!ВАЖНО!!!

Необходимо предоставить доступ на изменение файлов логирования самого pgAdmin от имени пользователя www-data. Это нужно для того, чтобы наш веб-сервер мог вносить изменения в файл журнала.

chown www-data:www-data -R /var/lib/pgadmin4 /var/log/pgadmin4

Либо, укажите права от имени пользователя, от которого вы ведёте установку.

chown blablauser:blablauser -R /var/lib/pgadmin4 /var/log/pgadmin4


 

Шаг № 11 — Продолжаем конфигурацию

Находим файл «config.py«, который живёт в нашем новом каталоге:

/var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/config.py

Для поиска можно воспользоваться командой:

find / -name "config.py"

Подобных файлов может быть очень много. Имейте ввиду.

Нашли нужный config.py для настройка pgAdmin
Нашли нужный config.py для настройка pgAdmin

Редактируем его:

Меняем директиву DEFAULT_SERVER:

DEFAULT_SERVER = '0.0.0.0'

Меняем директиву DEFAULT_SERVER_PORT:

DEFAULT_SERVER_PORT = 15050

опционально можете изменить количество неудачных попыток авторизации. Стандартно 3 попытки.

MAX_LOGIN_ATTEMPTS = 133

Это на тот случай, если что-то пойдёт не так в момент входа. Если запоритесь на этом этапе, тогда читайте как произвести сброс админсокого аккаунта pgAdmin.

 

Возвращаемся в виртуальную среду, чтобы запустить главный экран приветствия pgAdmin4, чтобы убедиться, что настройка идёт правильно.

 

Шаг № 12 — Настраиваем firewall

Добавление порта 15050

firewall-cmd --permanent --add-port=15050/tcp

где ключ —permanent — добавить постоянное правило (будет действовать после перезагрузки).

Перезапускаем файрвол

firewall-cmd --reload

Просматриваем список портов файрвола

firewall-cmd --list-all

 

Далее будут 3 варианта подключения

  1. Запуск pgAdmin используя Python
  2. Запуск pgAdmin с помощью wsgi (параметр —wsgi-file)
  3. Запуск pgAdmin с помощью wsgi (параметр —mount)

 

Шаг № 13 — Запуск pgAdmin используя Python

Уже сейчас у нас есть всё необходимое для того, чтобы увидеть первую web-оболочку pgAdmin и даже авторизоваться.

Нам понадобится знание двух путей:

  • «/var/www/mypgadmin/my-env/bin/python3.7″
  • «/var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/pgAdmin4.py»

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

/var/www/mypgadmin/my-env/bin/python3.7 /var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/pgAdmin4.py

Видим в терминале информацию о том, что по адресу ЛОКАЛЬНОЙ МАШИНЫ и порту 15050 работает наш сайт с веб-интерфейсом pgAdmin4:

Запуск pgAdmin используя Python
Запуск pgAdmin используя Python

Чтобы выйти из «залипшей» консоли, нужно нажать сочетание клавиш CTRL + C. Пока этого делать не нужно.

Так мы сможем вернуться в обычный терминал.

 

Шаг № 14 — Доступ к pgAdmin из браузера

С этого момента (пока скрипт активен в терминале) мы можем перейти по указанному адресу (в нашем случае это локальный IP на котором работает Debian) и обратиться к порту 15050.

Для этого нам понадобится любой браузер.

Приветственное окно авторизации pgAdmin 2022 год
Приветственное окно авторизации pgAdmin 2022 год

Здесь в браузере задан масштаб 200% и на весь экран развернулось только диалоговое окно авторизации.

Вводим наши Логин и Пароль от учётной записи администратора pgAdmin.

Это окно говорит нам, что сама веб-оболочка pgAdmin установилась и работает. Запросы поступают, ответы возвращаются.

 

Шаг № 15 — Запуск pgAdmin с помощью wsgi (параметр —wsgi-file)

Находим директории (пути) для wsgi:

find / -name "uwsgi"

Может быть много адресов расположения «uwsgi»:

Путь до нужного uwsgi в Debian
Путь до нужного uwsgi в Debian

Нам нужна та, которая живёт в нашем виртуальном окружении «my-env«:

/var/www/mypgadmin/my-env/bin/uwsgi

 

Создание СОКЕТА

Сейчас важный этап!

Командой ниже, мы заставим uwsgi держать соединение в активном прослушивании порта 15050. Это значит, что в терминал освободится под другие вводы команд.

Теперь создаём сокеты (длинная команда):

/var/www/mypgadmin/my-env/bin/uwsgi --http-socket 0.0.0.0:15050 --chdir /var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/ --wsgi-file /var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/pgAdmin4.wsgi &

Получаем:

Прикрутили сокет для ip-адреса и порта для pgAdmin
Прикрутили сокет для ip-адреса и порта для pgAdmin

Первой строкой возвращается номер процесса. ЗАПОМНИТЕ ЕГО. У меня это 23350. У вас будет другой.

Нас интересует запись «uwsgi socket 0 bound to TCP address 0.0.0.0:15050 fd 3″

Можем проверить процессы:

ps -ef | grep uwsgi

или

ps aux | grep uwsgi

Получаем что-то вроде:

Активные процессы uwsgi
Активные процессы uwsgi

Можно ещё так посмотреть:

netstat -natp
netstat -natp uwsgi pgAdmin Debian
netstat -natp uwsgi pgAdmin Debian

Можно тестировать в браузере. Такой конфиг будет работать.

Но при таком подключении нам нужно держать соединение в терминале. Не пойдёт.

 

Шаг № 16 — Запуск pgAdmin с помощью wsgi (параметр —mount)

Можно держать приложение активным при помощи параметра —mount

Если вы делали предыдущий этап, то не забудьте убить процесс т. к. может возникнуть конфликт прослушивания. В моём случае это был номер 23350

kill 23350

Теперь создаём сокеты (длинная команда):

/var/www/mypgadmin/my-env/bin/uwsgi --http-socket 0.0.0.0:15050 --chdir /var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/ --mount /=pgAdmin4:app

Результат:

Подключение через mount - pgAdmin
Подключение через mount — pgAdmin

 

Шаг № 17 — Настройка pgAdmin и Nginx для запуска pgAdmin с использованием WSGI

Теперь нам нужно поработать с файлом «pgadmin.ini«. Он будет жить у нас в папке «/var/www/mypgadmin/»

Создадим его:

[uwsgi]
uid = www-data
gid = www-data
plugins = python3
chdir = /var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/
wsgi-file = /var/www/mypgadmin/my-env/lib/python3.7/site-packages/pgadmin4/pgAdmin4.wsgi
master = true
processes = 1
socket = /var/www/mypgadmin/pgadmin.sock
chmod-socket = 664
vacuum = true
# Добавлено логирование
logto = /var/www/mypgadmin/log777.log

Внимание!!! В этом конфиге нужно правильно указать пользователя, от имени которого происходили все установки и настройки, а также автозапуски.

У меня это был www-data, поэтому я указываю uid (идентификатор пользователя) и gid (идентификатор группы) равным www-data.

Полезная информация про параметр logtouWSGI 2.0.20 | Логирование (Ведение журнала)

 

Пишем свою службу для запусков

Теперь нам нужно создать сервис(службу). С её помощью мы будем стартовать, а так же останавливать наше приложение. Назовём её как-нибудь созвучно — «uwsgi-pgadmin.service«.

Путь будет такой:

/etc/systemd/system/uwsgi-pgadmin.service

Теперь создадим файл с таким названием «uwsgi-pgadmin.service«:

[Unit]
Description=uWSGI and pgAdmin service unit
After=syslog.target

[Service]
ExecStart=/var/www/mypgadmin/my-env/bin/uwsgi --ini /var/www/mypgadmin/pgadmin.ini
RuntimeDirectory=uwsgi
Restart=always
Type=notify
StandardError=syslog
NotifyAccess=all
KillSignal=SIGQUIT

[Install]
WantedBy=multi-user.target

Закидываем файл в директорию «/etc/systemd/system/»

Теперь мы можем запустить наш собственный сервис:

systemctl start uwsgi-pgadmin.service

Можно проверить статус:

systemctl status uwsgi-pgadmin.service

Остановка сервиса:

systemctl stop uwsgi-pgadmin.service

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

systemctl reenable uwsgi-pgadmin.service

Служба может перестать работать по разным причинам. Её нужно будет починить.

 

Создаём конфигурационный файл виртуального хоста для веб-сервера nginx

Назовём файл «nginx-mypgadmin.conf»

Его содержимое будет таким:

server {
  listen 15050;
  # server_name _;
  server_name $server_addr;
  # charset utf-8;
  # client_max_body_size 75M;

  location / {
    include uwsgi_params;
    # uwsgi_pass pgadmin;
    # include /etc/nginx/uwsgi_params;
    uwsgi_pass unix:/var/www/mypgadmin/pgadmin.sock;
  }
}

Решётками тут закомментированы возможные строки. Не потеряйте точки с запятыми в конце строк, а то конфиг сломается.

 

 

Обязательно задаём права на файлы от пользователя www-data: (от имени этого пользователя работает nginx)

chown -R www-data:www-data /var/www/mypgadmin

Если этого не сделать, то наши файлы от root-пользователя не будут отданы или обработаны nginx. Мы просто упадём в 502 ошибку сервера. Если файл сокета будет активирован от root-пользователя, то nginx не сможет им воспользоваться и пробросить в него запрос.

После этого обязательно подключаем виртуальный хост в nginx:

ln -s /etc/nginx/sites-available/pgadmin2023.conf /etc/nginx/sites-enabled/pgadmin2023.conf

 

Шаг № 18 — Подключение нового сервера из веб-интерфейса

Надеюсь, что предыдущие шаги у вас получились и вы успешно авторизовались в веб-интерфейсе pgAdmin4. Я в настройках поправил язык на русский, чтобы лучше воспринимать информацию.

Чего мы добились к этому этапу? Мы получили работающий веб-сервер под Python-приложения. Мы создали свою службу и добавили её в автозагрузку — это значит, что наш веб-сервер под Python-приложения будет стартовать автоматически при перезагрузках ОС Debian. Мы связали веб-сервер с нашим конкретным приложением pgAdmin4. Мы добились корректной отдачи HTML-разметки. Мы по сути подключили новый сайт.

Теперь про сам интерфейс.

Слева мы видим, что у нас нет подключенных серверов для управления базами данных. Список как бы развёрнут, но пуст. Посередине, под иконкой синего слона, есть кнопка «Добавить новый сервер» (Add New Server). Она нам нужна для подключения. Нажимаем.

pgAdmin4 окно после успешной авторизации в веб-интерфейсе
pgAdmin4 окно после успешной авторизации в веб-интерфейсе

Нас встречает окно «Register — Сервер» с вкладкой «General«:

Регистрация нового сервера в pgAdmin4 окно General
Регистрация нового сервера в pgAdmin4 окно General

pgAdmin4 хочет, чтобы мы ввели имя сервера для подключения. Назовите так, как будет понятно вам. Называйте латиницей. Называйте маленькими (строчными) буквами. Можете добавить цифр.

В моём случае имя будет «efim2022«. Цифры будут значить год создания сервера.

Имя нового сервера для pgAdmin - efim2022
Имя нового сервера для pgAdmin — efim2022

Переходим на вкладку «Соединение» (Connection)

Регистрация нового сервера в pgAdmin4 вкладка Соединение
Регистрация нового сервера в pgAdmin4 вкладка Соединение

ВНИМАНИЕ!!!

Нам нужно правильно указать ip-адрес с которого будем ловить запросы. В нашем случае это тот же физический сервер (или та же виртуальная машина). В этом случае мы можем указать ip-адрес127.0.0.1. Или мы можем написать слово «localhost«. Выбирайте на свой вкус.

127.0.0.1 адрес сервера для нового подключения в pgAdmin4
127.0.0.1 адрес сервера для нового подключения в pgAdmin4

Порт по умолчанию 5432. На нём работает сам PostgreSQL в нашей системе Debian. Порт — это как номер квартиры в доме. Его мы не трогаем.

 

Служебная база данных. Для примера мы оставляем postgres, потому что у нас нет какой-то своей собственной БД. Это не пользователь postgres !! Не путайте!!! Откуда мы её взяли? По умолчанию, при установки самого PostgreSQL, он поставляется с тремя шаблонными базами данных:

  • postgres
  • template0
  • template1
Список баз данных по умочанию после установки PostgreSQL в Debian
Список баз данных по умочанию после установки PostgreSQL в Debian

Обратите внимание!!! Одна из трёх баз называется (Имя) postgres и её владелец тоже называется postgres. Это разные сущности. На кой хер они это сделали — мне непонятно. Новичка это только запутает. Будьте внимательны! Различайте эти понятия. Мы выбираем базу (оставляем) postgres.

 

Имя пользователя. В этом поле мы заменяем пользователя admin на пользователя postgres.

Имя базы postgres имя пользователя postgres в pgAdmin4
Имя базы postgres имя пользователя postgres в pgAdmin4

 

Пароль. Нам нужно ввести пароль для пользователя postgres. Если вы создавали ранее пароль для пользователя postgres, то введите его. Если нет, то читайте ниже как его создать. Я введу свой «секретный пароль» 🙂

Заполнили все минимальные данные на вкладке Соединение в pgAdmin4
Заполнили все минимальные данные на вкладке Соединение в pgAdmin4

Нажимаем на кнопку «Сохранить»

Панель информации нового успешно подключенного сервера в pgAdmin4
Панель информации нового успешно подключенного сервера в pgAdmin4

Если всё введено правильно, то перед вами предстанет «Панель информации» нового подключенного сервера.

Теперь в левом меню под словом «Servers» появится иконка слона с именем «efim2022«.

Мы получили желаемый результат.

 

Если у вас есть свои собственные Python-проекты, которые черпают данные из СУБД PostgreSQL, то вы можете подобным образом подключить нужную вам базу данных и управлять ей.

 

Шаг № 19 — Ошибка «fe_sendauth: no password supplied«

Если мы будем коннектиться от пользователя «postgres«, то у него нет пароля. По-умолчанию это так.

Запись «fe_sendauth: no password supplied» на русском означает «пароль не указан«.

Нам нужно задать пароль пользователю «postgres«. Если мы в оболочке какого-то пользователя (например root), то нам нужно сначала переключиться в пользователя postgres.

Команда:

su - postgres

С этого момента оболочка сменит самое левое слово на postgres.

От имени postgres теперь мы можем обратиться к утилите psql

psql

Она занимается управлением самой СУБД. Вызвав её, мы проваливаемся во внутреннюю консоль самого PostgreSQL. Видим запись:

postgres=#

Справа от этой записи мы можем вводить полезные команды.

Команда смены пароля пользователя postgres будет выглядеть так:

\password

Обязательно обратный слеш в самом начале!

Задали пароль для пользователя postgres в Debian
Задали пароль для пользователя postgres в Debian

Обязательно ЗАПОМНИТЕ этот пароль т. к. с его помощью вы сможете подключить ваш pgAdmin4 к существующей СУБД PostgreSQL и управлять её базами данных через графический веб-интерфейс.

 

Как вариант можно немного отредактировать конфигурационный файл «postgresql.conf» или «pg_hba.conf«. Но нужно читать документацию.

Эти файлы лежат в папке «/etc/postgresql/14/main»

 

Таймкоды из видео

00:12 — Install virtualenv
00:35 — Creating pgAdmin directory
00:58 — Creating a virtual environment
02:02 — Activating a virtual environment
02:18 — Download pgAdmin
04:13 — Verify GPG signature
05:04 — Check pip version and location
06:21 — Install pgAdmin
09:47 — Install uWSGI
11:54 — Configure pgAdmin
15:08 — Leaving virtual environment
15:41 — Configure pgAdmin
17:24 — Configure firewall
18:47 — Run pgAdmin using python
19:41 — Access pgAdmin from browser
22:01 — Run pgAdmin using wsgi (wsgi-file parameter)
22:47 — Access pgAdmin from browser
25:13 — Run pgAdmin using wsgi (mount parameter)
25:53 — Access pgAdmin from browser
27:22 — Configure pgAdmin and Nginx, to run pgAdmin using WSGI
32:51 — Access pgAdmin from browser
33:35 — Connect to PostgreSQL