|
|
@@ -2,10 +2,11 @@
|
|
|
################################################################################
|
|
|
# Простая установка/обновление/удаление Odoo 19 на Debian 13 (Trixie)
|
|
|
# - автоматический выбор свежего архива odoo_19.0+e.*.tar.gz
|
|
|
-# - распаковка clean-enterprise-19.0.zip (если есть)
|
|
|
-# - PostgreSQL 16 с принудительным созданием пользователя postgres и кластера
|
|
|
-# - wkhtmltopdf с libssl1.1 (совместимость с Trixie)
|
|
|
+# - распаковка clean-enterprise-19.0.zip (с запросом при обновлении)
|
|
|
+# - PostgreSQL 16 с надёжным созданием/запуском кластера
|
|
|
+# - wkhtmltopdf (нативная сборка для Bookworm/Trixie)
|
|
|
# - venv, systemd, конфиг в /etc/odoo/
|
|
|
+# - обновление только баз, принадлежащих пользователю odoo
|
|
|
#-------------------------------------------------------------------------------
|
|
|
# Сделайте скрипт исполняемым: chmod +x odoo19_install_debian13.sh
|
|
|
# Использование: sudo ./odoo19_install_debian13.sh {install|update|uninstall}
|
|
|
@@ -25,10 +26,12 @@ OE_VERSION="19.0"
|
|
|
OE_PORT="8069"
|
|
|
OE_SUPERADMIN="admin"
|
|
|
GENERATE_RANDOM_PASSWORD="True"
|
|
|
+UPDATE_MODE="False" # флаг для режима обновления
|
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
ODOO_ARCHIVE=$(ls -t "$SCRIPT_DIR"/odoo_19.0+e.*.tar.gz 2>/dev/null | head -n1)
|
|
|
CUSTOM_ARCHIVE=$(ls -t "$SCRIPT_DIR"/clean-enterprise-19.0.zip 2>/dev/null | head -n1)
|
|
|
+WKHTMLTOX_URL="https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bookworm_amd64.deb"
|
|
|
|
|
|
if [[ -z "$ODOO_ARCHIVE" ]]; then
|
|
|
echo "ОШИБКА: Не найден архив odoo_19.0+e.*.tar.gz в $SCRIPT_DIR"
|
|
|
@@ -39,9 +42,6 @@ if [[ -n "$CUSTOM_ARCHIVE" ]]; then
|
|
|
echo "Найден архив кастомных модулей: $CUSTOM_ARCHIVE"
|
|
|
fi
|
|
|
|
|
|
-WKHTMLTOX_URL="https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.jammy_amd64.deb"
|
|
|
-LIBSSL_URL="http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb"
|
|
|
-
|
|
|
# ------------------------- ФУНКЦИИ -------------------------
|
|
|
log_info() { echo -e "\n[INFO] $*"; }
|
|
|
log_error() { echo -e "\n[ERROR] $*" >&2; }
|
|
|
@@ -59,10 +59,6 @@ generate_password() {
|
|
|
|
|
|
install_wkhtmltopdf() {
|
|
|
log_info "Установка wkhtmltopdf"
|
|
|
- wget -q "$LIBSSL_URL" -O /tmp/libssl1.1.deb
|
|
|
- dpkg -i /tmp/libssl1.1.deb || apt-get install -f -y >/dev/null 2>&1
|
|
|
- rm -f /tmp/libssl1.1.deb
|
|
|
-
|
|
|
wget -q "$WKHTMLTOX_URL" -O /tmp/wkhtmltox.deb
|
|
|
dpkg -i /tmp/wkhtmltox.deb || apt-get install -f -y >/dev/null 2>&1
|
|
|
rm -f /tmp/wkhtmltox.deb
|
|
|
@@ -94,6 +90,17 @@ extract_odoo() {
|
|
|
|
|
|
extract_custom() {
|
|
|
if [[ -n "$CUSTOM_ARCHIVE" && -f "$CUSTOM_ARCHIVE" ]]; then
|
|
|
+ # Если это обновление и папка уже существует, спрашиваем
|
|
|
+ if [[ "$UPDATE_MODE" == "True" ]] && [[ -d "$OE_HOME/custom-addons/clean_enterprise" ]]; then
|
|
|
+ read -p "Обновить кастомные модули (папка clean_enterprise уже существует)? (y/N): " confirm
|
|
|
+ if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
|
|
|
+ log_info "Пропускаем обновление кастомных модулей."
|
|
|
+ return
|
|
|
+ fi
|
|
|
+ # Если подтвердили, удаляем папку
|
|
|
+ rm -rf "$OE_HOME/custom-addons/clean_enterprise"
|
|
|
+ fi
|
|
|
+
|
|
|
log_info "Распаковка $CUSTOM_ARCHIVE в $OE_HOME/custom-addons"
|
|
|
unzip -qo "$CUSTOM_ARCHIVE" -d $OE_HOME/custom-addons
|
|
|
if [[ -d "$OE_HOME/custom-addons/clean-enterprise-19.0" ]]; then
|
|
|
@@ -171,15 +178,16 @@ EOF
|
|
|
}
|
|
|
|
|
|
update_databases() {
|
|
|
- log_info "Обновление модулей во всех базах данных"
|
|
|
- OE_DBS=$(sudo -Hiu postgres psql -tAc "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres', 'template0', 'template1', 'template0');")
|
|
|
+ log_info "Обновление модулей во всех базах данных пользователя $OE_USER"
|
|
|
+ # Выбираем только те базы, владельцем которых является пользователь odoo
|
|
|
+ OE_DBS=$(sudo -Hiu postgres psql -tAc "SELECT datname FROM pg_database WHERE datdba = (SELECT oid FROM pg_roles WHERE rolname='$OE_USER')")
|
|
|
if [[ -n "$OE_DBS" ]]; then
|
|
|
for db in $OE_DBS; do
|
|
|
log_info "Обновление базы: $db"
|
|
|
su - $OE_USER -s /bin/bash -c "source $OE_VENV/bin/activate && python3 -m odoo -c $OE_CONFIG_FILE --update all --stop-after-init -d $db"
|
|
|
done
|
|
|
else
|
|
|
- log_info "Нет баз данных для обновления."
|
|
|
+ log_info "Нет баз данных, принадлежащих пользователю $OE_USER, для обновления."
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
@@ -187,9 +195,23 @@ update_databases() {
|
|
|
do_install() {
|
|
|
log_info "=== УСТАНОВКА Odoo $OE_VERSION на Debian 13 (Trixie) ==="
|
|
|
|
|
|
- # 1. Базовые пакеты
|
|
|
+ # 0. Настройка репозитория PostgreSQL ДО первого apt-get update
|
|
|
+ log_info "Настройка репозитория PostgreSQL 16"
|
|
|
+ rm -f /usr/share/keyrings/postgresql-archive-keyring.gpg
|
|
|
+ rm -f /etc/apt/sources.list.d/pgdg.list
|
|
|
+
|
|
|
+ wget -q -O- https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql-archive-keyring.gpg
|
|
|
+ if [[ ! -s /usr/share/keyrings/postgresql-archive-keyring.gpg ]]; then
|
|
|
+ log_error "Не удалось загрузить ключ репозитория PostgreSQL"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ echo "deb [signed-by=/usr/share/keyrings/postgresql-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
|
|
|
+
|
|
|
+ # 1. Обновление системы
|
|
|
apt-get update
|
|
|
apt-get upgrade -y
|
|
|
+
|
|
|
+ # 2. Базовые пакеты
|
|
|
apt-get install -y git python3 python3-pip build-essential wget \
|
|
|
python3-dev python3-venv python3-wheel python3-cffi \
|
|
|
libssl-dev libffi-dev libxml2-dev libxslt1-dev \
|
|
|
@@ -197,7 +219,7 @@ do_install() {
|
|
|
libjpeg-dev zlib1g-dev libpng-dev \
|
|
|
nodejs npm gdebi-core curl unzip
|
|
|
|
|
|
- # 2. PostgreSQL 16
|
|
|
+ # 3. PostgreSQL 16 (установка, кластер уже не требует добавления репозитория)
|
|
|
log_info "Установка PostgreSQL 16"
|
|
|
# Убедимся, что системный пользователь postgres существует
|
|
|
if ! id "postgres" &>/dev/null; then
|
|
|
@@ -205,48 +227,51 @@ do_install() {
|
|
|
adduser --system --quiet --shell=/bin/bash --home=/var/lib/postgresql --group postgres
|
|
|
fi
|
|
|
|
|
|
- # Добавляем репозиторий PostgreSQL (ключ перезаписывается без подтверждения)
|
|
|
- curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql-archive-keyring.gpg
|
|
|
- echo "deb [signed-by=/usr/share/keyrings/postgresql-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
|
|
|
- apt-get update
|
|
|
apt-get install -y postgresql-16 postgresql-client-16 postgresql-server-dev-16
|
|
|
|
|
|
- # Проверяем, существует ли кластер 16 main
|
|
|
- if ! pg_lsclusters 2>/dev/null | grep -q "16 main"; then
|
|
|
- log_info "Кластер 16/main не найден, создаём вручную от пользователя postgres"
|
|
|
- su - postgres -c "pg_createcluster 16 main --start --locale C.UTF-8" || {
|
|
|
- log_error "Не удалось создать кластер. Попробуйте вручную: su - postgres -c 'pg_createcluster 16 main --start'"
|
|
|
- exit 1
|
|
|
- }
|
|
|
+ # Убедимся, что кластер существует и запущен
|
|
|
+ if ! pg_isready -q; then
|
|
|
+ log_info "PostgreSQL не отвечает, пробуем запустить кластер"
|
|
|
+ if pg_ctlcluster 16 main start 2>/dev/null; then
|
|
|
+ log_info "Кластер 16/main запущен"
|
|
|
+ else
|
|
|
+ log_info "Не удалось запустить кластер, пробуем создать"
|
|
|
+ su - postgres -c "pg_createcluster 16 main --start --locale C.UTF-8" 2>/dev/null || {
|
|
|
+ log_info "Создание не удалось, возможно кластер уже есть, пробуем запустить"
|
|
|
+ pg_ctlcluster 16 main start || {
|
|
|
+ log_error "Не удалось запустить или создать кластер"
|
|
|
+ exit 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fi
|
|
|
else
|
|
|
- log_info "Кластер 16/main уже существует, запускаем"
|
|
|
- pg_ctlcluster 16 main start || true
|
|
|
+ log_info "PostgreSQL уже работает"
|
|
|
fi
|
|
|
|
|
|
# Создаём пользователя odoo в PostgreSQL
|
|
|
su - postgres -c "createuser -s $OE_USER" 2>/dev/null || true
|
|
|
|
|
|
- # 3. wkhtmltopdf
|
|
|
+ # 4. wkhtmltopdf
|
|
|
install_wkhtmltopdf
|
|
|
|
|
|
- # 4. Глобальные пакеты npm
|
|
|
+ # 5. Глобальные пакеты npm
|
|
|
npm install -g less less-plugin-clean-css rtlcss
|
|
|
|
|
|
- # 5. Пользователь и каталоги
|
|
|
+ # 6. Пользователь и каталоги
|
|
|
create_odoo_user_and_dirs
|
|
|
|
|
|
- # 6. Распаковка архивов
|
|
|
+ # 7. Распаковка архивов
|
|
|
extract_odoo
|
|
|
extract_custom
|
|
|
|
|
|
- # 7. Права
|
|
|
+ # 8. Права
|
|
|
chown -R $OE_USER:$OE_USER $OE_HOME
|
|
|
chown -R $OE_USER:$OE_USER /var/log/$OE_USER
|
|
|
|
|
|
- # 8. Виртуальное окружение
|
|
|
+ # 9. Виртуальное окружение
|
|
|
setup_venv
|
|
|
|
|
|
- # 9. Конфиг и сервис
|
|
|
+ # 10. Конфиг и сервис
|
|
|
create_config
|
|
|
create_service
|
|
|
|
|
|
@@ -262,6 +287,7 @@ do_install() {
|
|
|
|
|
|
do_update() {
|
|
|
log_info "=== ОБНОВЛЕНИЕ Odoo $OE_VERSION ==="
|
|
|
+ UPDATE_MODE="True"
|
|
|
systemctl stop ${OE_SERVER} || true
|
|
|
|
|
|
ODOO_ARCHIVE=$(ls -t "$SCRIPT_DIR"/odoo_19.0+e.*.tar.gz 2>/dev/null | head -n1)
|
|
|
@@ -296,19 +322,35 @@ do_uninstall() {
|
|
|
exit 0
|
|
|
fi
|
|
|
|
|
|
+ # 1. Остановка и удаление сервиса
|
|
|
systemctl stop ${OE_SERVER} 2>/dev/null || true
|
|
|
systemctl disable ${OE_SERVER} 2>/dev/null || true
|
|
|
rm -f /etc/systemd/system/${OE_SERVER}.service
|
|
|
systemctl daemon-reload
|
|
|
+
|
|
|
+ # 2. Удаление конфига и каталогов Odoo
|
|
|
rm -f $OE_CONFIG_FILE
|
|
|
rmdir $OE_CONFIG_DIR 2>/dev/null || true
|
|
|
rm -rf $OE_HOME
|
|
|
rm -rf /var/log/$OE_USER
|
|
|
+
|
|
|
+ # 3. Удаление пользователя odoo
|
|
|
userdel -r $OE_USER 2>/dev/null || true
|
|
|
|
|
|
- # Удаляем ключ репозитория, чтобы при повторной установке не было запроса
|
|
|
+ # 4. Удаление ключа репозитория PostgreSQL и файла источника
|
|
|
rm -f /usr/share/keyrings/postgresql-archive-keyring.gpg
|
|
|
+ rm -f /etc/apt/sources.list.d/pgdg.list
|
|
|
+
|
|
|
+ # 5. Удаление wkhtmltopdf и симлинков
|
|
|
+ log_info "Удаление wkhtmltopdf"
|
|
|
+ apt-get purge -y wkhtmltox 2>/dev/null || true
|
|
|
+ rm -f /usr/bin/wkhtmltopdf /usr/bin/wkhtmltoimage
|
|
|
+ log_info "wkhtmltopdf и симлинки удалены"
|
|
|
+
|
|
|
+ # 6. (Опционально) Удаление глобальных npm-пакетов
|
|
|
+ # npm uninstall -g less less-plugin-clean-css rtlcss
|
|
|
|
|
|
+ # 7. Удаление пользователя PostgreSQL и баз
|
|
|
read -p "Удалить пользователя PostgreSQL 'odoo' и его базы? (y/N): " del_pg
|
|
|
if [[ "$del_pg" =~ ^[Yy]$ ]]; then
|
|
|
if id "postgres" &>/dev/null; then
|
|
|
@@ -321,6 +363,7 @@ do_uninstall() {
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
+ # 8. Удаление PostgreSQL полностью (опционально)
|
|
|
read -p "Удалить PostgreSQL полностью? (y/N): " del_pg_all
|
|
|
if [[ "$del_pg_all" =~ ^[Yy]$ ]]; then
|
|
|
apt-get purge -y postgresql-16 postgresql-client-16 postgresql-server-dev-16
|