Хочу адаптировать заметку: "Настройка связки Nginx + PhpPgAdmin on Ubuntu 20.04", но уже к использованию другого LTS релиза Ubuntu(ы), а именно Ubuntu 22.04, возможно появились какие-либо дополнительные нюансы о которых мне предстоит узнать, плюс это интересно и возможно пригодится в будущем. Напомню самому себе:

  • phpPgAdmin — веб-приложение с открытым кодом, написанное на языке PHP и представляющее собой веб-интерфейс для администрирования СУБД PostgreSQL.
  • phpPgAdmin позволяет через браузер осуществлять администрирование сервера PostgreSQL, запускать команды SQL и просматривать содержимое таблиц и баз данных. Приложение пользуется большой популярностью у веб-разработчиков, так как позволяет управлять PostgreSQL без непосредственного ввода SQL команд.

Шаг №1: Обновляю установленную систему до самого последнего релиза в рамках текущего LTS релиза для Ubuntu 22.04 Server/Desktop:

ekzorchik@srv-home:~$ sudo nano /etc/update-manager/release-upgrades
[DEFAULT]
Prompt=never
ekzorchik@srv-home:~$ sudo rm -Rf /var/lib/apt/lists
ekzorchik@srv-home:~$ sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
ekzorchik@srv-home:~$ sudo reboot
ekzorchik@srv-home:~$ uname -a && lsb_release -a
Linux srv-home 5.15.0-101-generic #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy
ekzorchik@srv-home:~$

Шаг №2: Настройки локали прописываю следующим образом:

sudo rm -f /etc/localtime
sudo ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
sudo locale-gen en_US.UTF-8
echo "LC_ALL="en_US.UTF-8"" | sudo -s tee /etc/default/locale
echo "LANG="en_US.UTF-8"" | sudo tee -a /etc/default/locale
echo "LANGUAGE="en.US.UTF-8"" | sudo tee -a /etc/default/locale

Шаг №3: Настройки синхронизации времени прописываем опираясь на заметку: "Настраиваем службу времени в Ubuntu 22.04 Server"

Шаг №4: Устанавливаю PostgreSQL сервис из дефолтных репозитариев текущей системы, а именно Ubuntu 22.04 Server:

ekzorchik@srv-home:~$ apt-cache show postgresql | grep Version
Version: 14+238
ekzorchik@srv-home:~$ sudo apt-get install -y postgresql net-tools
ekzorchik@srv-home:~$ sudo systemctl restart postgresql && sudo systemctl status postgresql | head -n5
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2024-03-20 08:45:25 MSK; 12ms ago
Process: 3124 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 3124 (code=exited, status=0/SUCCESS)
ekzorchik@srv-home:~$

Шаг №5: Сейчас создадим базу под Webсервис PhpPgAdmin:

ekzorchik@srv-home:~$ cat /etc/passwd | grep postgres
postgres:x:114:120:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ sudo su - postgres
postgres@srv-home:~$ pwd
/var/lib/postgresql
postgres@srv-home:~$
postgres@srv-home:~$ psql
psql (14.11 (Ubuntu 14.11-0ubuntu0.22.04.1))
Type "help" for help.
postgres=#
postgres=# CREATE USER us_pgadmin WITH PASSWORD 'Aa1234567aA';
CREATE ROLE
postgres=# CREATE DATABASE db_pgadmin;
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE db_pgadmin to us_pgadmin;
GRANT
postgres=# quit
postgres@srv-home:~$ exit
logout
ekzorchik@srv-home:~$

Шаг №6: Устанавливаю пакеты PHP которые потребуются для PostgreSQL при работе через Webинтерфейс:

ekzorchik@srv-home:~$ sudo apt-get install -y php php-bz2 php-curl php-fpm php-gd php-mbstring php-pgsql php-xml php-zip curl
ekzorchik@srv-home:~$ php -v
PHP 8.1.2-1ubuntu2.14 (cli) (built: Aug 18 2023 11:41:11) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2-1ubuntu2.14, Copyright (c), by Zend Technologies
ekzorchik@srv-home:~$

Шаг №7: В процессе будет установлен по умолчанию Webсервис Apache2, но я его использовать не буду:

ekzorchik@srv-home:~$ dpkg -l | grep apache2
ii  apache2                                2.4.52-1ubuntu4.8                       amd64        Apache HTTP Server
ii  apache2-bin                            2.4.52-1ubuntu4.8                       amd64        Apache HTTP Server (modules and other binary files)
ii  apache2-data                           2.4.52-1ubuntu4.8                       all          Apache HTTP Server (common files)
ii  apache2-utils                          2.4.52-1ubuntu4.8                       amd64        Apache HTTP Server (utility programs for web servers)
ii  libapache2-mod-php8.1                  8.1.2-1ubuntu2.14                       amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ sudo systemctl disable apache2.service
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable apache2
Removed /etc/systemd/system/multi-user.target.wants/apache2.service.
ekzorchik@srv-home:~$ sudo systemctl stop apache2
ekzorchik@srv-home:~$

Шаг №8: Т.к. Webсервис Apache2 я деактировал, то устанавливаю Webсервис Nginx:

ekzorchik@srv-home:~$ sudo apt-get install -y nginx
ekzorchik@srv-home:~$ nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
ekzorchik@srv-home:~$ sudo unlink /etc/nginx/sites-available/default
ekzorchik@srv-home:~$ sudo unlink /etc/nginx/sites-enabled/default
ekzorchik@srv-home:~$ sudo rm -f /var/www/html/{index.html,index.nginx-default.html}
ekzorchik@srv-home:~$ sudo rm -f /usr/share/nginx/html/index.html
ekzorchik@srv-home:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ sudo systemctl restart nginx

