From 338d1562ed2362a42b221846d5f5ae4482073d91 Mon Sep 17 00:00:00 2001 From: hosh1 Date: Mon, 11 Aug 2025 04:25:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.sh | 300 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 246 insertions(+), 54 deletions(-) diff --git a/install.sh b/install.sh index 5b2963e..5708526 100644 --- a/install.sh +++ b/install.sh @@ -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" < "$APACHE_CONF" < DocumentRoot $WEBROOT ServerName localhost @@ -815,21 +1021,7 @@ echo "Время сервера: " . date('Y-m-d H:i:s T') . "
"; echo "Document Root: " . $_SERVER['DOCUMENT_ROOT']; echo ""; -// Проверка подключения к БД -try { - $pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET, DB_USER, DB_PASS); - echo "
"; - echo "База данных подключена
"; - echo "База данных: " . DB_NAME . "
"; - echo "Хост: " . DB_HOST; - echo "
"; -} catch (PDOException $e) { - echo "
"; - echo "Проблема с БД: " . htmlspecialchars($e->getMessage()); - echo "
"; -} - -// Проверка подключения к БД +// Диагностика конфигурации БД echo "
"; echo "Диагностика конфигурации БД:
"; @@ -854,34 +1046,34 @@ if (file_exists(__DIR__ . '/db_config.php')) { echo "✗ Файл НЕ читаемый
"; } } else { - echo "✗ Файл db_config.php НЕ существует
"; - } - echo "
"; + echo "✗ Файл db_config.php НЕ существует
"; +} +echo ""; - // Теперь пробуем подключиться к БД - 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 "
"; - echo "База данных подключена
"; - echo "База данных: " . DB_NAME . "
"; - echo "Хост: " . DB_HOST; - echo "
"; - } catch (PDOException $e) { - echo "
"; - echo "Проблема с БД: " . htmlspecialchars($e->getMessage()); - echo "
"; - } - } 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 "
"; + echo "База данных подключена
"; + echo "База данных: " . DB_NAME . "
"; + echo "Хост: " . DB_HOST; + echo "
"; + } catch (PDOException $e) { echo "
"; - echo "Не удалось загрузить конфигурацию БД"; + echo "Проблема с БД: " . htmlspecialchars($e->getMessage()); echo "
"; } - +} else { + echo "
"; + echo "Не удалось загрузить конфигурацию БД"; echo "
"; - echo ""; - echo ""; +} + +echo ""; +echo ""; +echo ""; EOF }