Установка PostgreSQL 14 и pgAdmin 4 на Ubuntu 22.04
Кому это нужно
- Администраторам Linux, которые разворачивают PostgreSQL 14 на Ubuntu 22.04.
- Разработчикам, которым нужен веб-интерфейс управления базой (pgAdmin 4).
- Тем, кто хочет безопасно предоставить удалённый доступ к PostgreSQL через HTTPS и Nginx.
Основные результаты этого руководства
- Рабочая пара «PostgreSQL 14 + pgAdmin 4» на Ubuntu 22.04.
- Доступ к pgAdmin по HTTPS с сертификатом Let’s Encrypt.
- Интеграция pgAdmin через uWSGI и проксирование Nginx.
- Практические чек-листы по безопасности и приёмке.
Предварительные условия
- Сервер с Ubuntu 22.04 (64-bit) и доступом по SSH.
- Ненулевой sudo-пользователь (не root) с правами sudo.
- Полностью квалифицированное доменное имя (FQDN), например pgadmin.example.com.
- Обновлённая система и базовые утилиты. Выполните:
$ sudo apt update
$ sudo apt upgrade- Установите базовые пакеты (если их нет):
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -yНекоторые пакеты могут быть уже установлены.
Important: В этом руководстве предполагается Ubuntu 22.04 и PostgreSQL 14 (поставляется по умолчанию в 22.04). Если у вас другая версия Ubuntu — адаптируйте команды репозиториев и пути соответственно.
Что такое роли и аутентификация в PostgreSQL (одно предложение)
Роль — это сущность PostgreSQL, которая может представлять пользователя или группу; методы аутентификации (peer, scram-sha-256, trust и т.д.) определяются в pg_hba.conf.
Шаг 1 — Установка PostgreSQL 14
Ubuntu 22.04 содержит PostgreSQL 14 в официальных репозиториях. Установите пакеты:
$ sudo apt install postgresql postgresql-contribПакет postgresql-contrib содержит дополнительные утилиты.
Если вы хотите использовать официальный репозиторий PostgreSQL (например, чтобы получить более свежие патчи), добавьте GPG-ключ и репозиторий:
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ sudo apt updateПроверьте статус сервиса:
$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-05-16 11:20:35 UTC; 5 days ago
Process: 30544 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 30544 (code=exited, status=0/SUCCESS)
CPU: 2ms
May 16 11:20:35 postgresql systemd[1]: Starting PostgreSQL RDBMS...
May 16 11:20:35 postgresql systemd[1]: Finished PostgreSQL RDBMS.Вы увидите, что служба включена и запущена по умолчанию.
Шаг 2 — Роли PostgreSQL и методы аутентификации
Postgres использует роли (roles) вместо чёткого разделения пользователей и групп. Основные методы аутентификации:
- peer — локальная проверка по имени Unix-пользователя (по умолчанию при установке).
- scram-sha-256 — рекомендуемый безопасный метод для паролей.
- md5 — устаревший метод, по возможности избегайте.
- trust — без пароля (опасно, использовать только в изолированных окружениях).
- ident/peer для специальных сетевых сценариев.
По умолчанию создан системный пользователь/роль postgres.
Переключиться на системного пользователя postgres и запустить psql:
$ sudo -i -u postgres
postgres@server:~$ psql
psql (14.3 (Ubuntu 14.3-1.pgdg22.04+1))
Type "help" for help.
postgres=#Выход из оболочки: \q или exit.
Для однократного запуска psql из вашей учётной записи:
$ sudo -u postgres psqlШаг 3 — Создание новой роли (пользователя)
Можно использовать createuser или SQL-команды в psql.
Интерактивно:
$ sudo -u postgres createuser --interactive
Enter name of role to add: navjot
Shall the new role be a superuser? (y/n) yЧерез psql:
postgres=# CREATE ROLE username WITH SUPERUSER CREATEDB CREATEROLE LOGIN ENCRYPTED PASSWORD 'yourpassword';Показать роли:
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
username | Superuser, Create role, Create DB | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}Совет безопасности: не давайте роли SUPERUSER без необходимости; вместо этого назначайте конкретные привилегии.
Шаг 4 — Создание базы данных
Создать базу командой createdb:
$ sudo -u postgres createdb howtoforgeИли в psql:
postgres=# CREATE DATABASE howtoforge;Дать права роли:
postgres=# GRANT ALL PRIVILEGES ON DATABASE howtoforge TO username;Посмотреть список баз:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
howtoforge| postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | username=CTc/postgres
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)Шаг 5 — Включение удалённого доступа
По умолчанию PostgreSQL слушает только localhost. Для прослушивания всех интерфейсов отредактируйте файл /etc/postgresql/14/main/postgresql.conf и установите:
# CONNECTIONS AND AUTHENTICATION
listen_addresses = '*' # what IP address(es) to listen on;Перезапустите PostgreSQL:
$ sudo systemctl restart postgresqlПроверьте прослушиваемые порты:
$ ss -nlt | grep 5432
LISTEN 0 244 0.0.0.0:5432 0.0.0.0:*
LISTEN 0 244 [::]:5432 [::]:*Настройте правила доступа в /etc/postgresql/14/main/pg_hba.conf (пример):
# TYPE DATABASE USER ADDRESS METHOD
# Полный доступ по паролю scram-sha-256
host all username 0.0.0.0/0 scram-sha-256
# Доступ к конкретной базе howtoforge по паролю
host howtoforge username 0.0.0.0/0 scram-sha-256
# Доступ без пароля из доверенной подсети
host all username 192.168.1.134/32 trustВажно: не оставляйте 0.0.0.0/0 в продакшене; ограничьте IP-диапазоны.
Откройте порт в ufw:
$ sudo ufw allow 5432/tcpИли ограничьте доступ подсетью:
$ sudo ufw allow proto tcp from 192.168.1.0/24 to any port 5432Шаг 6 — Установка pgAdmin 4 (виртуальное окружение Python)
Мы устанавливаем pgAdmin в Python-virtualenv, чтобы не принудительно ставить Apache. Создаём директории данных и логи:
$ sudo mkdir /var/lib/pgadmin
$ sudo mkdir /var/log/pgadmin
$ sudo mkdir /opt/pgadminПерейдите в root:
$ sudo su -Установите зависимости Python:
# как root
$ apt install build-essential python3-dev python3-venv python3-pip -yСоздайте виртуальное окружение и активируйте его:
$ python3 -m venv /opt/pgadmin/venv
$ source /opt/pgadmin/venv/bin/activateУстановите pgAdmin и uWSGI:
(venv) root@server:-$ pip install --upgrade pip
(venv) root@server:-$ pip install --upgrade setuptools
(venv) root@server:-$ pip install wheel
(venv) root@server:-$ pip install pgadmin4
(venv) root@server:-$ pip install uwsgiЗапустите скрипт инициализации pgAdmin (путь может отличаться в зависимости от Python):
(venv) root@server:-$ python3 /opt/pgadmin/venv/lib/python3.10/site-packages/pgadmin4/setup.pyСледуйте инструкциям: укажите email и пароль администратора pgAdmin. Запомните их.
Деактивируйте виртуальное окружение:
(venv) root@server:-$ deactivateСоздайте системного пользователя для запуска pgAdmin:
$ sudo adduser --system --group --home /var/lib/pgadmin --disabled-login --shell /usr/sbin/nologin pgadminНазначьте владельцев директорий (в примере используем группу nginx, потому что позже Nginx будет проксировать):
$ sudo chown -R pgadmin:nginx /var/lib/pgadmin /var/log/pgadmin /opt/pgadminШаг 7 — Интеграция uWSGI и pgAdmin
Создайте uWSGI-конфигурацию /opt/pgadmin/pgadmin-uwsgi.ini:
$ sudo nano /opt/pgadmin/pgadmin-uwsgi.iniДобавьте:
[uwsgi]
socket = /var/lib/pgadmin/pgadmin4.sock
chdir = /opt/pgadmin/venv/lib/python3.10/site-packages/pgadmin4/
module = pgAdmin4:application
threads = 20
processes = 1
mount = /=pgAdmin4:app
manage-script-name = true
chmod-socket = 660Сохраните файл. Обратите внимание: путь Python (python3.10) должен соответствовать установленной версии в системе.
Шаг 8 — Создание systemd-сервиса для uWSGI
Создайте unit-файл /etc/systemd/system/pgadmin-uwsgi.service:
$ sudo nano /etc/systemd/system/pgadmin-uwsgi.serviceВставьте:
[Unit]
Description=pgadmin4 on uWSGI
Requires=network.target
After=network.target
[Service]
User=pgadmin
Group=nginx
Environment="PATH=/opt/pgadmin/venv/bin"
ExecStart=/opt/pgadmin/venv/bin/uwsgi --ini /opt/pgadmin/pgadmin-uwsgi.ini
[Install]
WantedBy=multi-user.targetВключите и запустите сервис:
$ sudo systemctl enable pgadmin-uwsgi --now
$ sudo systemctl status pgadmin-uwsgiЕсли socket создаётся в /var/lib/pgadmin/pgadmin4.sock, убедитесь, что у Nginx есть доступ (правильно настроены права и владельцы).
Шаг 9 — Установка SSL (Let’s Encrypt)
Устанавливаем Certbot через snap:
$ sudo apt install snapd -y
$ sudo snap install core
$ sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotОстановите Nginx перед выдачей сертификата standalone режимом:
$ sudo systemctl stop nginxПолучите сертификат (замените email и домен):
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d pgadmin.example.comСертификаты будут в /etc/letsencrypt/live/pgadmin.example.com.
Создайте dhparam (может занять время):
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096Создайте веб-корень для webroot renewal и скрипт обновления:
$ sudo mkdir -p /var/lib/letsencrypt
$ sudo nano /etc/cron.daily/certbot-renewВставьте:
#!/bin/sh
certbot renew --cert-name pgadmin.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"Сделайте исполняемым:
$ sudo chmod +x /etc/cron.daily/certbot-renewЗамечание: Вы также можете использовать certbot с плагином nginx, если предпочитаете автоматическую конфигурацию.
Шаг 10 — Установка и настройка Nginx
Добавим официальный репозиторий Nginx, чтобы при необходимости установить стабильную версию:
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
$ sudo apt update
$ sudo apt install nginx
$ nginx -vПример конфигурации для /etc/nginx/conf.d/pgadmin.conf (обратите внимание на socket):
$ sudo nano /etc/nginx/conf.d/pgadmin.confВставьте:
server {
listen 80;
listen [::]:80;
server_name pgadmin.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name pgadmin.example.com;
ssl_certificate /etc/letsencrypt/live/pgadmin.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pgadmin.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/pgadmin.example.com/chain.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 5m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location /pgadmin4/ {
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/var/lib/pgadmin/pgadmin4.sock;
}
}Затем добавьте в /etc/nginx/nginx.conf перед include /etc/nginx/conf.d/*.conf;:
server_names_hash_bucket_size 64;Проверка конфигурации и перезапуск:
$ sudo nginx -t
$ sudo systemctl restart nginxImportant: В конфигурации указан location /pgadmin4/ — это соответствует настройке uWSGI, где приложение монтируется как / и менеджер скрипт-имя управляет путями.
Шаг 11 — Настройка брандмауэра
Откройте HTTP/HTTPS порты:
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcpПроверьте статус:
$ sudo ufw statusПример вывода:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
5432/tcp ALLOW 192.168.1.0/24
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)Шаг 12 — Доступ и первоначальная настройка pgAdmin
Установите пароль для пользователя postgres, чтобы подключаться через pgAdmin:
$ sudo -u postgres psql
postgres=# \password postgres
Enter new password for user "postgres":
Enter it again:
postgres=# exitУбедитесь, что UNIX-сокет имеет правильные права для nginx:
$ sudo chown nginx:nginx /var/lib/pgadmin/pgadmin4.sockОткройте в браузере: https://pgadmin.example.com

ALT: Экран входа в pgAdmin 4 с полями для адреса электронной почты и пароля
Войдите под учетными данными, созданными на шаге установки pgAdmin.

ALT: Дашборд pgAdmin 4 с боковой панелью и списком серверов
Добавьте новый сервер (Add New Server):

ALT: Окно «Добавить новый сервер» в pgAdmin с полями для имени и вкладкой Connection
В качестве hostname используйте localhost, порт можно оставить пустым (по умолчанию 5432), введите имя пользователя и пароль postgres и отметьте Save password?.

ALT: Вкладка параметров подключения сервера в pgAdmin с полями Hostname, Port, Username и Password
После добавления вы увидите панель сервера и сможете создавать таблицы и выполнять запросы.

ALT: Страница дашборда сервера PostgreSQL в pgAdmin с графиками и метриками
Пример: создание таблицы и вставка данных через pgAdmin
Откройте дерево БД > Databases > howtoforge > Schemas > Tables.

ALT: Дерево объектов базы данных в pgAdmin с раскрытыми разделами Databases и Schemas
Правый клик на Tables → Create → Table.

ALT: Меню с опцией Create Table в контекстном меню pgAdmin
Заполните имя таблицы и добавьте столбцы (ID int PK, Name varchar(30)).

ALT: Окно создания таблицы в pgAdmin с вкладкой Columns
Добавьте строки через Scripts → INSERT Script, отредактируйте и выполните:
INSERT INTO public."table-01"(
"ID", "Name")
VALUES (1, 'Navjot'), (2, 'Adam'), (3, 'Roxy');ALT для изображения SQL вставки: Окно редактора SQL в pgAdmin с примером INSERT-запроса
Просмотрите данные через View/Edit Data → All Rows.

ALT: Табличный просмотр данных в pgAdmin с отображением строк и столбцов
Настройка бинарных путей для Backup/Restore в pgAdmin
Если pgAdmin не видит утилиты pg_dump/pg_restore, укажите путь к бинарникам PostgreSQL: File → Preferences → Paths → Binary paths и установите /usr/bin для PostgreSQL 14.

ALT: Меню File → Preferences в pgAdmin, показывающее раздел Paths

ALT: Настройка PostgreSQL Binary Path в pgAdmin с полем /usr/bin
Безопасность и жёсткие настройки (Security hardening)
- Всегда используйте scram-sha-256 для паролей в pg_hba.conf.
- Ограничьте подключающиеся IP-адреса в pg_hba.conf и в брандмауэре.
- Не оставляйте роли с SUPERUSER без надобности; используйте минимальные привилегии.
- Регулярно обновляйте систему и PostgreSQL-пакеты.
- Защитите сокет и директории pgAdmin от неавторизованного доступа (правильные владельцы и права файлов).
- Настройте регулярный бэкап и тест восстановления.
Отладка и распространённые ошибки
- uWSGI не создаёт сокет — проверьте PATH в systemd-сервисе и права на папку
/var/lib/pgadmin. - 502 Bad Gateway от Nginx — проверьте, что uWSGI запущен, и путь в
uwsgi_passсовпадает с созданным сокетом. - Certbot не выдаёт сертификат — убедитесь, что Nginx остановлен и порт 80 доступен для ACME-валидации.
- pgAdmin не видит pg_dump — проверьте пункт Binary paths в Preferences и что бинарники установлены (обычно /usr/bin).
Минитесты для проверки корректности установки
- systemctl is-active postgresql
- systemctl is-active pgadmin-uwsgi
- ss -nlt | grep 5432
- ss -xl | grep pgadmin4.sock
- curl -I https://pgadmin.example.com
Чек-лист перед вводом в эксплуатацию
- Установлены последние обновления ОС и пакетов.
- PostgreSQL слушает на нужных интерфейсах и ограничен брандмауэром.
- Используется scram-sha-256 или другой безопасный метод аутентификации.
- uWSGI служба активна и создала UNIX-сокет с корректными правами.
- Nginx корректно проксирует /pgadmin4/ на uWSGI.
- Сертификаты Let’s Encrypt успешно выпущены и автопродление настроено.
- Резервное копирование и проверенное восстановление настроены.
- Протестирован доступ под реальными ролями и проверен журнал ошибок.
Критерии приёмки
- Доступ к pgAdmin через HTTPS для указанных пользователей.
- Подключение к локальной и удалённой базе данных проходит с учётом правил pg_hba.conf.
- Выполнение резервного копирования и восстановления через pgAdmin проходит без ошибок.
- Логи uWSGI/Nginx/Postgres не содержат критичных ошибок за 72 часа после запуска.
Когда этот подход не подходит (контрпримеры)
- Если вы хотите быструю изолированную среду для тестов — проще использовать Docker-контейнеры.
- Для управляемого продакшена с SLA и автоматическим бэкапом логичнее рассмотреть управляемые сервисы (например, облачные RDS/Cloud SQL).
- Если требуется многосерверный кластер с репликацией и высокой доступностью — дополнительно потребуется Patroni/pgpool/replication, а простая конфигурация здесь этого не покрывает.
Альтернативные подходы
- Развернуть PostgreSQL и pgAdmin в Docker (официальные образы) — быстро, удобно для тестов.
- Использовать пакетную установку pgAdmin (apt) с Apache, если хотите избегать настройки Python-виртуального окружения.
- Управляемые БД в облаке — снимают часть операционной нагрузки (patching, бэкапы).
Роль‑ориентированные чек‑листы
DBA:
- Настроить регулярные бэкапы и тест восстановления.
- Настроить мониторинг (pg_stat_statements, метрики).
DevOps:
- Интегрировать автоматизированную доставку конфигураций (Ansible/Chef).
- Настроить автообновление Certbot и тестовую ротацию ключей.
Разработчик:
- Проверить подключения из приложений по строке подключения.
- Тестировать миграции в тестовой среде, реплицировать окружение.
Мини‑методология быстрой проверки работоспособности
- Проверьте процессы: postgresql, pgadmin-uwsgi, nginx.
- Проверьте сокеты и порты (ss/netstat).
- Откройте web-интерфейс и выполните базовую операцию (создать таблицу, вставить строку, сделать backup).
- Проверьте логи (journalctl, /var/log/nginx, /var/log/pgadmin).
Короткий глоссарий (1 строка)
- pgAdmin — веб-интерфейс управления PostgreSQL; uWSGI — приложение WSGI-сервер для запуска Python-приложений; pg_hba.conf — файл контроля доступа PostgreSQL.
Сценарий отката (Runbook)
Если после изменений nginx/uWSGI/SSL сайт перестал отвечать:
- Проверить журналы: sudo journalctl -u pgadmin-uwsgi, sudo journalctl -u nginx.
- Временно остановить Nginx и uWSGI: sudo systemctl stop nginx pgadmin-uwsgi.
- Запустить uWSGI вручную в foreground для отладки (в venv): /opt/pgadmin/venv/bin/uwsgi –ini /opt/pgadmin/pgadmin-uwsgi.ini –die-on-term.
- Откатить изменения конфигураций из резервной копии и перезапустить сервисы.
Советы по резервному копированию и восстановлению
- Планируйте регулярные полный и инкрементальные бэкапы (pg_dump, pg_basebackup).
- Тестируйте восстановление на отдельной машине не реже раза в квартал.
- Настройте хранение бэкапов в удалённом хранилище (S3/MinIO) и проверяйте целостность.
Часто задаваемые вопросы (Кратко)
Q: Можно ли установить pgAdmin для локального доступа без HTTPS? A: Возможнo, но в продакшене HTTPS обязателен — особенно при передаче паролей.
Q: Почему pgAdmin не видит mypg_dump? A: Проверьте путь бинарников в Preferences → Paths и наличие утилит в /usr/bin.
Q: Как ограничить доступ к PostgreSQL только для приложений? A: Используйте pg_hba.conf + UFW, назначьте отдельные роли с минимальными правами.
Итог
Вы установили PostgreSQL 14 и pgAdmin 4 на Ubuntu 22.04, настроили удалённый доступ, безопасное соединение через Nginx и Let’s Encrypt и развернули pgAdmin в виртуальном окружении с uWSGI. В статье также приведены чек-листы, тесты и рекомендации по безопасности и откату.
Если остались вопросы — опишите ваш сценарий и ошибки, и мы поможем их диагностировать.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента