В этом руководстве рассказывается об установке PostgreSQL 18 на Void Linux, инициализации кластера баз данных, создании службы рунита с нуля (Void не поставляется) и блокировке аутентификации. Если вы работаете в Debian или RHEL, самое большое отличие заключается в управлении сервисами, которые мы подробно рассмотрим.

Предварительные условия

  • Сервер под управлением Void Linux.
  • Привилегии пользователя: пользователь root или не root с привилегиями sudo.

Конвенции

1
2
# - данные команды должны выполняться с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo.
$ - данные команды должны выполняться от имени обычного пользователя.

Обновите систему

Свежая установка Void Linux требует обновления пакетов до последних доступных версий.

1
sudo xbps-install -u xbps

После того, как xbps включен, запустите полное обновление системы.

1
sudo xbps-install -Syu

Система может нуждаться в перезагрузке после обновления.

1
sudo reboot -f

Установить PostreSQL

Хранилище Void XBPS поставляется с PostgreSQL 18.x. Установите пакеты сервера и клиента:

1
sudo xbps-install -Sy postgresql18 postgresql18-client

Подтвердите установленную версию:

1
psql --version

Вы должны увидеть строку версии, подтверждающую 18.x:

1
psql (PostgreSQL) 18.3

XBPS автоматически создает пользователя системы postgres во время установки. Проверьте, существует ли:

1
id postgres

Результат подтверждает пользователя и группу:

1
uid=997(postgres) gid=997(postgres) groups=997(postgres)

Инициировать кластер баз данных

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

1
2
sudo mkdir -p /var/lib/postgresql/data
sudo chown postgres:postgres /var/lib/postgresql/data

Теперь инициализируйте кластер. Это должно работать как пользователь postgres:

1
sudo -u postgres initdb -D /var/lib/postgresql/data

На выходе инициализации показан кластер, создаваемый с настройками по умолчанию:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default "timezone" ... UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A,
or --auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    pg_ctl -D /var/lib/postgresql/data -l logfile start

Обратите внимание на предупреждение об аутентификации доверия. Мы ужесточим это после запуска службы.

Создать сервис Runit

Void Linux использует рунит для управления службами, а PostgreSQL по умолчанию не поставляется с файлом службы рунита. Вам нужно создать его вручную. Это застает большинство людей врасплох, когда они приходят из дистрибутивов, где systemctl enable postgresql позволяет просто работать.

Создайте структуру каталога услуг:

1
sudo mkdir -p /etc/sv/postgresql/log

Создайте основной скрипт запуска, который запускает PostgreSQL в качестве пользователя postgres:

1
2
3
4
sudo tee /etc/sv/postgresql/run > /dev/null <<'EOF'
#!/bin/sh
exec chpst -u postgres postgres -D /var/lib/postgresql/data 2>&1
EOF

Сделайте его исполняемым:

1
sudo chmod +x /etc/sv/postgresql/run

Теперь создайте лог-сервис. Runit ожидает, что скрипт log/run захватит выход через svlogd:

1
2
3
4
sudo tee /etc/sv/postgresql/log/run > /dev/null <<'EOF'
#!/bin/sh
exec svlogd -tt /var/log/postgresql
EOF

Сделайте его исполняемым и создайте каталог журнала:

1
2
sudo chmod +x /etc/sv/postgresql/log/run
sudo mkdir -p /var/log/postgresql

Включите услугу, создав симлинк на /var/service/. Рунит забирает его автоматически в течение нескольких секунд:

1
sudo ln -s /etc/sv/postgresql /var/service/

Проверьте статус сервиса:

1
sudo sv status postgresql

Здоровый сервис выглядит так:

1
run: postgresql: (pid 1423) 5s; run: log: (pid 1420) 5s

Если статус отображается down, проверьте журнал на /var/log/postgresql/current на наличие ошибок. Общие причины включают неправильные разрешения в каталоге данных или отсутствующего пользователя.

Защитите установку

Конфигурация initdb по умолчанию использует аутентификацию доверия для локальных соединений, что означает, что любой локальный пользователь может подключаться как любой пользователь базы данных без пароля. Исправьте это, установив пароль для суперпользователя postgres и переключившись на аутентификацию на основе пароля.

Подключитесь к PostgreSQL и установите пароль суперпользователя:

1
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'YourStrongPassword';"

Замените YourStrongPassword сильным паролем, включая случайные символы.

Ответ подтверждает изменение:

1
ALTER ROLE

Теперь отредактируйте pg hba.conf для обеспечения аутентификации пароля.

1
sudo sed -i '/^local/s/peer/scram-sha-256/' /var/lib/postgresql/data/pg_hba.conf

Перезагрузите PostgreSQL, чтобы применить изменения без отказа от существующих соединений:

1
sudo -u postgres pg_ctl reload -D /var/lib/postgresql/data

Подтверждение перезагрузки:

1
server signaled

Отныне каждое соединение требует пароля. Проверьте:

