🐘
Хостинг

PostgreSQL на хостинге: создание базы и подключение к сайту

07.11.2026
← Все статьи

Большинство сайтов работают с 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

Частые ошибки

Если вы переезжаете с MySQL, будьте готовы к различиям в синтаксисе: вместо обратных кавычек (`) используются двойные, вместо AUTO_INCREMENT — GENERATED ... AS IDENTITY или SERIAL. При переносе больших баз заметно помогают инструменты вроде pgloader, но результат обязательно проверяйте в тестовой среде.

Похожие статьи

💽 Диск заполнен: ошибка 500, повреждённый .htaccess и восстановление базы 🍃 MongoDB: облачный Atlas или собственный сервер — что выбрать 🗄️ Кеширование статики в Nginx: Cache-Control, expires и версионирование 📦 Плагины резервного копирования забивают диск: как правильно настроить UpdraftPlus
🌐 Язык
🇺🇿 O'zbek 🇺🇿 Ўзбек 🇷🇺 Русский ✓ 🇬🇧 English