This commit is contained in:
2025-08-11 04:25:36 +03:00
parent c61ccf799b
commit 338d1562ed

View File

@@ -386,45 +386,251 @@ proceed_with_installation() {
fi
log_success "Дополнительные компоненты установлены"
log_step "Добавление репозиториев для PHP 8.3..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
# Для Ubuntu/Debian
if ! apt-cache show php8.3 &>/dev/null; then
log_info "Добавление PPA ondrej/php для Ubuntu/Debian..."
# Устанавливаем необходимые пакеты для PPA
apt update -y >/dev/null 2>&1
apt install -y software-properties-common gnupg2 lsb-release >/dev/null 2>&1
# Добавляем ключ GPG для PPA ondrej/php
curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/php-archive-keyring.gpg 2>/dev/null
# Определяем кодовое имя дистрибутива
CODENAME=$(lsb_release -cs)
# Добавляем репозиторий
echo "deb [signed-by=/usr/share/keyrings/php-archive-keyring.gpg] https://packages.sury.org/php/ $CODENAME main" > /etc/apt/sources.list.d/php.list
# Обновляем списки пакетов
apt update -y >/dev/null 2>&1
# Проверяем доступность PHP 8.3
if ! apt-cache show php8.3 &>/dev/null; then
log_error "PHP 8.3 все еще недоступен после добавления репозитория Sury."
log_info "Попытка добавления через PPA..."
if add-apt-repository ppa:ondrej/php -y >/dev/null 2>&1; then
apt update -y >/dev/null 2>&1
if ! apt-cache show php8.3 &>/dev/null; then
log_error "PHP 8.3 недоступен ни через Sury, ни через PPA ondrej/php"
exit 1
fi
else
log_error "Не удалось добавить ни один репозиторий для PHP 8.3"
exit 1
fi
fi
log_success "Репозиторий PHP добавлен успешно"
else
log_success "PHP 8.3 уже доступен в репозиториях"
fi
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
log_info "Настройка репозиториев для RHEL-семейства..."
# Определяем версию системы
if [ -f /etc/os-release ]; then
VERSION_ID=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2 | cut -d'.' -f1)
fi
if [ "$DISTRO" = "fedora" ]; then
log_info "Добавление репозитория Remi для Fedora..."
FEDORA_VERSION=$(rpm -E %fedora)
# Устанавливаем EPEL и Remi для Fedora
$PKG_MANAGER install -y https://rpms.remirepo.net/fedora/remi-release-${FEDORA_VERSION}.rpm >/dev/null 2>&1 || true
# Включаем модуль PHP 8.3
if command -v dnf >/dev/null 2>&1; then
dnf module reset php -y >/dev/null 2>&1 || true
dnf module enable php:remi-8.3 -y >/dev/null 2>&1 || true
fi
elif echo "$DISTRO" | grep -qi "rocky\|rhel\|centos\|almalinux"; then
log_info "Добавление репозитория Remi для RHEL/Rocky/CentOS..."
# Устанавливаем EPEL
$PKG_MANAGER install -y epel-release >/dev/null 2>&1 || true
# Добавляем Remi репозиторий в зависимости от версии
if [ "$VERSION_ID" = "8" ]; then
$PKG_MANAGER install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm >/dev/null 2>&1 || true
elif [ "$VERSION_ID" = "9" ]; then
$PKG_MANAGER install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm >/dev/null 2>&1 || true
else
log_warning "Неизвестная версия RHEL ($VERSION_ID), пробуем универсальный подход"
$PKG_MANAGER install -y https://rpms.remirepo.net/enterprise/remi-release-${VERSION_ID}.rpm >/dev/null 2>&1 || true
fi
# Включаем модуль PHP 8.3 если доступен DNF
if command -v dnf >/dev/null 2>&1; then
dnf module reset php -y >/dev/null 2>&1 || true
dnf module enable php:remi-8.3 -y >/dev/null 2>&1 || true
fi
fi
# Обновляем кэш пакетов
$PKG_MANAGER makecache >/dev/null 2>&1 || true
# Проверяем доступность PHP пакетов
if ! $PKG_MANAGER list available | grep -E "php8[0-9].*8\.3|php-8\.3|php.*remi.*8\.3" >/dev/null 2>&1; then
log_error "PHP 8.3 недоступен в репозиториях после добавления Remi"
log_info "Доступные PHP пакеты:"
$PKG_MANAGER list available | grep php | head -10
exit 1
fi
log_success "Репозиторий Remi добавлен успешно"
fi
log_step "Установка PHP 8.3 и расширений..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
# Список пакетов для Debian/Ubuntu
PHP_PACKAGES="php8.3 php8.3-cli php8.3-common php8.3-mysql php8.3-curl php8.3-gd \
php8.3-mbstring php8.3-xml php8.3-zip php8.3-opcache php8.3-intl \
php8.3-bcmath libapache2-mod-php8.3"
php8.3-bcmath php8.3-json php8.3-readline libapache2-mod-php8.3"
log_info "Устанавливаем пакеты: $PHP_PACKAGES"
if ! apt install -y $PHP_PACKAGES >/dev/null 2>&1; then
log_error "Не удалось установить PHP 8.3 и/или его расширения."
log_error "Не удалось установить базовые PHP пакеты. Подробности:"
apt install -y $PHP_PACKAGES 2>&1 | tail -20
log_info "Попытка установки по одному пакету для выявления проблемного..."
for pkg in $PHP_PACKAGES; do
if apt install -y $pkg >/dev/null 2>&1; then
log_success "Установлен: $pkg"
else
log_error "Не удалось установить: $pkg"
fi
done
exit 1
fi
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
if [ "$DISTRO" = "fedora" ]; then
# Для Fedora используем PHP-FPM
PHP_PACKAGES="php php-cli php-common php-mysqlnd php-curl php-gd \
php-mbstring php-xml php-zip php-opcache php-intl \
php-bcmath php-fpm"
else
# Для Rocky Linux/CentOS используем PHP-FPM из Remi
# Определяем, какие пакеты PHP нужно установить
if $PKG_MANAGER list available | grep -q "php83-php\b"; then
# Remi PHP 8.3 пакеты (Rocky/CentOS/RHEL)
log_info "Используем пакеты php83-* из Remi репозитория"
PHP_PACKAGES="php83-php php83-php-cli php83-php-common php83-php-mysqlnd php83-php-curl php83-php-gd \
php83-php-mbstring php83-php-xml php83-php-zip php83-php-opcache php83-php-intl \
php83-php-bcmath php83-php-fpm"
php83-php-bcmath php83-php-json php83-php-fpm"
elif $PKG_MANAGER list available | grep -E "php-8\.3|php.*remi.*8\.3" >/dev/null 2>&1; then
# Альтернативный формат пакетов Remi
log_info "Используем пакеты php-* версии 8.3 из Remi репозитория"
PHP_PACKAGES="php php-cli php-common php-mysqlnd php-curl php-gd \
php-mbstring php-xml php-zip php-opcache php-intl \
php-bcmath php-json php-fpm"
else
# Стандартные пакеты (Fedora)
log_info "Используем стандартные пакеты php-*"
PHP_PACKAGES="php php-cli php-common php-mysqlnd php-curl php-gd \
php-mbstring php-xml php-zip php-opcache php-intl \
php-bcmath php-json php-fpm"
fi
log_info "Устанавливаем пакеты: $PHP_PACKAGES"
if ! $PKG_MANAGER install -y $PHP_PACKAGES >/dev/null 2>&1; then
log_error "Не удалось установить PHP 8.3 и/или его расширения."
log_error "Не удалось установить PHP пакеты. Подробности:"
$PKG_MANAGER install -y $PHP_PACKAGES 2>&1 | tail -20
log_info "Попытка установки по одному пакету для выявления проблемного..."
for pkg in $PHP_PACKAGES; do
if $PKG_MANAGER install -y $pkg >/dev/null 2>&1; then
log_success "Установлен: $pkg"
else
log_error "Не удалось установить: $pkg"
fi
done
exit 1
fi
# Создаем символические ссылки для PHP83 если нужно
if command -v php83 >/dev/null 2>&1 && [ ! -f /usr/bin/php ]; then
log_info "Создание символических ссылок для php83..."
ln -sf /opt/remi/php83/root/usr/bin/php /usr/bin/php >/dev/null 2>&1 || true
ln -sf /opt/remi/php83/root/usr/bin/php-fpm /usr/bin/php-fpm >/dev/null 2>&1 || true
# Добавляем путь в PATH
echo 'export PATH=/opt/remi/php83/root/usr/bin:$PATH' > /etc/profile.d/php83.sh
source /etc/profile.d/php83.sh >/dev/null 2>&1 || true
fi
fi
# Проверяем успешность установки PHP
log_info "Проверка установки PHP..."
if command -v php >/dev/null 2>&1; then
PHP_VERSION=$(php -v 2>/dev/null | head -1 | cut -d' ' -f2 | cut -d'.' -f1,2 2>/dev/null || echo "неизвестно")
if [[ "$PHP_VERSION" == "8.3" ]]; then
log_success "PHP 8.3 успешно установлен (версия: $(php -v | head -1))"
else
log_warning "PHP установлен, но версия $PHP_VERSION (ожидалась 8.3)"
log_info "Попытка исправления версии PHP..."
# Для Debian попробуем переключить версию
if [ "$DISTRO_FAMILY" = "debian" ] && command -v update-alternatives >/dev/null 2>&1; then
if [ -f /usr/bin/php8.3 ]; then
update-alternatives --set php /usr/bin/php8.3 >/dev/null 2>&1 || true
PHP_VERSION=$(php -v 2>/dev/null | head -1 | cut -d' ' -f2 | cut -d'.' -f1,2 2>/dev/null || echo "неизвестно")
if [[ "$PHP_VERSION" == "8.3" ]]; then
log_success "Версия PHP исправлена на 8.3"
fi
fi
fi
fi
else
log_error "PHP не найден после установки"
exit 1
fi
# Проверяем установку основных расширений
log_info "Проверка PHP расширений..."
REQUIRED_EXTENSIONS="mysqli pdo_mysql curl gd mbstring xml zip opcache intl bcmath json"
MISSING_EXTENSIONS=""
for ext in $REQUIRED_EXTENSIONS; do
if php -m | grep -q "^$ext$" 2>/dev/null; then
log_success "Расширение $ext: установлено"
else
log_warning "Расширение $ext: НЕ найдено"
MISSING_EXTENSIONS="$MISSING_EXTENSIONS $ext"
fi
done
if [ -n "$MISSING_EXTENSIONS" ]; then
log_warning "Отсутствующие расширения:$MISSING_EXTENSIONS"
log_info "Попытка дополнительной установки расширений..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
for ext in $MISSING_EXTENSIONS; do
if [ "$ext" = "mysqli" ] || [ "$ext" = "pdo_mysql" ]; then
apt install -y php8.3-mysql >/dev/null 2>&1 || true
else
apt install -y php8.3-$ext >/dev/null 2>&1 || true
fi
done
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
for ext in $MISSING_EXTENSIONS; do
if [ "$ext" = "mysqli" ] || [ "$ext" = "pdo_mysql" ]; then
$PKG_MANAGER install -y php*-mysqlnd >/dev/null 2>&1 || true
else
$PKG_MANAGER install -y php*-$ext >/dev/null 2>&1 || true
fi
done
fi
fi
log_success "PHP 8.3 и расширения установлены"
log_step "Настройка Apache и модулей..."
log_step "Настройка Apache и модулей..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
a2enmod php8.3 rewrite ssl headers expires deflate >/dev/null 2>&1
@@ -650,11 +856,11 @@ EOF
log_success "Модули Apache настроены"
log_step "Создание конфигурации виртуального хоста..."
mkdir -p "$WEBROOT"
mkdir -p "$WEBROOT"
# Для Debian/Ubuntu создаем стандартный VirtualHost
if [ "$DISTRO_FAMILY" = "debian" ]; then
cat > "$APACHE_CONF" <<EOF
# Для Debian/Ubuntu создаем стандартный VirtualHost
if [ "$DISTRO_FAMILY" = "debian" ]; then
cat > "$APACHE_CONF" <<EOF
<VirtualHost *:80>
DocumentRoot $WEBROOT
ServerName localhost
@@ -815,21 +1021,7 @@ echo "Время сервера: " . date('Y-m-d H:i:s T') . "<br>";
echo "Document Root: " . $_SERVER['DOCUMENT_ROOT'];
echo "</div>";
// Проверка подключения к БД
try {
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET, DB_USER, DB_PASS);
echo "<div class='status success'>";
echo "<strong>База данных подключена</strong><br>";
echo "База данных: " . DB_NAME . "<br>";
echo "Хост: " . DB_HOST;
echo "</div>";
} catch (PDOException $e) {
echo "<div class='status warning'>";
echo "<strong>Проблема с БД:</strong> " . htmlspecialchars($e->getMessage());
echo "</div>";
}
// Проверка подключения к БД
// Диагностика конфигурации БД
echo "<div class='status warning'>";
echo "<strong>Диагностика конфигурации БД:</strong><br>";
@@ -854,34 +1046,34 @@ if (file_exists(__DIR__ . '/db_config.php')) {
echo "✗ Файл НЕ читаемый<br>";
}
} else {
echo "✗ Файл db_config.php НЕ существует<br>";
}
echo "</div>";
echo "✗ Файл db_config.php НЕ существует<br>";
}
echo "</div>";
// Теперь пробуем подключиться к БД
if (file_exists(__DIR__ . '/db_config.php') && is_readable(__DIR__ . '/db_config.php')) {
try {
require_once __DIR__ . '/db_config.php';
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET, DB_USER, DB_PASS);
echo "<div class='status success'>";
echo "<strong>База данных подключена</strong><br>";
echo "База данных: " . DB_NAME . "<br>";
echo "Хост: " . DB_HOST;
echo "</div>";
} catch (PDOException $e) {
echo "<div class='status warning'>";
echo "<strong>Проблема с БД:</strong> " . htmlspecialchars($e->getMessage());
echo "</div>";
}
} else {
// Теперь пробуем подключиться к БД
if (file_exists(__DIR__ . '/db_config.php') && is_readable(__DIR__ . '/db_config.php')) {
try {
require_once __DIR__ . '/db_config.php';
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET, DB_USER, DB_PASS);
echo "<div class='status success'>";
echo "<strong>База данных подключена</strong><br>";
echo "База данных: " . DB_NAME . "<br>";
echo "Хост: " . DB_HOST;
echo "</div>";
} catch (PDOException $e) {
echo "<div class='status warning'>";
echo "<strong>Не удалось загрузить конфигурацию БД</strong>";
echo "<strong>Проблема с БД:</strong> " . htmlspecialchars($e->getMessage());
echo "</div>";
}
} else {
echo "<div class='status warning'>";
echo "<strong>Не удалось загрузить конфигурацию БД</strong>";
echo "</div>";
echo "</body>";
echo "</html>";
}
echo "</div>";
echo "</body>";
echo "</html>";
EOF
}