1
psql -U postgres -h 127.0.0.1 -c "SELECT version();"

Введите пароль, который вы установили ранее. Вывод запроса показывает вашу запущенную версию:

1
2
3
4
                                                version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 18.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 13.2.0, 64-bit
(1 row)

Создание базы данных и пользователя

Производственные приложения никогда не должны подключаться в качестве суперпользователя postgres. Создайте выделенного пользователя и базу данных для вашего приложения.

Подключайтесь сначала как суперпользователь:

1
psql -U postgres -h 127.0.0.1

Создать нового пользователя, базу данных и предоставить привилегии. Это интерактивная сессия psql:

1
2
3
4
CREATE USER appuser WITH PASSWORD 'YourStrongPassword';
CREATE DATABASE appdb OWNER appuser;
GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;
\q

Проверьте, может ли новый пользователь подключиться к базе данных:

1
psql -U appuser -h 127.0.0.1 -d appdb -c "\conninfo"

Информация о подключении подтверждает пользователя и базу данных:

1
You are connected to database "appdb" as user "appuser" on host "127.0.0.1" at port "5432".

Включить удаленные соединения (Необязательный)

По умолчанию PostgreSQL 18 прослушивают только на локальном хосте. Если другие машины в вашей сети должны подключаться, вам нужно будет изменить адрес прослушивания и добавить правило брандмауэра.

Откройте основной файл конфигурации:

1
sudo nano /var/lib/postgresql/data/postgresql.conf

Найдите строку listen_addresses и измените ее на все интерфейсы:

1
listen_addresses = '*'

Затем добавьте строку в pg hba.conf для подключения к сети. Откройте файл:

1
sudo nano /var/lib/postgresql/data/pg_hba.conf

Добавьте эту строку в конце, настраивая подсеть в соответствии с вашей сетью:

1
2
# Allow connections from local network
host    all             all             10.0.1.0/24             scram-sha-256

Перезагрузите PostgreSQL, чтобы применить изменение адреса прослушивания:

1
sudo sv restart postgresql

Void Linux использует nftables для брандмауэра. Разрешите порт 5432 TCP:

1
sudo nft add rule inet filter input tcp dport 5432 accept

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

1
sudo nft list ruleset | sudo tee /etc/nftables.conf

Проверить PostgreSQL можно на всех интерфейсах:

1
ss -tlnp | grep 5432

На выходе должно быть показано 0,0.0.0:5432 вместо 127.0.0.1:5432:

1
LISTEN 0      244          0.0.0.0:5432       0.0.0.0:*    users:(("postgres",pid=1423,fd=6))

Основные команды psql

Быстрая ссылка на наиболее распространенные команды psql, которые вы будете использовать ежедневно. Свяжитесь с psql -U postgres -h 127.0.0.1 и запустите их из psql:

КомандыОписание
\lПеречислите все базы данных
\dtТаблицы перечней в текущей базе данных
\c dbnameПодключение к другой базе данных
\d tablenameОпишите таблицу (колонки, типы, индексы)
\duСписок всех ролей/пользователей
SELECT version();Показать серверную версию PostgreSQL
\timingОтображение времени выполнения запроса Toggle
\xРасширенный (вертикальный) выход Toggle
\qВыход psql

Тюнинг для производства

Конфигурация PostgreSQL по умолчанию является консервативной. На выделенном сервере базы данных вы захотите настроить эти настройки в postgresql.conf. Значения ниже предполагают сервер с 4 ГБ ОЗУ.

1
sudo -u postgres nano /var/lib/postgresql/data/postgresql.conf

Ключевые параметры для изменения:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Memory (adjust proportionally to your RAM)
shared_buffers = 1GB              # 25% of total RAM
effective_cache_size = 3GB        # 75% of total RAM
work_mem = 16MB                   # per-operation sort memory
maintenance_work_mem = 256MB      # for VACUUM, CREATE INDEX

# WAL and checkpoints
wal_buffers = 64MB
checkpoint_completion_target = 0.9
max_wal_size = 2GB

# Connections
max_connections = 100             # lower this if using pgbouncer

После редактирования перезагрузите конфигурацию без перезагрузки:

1
sudo sv reload postgresql

Некоторые параметры (например, shared buffers и max connections) требуют полного перезапуска. Проверьте документацию PostgreSQL 18, для которой настройки требуют перезагрузки. Для бэкэнда веб-приложения соединение этого со стеком LAMP или Nginx на том же хосте Void Linux хорошо работает для развертывания от малого до среднего. После того, как база данных содержит реальные данные, настройте стратегию резервного копирования с моментальным восстановлением, чтобы вы могли восстановиться в любой момент до сбоя.

Завершение

Теперь вы можете интегрировать PostgreSQL с вашими приложениями для безопасного управления данными.

Если вам понравился этот пост об установке PostgreSQL на сервере Void Linux, пожалуйста, поделитесь им со своими друзьями в социальных сетях, которым может быть интересна эта статья или оставьте комментарий ниже.