Шаг №9: Перед последующими внесения изменений в конфигурационные файлы PHP делаю бекап:

ekzorchik@srv-home:~$ sudo cp /etc/php/8.1/fpm/php.ini /etc/php/8.1/fpm/php.ini.backup
ekzorchik@srv-home:~$ sudo nano /etc/php/8.1/fpm/php.ini
date.timezone = Europe/Moscow
;display_errors = Off
display_errors = On
ekzorchik@srv-home:~$ sudo php-fpm8.1 --test
[20-Mar-2024 09:05:22] NOTICE: configuration file /etc/php/8.1/fpm/php-fpm.conf test is successful

Шаг №10: Устанавливаю PhpPgAdmin из стандартных репозитариев:

На заметку: Обратите внимание что в качестве Web-сервиса используется по умолчанию apache2, и установка завершится не успешно, это нормально в текущем случаем при использовании Web-сервиса Nginx в качестве основного.

ekzorchik@srv-home:~$ apt-cache show phppgadmin | grep Version
Version: 7.13.0+dfsg-2
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ sudo apt-get install -y phppgadmin

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

apache2_invoke: Enable configuration phppgadmin
apache2.service is not active, cannot reload.
invoke-rc.d: initscript apache2, action "reload" failed.

А все потому что сервис Apache2 через systemctl disable apache2 я деактивировал.

Шаг №11: Изменяю поведение сервиса, то доступ к нему не только с локального хоста:

ekzorchik@srv-home:~$ sudo nano /etc/apache2/conf-available/phppgadmin.conf
# Only allow connections from localhost:
#Require local
Require all granted

Шаг №12: Создаю конфигурационный файл для nginx на работу с phppgadmin:

ekzorchik@srv-home:~$ sudo nano /etc/apache2/conf-available/phppgadmin.conf
ekzorchik@srv-home:~$ sudo ln -s /usr/share/phppgadmin/ /usr/share/nginx/db
ekzorchik@srv-home:~$ sudo chown -R www-data:www-data /usr/share/phppgadmin/
ekzorchik@srv-home:~$ sudo chown -R www-data:www-data /usr/share/nginx/
ekzorchik@srv-home:~$ sudo nano /etc/nginx/sites-available/phppgadmin.conf
server {
  listen 80;
  server_name 172.33.33.102;
  root /usr/share/nginx/db;
  index index.php;
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
  }
}
ekzorchik@srv-home:~$ sudo ln -s /etc/nginx/sites-available/phppgadmin.conf /etc/nginx/sites-enabled/phppgadmin.conf
ekzorchik@srv-home:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ sudo systemctl restart nginx php8.1-fpm.service

Шаг №13: Теперь запускаем браузер с другой системы и в строке адреса указываем URL системы Ubuntu 22.04 Server где устанавливали шагами выше связку nginx + PhpPgAdmin, Т.е. Url получается: http://172.33.33.102

Web интерфейс PhpPgAdmin 7.13.0 на Ubuntu 22.04 Server

Отлично, Web-интерфейс поднят.

Шаг №14: Но, чтобы Web-интерфейс доступа для Администрирования Postgres не святил всем, кто есть в сети, я бы доступ к нему ограничил банальной Auth Basic аутентификацией, приступим:

На заметку: Если в качестве Web-сервиса Вы используете Apache2, то в Вашем случае есть пакет apache2-utils с помощью которого создается файл .htpasswd где указывается логин и зашифрованный пароль, но если как я сейчас Nginx, то делаем через встроенные утилиты.

ekzorchik@srv-home:~$ cat /usr/share/nginx/.htpasswd
ekzorchik:
ekzorchik@srv-home:~$ sudo sh -c "openssl passwd -apr1 >> /usr/share/nginx/.htpasswd"
Password: указываю к примеру пароль Aa1234567aA
Verifying - Password: указываю к примеру пароль Aa1234567aA
ekzorchik@srv-home:~$ cat /usr/share/nginx/.htpasswd
ekzorchik:$apr1$4LTyKH64$q70xMrU1qgw6BjBP.gvHK/
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ sudo chown www-data:www-data /usr/share/nginx/.htpasswd
ekzorchik@srv-home:~$ sudo chmod 600 /usr/share/nginx/.htpasswd
ekzorchik@srv-home:~$ sudo nano /etc/nginx/sites-available/phppgadmin.conf
server {
  listen 80;
  server_name 172.33.33.102;
  root /usr/share/nginx/db;
  index index.php;

  location / {
        auth_basic "now allowed";
        auth_basic_user_file /usr/share/nginx/.htpasswd;
        try_files $uri $uri/ =404;
        }

  location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        include snippets/fastcgi-php.conf;
        }
}
ekzorchik@srv-home:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-home:~$ sudo systemctl restart nginx php8.1-fpm.service

Шаг №15: Проверяю, что обратившись по URL адресу http://172.33.33.102 у меня сперва отрабатывает Basic Auth аутентификация, т.е. сперва нужно получить доступ, а уже потом предстанет Web-интерфейс администрирования Postgres:

Basic Auth перед доступом к PhpPgAdmin on Ubuntu 22.04

и нажимаю "Вход" и передо мной Web-интерфейс PhpPgAdmin.

Вот теперь точно отлично. Оснастка PhpPgAdmin развернута при использовании nginx + защищена связкой логин + пароль.

На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.