Задача
Нам нужно установить 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
Получим что-то вроде:
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» в которой будут лежать всякие файлы:
- Папка bin – файлы, которые взаимодействуют с виртуальной средой;
- Папка lib – копия версии Python вместе с папкой «site-packages«, в которой установлена каждая зависимость.
Далее, у нас есть копии или символические ссылки нескольких различных инструментов Python. Эти файлы используются для обеспечения того, чтобы команды и код Python выполнялись в контексте нынешней среды. Так достигается изоляция от глобальной среды.
При желании вы можете заглянуть в обновлённое содержимое папки «mypgadmin«:
ls -al
или папки с новой виртуальной средой «mypgadmin«:
ls -al my-env
или папки «bin«:
ls -al my-env/bin
Шаг № 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. Это можно понять по записи «(my-env)«.
С этого момента, всё что мы будем устанавливать в виртуальную среду СОХРАНИТСЯ.
Шаг № 5 — Загрузка pgAdmin с официального сайта
Окружение готово. Теперь нужно получить сами файлы продукта «pgAdmin 4«.
Сделать это можно из репозиториев, которые лежат на официальном сайте проекта: https://www.pgadmin.org
Переходим в раздел «Download» (Загрузка): https://www.pgadmin.org/download/
Так как мы всё это время говорили о Python, то и зайти нам нужно в раздел Python. Ссылка (https://www.pgadmin.org/download/pgadmin-4-python/) Ссылка может измениться со временем, имейте ввиду.
На странице нас будет интересовать раздел «Manual installation with a Python Wheel package» (Ручная установка с помощью пакета Python Wheel)
Кликаем на САМУЮ НОВУЮ версию продукта «pgAdmin4«.
Нас интересует САМЫЙ ЖИРНЫЙ файл из всех. Это файл с расширением «whl». (Для Колёсного Питона)
В моем случае это файл «pgadmin4-6.7-py3-none-any.whl«.
Нам нужна ссылка на этот файл !!!
В моём случае это адрес «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, тогда установите его.
Теперь скачиваем файл с расширением «.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)». Закодированная подобным образом информация может быть отправлена в виде обычного сообщения, например, электронного письма, и расшифрована с помощью имеющегося у получателя ключа.
Шаг № 6 — Проверить подпись GPG
Давайте ещё раз получим список файлов из директории «mypgadmin»
ls -al
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
Обязательно проверьте откуда ваша «пипка». Из-за разной версионности пакетов «пипка» может иметь не ту, что нам нужна.
Что-то подобное:
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
- pip3
- pip-3
- pip3.7
- pip-3.7
Одному богу известно, что будет установлено в вашей системе. У меня в изолированной среде всего одна версия pip. Удобно.
Команда установки pgAdmin:
pip install pgadmin4-6.7-py3-none-any.whl или pip install pgadmin4-6.11-py3-none-any.whl
После этого начнётся ПРОДОЛЖИТЕЛЬНАЯ установка. Будут распаковываться файлы в новую директорию внутри проекта.
Все файлы окажутся в папке:
/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.
Скриншот:
И можем обновить по рекомендованной команде:
Шаг № 8 — Установка uWSGI
Немного справочной информации:
Прежде чем приступить к работе, нужно разобраться с основными терминами и понятиями. Следующие три термина на первый взгляд кажутся взаимозаменяемыми, но на самом деле они совсем разные:
- WSGI: спецификация Python, которая определяет стандартный интерфейс для взаимодействия приложения/фреймворка с сервером приложений/веб-сервером. Её цель – упростить и стандартизировать взаимодействие этих компонентов. По сути, WSGI определяет интерфейс API, который можно использовать с другими протоколами.
- uWSGI: сервер приложений, который обеспечивает полноценную платформу для разработки и развертывания веб-приложений и сервисов. Этот сервер приложений может обрабатывать приложения, написанные на разных языках. Он взаимодействует с приложением согласно спецификации WSGI. Он может взаимодействовать с другими веб-серверами при помощи различных протоколов. Этот компонент трансформирует запросы стандартного веб-сервера в формат, который может обработать приложение.
- uwsgi: быстрый бинарный протокол, который реализуется сервером uWSGI для взаимодействия с другими полнофункциональными протоколами. Это wire протокол, а не транспортный протокол. Он лучше всего подходит для взаимодействия с веб-серверами, которые проксируют запросы для uWSGI.
Как видите, чёрт ногу сломит в этом всём разобраться. И жизни не хватит. Пакеты и обновления выходят так часто, что можно даже не запоминать эти все названия. Нужно просто понимать их суть.
Устанавливаем сервер приложений uWSGI в нашу среду: (мы ещё внутри (my-env)!!!)
pip install uwsgi
Узнать версию uwsgi:
uwsgi --version
Получим что-то подобное:
Перезапустить сервер приложений uWSGI:
service uwsgi restart
Узнать состояние активности сервера приложений uWSGI:
service uwsgi status
Путь до папки сервера приложений uWSGI в Debian:
/etc/uwsgi
Внутри две директории:
- apps-enabled
- 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."
диалоговое окно вида:
Первое о чём вас попросят — это «Введите адрес электронной почты и пароль для начальной учетной записи пользователя 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"
Подобных файлов может быть очень много. Имейте ввиду.
Редактируем его:
Меняем директиву 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 варианта подключения
- Запуск pgAdmin используя Python
- Запуск pgAdmin с помощью wsgi (параметр —wsgi-file)
- Запуск 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:
Чтобы выйти из «залипшей» консоли, нужно нажать сочетание клавиш CTRL + C. Пока этого делать не нужно.
Так мы сможем вернуться в обычный терминал.
Шаг № 14 — Доступ к pgAdmin из браузера
С этого момента (пока скрипт активен в терминале) мы можем перейти по указанному адресу (в нашем случае это локальный IP на котором работает Debian) и обратиться к порту 15050.
Для этого нам понадобится любой браузер.
Здесь в браузере задан масштаб 200% и на весь экран развернулось только диалоговое окно авторизации.
Вводим наши Логин и Пароль от учётной записи администратора pgAdmin.
Это окно говорит нам, что сама веб-оболочка pgAdmin установилась и работает. Запросы поступают, ответы возвращаются.
Шаг № 15 — Запуск pgAdmin с помощью wsgi (параметр —wsgi-file)
Находим директории (пути) для wsgi:
find / -name "uwsgi"
Может быть много адресов расположения «uwsgi»:
Нам нужна та, которая живёт в нашем виртуальном окружении «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 &
Получаем:
Первой строкой возвращается номер процесса. ЗАПОМНИТЕ ЕГО. У меня это 23350. У вас будет другой.
Нас интересует запись «uwsgi socket 0 bound to TCP address 0.0.0.0:15050 fd 3″
Можем проверить процессы:
ps -ef | grep uwsgi или ps aux | grep uwsgi
Получаем что-то вроде:
Можно ещё так посмотреть:
netstat -natp
Можно тестировать в браузере. Такой конфиг будет работать.
Но при таком подключении нам нужно держать соединение в терминале. Не пойдёт.
Шаг № 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
Результат:
Шаг № 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.
Полезная информация про параметр logto — uWSGI 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). Она нам нужна для подключения. Нажимаем.
Нас встречает окно «Register — Сервер» с вкладкой «General«:
pgAdmin4 хочет, чтобы мы ввели имя сервера для подключения. Назовите так, как будет понятно вам. Называйте латиницей. Называйте маленькими (строчными) буквами. Можете добавить цифр.
В моём случае имя будет «efim2022«. Цифры будут значить год создания сервера.
Переходим на вкладку «Соединение» (Connection)
ВНИМАНИЕ!!!
Нам нужно правильно указать ip-адрес с которого будем ловить запросы. В нашем случае это тот же физический сервер (или та же виртуальная машина). В этом случае мы можем указать ip-адрес — 127.0.0.1. Или мы можем написать слово «localhost«. Выбирайте на свой вкус.
Порт по умолчанию 5432. На нём работает сам PostgreSQL в нашей системе Debian. Порт — это как номер квартиры в доме. Его мы не трогаем.
Служебная база данных. Для примера мы оставляем postgres, потому что у нас нет какой-то своей собственной БД. Это не пользователь postgres !! Не путайте!!! Откуда мы её взяли? По умолчанию, при установки самого PostgreSQL, он поставляется с тремя шаблонными базами данных:
- postgres
- template0
- template1
Обратите внимание!!! Одна из трёх баз называется (Имя) postgres и её владелец тоже называется postgres. Это разные сущности. На кой хер они это сделали — мне непонятно. Новичка это только запутает. Будьте внимательны! Различайте эти понятия. Мы выбираем базу (оставляем) postgres.
Имя пользователя. В этом поле мы заменяем пользователя admin на пользователя postgres.
Пароль. Нам нужно ввести пароль для пользователя postgres. Если вы создавали ранее пароль для пользователя postgres, то введите его. Если нет, то читайте ниже как его создать. Я введу свой «секретный пароль» 🙂
Нажимаем на кнопку «Сохранить»
Если всё введено правильно, то перед вами предстанет «Панель информации» нового подключенного сервера.
Теперь в левом меню под словом «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
Обязательно обратный слеш в самом начале!
Обязательно ЗАПОМНИТЕ этот пароль т. к. с его помощью вы сможете подключить ваш 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