pgAdmin 4 - де-факто стандартный GUI-клиент для PostgreSQL.
Он активно развивается, официально поддерживается на Debian и… при этом на Arch Linux с Desktop-версией всё стабильно плохо.
На момент написания статьи в AUR есть несколько пакетов pgAdmin4 Desktop, но ни один из них:
не собирается стабильно,
не переживает обновления Python / Electron,
или требует ручных правок после установки.
В этой статье я хочу рассказать:
почему pgAdmin4 Desktop так плохо ложится на Arch,
какие решения обычно ломаются,
и какой компромиссный, но рабочий вариант в итоге получился у меня.
Немного контекста: почему pgAdmin4 Desktop - проблема
Архитектурно pgAdmin4 Desktop - это:
backend на Python (Flask + остальные зависимости),
frontend на JavaScript,
desktop-обвязка на Electron,
и жёсткое предположение upstream, что всё это запускается из virtualenv.
Для дистрибутивов Debian based это не проблема:
там спокойно живут venv внутри /usr/lib.
Но из за того что разрабы на Arch Linux положили большой и длинный... Это сразу конфликтует с "философией":
system Python - один,
пакеты должны быть воспроизводимы,
runtime-загрузки и auto-updaters не приветствуются.
Почему существующие AUR-пакеты нестабильны
Если коротко, основные причины такие.
1. Жёсткая привязка к venv
Upstream pgAdmin ожидает путь вида:
venv/bin/python3
Любая попытка «подменить» это без патчей приводит к:
падениям,
сломанному
PYTHONPATH,несовместимости после обновлений Python.
2. Встроенный Electron
Многие пакеты:
либо тянут свой Electron,
либо не переживают обновление system Electron.
3. Runtime-загрузки
Некоторые сборки:
скачивают зависимости при первом запуске,
или делают это через yarn/npm.
Это ломает воспроизводимость и доверие к пакету.
Цель, которую я себе поставил
Я хотел получить пакет, который:
собирается из upstream source
использует system Electron
использует system Python в runtime
не качает ничего при запуске
воспроизводимо собирается в clean chroot
не требует ручных правок после установки
При этом я сознательно допускал компромиссы, если они упрощают жизнь пользователю. Ну или по простому, я наставил костылей, спасибо что хотя бы рабочих.
Ключевое решение: venv только на этапе сборки
Самое важное архитектурное решение:
virtualenv используется только при сборке,
а в runtime — обычный/usr/bin/python3.
Как это реализовано:
Во время
build():создаётся временный venv,
туда устанавливаются все Python-зависимости pgAdmin.
В
package():содержимое
site-packagesкопируется в/opt/pgadmin4-native/python-packages,сам venv в пакет не попадает.
В runtime:
PYTHONPATHуказывает на этот каталог,Python системный.
Таким образом:
зависимости изолированы,
system Python не загрязняется,
pgAdmin видит именно те библиотеки, которые ему нужны.
Почему /opt, а не /usr
pgAdmin Desktop — это:
Electron-приложение,
с собственным layout,
со своей логикой запуска.
Размещение в /opt/pgadmin4-native позволяет:
не смешивать файлы с системой,
не имитировать структуру обычного Python-пакета,
честно признать, что это application bundle.
Патчи upstream-кода
К сожалению, без патчей не обойтись.
В процессе сборки:
жёсткие пути вида
/venv/bin/python3заменяются на/usr/bin/python3,относительные пути до
pgAdmin4.pyзаменяются на абсолютные.
Это делается простыми sed патчами на этапе build
и хорошо воспроизводимо в clean chroot.
Electron
В пакете:
нет встроенного Electron,
используется
electron34из репозиториев Arch.
Если в будущем версия Electron изменится — это будет видно сразу,
а не через "тихие" runtime-баги.
Что в итоге получилось?
Итоговый пакет:
pgadmin4-desktop-native
AUR: https://aur.archlinux.org/packages/pgadmin4-desktop-native
На текущий момент он:
протестирован на vanilla Arch и CachyOS,
собирается в clean chroot,
запускается без runtime-загрузок,
переживает обновления Python и Electron (в пределах совместимости upstream).
Про «идеологическую чистоту»
Да, этот пакет:
не использует system site-packages,
не использует runtime virtualenv,
и не вписывается идеально в абстрактную модель.
Но он:
работает,
воспроизводим,
и хотя бы решает проблему пользователей.
Заключение
pgAdmin4 Desktop на Arch Linux - это пример того,
как upstream-архитектура и философия дистрибутива могут конфликтовать.
Иногда, чтобы получить стабильный результат, приходится:
принимать компромиссы,
ставить костыли
и брать ответственность за то что наворотил.
Если этот пакет окажется полезным, я буду очень рад.
Если у вас есть идеи, как сделать его лучше без потери стабильности я всегда открыт для pull requests =] и обсуждение приветствуются.
