Большинство сайтов работают с MySQL или MariaDB, но Django, часть проектов на Laravel, системы с геоданными и приложения со сложной отчётностью часто требуют PostgreSQL. Эта СУБД сильна в транзакциях, работе с JSON-полями, полнотекстовом поиске и сложных запросах. В статье по шагам разберём, где можно создать базу, как безопасно её настроить, подключиться из приложения и организовать резервное копирование.
Обычный хостинг или VPS: что выяснить сначала
На обычном (виртуальном) хостинге стандартная база — как правило, MySQL. PostgreSQL доступен, только если администратор сервера отдельно установил его и подключил к панели. Если при создании базы в панели управления можно выбрать тип сервера и в списке есть PostgreSQL, создайте базу там и подключайтесь с хостом, портом и логином, которые выдаст панель. Если его нет, уточните наличие PostgreSQL на вашем тарифе в кабинете sayt.uz или через техподдержку.
Также проверьте, что в PHP включено расширение pdo_pgsql. Без него даже при наличии базы PHP-приложение выдаст ошибку could not find driver. Если нужен полный контроль над версией PostgreSQL, расширениями (например, PostGIS) и настройками, гораздо удобнее VPS. Команды ниже рассчитаны на VPS или собственный сервер.
Пример: система учёта пациентов для клиники
Частная клиника в Самарканде заказала внутреннюю систему для записи на приём и ведения истории пациентов. Разработчик выбрал Django, а Django лучше всего работает с PostgreSQL. Данные пациентов конфиденциальны, поэтому база должна быть полностью закрыта от внешней сети, а приложение — подключаться только под своим пользователем с ограниченными правами. Настройки ниже соответствуют именно этим требованиям.
Создание базы и пользователя
В Ubuntu и Debian PostgreSQL ставится из стандартного пакета, и в системе появляется административный пользователь postgres. Приложение никогда не должно подключаться от его имени: для каждого проекта создайте отдельную роль и принадлежащую ей базу. Тогда уязвимость в одном приложении не затронет другие базы.
sudo apt install postgresql
sudo -u postgres psql
CREATE ROLE klinika_user WITH LOGIN PASSWORD 'Uzun_Murakkab_Parol_2026';
CREATE DATABASE klinika_db OWNER klinika_user ENCODING 'UTF8';
\q
Параметр OWNER закрепляет базу за новой ролью, поэтому приложение может создавать и изменять свои таблицы, но не имеет доступа к чужим базам. Пароль храните не в коде, а в переменной окружения или файле .env.
Сетевой доступ и аутентификация
Кто, откуда и каким способом может подключаться, PostgreSQL определяет в файле pg_hba.conf. Если приложение и база на одном сервере, PostgreSQL достаточно слушать только localhost, открывать порт 5432 в интернет незачем. Для проверки пароля используйте современный метод scram-sha-256. Номер версии в пути к файлу зависит от установленной у вас версии.
# /etc/postgresql/16/main/postgresql.conf
listen_addresses = 'localhost'
# /etc/postgresql/16/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
host klinika_db klinika_user 127.0.0.1/32 scram-sha-256
sudo systemctl reload postgresql
Перед настройкой приложения проверьте подключение через psql. Если появилась строка с версией, пользователь, пароль и права настроены верно.
psql -h 127.0.0.1 -U klinika_user -d klinika_db -c "SELECT version();"
Подключение из PHP, Django и Laravel
В PHP с PostgreSQL удобнее всего работать через PDO. Подготовленные запросы (prepare) защищают от SQL-инъекций, а для разработчика, пришедшего с MySQL, код выглядит почти так же.
<?php
$pdo = new PDO(
'pgsql:host=127.0.0.1;port=5432;dbname=klinika_db',
'klinika_user',
getenv('DB_PASSWORD'),
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$stmt = $pdo->prepare('SELECT id, full_name FROM patients WHERE phone = :p');
$stmt->execute(['p' => '+998901234567']);
В Django и Laravel подключение задаётся несколькими строками в настройках. Для Django нужен установленный пакет psycopg, для Laravel — расширение PHP pdo_pgsql.
# settings.py (Django)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'klinika_db',
'USER': 'klinika_user',
'PASSWORD': os.environ['DB_PASSWORD'],
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
# .env (Laravel)
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=klinika_db
DB_USERNAME=klinika_user
Управление базой с компьютера: SSH-туннель
Иногда базу нужно посмотреть в графической программе, например DBeaver или pgAdmin. Вместо того чтобы открывать порт 5432, используйте SSH-туннель: порт 5433 на вашем компьютере по шифрованному каналу соединяется с портом 5432 на сервере. Пока туннель открыт, программа подключается к адресу 127.0.0.1:5433.
ssh -L 5433:127.0.0.1:5432 user@misol.uz
# в другом окне:
psql -h 127.0.0.1 -p 5433 -U klinika_user -d klinika_db
Резервное копирование и восстановление
Для такой важной базы, как данные пациентов, копия должна создаваться автоматически каждый день. pg_dump копирует базу на ходу, не останавливая её, а формат -Fc сжат и позволяет восстанавливать выборочно через pg_restore. Чтобы пароль не запрашивался каждый раз, используйте файл ~/.pgpass с правами на чтение только для владельца.
# ~/.pgpass (chmod 600 ~/.pgpass)
127.0.0.1:5432:klinika_db:klinika_user:Uzun_Murakkab_Parol_2026
# резервная копия (сжатый custom-формат)
pg_dump -Fc -h 127.0.0.1 -U klinika_user klinika_db > klinika_$(date +%F).dump
# восстановление
pg_restore --clean -h 127.0.0.1 -U klinika_user -d klinika_db klinika_2026-11-04.dump
Для ежедневной копии добавьте задачу cron. Внутри cron символ % имеет особое значение, поэтому его нужно экранировать обратной косой чертой. Копируйте резервные копии и на другой сервер или во внешнее хранилище и периодически проверяйте их восстановлением в тестовую базу.
30 2 * * * pg_dump -Fc -h 127.0.0.1 -U klinika_user klinika_db > /backup/klinika_$(date +\%F).dump
Частые ошибки
FATAL: password authentication failed for user— неверный пароль или метод вpg_hba.confне подходит для парольного входа.FATAL: Peer authentication failed for user— не указан-h, подключение пошло через unix-сокет, и методpeerпотребовал совпадения с именем системного пользователя. Добавьте-h 127.0.0.1.Connection refused— PostgreSQL не запущен или используется другой порт, проверьтеsystemctl status postgresql.permission denied for table— таблица принадлежит другой роли: смените владельца черезALTER TABLE ... OWNER TOили выдайте нужные права.
Если вы переезжаете с MySQL, будьте готовы к различиям в синтаксисе: вместо обратных кавычек (`) используются двойные, вместо AUTO_INCREMENT — GENERATED ... AS IDENTITY или SERIAL. При переносе больших баз заметно помогают инструменты вроде pgloader, но результат обязательно проверяйте в тестовой среде.