Авторские статьи

PostgreSQL в snap пакете.


Парни из проекта Command Prompt сделали шикарный подарок всем пользователям Ubuntu, особенно тем, кто нежно любит СУБД PostgreSQL. Различные версии этой прекрасной БД представлены в различных snap пакетах, что открывает перед вами новые возможности. Вы сможете поставить все версии одновременно и использовать их, к примеру, для тестирования своего приложения, использующего PostgreSQL.

Установка

Для установки используйте - sudo snap install postgresql$version Где $version 93, 94, 95 или 96.

Пользователь postgres

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

Управление PostgreSQL

Ниже в разделе "Проблемы и ограничения" прочтёте подробнее о временных сложностях, а пока следует знать - как нужно управляться конкретной версией СУБД.

Чтобы показать вам, дорогие читатели, самый сложный вариант, решил поставить все 4 доступные версии и показать на их примере как разрешить вопрос об учётной записи для каждой из версий и как разрулить вопрос с дефолтным портом 5432.

Ставим все версии - sudo snap install postgresql9*
snap list

Name          Version  Rev  Developer  Notes
postgresql93  9.3.15   3    cmd        -
postgresql94  9.4.10   3    cmd        -
postgresql95  9.5.5    3    cmd        -
postgresql96  9.6.1    3    cmd        -

Создаём 4 учётные записи через adduser. Решил не мудрить и назвал учётки postgresql user - pu93, pu94, pu95, pu96. На данном этапе кратко напомню что за новый мир snap. Программа внутри snap пакета сильно сжата с помощью squashfs и при установке пакета в систему её прозрачно для нас монтируют, но данное место программе не доступно для записи. Если внутри программы или в её стартовых скриптах нужно понять автору пакета где именно она находится, то следует оперировать переменной $SNAP. Для записи десктопной программе следует манипулировать переменной $SNAP_USER_DATA, а для сервисов-демонов $SNAP_DATA. Эти переменные традиционно тянутся в папку той учётной записи, от которой потом будет работать программа или сервис.

Итак, у нас поставлены 4 версии PostgreSQL и созданы 4 учётные записи - pu9[3/4/5/6]. В 4 Терминалах через su - pu9x осуществлён вход в конкретные учётные записи. Дальше будет приведён пример для версии 9.3, так как остальное делается по аналогии.

В учётной записи pu93 командуем
$ postgresql93.initialize initdb

Generating a new locale in /home/pu93/snap/postgresql93/3/locales/en_US.UTF-8...
Setting up PostgreSQL environment...
Data directory: /home/pu93/snap/postgresql93/3/data
Logs directory: /home/pu93/snap/postgresql93/3/logs
psql history directory: /home/pu93/snap/postgresql93/3/history
.psqlrc file: /home/pu93/snap/postgresql93/3/.psqlrc
Checking if initdb has already been run before. If not, a new cluster will be created.
The files belonging to this database system will be owned by user "pu93".
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 /home/pu93/snap/postgresql93/3/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
creating configuration files ... ok
creating template1 database in /home/pu93/snap/postgresql93/3/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
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:
    /snap/postgresql93/3/usr/bin/postgres -D /home/pu93/snap/postgresql93/3/data
or
    /snap/postgresql93/3/usr/bin/pg_ctl -D /home/pu93/snap/postgresql93/3/data -l logfile start

Теперь аккуратно правим файл postgresql.conf, который в моём случае находится в /home/pu93/snap/postgresql93/3/data/postgresql.conf
Откуда я взял что файл лежит там? В последней строке вышеописанного вывода можно наблюдать подстроку "-D /home/pu93/snap/postgresql93/3/data". Вот там и следует искать требуемое. В файле postgresql.conf находим закомментированную строку port = 5432, раскомментируем строку и чтобы в дальнейшем не путаться, решаю последнюю цифру порта сделать связанной с версией.
Порт 5433 для версии 9.3
Порт 5434 для версии 9.4
Порт 5435 для версии 9.5
Порт 5436 для версии 9.6

В дальнейшем, настоятельно рекомендуется НЕ выполнять какие-либо команды, когда рабочим каталогом является каталог ~/snap/

Для запуска/остановки/получения-статуса конкретной версии PostgreSQL нам советуется не совсем точная команда
/snap/postgresql93/3/usr/bin/pg_ctl -D /home/pu93/snap/postgresql93/3/data -l logfile start
она выведет вам ошибку о невозможности создать журнал там где нужно

cannot create logfile: Permission denied

