---
title: "Установка PostgreSQL на Linux-сервер"
description: "Установка базы данных PostgreSQL на сервер с UNIX-подобной ОС. Документация и инструкции по использованию и настройке облачных серверов Timeweb Cloud."
---

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

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

В статье мы рассмотрим установку PostgreSQL на VDS с **Ubuntu 24.04** и особенности работы с ней. 

Для выполнения операций, описанных в инструкции, на сервере должен быть [создан пользователь](https://timeweb.cloud/docs/unix-guides/adding-users) с привилегиями sudo. 

## Установка PostgreSQL

PostgreSQL присутствует в официальных репозиториях Ubuntu, поэтому для установки достаточно выполнить:

```shell
sudo apt update
sudo apt install postgresql postgresql-contrib
```

Таким образом вы обновите локальный индекс пакетов и установите PostgreSQL вместе с пакетом `contrib`, который содержит дополнительный функционал и утилиты для работы СУБД. 

При установке будет автоматически создана роль и пользователь в системе Linux `postgres`, под которым можно будет начать работу с PostgreSQL.

## Пользователи (роли)

Вместо привычного понятия пользователей, PostgreSQL использует концепцию ролей. Несмотря на определенные отличия, в целом можно определять роли как пользователей базы данных. 

В зависимости от настройки, роль можно рассматривать как пользователя базы данных или как группу пользователей. Роли могут владеть объектами базы данных (например, таблицами) и выдавать другим ролям разрешения на доступ к этим объектам. Также можно предоставить одной роли членство в другой роли (схоже с добавлением пользователя в группу), чтобы одна роль могла использовать привилегии другой роли.

Как отмечалось выше, во время установки была автоматически создана роль `postgres`. Вы можете работать с СУБД из-под нее. Для этого переключитесь на сессию данного пользователя:

```shell
sudo su - postgres
```

После чего запустите консоль Postgres:

```shell
psql
```

После завершения работы вы сможете выйти из консоли Postgres командой `\q`:

```shell
\q
```

Так как для каждой созданной роли Postgres предполагает наличие базы данных с таким же именем и по умолчанию подключается именно к ней, имеет смысл создавать новую роль для каждой базы. Кроме того, если имя роли совпадает с именем пользователя, созданного в системе Linux, подключение к БД также упрощается.

### **Создание новой роли**

Создать роль **из консоли системы** (не `psql`) можно с помощью команды:

```shell
createuser -P --interactive
```

Ключ `-P` позволит сразу задать пароль пользователю, а `--interactive` запустит интерактивный режим для указания дополнительных параметров.

Система поочередно запросит имя новой роли, ее пароль и повтор пароля, а также позволит указать привилегии: сделать ли роль суперпользователем, должны ли быть права на создание баз данных и создание других ролей. Нажимайте `y / n` и `Enter` для выбора.

![Db1](https://content.timeweb.com/assets/7f2c589a-e486-41da-abab-3e88db6a43d3?width=513&height=114)

Создать роль **из консоли Postgres** можно с помощью запроса `CREATE ROLE`.

При использовании этой команды без дополнительных опций пользователь будет создан без каких-либо привилегий, поэтому желательно сразу при создании роли указывать нужные привилегии. Полный список доступных опций можно просмотреть, выполнив:

```shell
\h CREATE ROLE
```

Чтобы создать новую роль выполните:

```shell
CREATE ROLE имя_роли WITH LOGIN CREATEDB CREATEROLE;
```

Далее задайте новому пользователю пароль:

```shell
\password имя_роли
```

### **Просмотр существующих ролей**

Чтобы просмотреть созданных пользователей и их привилегии, перейдите в консоль Postgres:

```shell
psql
```

И выполните команду:

```shell
\du
```

Пример вывода:

```shell
                                   List of roles
 Role name |                        Attributes                          | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 tmweb     | Create role, Create DB                                     | {}
 tweb      | Create role, Create DB                                     | {}
```

Нажмите `q`, чтобы закрыть вывод, и `\q`, если нужно выйти из консоли Postgres.

### **Удаление роли**

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

```shell
dropuser имя_роли
```

Либо команду в консоли Postgres:

```shell
DROP ROLE имя_роли;
```

### **Смена пароля пользователя**

Для смены пароля одной из ролей подключитесь к Postgres от суперпользователя (`postgres` или другой роли с такими привилегиями), после чего выполните:

```shell
ALTER USER имя_роли WITH PASSWORD 'новый_пароль';
```

Обратите внимание, что эта операция сохранится в файле `.psql_history` вместе с паролем в открытом виде. Из соображений безопасности рекомендуется удалить соответствующую запись из файла.

Как правило, файл размещается в директории `/var/lib/postgresql`. Проверить его расположение можно в терминале системы с помощью: 

```shell
grep postgres /etc/passwd | cut -d ':' -f 6
```

Откройте файл, указав корректный путь к нему:

```shell
sudo nano /var/lib/postgresql/.psql_history
```

Удалите запись с паролем и сохраните изменения.

## Создание базы данных

Создать базу из консоли системы можно следующим образом:

```shell
createdb имя_базы
```

Для создания базы из консоли Postgres, используйте:

```shell
CREATE DATABASE имя_базы;
```

Вывести список баз можно командой `\l` в консоли Postgres:

```shell
postgres=# \l
```

## Подключение к базе данных

1.  По умолчанию (без дополнительных опций) Postgres пытается подключиться от имени текущего пользователя к одноименной базе. Поэтому, если имя пользователя Linux совпадает с именем роли, созданной в Postgres, а также с именем базы, достаточно выполнить:

```shell
psql
```

Например, если на сервере создан пользователь `timeweb`, а в Postgres — одноименная роль и база, подключиться можно с помощью данной команды:

![Db5](https://content.timeweb.com/assets/5b088c16-2eec-46b8-8329-46e154a59b34?width=890&height=113)

После подключения можно выполнить команду `\conninfo`, чтобы посмотреть информацию о текущем соединении.

1.2. Если имя базы, к которой нужно подключиться, отличается, нужно указать его в команде:

```shell
psql -d имя_базы
```

2.  Если имя роли не совпадает с именем пользователя Linux, необходимо указать дополнительные параметры в команде.

2.1. Если имя роли и имя базы совпадают, достаточно выполнить:

```shell
psql -U имя_роли -h localhost -W
```

![Db2](https://content.timeweb.com/assets/8bba70a7-6ce6-47d9-8eb3-37e36587f1ed?width=777&height=158)

Как видно из вывода `\conninfo`, мы подключены к базе `tmweb` от одноименной роли.

2.2. Если имя роли и базы отличаются, базу также нужно указать в команде:

```shell
psql -U имя_роли -d имя_базы -h localhost -W
```

![Db3](https://content.timeweb.com/assets/73d9964d-9707-4bc8-a3a0-60f4dfa8a56a?width=765&height=161)

3.  Если вы подключаетесь к другой базе данных уже в консоли Postgres, используйте:

```shell
\c имя_базы
```

![DB C2](https://content.timeweb.com/assets/775b2b0e-ebc7-4bcd-a3b8-501117d3ef3b?width=518&height=112)

## Резервные копии (экспорт и импорт дампа)

При установке PostgreSQL на сервер устанавливаются утилиты `pg_dump` и `pg_restore`, с помощью которых вы сможете из консоли Linux создавать резервные копии базы данных (`pg_dump`) и восстанавливать данные из них (`pg_restore`).

### **Создание резервной копии**

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

```shell
pg_dump -h хост -U имя_роли -F формат_дампа -f путь_к_дампу имя_базы
```

Параметры:

-   `хост` — сервер, на котором располагается база; может быть указан `localhost`, IP-адрес или домен;
-   `имя_роли` — имя пользователя PostgreSQL, под которым вы подключаетесь к базе;
-   `формат_дампа` — формат, в котором будет сохранен дамп; указывается буквами `c`, `t` или `p`: '`с`' (custom), '`t`' (tar — архив .tar), '`p`' (plain — текстовый файл без сжатия, как правило, `.sql`);
-   `путь_к_дампу` — путь сохранения для файла дампа и имя файла;
-   `имя_базы` — имя базы данных, для которой создается резервная копия.

Например:

```shell
pg_dump -h localhost -U tmweb -F c -f /home/user/backups/db.dump tmweb
```

После выполнения команды будет запрошен пароль пользователя Postgres, указанного в команде (в примере — `tmweb`). 

### **Восстановление из дампа**

Импорт дампов выполняется с помощью `pg_restore`:

```shell
pg_restore -h хост -U имя_роли -F формат_дампа -d имя_базы путь_к_дампу
```

Параметры:

-   `хост` — сервер, на котором располагается база; может быть указан `localhost`, IP-адрес или домен;
-   `имя_роли` — имя пользователя PostgreSQL, под которым вы подключаетесь к базе;
-   `формат_дампа` — формат, в котором был сохранен дамп (необязательный ключ);
-   `имя_базы` — имя базы данных, в которую импортируется дамп;
-   `путь_к_дампу` — путь к файлу дампа и имя файла.

Например:

```shell
pg_restore -h localhost -U tmweb -F c -d new_db /home/user/backups/db.dump
```

Для импорта дампов в формате `.sql` используется `cat`:

```shell
cat путь_к_дампу | psql -h хост -U имя_роли имя_базы
```

Параметры:

-   `путь_к_дампу` — путь к файлу дампа и имя файла;
-   `хост` — сервер, на котором располагается база; может быть указан `localhost`, IP-адрес или домен;
-   `имя_роли` — имя пользователя PostgreSQL, под которым вы подключаетесь к базе;
-   `имя_базы` — имя базы данных, в которую импортируется дамп.

Например:

```shell
cat /home/user/backups/dump.sql | psql -h localhost -U tmweb new_db
```

## Работа с шаблонами баз данных

При установке PostgreSQL по умолчанию создаются три базы данных: `postgres`, `template0`, `template1`.

`template0` и `template1` — это шаблоны баз данных, из которых в дальнейшем будут создаваться пользовательские БД.

Фактически, когда вы выполняете команду `CREATE DATABASE`, Postgres создает клон базы `template1`. Если внести изменения в `template1`, они будут наследоваться всеми новыми создаваемыми базами. Это позволяет, например, добавить в `template1` необходимые вам таблицы с данными или установить расширения, после чего не потребуется добавлять их для каждой новой базы.

Обратите внимание, что для установки расширений необходимо подключиться к `template1` от суперпользователя (`postgres` или другой роли, имеющей данные привилегии).

Подключитесь к шаблону `template1`:

```shell
\c template1
```

И установите расширение:

```shell
CREATE EXTENSION название_расширения;
```

Например, если вы установите в `template1` расширение `pgcrypto`, то в дальнейшем, при выполнении `CREATE DATABASE`, новые базы будут создаваться с уже установленным `pgcrypto`.

![DB Ext](https://content.timeweb.com/assets/185aac81-ef24-44aa-b981-4771a169b404?width=535&height=67)

`template0` — это исходная база, которая используется, когда нужно создать новую базу без каких-либо изменений, внесенных в шаблон `template1`, или же вернуть `template1` в его изначальное состояние.

Чтобы создать «чистую базу на основе `template0`, нужно выполнить:

```shell
CREATE DATABASE имя_базы TEMPLATE template0;
```

Также `template0` необходима, если вам нужно внести изменения в кодировку или локаль создаваемой базы данных. По умолчанию (при использовании `template1`) эти изменения невозможны.

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

```shell
CREATE DATABASE имя_базы TEMPLATE template0 ENCODING 'SQL_ASCII';
```

**Пересоздание template1**

С помощью `template0` вы также можете вернуть базу `template1` в исходный вид: для этого потребуется ее удалить, а после создать заново, на основе шаблона template0.

Сначала необходимо указать, что `template1` не является шаблоном, чтобы удаление стало возможно:

```shell
UPDATE pg_database SET datistemplate = false WHERE datname = 'template1';
```

Далее удалить `template1`:

```shell
DROP DATABASE template1;
```

И создать базу `template1` заново, указав, что она будет являться шаблоном:

```shell
CREATE DATABASE template1 OWNER postgres TEMPLATE template0 is_template true;
```

## Параметры и конфигурационные файлы

Узнать расположение конфигурационного файла (как правило, размещается по пути: `/etc/postgresql/версия/main/postgresql.conf`) можно с помощью:

```shell
SHOW config_file;
```

![DB Config](https://content.timeweb.com/assets/9755952c-a515-463f-9721-7370dc78a272?width=359&height=88)

Узнать значение какого-либо параметра Postgres:

```shell
SHOW параметр;
```

![DB Show](https://content.timeweb.com/assets/3ff9d885-90e7-4f70-8795-b1b06cf0f9e9?width=293&height=87)

Получить расширенную информацию о параметре можно из представления `pg_settings`: будет выведено не только установленное значение, но также файл, в котором он назначен, максимальные и минимальные значения.

```shell
SELECT * FROM pg_settings WHERE name = 'параметр';
```

Например:

```sql
SELECT * FROM pg_settings WHERE name = 'max_connections';
```

Чтобы вывести информацию в удобном для восприятия формате, можно сменить представление командой `\x`:

![DB X](https://content.timeweb.com/assets/32f9efc2-0849-4e19-9dc0-ea5d97ec7b5b?width=597&height=340)

## Другие полезные команды для управления Postgres

Вывести все параметры терминального командного меню Postgres:

```shell
psql --help
```

Просмотр баз данных из командной строки Linux:

```shell
psql -l
```

Список команд `psql` выводится с помощью `\?`:

```shell
\?
```

Список SQL-команд (запросов):

```shell
\h
```

Справка по конкретному SQL- запросу:

```shell
\h запрос

# Например:
\h CREATE TABLE
```

 Информация о подключении:

```shell
\conninfo
```

![DB Conn](https://content.timeweb.com/assets/d960c00a-e967-48ca-a209-3fca693cc09d?width=766&height=49)

Выполнение shell-команд из командной строки Postgres: 

```shell
\! команда_shell
```

Например, чтобы вывести директорию нахождения:

```shell
\! pwd
```

 ![DB Shell](https://content.timeweb.com/assets/ce99c53c-d690-49dd-94ee-7199a0d74c66?width=295&height=34)

Подключение к базе данных:

```shell
\c имя_базы
```

![DB C](https://content.timeweb.com/assets/f9459ef6-5ff1-468f-a1e5-ec616ae3a2ce?width=764&height=79)