Даю правильный старт всех 4 версий PostgreSQL, который получился у меня, но будьте аккуратны и в будущем может изменится номер ревизии и пути у вас будут другими.
cd ~/; postgresql93.pgctl -D /home/pu93/snap/postgresql93/3/data -l /home/pu93/snap/postgresql93/3/logs/logfile start
cd ~/; postgresql94.pgctl -D /home/pu94/snap/postgresql94/3/data -l /home/pu94/snap/postgresql94/3/logs/logfile start
cd ~/; postgresql95.pgctl -D /home/pu95/snap/postgresql95/3/data -l /home/pu95/snap/postgresql95/3/logs/logfile start
cd ~/; postgresql96.pgctl -D /home/pu96/snap/postgresql96/3/data -l /home/pu96/snap/postgresql96/3/logs/logfile start

Точно все сервисы стартовали?
netstat -nap4|grep postgres

tcp        0      0 127.0.0.1:5433          0.0.0.0:*               LISTEN      3092/postgres   
tcp        0      0 127.0.0.1:5434          0.0.0.0:*               LISTEN      3355/postgres   
tcp        0      0 127.0.0.1:5435          0.0.0.0:*               LISTEN      3366/postgres   
tcp        0      0 127.0.0.1:5436          0.0.0.0:*               LISTEN      3377/postgres   

Проверяем статус:
cd ~/; postgresql93.pgctl -D /home/pu93/snap/postgresql93/3/data -l /home/pu93/snap/postgresql93/3/logs/logfile status

pg_ctl: server is running (PID: 3092)
/snap/postgresql93/3/usr/bin/postgres "-D" "/home/pu93/snap/postgresql93/3/data"

Подсоединение к PostgreSQL

Так как для примера были запущены все 4 версии PostgreSQL, то был указан для каждой версии свой порт. Вы можете не делать так и использовать один, дефолтный порт 5432, но тогда должны строго следить, чтобы в одну единицу времени была запущена какая-либо одна и только одна версия. В нашем примере могут быть запущены одновременно все 4 версии и тогда для работы с ними нужно указывать порт, для psql через ключ -p.

postgresql93.psql -h 127.0.0.1 -p 5433 -d postgres

psql (9.3.15)
Type "help" for help.
postgres=# 

Проблемы и ограничения

Вскоре команда Command Prompt устранит текущие ограничения, но пока:

  • Доступна только одна локаль en_US.UTF-8.
  • Для системы инициализации systemd не созданы файлы .service для запуска демона. Вы должны вручную работать с демоном PostgreSQL через pg_ctl.
  • pg_ctl стартует, исходя из того, что локаль в bash выставлена в en_US.UTF-8.
  • psql стартует через враппер на bash, чтобы записать в файл HISTFILE (.psgl_history)
  • В отключенном состоянии находятся Kerberos, GSSAPI и Bonjour.
  • Contrib модули не включены в пакет.

Мои комментарии

Странно что ситуация с локалью у англоязычных разработчиков возникает из раза в раз. Это связано с тем, что англосаксы "развращены" наличием только одной локали в системе и отсутствием понятия "переключение между раскладками-локалями" как класс. В одном из своих пакетов snap я столкнулся с тем, что программа не может открыть файлы, если в полном пути есть национальные символы.

Раньше нужно было при упаковке в snapcraft.yaml указать в разделе stage просьбу добавить следующие пакеты внутрь итогового snap.

  stage-packages:
    - locales
    - locales-all
    - libc-bin
...

и в стартовом скрипте программы определить строки

export I18NPATH=$SNAP/usr/share/i18n
export LOCPATH=$SNAP_USER_DATA
export LC_ALL=$LANG
LANG1=$(echo $LANG | cut -f1 -d.)
ENC=UTF-8
LOC="$LANG"
# generate a locale so we get properly working charsets and graphics
if [ ! -e $SNAP_USER_DATA/$LOC ]; then
  $SNAP/usr/bin/localedef --prefix=$SNAP_USER_DATA -f $ENC -i $LANG1 $SNAP_USER_DATA/$LOC
fi

Но snapd не стоит на месте и хорошеет день ото дня. Был добавлен интерфейс locale-control, к которому можно попросить коннект во всё том же snapcraft.yaml и вышеописанные строки не нужны. Почему у парней из Command Prompt возникли тут проблемы? Не ясно, но раз обещают исправить - исправят! В любом случае респект парням и лично от себя хочется добавить, что очень рад развитию технологии упаковки в самодостаточные пакеты snap. Благодаря им, легко и просто делаются откаты установленного софта при ошибках и возможность установки одной и той же программы в различных её версиях. А про безопасность вообще молчу. Она там by design.

Администрирование PostgreSQL.

Дата последней правки: 2023-12-27 13:59:16

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта