From 0c6e85341ce9d29a10f6e78dd2c911959c84390e Mon Sep 17 00:00:00 2001 From: hosh1 Date: Tue, 12 Aug 2025 10:22:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=BD=D0=B0=20RHEL-=D0=B4=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B8=D0=B1=D1=83=D1=82=D0=B8=D0=B2=D0=B0=D1=85;?= =?UTF-8?q?=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B8=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.sh | 2351 ++++++++++++++++++++++++---------------------------- 1 file changed, 1082 insertions(+), 1269 deletions(-) diff --git a/install.sh b/install.sh index c6233ff..35a1c10 100644 --- a/install.sh +++ b/install.sh @@ -1,23 +1,19 @@ #!/bin/bash clear + set -e UNINSTALL=false REINSTALL=false -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -LOG_FILE="/tmp/altcor_install_$(date +%Y%m%d_%H%M%S).log" - -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' while getopts ":ur" opt; do case $opt in - u) UNINSTALL=true ;; - r) REINSTALL=true ;; + u) + UNINSTALL=true + ;; + r) + REINSTALL=true + ;; \?) echo -e "${RED}[Ошибка]${NC} Неизвестный параметр: -$OPTARG" >&2 echo "Использование: $0 [-u] [-r]" @@ -28,106 +24,32 @@ while getopts ":ur" opt; do esac done -log_to_file() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"; } -log_success() { echo -e "${GREEN}[Успех]${NC} $1"; log_to_file "SUCCESS: $1"; } -log_error() { echo -e "${RED}[Ошибка]${NC} $1"; log_to_file "ERROR: $1"; } -log_info() { echo -e "${BLUE}[Инфо]${NC} $1"; log_to_file "INFO: $1"; } -log_warning() { echo -e "${YELLOW}[Предупреждение]${NC} $1"; log_to_file "WARNING: $1"; } -log_step() { echo -e "${CYAN}[Шаг]${NC} $1"; log_to_file "STEP: $1"; } +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +log_success() { echo -e "${GREEN}[Успех]${NC} $1"; } +log_error() { echo -e "${RED}[Ошибка]${NC} $1"; } +log_info() { echo -e "${BLUE}[Инфо]${NC} $1"; } +log_warning() { echo -e "${YELLOW}[Предупреждение]${NC} $1"; } +log_step() { echo -e "${CYAN}[Шаг]${NC} $1"; } generate_password() { - if command -v openssl >/dev/null 2>&1; then - openssl rand -base64 32 | tr -d "=+/" | cut -c1-16 - else - head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 - fi + openssl rand -base64 32 | tr -d "=+/" | cut -c1-16 } -check_root() { - if [[ $EUID -ne 0 ]]; then - log_error "Запустите этот скрипт с правами администратора (sudo)." - exit 1 - fi -} - -detect_distro() { - if [ -f /etc/os-release ]; then - source /etc/os-release - DISTRO="$ID" - FAMILY="$ID_LIKE" - VERSION_ID="${VERSION_ID}" - else - log_error "Не удалось определить дистрибутив." - exit 1 - fi - - if echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then - PKG_MANAGER="apt" - DISTRO_FAMILY="debian" - WEBSERVER_SERVICE="apache2" - WEBROOT="/var/www/html" - APACHE_CONF="/etc/apache2/sites-available/000-default.conf" - WEBSERVER_USER="www-data" - PHP_INI_PATH="/etc/php/8.3/apache2/php.ini" - DB_SOCKET="/var/run/mysqld/mysqld.sock" - elif echo "$DISTRO $FAMILY" | grep -qi "rhel\|centos\|fedora\|rocky\|almalinux"; then - DISTRO_FAMILY="rhel" - WEBSERVER_SERVICE="httpd" - WEBROOT="/var/www/html" - APACHE_CONF="/etc/httpd/conf.d/altcor.conf" - WEBSERVER_USER="apache" - DB_SOCKET="/var/lib/mysql/mysql.sock" - - if command -v dnf >/dev/null 2>&1; then - PKG_MANAGER="dnf" - else - PKG_MANAGER="yum" - fi - - if [ -f "/etc/opt/remi/php83/php.ini" ]; then - PHP_INI_PATH="/etc/opt/remi/php83/php.ini" - PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" - PHP_FPM_SERVICE="php83-php-fpm" - SOCKET_PATH="/var/opt/remi/php83/run/php-fpm/www.sock" - elif [ -f "/etc/php.ini" ]; then - PHP_INI_PATH="/etc/php.ini" - PHP_FPM_CONF="/etc/php-fpm.d/www.conf" - PHP_FPM_SERVICE="php-fpm" - SOCKET_PATH="/run/php-fpm/www.sock" - fi - else - log_error "Дистрибутив '$DISTRO' не поддерживается." - log_info "Поддерживаются: Debian, Ubuntu, CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux" - exit 1 - fi - - log_info "Обнаружен дистрибутив: $DISTRO ($DISTRO_FAMILY)" -} - -safe_execute() { - local description="$1" - shift - log_info "$description..." - - if "$@" >/dev/null 2>&1; then - log_success "$description - выполнено" - return 0 - else - log_error "$description - не удалось выполнить" - log_to_file "FAILED COMMAND: $*" - return 1 - fi -} - -check_component_status() { +check_component() { local component=$1 local command_check=$2 local service_check=$3 - if command -v "$command_check" >/dev/null 2>&1; then + if [[ -n "$command_check" && $(command -v "$command_check" 2>/dev/null) ]]; then if [[ -n "$service_check" ]]; then if systemctl is-active --quiet "$service_check" 2>/dev/null; then - return 0 + return 0 else return 1 fi @@ -142,116 +64,310 @@ check_component_status() { check_existing_installation() { log_step "Проверка существующей установки..." - local apache_status php_status mariadb_status redis_status - local need_reinstall=false + local apache_status=2 php_status=2 mariadb_status=2 redis_status=2 + local altcor_installed=false + local components_installed=false - log_info "Проверка Apache..." - if [ "$DISTRO_FAMILY" = "debian" ]; then - check_component_status "Apache" "apache2" "apache2" - apache_status=$? - else - check_component_status "Apache" "httpd" "httpd" - apache_status=$? + log_info "Проверка установки Altcor..." + + local altcor_signs=0 + + if [ -f "/var/www/html/db_config.php" ]; then + if grep -q "ALTCor" "/var/www/html/db_config.php" 2>/dev/null && grep -q "DB_NAME" "/var/www/html/db_config.php" 2>/dev/null; then + altcor_signs=$((altcor_signs + 1)) + log_info "✓ Найдена конфигурация БД Altcor" + fi fi - log_info "Проверка PHP..." - check_component_status "PHP" "php" "" - php_status=$? + + if command -v mysql >/dev/null 2>&1 && systemctl is-active --quiet mariadb 2>/dev/null; then + if [ -f "/root/.db_password" ]; then + source "/root/.db_password" 2>/dev/null || true + if [ -n "$DB_PASSWORD" ] && mysql -u root -p"$DB_PASSWORD" -e "USE ALTCor; SELECT 1;" >/dev/null 2>&1; then + altcor_signs=$((altcor_signs + 1)) + log_info "✓ Найдена рабочая база данных ALTCor" + fi + fi + fi - log_info "Проверка MariaDB..." - check_component_status "MariaDB" "mysql" "mariadb" - mariadb_status=$? + if [ -f "/var/www/html/index.php" ]; then + if grep -q "ALTCor\|Altcor\|altcor" "/var/www/html/index.php" 2>/dev/null || + (grep -q "/dev/null && + ! grep -q "phpinfo\|Сервер готов к работе\|PHP.*работает" "/var/www/html/index.php" 2>/dev/null && + wc -l < "/var/www/html/index.php" > 50); then + altcor_signs=$((altcor_signs + 1)) + log_info "✓ Найдены файлы приложения Altcor" + fi + fi - log_info "Проверка Redis..." - if systemctl is-active --quiet redis-server 2>/dev/null || systemctl is-active --quiet redis 2>/dev/null; then - redis_status=0 - elif command -v redis-cli >/dev/null 2>&1; then - redis_status=1 + if [ $altcor_signs -ge 2 ]; then + altcor_installed=true + log_success "Обнаружена существующая установка Altcor" + fi + + log_info "Проверка веб-компонентов..." + + if [ "$DISTRO_FAMILY" = "debian" ]; then + if command -v apache2 >/dev/null 2>&1; then + components_installed=true + if systemctl is-active --quiet apache2 2>/dev/null; then + apache_status=0 + else + apache_status=1 + fi + else + apache_status=2 + fi + else + if command -v httpd >/dev/null 2>&1; then + components_installed=true + if systemctl is-active --quiet httpd 2>/dev/null; then + apache_status=0 + else + apache_status=1 + fi + else + apache_status=2 + fi + fi + + if command -v php >/dev/null 2>&1; then + components_installed=true + php_status=0 + else + php_status=2 + fi + + if command -v mysql >/dev/null 2>&1; then + components_installed=true + if systemctl is-active --quiet mariadb 2>/dev/null || systemctl is-active --quiet mysql 2>/dev/null; then + mariadb_status=0 + else + mariadb_status=1 + fi + else + mariadb_status=2 + fi + + if command -v redis-cli >/dev/null 2>&1; then + if systemctl is-active --quiet redis-server 2>/dev/null || systemctl is-active --quiet redis 2>/dev/null; then + redis_status=0 + else + redis_status=1 + fi else redis_status=2 fi - echo "" - display_component_status "Apache" $apache_status - display_php_status $php_status - display_component_status "MariaDB" $mariadb_status - display_component_status "Redis" $redis_status - - if [ -f "/var/www/html/db_config.php" ]; then - echo -e "Конфигурация БД: ${GREEN}Найдена${NC}" - else - echo -e "Конфигурация БД: ${RED}Не найдена${NC}" - need_reinstall=true + nginx_installed=false + if command -v nginx >/dev/null 2>&1; then + nginx_installed=true + components_installed=true fi + echo "" + echo "=== РЕЗУЛЬТАТЫ ПРОВЕРКИ ===" echo "" - if [[ $apache_status -ne 0 ]] || [[ $php_status -ne 0 ]] || [[ $mariadb_status -ne 0 ]]; then - need_reinstall=true - fi - - return $([ "$need_reinstall" = "true" ] && echo 1 || echo 0) -} - -display_component_status() { - local name=$1 - local status=$2 - - case $status in - 0) echo -e "$name: ${GREEN}Установлен и работает${NC}" ;; - 1) echo -e "$name: ${YELLOW}Установлен, но не работает${NC}" ;; - 2) echo -e "$name: ${RED}Не установлен${NC}" ;; - esac -} - -display_php_status() { - local status=$1 - - case $status in - 0) - local 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 + if [ "$altcor_installed" = true ]; then + echo -e "${GREEN}✓ ALTCOR УЖЕ УСТАНОВЛЕН${NC}" + echo "" + echo "Обнаружена рабочая установка Altcor со следующими компонентами:" + echo "" + + case $apache_status in + 0) echo -e "Apache: ${GREEN}Установлен и работает${NC}" ;; + 1) echo -e "Apache: ${YELLOW}Установлен, но не работает${NC}" ;; + 2) echo -e "Apache: ${RED}Не установлен${NC}" ;; + esac + + case $php_status in + 0) + php_version=$(php -v 2>/dev/null | head -1 | cut -d' ' -f2 | cut -d'.' -f1,2 2>/dev/null || echo "неизвестно") echo -e "PHP: ${GREEN}Установлен (версия $php_version)${NC}" - else - echo -e "PHP: ${YELLOW}Установлен (версия $php_version, требуется 8.3)${NC}" + ;; + 2) echo -e "PHP: ${RED}Не установлен${NC}" ;; + esac + + case $mariadb_status in + 0) echo -e "MariaDB: ${GREEN}Установлен и работает${NC}" ;; + 1) echo -e "MariaDB: ${YELLOW}Установлен, но не работает${NC}" ;; + 2) echo -e "MariaDB: ${RED}Не установлен${NC}" ;; + esac + + case $redis_status in + 0) echo -e "Redis: ${GREEN}Установлен и работает${NC}" ;; + 1) echo -e "Redis: ${YELLOW}Установлен, но не работает${NC}" ;; + 2) echo -e "Redis: ${RED}Не установлен${NC}" ;; + esac + + echo "" + + if [ "$REINSTALL" = true ]; then + log_warning "Принудительная переустановка запрошена через параметр -r" + echo "" + read -p "Подтвердите переустановку Altcor? [y/N]: " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + log_info "Начинаем переустановку Altcor..." return 1 + else + log_info "Переустановка отменена." + exit 0 fi - ;; - 2) echo -e "PHP: ${RED}Не установлен${NC}"; return 1 ;; - esac - return 0 + else + echo -e "${YELLOW}Altcor уже полностью установлен и функционирует.${NC}" + echo "" + IP_ADDR=$(hostname -I | awk '{print $1}') + echo "Доступ к системе:" + echo "• http://localhost/" + echo "• http://$IP_ADDR/" + echo "" + read -p "Хотите переустановить систему? [y/N]: " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + log_info "Начинаем переустановку по запросу пользователя..." + REINSTALL=true + return 1 + else + echo "" + log_info "Установка отменена. Система остается без изменений." + echo "" + echo "Для принудительной переустановки используйте: $0 -r" + echo "" + exit 0 + fi + fi + + elif [ "$components_installed" = true ]; then + echo -e "${YELLOW}⚠ ОБНАРУЖЕНЫ СУЩЕСТВУЮЩИЕ ВЕБ-КОМПОНЕНТЫ${NC}" + echo "" + echo "На вашем сервере уже установлены следующие компоненты:" + echo "" + + case $apache_status in + 0) echo -e "Apache: ${GREEN}Установлен и работает${NC}" ;; + 1) echo -e "Apache: ${YELLOW}Установлен, но не работает${NC}" ;; + 2) echo -e "Apache: ${RED}Не установлен${NC}" ;; + esac + + if [ "$nginx_installed" = true ]; then + if systemctl is-active --quiet nginx 2>/dev/null; then + echo -e "Nginx: ${GREEN}Установлен и работает${NC}" + else + echo -e "Nginx: ${YELLOW}Установлен, но не работает${NC}" + fi + fi + + case $php_status in + 0) + 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 + echo -e "PHP: ${GREEN}Установлен (версия $php_version)${NC}" + else + echo -e "PHP: ${YELLOW}Установлен (версия $php_version, требуется 8.3)${NC}" + fi + ;; + 2) echo -e "PHP: ${RED}Не установлен${NC}" ;; + esac + + case $mariadb_status in + 0) echo -e "MariaDB: ${GREEN}Установлен и работает${NC}" ;; + 1) echo -e "MariaDB: ${YELLOW}Установлен, но не работает${NC}" ;; + 2) echo -e "MariaDB: ${RED}Не установлен${NC}" ;; + esac + + case $redis_status in + 0) echo -e "Redis: ${GREEN}Установлен и работает${NC}" ;; + 1) echo -e "Redis: ${YELLOW}Установлен, но не работает${NC}" ;; + 2) echo -e "Redis: ${RED}Не установлен${NC}" ;; + esac + + echo "" + echo -e "${RED}ВНИМАНИЕ:${NC} Для установки Altcor необходимо переустановить" + echo "существующие компоненты с правильной конфигурацией." + echo "" + echo "Это может повлиять на работу других веб-приложений на этом сервере!" + echo "" + + if [ "$REINSTALL" = true ]; then + log_warning "Принудительная установка запрошена через параметр -r" + echo "" + read -p "Подтвердите переустановку компонентов для Altcor? [y/N]: " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + log_info "Начинаем установку с переустановкой компонентов..." + return 1 + else + log_info "Установка отменена." + exit 0 + fi + else + read -p "Переустановить компоненты и установить Altcor? [y/N]: " -n 1 -r + echo "" + if [[ $REPLY =~ ^[Yy]$ ]]; then + log_info "Начинаем установку с переустановкой компонентов..." + REINSTALL=true + return 1 + else + echo "" + log_info "Установка отменена пользователем." + echo "" + echo "Для принудительной установки используйте: $0 -r" + echo "" + exit 0 + fi + fi + + else + echo -e "${GREEN}✓ СИСТЕМА ГОТОВА К УСТАНОВКЕ${NC}" + echo "" + echo "Компоненты для установки:" + echo "• Apache веб-сервер" + echo "• PHP 8.3" + echo "• MariaDB база данных" + echo "• Redis кеш-сервер" + echo "• LibreOffice" + echo "• Java Runtime" + echo "" + log_info "Начинаем чистую установку Altcor..." + return 0 + fi } full_uninstall() { log_step "Начинаем полное удаление Altcor..." log_info "Остановка сервисов..." - for service in nginx apache2 httpd php*-fpm mariadb mysql redis redis-server php83-php-fpm; do - systemctl stop "$service" 2>/dev/null || true - done + systemctl stop nginx apache2 httpd php*-fpm mariadb mysql redis redis-server 2>/dev/null || true log_info "Удаление пакетов..." if [ "$DISTRO_FAMILY" = "debian" ]; then + export DEBIAN_FRONTEND=noninteractive - for db_package in mariadb-server mysql-server; do - for version in "" "-10.3" "-10.5" "-10.6" "-10.11" "-5.7" "-8.0"; do - echo "${db_package}${version} mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true - done - done + echo "mariadb-server mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + echo "mariadb-server-10.* mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + echo "mysql-server-* mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true - safe_execute "Удаление пакетов (Debian/Ubuntu)" \ - apt purge -y nginx* apache2* php* mariadb* mysql* redis* - safe_execute "Очистка неиспользуемых пакетов" apt autoremove -y + apt purge -y nginx* apache2* php* mariadb* mysql* redis* 2>/dev/null || true + apt autoremove -y 2>/dev/null || true else - safe_execute "Удаление пакетов (RHEL/CentOS/Fedora)" \ - $PKG_MANAGER remove -y nginx httpd php* mariadb* mysql* redis* + $PKG_MANAGER remove -y nginx httpd php* mariadb* mysql* redis* 2>/dev/null || true fi log_info "Удаление файлов конфигурации и данных..." - rm -rf /etc/nginx /etc/apache2 /etc/httpd /etc/php* /var/www/html/* \ - /var/lib/mysql* /var/lib/redis* ~/.mysql_history /root/.mysql_history \ - /root/.db_password /etc/opt/remi/php83 /opt/remi/php83 2>/dev/null || true + rm -rf \ + /etc/nginx \ + /etc/apache2 \ + /etc/httpd \ + /etc/php* \ + /var/www/html/* \ + /var/lib/mysql* \ + /var/lib/redis* \ + ~/.mysql_history \ + /root/.mysql_history \ + /root/.db_password 2>/dev/null || true log_success "Полное удаление завершено." @@ -263,674 +379,259 @@ full_uninstall() { fi } -update_system() { - log_step "Обновление системы и установка базовых пакетов..." - +proceed_with_installation() { + DB_PASSWORD=$(generate_password) + + log_step "Остановка конфликтующих сервисов..." + systemctl stop nginx httpd apache2 php*-fpm mariadb mysql 2>/dev/null || true + systemctl disable nginx httpd 2>/dev/null || true + + log_info "Ожидание полной остановки служб..." + sleep 3 + + echo "" + echo "Начинаем установку Altcor..." + echo "" + + log_step "Удаление старых версий пакетов..." if [ "$DISTRO_FAMILY" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive - safe_execute "Обновление списка пакетов" apt update -y - safe_execute "Установка базовых пакетов" \ - apt install -y software-properties-common lsb-release ca-certificates \ - curl wget gnupg2 apt-transport-https unzip - else - safe_execute "Обновление системы" $PKG_MANAGER update -y - safe_execute "Установка EPEL репозитория" $PKG_MANAGER install -y epel-release || true - safe_execute "Установка базовых пакетов" \ - $PKG_MANAGER install -y curl wget gnupg2 unzip + + echo "mariadb-server mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + echo "mariadb-server-10.3 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + echo "mariadb-server-10.5 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + echo "mariadb-server-10.6 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + echo "mariadb-server-10.11 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + echo "mysql-server-5.7 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + echo "mysql-server-8.0 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true + + apt remove -y nginx nginx-common nginx-core >/dev/null 2>&1 || true + apt remove -y php7.* php8.0* php8.1* php8.2* libapache2-mod-php7.* libapache2-mod-php8.0* libapache2-mod-php8.1* libapache2-mod-php8.2* >/dev/null 2>&1 || true + + apt remove --purge -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" mariadb* mysql* /dev/null 2>&1 || true + apt autoremove -y >/dev/null 2>&1 || true + rm -rf /var/lib/mysql* /etc/mysql* /var/log/mysql* 2>/dev/null || true + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + $PKG_MANAGER remove -y nginx >/dev/null 2>&1 || true + $PKG_MANAGER remove -y php php7* php80* php81* php82* >/dev/null 2>&1 || true + $PKG_MANAGER remove -y mariadb* mysql* >/dev/null 2>&1 || true + rm -rf /var/lib/mysql* /etc/my.cnf* /var/log/mysql* 2>/dev/null || true fi -} + log_success "Старые пакеты удалены" -setup_php_repositories() { - log_step "Настройка репозиториев для PHP 8.3..." - + log_step "Обновление списка пакетов..." + if [ "$DISTRO_FAMILY" = "debian" ]; then + export DEBIAN_FRONTEND=noninteractive + apt update -y >/dev/null 2>&1 + apt install -y software-properties-common lsb-release ca-certificates curl wget gnupg2 apt-transport-https unzip >/dev/null 2>&1 + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + $PKG_MANAGER update -y >/dev/null 2>&1 + $PKG_MANAGER install -y epel-release >/dev/null 2>&1 || true + $PKG_MANAGER install -y curl wget gnupg2 unzip >/dev/null 2>&1 + fi + log_success "Система обновлена, базовые пакеты установлены" + + log_step "Добавление репозиториев для PHP 8.3..." if [ "$DISTRO_FAMILY" = "debian" ]; then if ! apt-cache show php8.3 &>/dev/null; then - log_info "Добавление репозитория Sury для PHP 8.3..." - - if ! curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/php-archive-keyring.gpg 2>/dev/null; then - log_warning "Не удалось добавить ключ Sury, пробуем PPA..." - safe_execute "Добавление PPA ondrej/php" add-apt-repository ppa:ondrej/php -y - else - 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 - fi - - safe_execute "Обновление списка пакетов после добавления репозитория PHP" apt update -y - - if ! apt-cache show php8.3 &>/dev/null; then - log_error "PHP 8.3 недоступен после добавления репозиториев" + log_info "Добавление PPA ondrej/php..." + if ! add-apt-repository ppa:ondrej/php -y >/dev/null 2>&1; then + log_error "Не удалось добавить PPA ondrej/php." exit 1 fi - fi - log_success "Репозиторий PHP 8.3 настроен" - - else - log_info "Настройка репозиториев Remi для RHEL-семейства..." - - local version_id=$(echo "$VERSION_ID" | cut -d'.' -f1) - - if [ "$DISTRO" = "fedora" ]; then - local fedora_version=$(rpm -E %fedora) - safe_execute "Установка Remi репозитория для Fedora" \ - $PKG_MANAGER install -y "https://rpms.remirepo.net/fedora/remi-release-${fedora_version}.rpm" + + apt update -y >/dev/null 2>&1 + + if ! apt-cache show php8.3 &>/dev/null; then + log_error "PHP 8.3 все еще недоступен после добавления PPA." + exit 1 + fi + log_success "PPA добавлен успешно" else - safe_execute "Установка Remi репозитория для RHEL/CentOS" \ - $PKG_MANAGER install -y "https://rpms.remirepo.net/enterprise/remi-release-${version_id}.rpm" + log_success "PHP 8.3 уже доступен в репозиториях" + fi + + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + log_info "Добавление репозитория Remi..." + if [ "$DISTRO" = "fedora" ]; then + $PKG_MANAGER install -y https://rpms.remirepo.net/fedora/remi-release-$(rpm -E %fedora).rpm >/dev/null 2>&1 || true + else + $PKG_MANAGER install -y https://rpms.remirepo.net/enterprise/remi-release-$(rpm -E %rhel).rpm >/dev/null 2>&1 || true fi if command -v dnf >/dev/null 2>&1; then - safe_execute "Сброс модуля PHP" dnf module reset php -y || true - safe_execute "Включение модуля PHP 8.3" dnf module enable php:remi-8.3 -y || true + dnf module reset php -y >/dev/null 2>&1 || true + dnf module enable php:remi-8.3 -y >/dev/null 2>&1 || true fi - log_success "Репозиторий Remi настроен" + if ! $PKG_MANAGER list available php83* php8.3* >/dev/null 2>&1; then + log_error "PHP 8.3 недоступен в репозиториях." + exit 1 + fi + log_success "Репозиторий Remi добавлен успешно" fi -} -install_components() { - log_step "Установка основных компонентов..." - - log_info "Остановка конфликтующих сервисов..." - for service in nginx httpd apache2 php*-fpm mariadb mysql; do - systemctl stop "$service" 2>/dev/null || true - done - systemctl disable nginx httpd 2>/dev/null || true - - sleep 3 - - remove_old_packages - + log_step "Установка Apache..." if [ "$DISTRO_FAMILY" = "debian" ]; then - safe_execute "Установка Apache" apt install -y apache2 - else - safe_execute "Установка Apache (httpd)" $PKG_MANAGER install -y httpd + export DEBIAN_FRONTEND=noninteractive + apt install -y apache2 >/dev/null 2>&1 + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + $PKG_MANAGER install -y httpd >/dev/null 2>&1 fi - - install_mariadb - - install_php83 - - install_additional_components -} + log_success "Apache установлен" -remove_old_packages() { - log_info "Удаление старых версий пакетов..." - + log_step "Установка MariaDB..." if [ "$DISTRO_FAMILY" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive - # Удаление старых версий MariaDB - for db_package in mariadb-server mysql-server; do - for version in "" "-10.3" "-10.5" "-10.6" "-10.11" "-5.7" "-8.0"; do - echo "${db_package}${version} mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true - done - done - - apt remove -y nginx nginx-common nginx-core 2>/dev/null || true - apt remove -y php7.* php8.0* php8.1* php8.2* libapache2-mod-php7.* libapache2-mod-php8.0* libapache2-mod-php8.1* libapache2-mod-php8.2* 2>/dev/null || true - apt remove --purge -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" mariadb* mysql* 2>/dev/null || true - apt autoremove -y 2>/dev/null || true - else - # Для RHEL семейства - удаляем только ненужные версии PHP - log_info "Очистка конфликтующих пакетов PHP..." - - # Останавливаем все PHP-FPM сервисы перед удалением - for service in php-fpm php74-php-fpm php80-php-fpm php81-php-fpm php82-php-fpm php84-php-fpm php85-php-fpm; do - systemctl stop "$service" 2>/dev/null || true - systemctl disable "$service" 2>/dev/null || true - done - - # Удаляем ненужные версии PHP, оставляем только php83 - $PKG_MANAGER remove -y nginx 2>/dev/null || true - $PKG_MANAGER remove -y php php7* php80* php81* php82* php84* php85* 2>/dev/null || true - $PKG_MANAGER remove -y mariadb* mysql* 2>/dev/null || true - - # Очищаем конфигурации - rm -rf /etc/php-fpm.d/*.conf.rpmsave /etc/opt/remi/php*/php-fpm.d/*.conf.rpmsave 2>/dev/null || true - fi - - # Общая очистка - rm -rf /var/lib/mysql* /etc/mysql* /var/log/mysql* /etc/my.cnf* 2>/dev/null || true - - log_success "Очистка пакетов завершена" -} - -diagnose_php_fpm() { - log_info "Диагностика PHP-FPM..." - - echo "=== Установленные PHP пакеты ===" | tee -a "$LOG_FILE" - rpm -qa | grep -E "php[0-9]*" | sort | tee -a "$LOG_FILE" - - echo "=== Доступные PHP-FPM сервисы ===" | tee -a "$LOG_FILE" - systemctl list-unit-files | grep php-fpm | tee -a "$LOG_FILE" - - echo "=== Статус PHP сервисов ===" | tee -a "$LOG_FILE" - for service in php-fpm php83-php-fpm php82-php-fpm php81-php-fpm php80-php-fpm; do - if systemctl list-unit-files | grep -q "${service}.service"; then - echo "--- $service ---" | tee -a "$LOG_FILE" - systemctl status "$service" --no-pager -l | tee -a "$LOG_FILE" - fi - done - - echo "=== Конфигурационные файлы PHP-FPM ===" | tee -a "$LOG_FILE" - find /etc -name "*php-fpm*" -type f 2>/dev/null | tee -a "$LOG_FILE" - find /etc/opt/remi -name "*php-fpm*" -type f 2>/dev/null | tee -a "$LOG_FILE" -} - -install_mariadb() { - log_info "Установка MariaDB..." - - if [ "$DISTRO_FAMILY" = "debian" ]; then - export DEBIAN_FRONTEND=noninteractive echo "mariadb-server mysql-server/root_password password ''" | debconf-set-selections 2>/dev/null || true echo "mariadb-server mysql-server/root_password_again password ''" | debconf-set-selections 2>/dev/null || true - safe_execute "Установка MariaDB" apt install -y mariadb-server - else - safe_execute "Установка MariaDB" $PKG_MANAGER install -y mariadb-server + + apt install -y mariadb-server >/dev/null 2>&1 + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + $PKG_MANAGER install -y mariadb-server >/dev/null 2>&1 fi - - safe_execute "Запуск MariaDB" systemctl start mariadb - safe_execute "Включение MariaDB в автозагрузку" systemctl enable mariadb - + + log_info "Запуск MariaDB..." + systemctl start mariadb >/dev/null 2>&1 + systemctl enable mariadb >/dev/null 2>&1 + log_info "Ожидание полного запуска MariaDB..." - local retry_count=0 - while ! systemctl is-active --quiet mariadb && [ $retry_count -lt 10 ]; do - sleep 2 - ((retry_count++)) - done - + sleep 5 + if ! systemctl is-active --quiet mariadb; then - log_error "MariaDB не удалось запустить" + log_error "MariaDB не смог запуститься" exit 1 fi -} -install_php83() { - log_info "Установка PHP 8.3 и расширений..." - + log_success "MariaDB установлен и запущен" + + log_step "Установка дополнительных компонентов (Redis, LibreOffice, Java)..." if [ "$DISTRO_FAMILY" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive - local 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 php8.3-json php8.3-readline libapache2-mod-php8.3" - else - # Для RHEL семейства устанавливаем только PHP 8.3 пакеты - local 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-json php83-php-fpm" - - # Убеждаемся, что включен правильный модуль - if command -v dnf >/dev/null 2>&1; then - dnf module reset php -y 2>/dev/null || true - dnf module install php:remi-8.3 -y 2>/dev/null || true - fi + apt install -y redis-server libreoffice default-jre >/dev/null 2>&1 + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + $PKG_MANAGER install -y redis libreoffice java-11-openjdk >/dev/null 2>&1 fi - - log_info "Устанавливаем пакеты: $php_packages" - - if ! $PKG_MANAGER install -y $php_packages; then - log_error "Не удалось установить PHP пакеты. Подробности в логе: $LOG_FILE" - $PKG_MANAGER install -y $php_packages 2>&1 | tee -a "$LOG_FILE" - exit 1 - fi - - # Для RHEL - создаем символические ссылки - if [ "$DISTRO_FAMILY" = "rhel" ]; then - # Создаем символические ссылки для php83 - if [ -f /opt/remi/php83/root/usr/bin/php ] && [ ! -f /usr/bin/php ]; then - ln -sf /opt/remi/php83/root/usr/bin/php /usr/bin/php - fi - - # Добавляем в PATH - echo 'export PATH=/opt/remi/php83/root/usr/bin:$PATH' > /etc/profile.d/php83.sh - source /etc/profile.d/php83.sh 2>/dev/null || true - - # Устанавливаем переменные для PHP-FPM - PHP_FPM_SERVICE="php83-php-fpm" - PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" - SOCKET_PATH="/var/opt/remi/php83/run/php-fpm/www.sock" - PHP_INI_PATH="/etc/opt/remi/php83/php.ini" - - log_info "Настроены пути для PHP 8.3:" - log_info " PHP: /opt/remi/php83/root/usr/bin/php" - log_info " PHP-FPM: $PHP_FPM_SERVICE" - log_info " Socket: $SOCKET_PATH" - fi - - verify_php_installation -} + log_success "Дополнительные компоненты установлены" -verify_php_installation() { - log_info "Проверка установки PHP..." - - if ! command -v php >/dev/null 2>&1; then - log_error "PHP не найден после установки" - exit 1 - fi - - local 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_warning "PHP версия $php_version (ожидалась 8.3)" + log_step "Установка PHP 8.3 и расширений..." + if [ "$DISTRO_FAMILY" = "debian" ]; then + export DEBIAN_FRONTEND=noninteractive + 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" - if [ "$DISTRO_FAMILY" = "debian" ] && [ -f /usr/bin/php8.3 ]; then - update-alternatives --set php /usr/bin/php8.3 2>/dev/null || true - php_version=$(php -v 2>/dev/null | head -1 | cut -d' ' -f2 | cut -d'.' -f1,2 2>/dev/null || echo "неизвестно") + if ! apt install -y $PHP_PACKAGES >/dev/null 2>&1; then + log_error "Не удалось установить PHP 8.3 и/или его расширения." + exit 1 fi - fi - - if [[ "$php_version" == "8.3" ]]; then - log_success "PHP 8.3 успешно установлен" - else - log_error "Не удалось установить PHP 8.3 (текущая версия: $php_version)" - exit 1 - fi - - verify_php_extensions -} - -verify_php_extensions() { - log_info "Проверка PHP расширений..." - - local required_extensions="mysqli pdo_mysql curl gd mbstring xml zip opcache intl bcmath json" - local missing_extensions="" - local php_cmd="php" - - # Для RHEL используем полный путь к php83 - if [ "$DISTRO_FAMILY" = "rhel" ] && [ -f /opt/remi/php83/root/usr/bin/php ]; then - php_cmd="/opt/remi/php83/root/usr/bin/php" - fi - - for ext in $required_extensions; do - if $php_cmd -m 2>/dev/null | grep -q "^$ext$"; then - log_success "Расширение $ext: установлено" + + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + if [ "$DISTRO" = "fedora" ]; then + 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 - log_warning "Расширение $ext: НЕ найдено" - missing_extensions="$missing_extensions $ext" + PHP_PACKAGES="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" fi - done - - if [ -n "$missing_extensions" ]; then - log_warning "Попытка установки отсутствующих расширений:$missing_extensions" - install_missing_php_extensions "$missing_extensions" - # Повторная проверка после установки - log_info "Повторная проверка расширений..." - for ext in $missing_extensions; do - if $php_cmd -m 2>/dev/null | grep -q "^$ext$"; then - log_success "Расширение $ext: теперь установлено" - else - log_warning "Расширение $ext: все еще отсутствует" - fi - done + if ! $PKG_MANAGER install -y $PHP_PACKAGES >/dev/null 2>&1; then + log_error "Не удалось установить PHP 8.3 и/или его расширения." + exit 1 + fi + + if command -v php83 >/dev/null 2>&1 && [ ! -f /usr/bin/php ]; then + 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 + fi fi -} + log_success "PHP 8.3 и расширения установлены" -install_missing_php_extensions() { - local missing_extensions="$1" - + log_step "Настройка Apache и модулей..." if [ "$DISTRO_FAMILY" = "debian" ]; then - for ext in $missing_extensions; do - case $ext in - mysqli|pdo_mysql) - apt install -y php8.3-mysql 2>/dev/null || true - ;; - opcache) - apt install -y php8.3-opcache 2>/dev/null || true - ;; - *) - apt install -y "php8.3-$ext" 2>/dev/null || true - ;; - esac + a2enmod php8.3 rewrite ssl headers expires deflate >/dev/null 2>&1 + + for php_ver in 7.4 8.0 8.1 8.2; do + a2dismod php$php_ver >/dev/null 2>&1 || true done - else - # Для RHEL используем пакеты php83 - for ext in $missing_extensions; do - case $ext in - mysqli|pdo_mysql) - $PKG_MANAGER install -y php83-php-mysqlnd 2>/dev/null || true - ;; - opcache) - $PKG_MANAGER install -y php83-php-opcache 2>/dev/null || true - ;; - *) - $PKG_MANAGER install -y "php83-php-$ext" 2>/dev/null || true - ;; - esac - done - fi -} - -install_additional_components() { - log_info "Установка дополнительных компонентов (Redis, LibreOffice, Java)..." - - if [ "$DISTRO_FAMILY" = "debian" ]; then - export DEBIAN_FRONTEND=noninteractive - safe_execute "Установка дополнительных компонентов" \ - apt install -y redis-server libreoffice default-jre - else - safe_execute "Установка дополнительных компонентов" \ - $PKG_MANAGER install -y redis libreoffice java-11-openjdk - fi -} - -configure_apache_php() { - log_step "Настройка Apache и PHP..." - - if [ "$DISTRO_FAMILY" = "debian" ]; then - configure_apache_debian - else - configure_apache_rhel - fi - - configure_php_ini - - create_virtual_host - - verify_apache_config -} - -configure_apache_debian() { - log_info "Настройка Apache для Debian/Ubuntu..." - - a2enmod php8.3 rewrite ssl headers expires deflate 2>/dev/null || true - - for php_ver in 7.4 8.0 8.1 8.2; do - a2dismod "php$php_ver" 2>/dev/null || true - done -} - -configure_apache_rhel() { - log_info "Настройка Apache для RHEL семейства..." - - rm -f /etc/httpd/conf.d/php.conf /etc/httpd/conf.modules.d/*php*.conf 2>/dev/null || true - - if ! httpd -V | grep -q "prefork"; then - log_info "Переключение на MPM prefork..." - $PKG_MANAGER remove -y httpd - $PKG_MANAGER install -y httpd httpd-tools - fi - - cat > /etc/httpd/conf.modules.d/00-mpm.conf << EOF -LoadModule mpm_prefork_module modules/mod_mpm_prefork.so -EOF - - # Добавление обязательных модулей - echo "LoadModule rewrite_module modules/mod_rewrite.so" > /etc/httpd/conf.modules.d/00-altcor.conf - echo "LoadModule proxy_module modules/mod_proxy.so" >> /etc/httpd/conf.modules.d/00-altcor.conf - echo "LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so" >> /etc/httpd/conf.modules.d/00-altcor.conf - - configure_php_fpm - create_php_fpm_config - create_altcor_config - - # Резервное копирование конфигурации - cp "$APACHE_CONF" "$APACHE_CONF.bak" - - cat > /etc/httpd/conf.modules.d/00-altcor-modules.conf << EOF + + WEBROOT="/var/www/html" + APACHE_CONF="/etc/apache2/sites-available/000-default.conf" + WEBSERVER_USER="www-data" + + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + WEBROOT="/var/www/html" + APACHE_CONF="/etc/httpd/conf.d/000-default.conf" + WEBSERVER_USER="apache" + + rm -f /etc/httpd/conf.d/php.conf + + if [ "$DISTRO" = "fedora" ]; then + cat > "/etc/httpd/conf.d/php.conf" << 'EOF' +LoadModule php_module modules/libphp.so LoadModule rewrite_module modules/mod_rewrite.so -LoadModule headers_module modules/mod_headers.so -LoadModule expires_module modules/mod_expires.so -LoadModule deflate_module modules/mod_deflate.so -LoadModule proxy_module modules/mod_proxy.so -LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so -EOF -} - -configure_php_fpm() { - log_info "Настройка PHP-FPM..." - - # Определяем правильный сервис PHP-FPM - if systemctl list-unit-files | grep -q "php83-php-fpm.service"; then - PHP_FPM_SERVICE="php83-php-fpm" - PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" - SOCKET_PATH="/var/opt/remi/php83/run/php-fpm/www.sock" - PHP_INI_PATH="/etc/opt/remi/php83/php.ini" - elif systemctl list-unit-files | grep -q "php-fpm.service"; then - PHP_FPM_SERVICE="php-fpm" - PHP_FPM_CONF="/etc/php-fpm.d/www.conf" - SOCKET_PATH="/run/php-fpm/www.sock" - PHP_INI_PATH="/etc/php.ini" - else - log_error "PHP-FPM сервис не найден" - return 1 - fi - - log_info "Используется сервис: $PHP_FPM_SERVICE" - log_info "Конфигурация: $PHP_FPM_CONF" - - # Проверяем существование конфигурационного файла - if [ ! -f "$PHP_FPM_CONF" ]; then - log_error "Файл конфигурации PHP-FPM не найден: $PHP_FPM_CONF" - - # Ищем альтернативные пути - log_info "Поиск альтернативных конфигураций..." - for conf_path in "/etc/opt/remi/php83/php-fpm.d/www.conf" "/etc/php-fpm.d/www.conf" "/etc/opt/remi/php*/php-fpm.d/www.conf"; do - if [ -f "$conf_path" ]; then - PHP_FPM_CONF="$conf_path" - log_info "Найден конфигурационный файл: $PHP_FPM_CONF" - break - fi - done - - if [ ! -f "$PHP_FPM_CONF" ]; then - log_error "Конфигурационный файл PHP-FPM не найден" - return 1 - fi - fi - - # Создаем резервную копию - cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)" - - # Настраиваем конфигурацию - sed -i "s|;*listen = .*|listen = $SOCKET_PATH|" "$PHP_FPM_CONF" - sed -i 's/;*listen.owner = .*/listen.owner = apache/' "$PHP_FPM_CONF" - sed -i 's/;*listen.group = .*/listen.group = apache/' "$PHP_FPM_CONF" - sed -i 's/;*listen.mode = .*/listen.mode = 0660/' "$PHP_FPM_CONF" - sed -i 's/;*user = .*/user = apache/' "$PHP_FPM_CONF" - sed -i 's/;*group = .*/group = apache/' "$PHP_FPM_CONF" - - # Настройки производительности - sed -i 's/;*pm = .*/pm = dynamic/' "$PHP_FPM_CONF" - sed -i 's/;*pm.max_children = .*/pm.max_children = 50/' "$PHP_FPM_CONF" - sed -i 's/;*pm.start_servers = .*/pm.start_servers = 5/' "$PHP_FPM_CONF" - sed -i 's/;*pm.min_spare_servers = .*/pm.min_spare_servers = 5/' "$PHP_FPM_CONF" - sed -i 's/;*pm.max_spare_servers = .*/pm.max_spare_servers = 35/' "$PHP_FPM_CONF" - - # Создаем директорию для сокета - local socket_dir=$(dirname "$SOCKET_PATH") - mkdir -p "$socket_dir" - chown apache:apache "$socket_dir" - chmod 755 "$socket_dir" - - # Останавливаем все PHP-FPM сервисы - log_info "Остановка всех PHP-FPM сервисов..." - for service in php-fpm php83-php-fpm php82-php-fpm php81-php-fpm php80-php-fpm php74-php-fpm; do - systemctl stop "$service" 2>/dev/null || true - systemctl disable "$service" 2>/dev/null || true - done - - # Запускаем нужный сервис - log_info "Запуск $PHP_FPM_SERVICE..." - if systemctl start "$PHP_FPM_SERVICE"; then - log_success "$PHP_FPM_SERVICE запущен" - systemctl enable "$PHP_FPM_SERVICE" - - # Проверяем создание сокета - local retry_count=0 - while [ ! -S "$SOCKET_PATH" ] && [ $retry_count -lt 10 ]; do - sleep 1 - ((retry_count++)) - done - - if [ -S "$SOCKET_PATH" ]; then - log_success "Сокет PHP-FPM создан: $SOCKET_PATH" - chown apache:apache "$SOCKET_PATH" - else - log_warning "Сокет PHP-FPM не создан, проверяем статус..." - systemctl status "$PHP_FPM_SERVICE" --no-pager -l | tee -a "$LOG_FILE" - fi - else - log_error "Не удалось запустить $PHP_FPM_SERVICE" - systemctl status "$PHP_FPM_SERVICE" --no-pager -l | tee -a "$LOG_FILE" - return 1 - fi -} - -create_php_fpm_config() { - log_info "Создание конфигурации PHP-FPM для Apache..." - - cat > "/etc/httpd/conf.d/php-fpm.conf" << EOF -# PHP-FPM configuration for Apache -# Использование только PHP-FPM, без mod_php - -# Загрузка необходимых модулей - - LoadModule rewrite_module modules/mod_rewrite.so - - - LoadModule headers_module modules/mod_headers.so - - - LoadModule expires_module modules/mod_expires.so - - - LoadModule deflate_module modules/mod_deflate.so - - - LoadModule proxy_module modules/mod_proxy.so - - - LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so - - -# Обработка PHP файлов через PHP-FPM - SetHandler "proxy:unix:$SOCKET_PATH|fcgi://localhost" + SetHandler application/x-httpd-php -# Настройки производительности -ProxyTimeout 300 -ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:$SOCKET_PATH|fcgi://localhost/var/www/html/ +DirectoryIndex index.php index.html EOF -} + else + log_info "Настройка PHP-FPM для Apache..." + + cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF' +LoadModule proxy_module modules/mod_proxy.so +LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so +LoadModule rewrite_module modules/mod_rewrite.so -create_altcor_config() { - log_info "Создание конфигурации Altcor..." - - cat > "/etc/httpd/conf.d/altcor.conf" << 'EOF' -# Altcor main configuration + + SetHandler "proxy:unix:/var/opt/remi/php83/run/php-fpm/www.sock|fcgi://localhost" + -# Безопасность сервера -ServerTokens Prod -ServerSignature Off +DirectoryIndex index.php index.html index.htm -# Основные настройки директории - - Options -Indexes +FollowSymLinks - AllowOverride All + Require all granted - - # Сжатие контента - - SetOutputFilter DEFLATE - SetEnvIfNoCase Request_URI \ - \.(?:gif|jpe?g|png|ico|exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary - SetEnvIfNoCase User-Agent "^Mozilla/4\.0[678]" no-gzip - SetEnvIfNoCase User-Agent "MSIE [1-6]\." no-gzip - - - # Кэширование статических ресурсов - - ExpiresActive On - ExpiresByType image/jpg "access plus 1 month" - ExpiresByType image/jpeg "access plus 1 month" - ExpiresByType image/gif "access plus 1 month" - ExpiresByType image/png "access plus 1 month" - ExpiresByType image/svg+xml "access plus 1 month" - ExpiresByType image/webp "access plus 1 month" - ExpiresByType image/x-icon "access plus 1 month" - ExpiresByType text/css "access plus 1 month" - ExpiresByType application/javascript "access plus 1 month" - ExpiresByType text/javascript "access plus 1 month" - ExpiresByType font/woff "access plus 1 month" - ExpiresByType font/woff2 "access plus 1 month" - ExpiresByType font/ttf "access plus 1 month" - ExpiresByType font/otf "access plus 1 month" - ExpiresByType text/html "access plus 0 seconds" - ExpiresByType application/x-httpd-php "access plus 0 seconds" - - - # Заголовки безопасности - - Header always set X-Content-Type-Options nosniff - Header always set X-Frame-Options SAMEORIGIN - Header always set X-XSS-Protection "1; mode=block" - Header always set Referrer-Policy "strict-origin-when-cross-origin" - - Header set Cache-Control "public, max-age=2592000" - - - - -# Запрет доступа к служебным файлам - - Require all denied - - - Require all denied - - - - Require all denied - - -# Защита директории uploads - - - Require all denied - - EOF -} - -configure_php_ini() { - log_info "Настройка PHP.ini..." - - if [ ! -f "$PHP_INI_PATH" ]; then - log_warning "Файл PHP.ini не найден по пути: $PHP_INI_PATH" - return + + if [ -f "/etc/opt/remi/php83/php-fpm.d/www.conf" ]; then + PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf" + + cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)" + + sed -i 's/^user = .*/user = apache/' "$PHP_FPM_CONF" + sed -i 's/^group = .*/group = apache/' "$PHP_FPM_CONF" + + sed -i 's/^listen = .*/listen = \/var\/opt\/remi\/php83\/run\/php-fpm\/www.sock/' "$PHP_FPM_CONF" + sed -i 's/^;listen.owner = .*/listen.owner = apache/' "$PHP_FPM_CONF" + sed -i 's/^;listen.group = .*/listen.group = apache/' "$PHP_FPM_CONF" + sed -i 's/^;listen.mode = .*/listen.mode = 0660/' "$PHP_FPM_CONF" + + log_info "PHP-FPM пул настроен" + fi + + mkdir -p /var/opt/remi/php83/run/php-fpm + chown apache:apache /var/opt/remi/php83/run/php-fpm + fi fi - - cp "$PHP_INI_PATH" "${PHP_INI_PATH}.backup.$(date +%Y%m%d_%H%M%S)" - - sed -i 's/;*upload_max_filesize = .*/upload_max_filesize = 64M/' "$PHP_INI_PATH" - sed -i 's/;*post_max_size = .*/post_max_size = 64M/' "$PHP_INI_PATH" - sed -i 's/;*max_execution_time = .*/max_execution_time = 300/' "$PHP_INI_PATH" - sed -i 's/;*memory_limit = .*/memory_limit = 256M/' "$PHP_INI_PATH" - sed -i 's/;*max_input_vars = .*/max_input_vars = 3000/' "$PHP_INI_PATH" - - sed -i 's/;*opcache.enable=.*/opcache.enable=1/' "$PHP_INI_PATH" - sed -i 's/;*opcache.enable_cli=.*/opcache.enable_cli=1/' "$PHP_INI_PATH" - sed -i 's/;*opcache.memory_consumption=.*/opcache.memory_consumption=128/' "$PHP_INI_PATH" - sed -i 's/;*opcache.revalidate_freq=.*/opcache.revalidate_freq=2/' "$PHP_INI_PATH" - sed -i 's/;*opcache.max_accelerated_files=.*/opcache.max_accelerated_files=4000/' "$PHP_INI_PATH" - - sed -i 's/;*expose_php = .*/expose_php = Off/' "$PHP_INI_PATH" - sed -i 's/;*display_errors = .*/display_errors = Off/' "$PHP_INI_PATH" - sed -i 's/;*log_errors = .*/log_errors = On/' "$PHP_INI_PATH" - - log_success "PHP.ini настроен" -} + log_success "Модули Apache настроены" -create_virtual_host() { - log_info "Создание конфигурации виртуального хоста..." - - mkdir -p "$WEBROOT" - - if [ "$DISTRO_FAMILY" = "debian" ]; then - cat > "$APACHE_CONF" << EOF + log_step "Создание конфигурации виртуального хоста..." +mkdir -p "$WEBROOT" + +SERVER_IP=$(hostname -I | awk '{print $1}') + +if [ "$DISTRO_FAMILY" = "debian" ]; then + cat > "$APACHE_CONF" < DocumentRoot $WEBROOT ServerName localhost - ServerAlias www.localhost + ServerAlias www.localhost $SERVER_IP $(hostname -f) $(hostname -s) Options -Indexes +FollowSymLinks @@ -950,7 +651,11 @@ create_virtual_host() { SetHandler application/x-httpd-php - + + Require all denied + + + Require all denied @@ -960,178 +665,144 @@ create_virtual_host() { ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" + ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType text/css "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" + ExpiresByType text/javascript "access plus 1 month" ErrorLog \${APACHE_LOG_DIR}/error.log CustomLog \${APACHE_LOG_DIR}/access.log combined EOF - fi -} -verify_apache_config() { - log_info "Проверка конфигурации Apache..." - +elif [ "$DISTRO_FAMILY" = "rhel" ]; then + cat > "$APACHE_CONF" < + DocumentRoot $WEBROOT + ServerName localhost + ServerAlias www.localhost $SERVER_IP $(hostname -f 2>/dev/null || hostname) $(hostname -s 2>/dev/null || hostname) + + + Options -Indexes +FollowSymLinks + AllowOverride All + Require all granted + + + SetHandler "proxy:unix:/var/opt/remi/php83/run/php-fpm/www.sock|fcgi://localhost" + + + + SetOutputFilter DEFLATE + SetEnvIfNoCase Request_URI \ + \.(?:gif|jpe?g|png)$ no-gzip dont-vary + SetEnvIfNoCase Request_URI \ + \.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary + + + + + Require all denied + + + + Require all denied + + + + ExpiresActive On + ExpiresByType image/jpg "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 month" + ExpiresByType image/gif "access plus 1 month" + ExpiresByType image/png "access plus 1 month" + ExpiresByType image/svg+xml "access plus 1 month" + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType text/javascript "access plus 1 month" + + + ErrorLog /var/log/httpd/error.log + CustomLog /var/log/httpd/access.log combined + +EOF + fi + log_success "Конфигурация виртуального хоста создана" + + log_step "Настройка Apache для прослушивания всех интерфейсов..." if [ "$DISTRO_FAMILY" = "debian" ]; then - if ! apache2ctl configtest >/dev/null 2>&1; then - log_error "Конфигурация Apache содержит ошибки:" - apache2ctl configtest 2>&1 | tee -a "$LOG_FILE" - exit 1 - fi - else - log_info "Проверка загруженных модулей:" - httpd -M 2>&1 | tee -a "$LOG_FILE" - if ! httpd -t >/dev/null 2>&1; then - log_error "Ошибки конфигурации:" - httpd -t 2>&1 | tee -a "$LOG_FILE" - - # Автоматическое исправление распространённых ошибок - if grep -q "Could not open configuration file" "$LOG_FILE"; then - log_info "Попытка восстановления конфигурации..." - cp -f "$APACHE_CONF.bak" "$APACHE_CONF" + if ! grep -q "Listen 0.0.0.0:80" /etc/apache2/ports.conf && ! grep -q "Listen \*:80" /etc/apache2/ports.conf; then + if grep -q "Listen 127.0.0.1:80" /etc/apache2/ports.conf; then + sed -i 's/Listen 127.0.0.1:80/Listen *:80/' /etc/apache2/ports.conf + fi + if ! grep -q "Listen.*:80" /etc/apache2/ports.conf; then + echo "Listen *:80" >> /etc/apache2/ports.conf + fi + fi + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + HTTPD_CONF="/etc/httpd/conf/httpd.conf" + if ! grep -q "Listen 0.0.0.0:80" "$HTTPD_CONF" && ! grep -q "Listen \*:80" "$HTTPD_CONF"; then + if grep -q "Listen 127.0.0.1:80" "$HTTPD_CONF"; then + sed -i 's/Listen 127.0.0.1:80/Listen *:80/' "$HTTPD_CONF" + elif ! grep -q "Listen.*:80" "$HTTPD_CONF"; then + echo "Listen *:80" >> "$HTTPD_CONF" fi - exit 1 fi fi - - log_success "Конфигурация Apache проверена" -} + log_success "Apache настроен для прослушивания всех интерфейсов" -configure_database() { - log_step "Настройка базы данных MariaDB..." - - local db_password=$(generate_password) - - if ! systemctl is-active --quiet mariadb; then - log_error "MariaDB не запущен" - exit 1 - fi - - setup_mariadb_security "$db_password" - - create_db_config "$db_password" - - save_db_credentials "$db_password" - - echo "$db_password" -} - -setup_mariadb_security() { - local db_password="$1" - - log_info "Выполнение базовой настройки безопасности MariaDB..." - - if mysql -u root -e "SELECT 1;" >/dev/null 2>&1; then - log_info "Первичная настройка MariaDB..." - setup_fresh_mariadb "$db_password" - elif mysql -u root -p"$db_password" -e "SELECT 1;" >/dev/null 2>&1; then - log_info "MariaDB уже настроен, обновляем базу данных..." - update_existing_mariadb "$db_password" - else - log_warning "Требуется сброс пароля root в MariaDB..." - reset_mariadb_password "$db_password" - fi -} - -setup_fresh_mariadb() { - local db_password="$1" - local script_file="/tmp/mysql_secure_$(date +%s).sql" - - cat > "$script_file" << MYSQL_SCRIPT -ALTER USER 'root'@'localhost' IDENTIFIED BY '$db_password'; -DELETE FROM mysql.user WHERE User=''; -DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); -DROP DATABASE IF EXISTS test; -DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; -CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost'; -FLUSH PRIVILEGES; -MYSQL_SCRIPT - - if mysql -u root < "$script_file" >/dev/null 2>&1; then - log_success "Первичная настройка MariaDB выполнена" - else - log_error "Ошибка при настройке MariaDB" - rm -f "$script_file" - exit 1 - fi - rm -f "$script_file" -} - -update_existing_mariadb() { - local db_password="$1" - local script_file="/tmp/mysql_update_$(date +%s).sql" - - cat > "$script_file" << MYSQL_SCRIPT -CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost'; -FLUSH PRIVILEGES; -MYSQL_SCRIPT - - if mysql -u root -p"$db_password" < "$script_file" >/dev/null 2>&1; then - log_success "База данных ALTCor обновлена" - else - log_error "Ошибка при обновлении базы данных" - rm -f "$script_file" - exit 1 - fi - rm -f "$script_file" -} - -reset_mariadb_password() { - local db_password="$1" - - log_info "Сброс пароля root в MariaDB..." - - systemctl stop mariadb - mysqld_safe --skip-grant-tables --skip-networking & - local mysqld_pid=$! - sleep 5 - - local reset_script="/tmp/mysql_reset_$(date +%s).sql" - cat > "$reset_script" << MYSQL_SCRIPT -USE mysql; -UPDATE user SET password=PASSWORD('$db_password') WHERE User='root'; -UPDATE user SET plugin='mysql_native_password' WHERE User='root'; -FLUSH PRIVILEGES; -MYSQL_SCRIPT - - if mysql -u root < "$reset_script" >/dev/null 2>&1; then - kill $mysqld_pid 2>/dev/null || true - sleep 3 - killall mysqld_safe mysqld 2>/dev/null || true - sleep 3 - - systemctl start mariadb - sleep 3 - - if systemctl is-active --quiet mariadb && mysql -u root -p"$db_password" -e "SELECT 1;" >/dev/null 2>&1; then - update_existing_mariadb "$db_password" - log_success "Пароль MariaDB сброшен и база данных настроена" + log_step "Настройка PHP.ini..." + if [ "$DISTRO_FAMILY" = "debian" ]; then + PHP_INI_PATH="/etc/php/8.3/apache2/php.ini" + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + if [ "$DISTRO" = "fedora" ]; then + PHP_INI_PATH="/etc/php.ini" else - log_error "MariaDB не запустился после сброса пароля" - exit 1 + if [ -f "/etc/opt/remi/php83/php.ini" ]; then + PHP_INI_PATH="/etc/opt/remi/php83/php.ini" + elif [ -f "/opt/remi/php83/root/etc/php.ini" ]; then + PHP_INI_PATH="/opt/remi/php83/root/etc/php.ini" + elif [ -f "/etc/php.ini" ]; then + PHP_INI_PATH="/etc/php.ini" + fi fi - else - log_error "Не удалось сбросить пароль root в MariaDB" - kill $mysqld_pid 2>/dev/null || true - exit 1 fi - rm -f "$reset_script" -} -create_db_config() { - local db_password="$1" - - log_info "Создание конфигурации базы данных..." - + if [ -f "$PHP_INI_PATH" ]; then + cp "$PHP_INI_PATH" "${PHP_INI_PATH}.backup.$(date +%Y%m%d_%H%M%S)" + + sed -i 's/;*upload_max_filesize = .*/upload_max_filesize = 64M/' "$PHP_INI_PATH" + sed -i 's/;*post_max_size = .*/post_max_size = 64M/' "$PHP_INI_PATH" + sed -i 's/;*max_execution_time = .*/max_execution_time = 300/' "$PHP_INI_PATH" + sed -i 's/;*memory_limit = .*/memory_limit = 256M/' "$PHP_INI_PATH" + sed -i 's/;*max_input_vars = .*/max_input_vars = 3000/' "$PHP_INI_PATH" + + sed -i 's/;*opcache.enable=.*/opcache.enable=1/' "$PHP_INI_PATH" + sed -i 's/;*opcache.enable_cli=.*/opcache.enable_cli=1/' "$PHP_INI_PATH" + sed -i 's/;*opcache.memory_consumption=.*/opcache.memory_consumption=128/' "$PHP_INI_PATH" + sed -i 's/;*opcache.revalidate_freq=.*/opcache.revalidate_freq=2/' "$PHP_INI_PATH" + sed -i 's/;*opcache.max_accelerated_files=.*/opcache.max_accelerated_files=4000/' "$PHP_INI_PATH" + + sed -i 's/;*expose_php = .*/expose_php = Off/' "$PHP_INI_PATH" + sed -i 's/;*display_errors = .*/display_errors = Off/' "$PHP_INI_PATH" + sed -i 's/;*log_errors = .*/log_errors = On/' "$PHP_INI_PATH" + + log_success "PHP.ini настроен ($PHP_INI_PATH)" + else + log_warning "Файл PHP.ini не найден по пути: $PHP_INI_PATH" + fi + + log_step "Создание конфигурации базы данных..." + if [ "$DISTRO_FAMILY" = "debian" ]; then + DB_SOCKET="/var/run/mysqld/mysqld.sock" + else + DB_SOCKET="/var/lib/mysql/mysql.sock" + fi + cat > "$WEBROOT/db_config.php" << EOF EOF - chown "$WEBSERVER_USER:$WEBSERVER_USER" "$WEBROOT/db_config.php" - chmod 600 "$WEBROOT/db_config.php" - - if ! sudo -u "$WEBSERVER_USER" test -r "$WEBROOT/db_config.php"; then - log_error "Веб-сервер не может читать db_config.php" + log_success "Конфигурация БД создана" + + chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/db_config.php" + chmod 644 "$WEBROOT/db_config.php" + + if sudo -u $WEBSERVER_USER test -r "$WEBROOT/db_config.php"; then + log_success "Веб-сервер может читать db_config.php" + else + log_error "Веб-сервер НЕ МОЖЕТ читать db_config.php" + fi + + if [ ! -f "$WEBROOT/db_config.php" ]; then + log_error "Не удалось создать файл db_config.php" exit 1 fi - - log_success "Конфигурация БД создана" -} -save_db_credentials() { - local db_password="$1" - local credentials_file="/root/.db_password" - - cat > "$credentials_file" << EOF -# Altcor Database Credentials -DB_HOST=localhost -DB_USER=root -DB_PASSWORD=$db_password -DB_NAME=ALTCor -DB_SOCKET=$DB_SOCKET -CREATED=$(date) -EOF - - chmod 600 "$credentials_file" - log_info "Учетные данные сохранены в $credentials_file" -} - -setup_web_application() { - log_step "Настройка веб-приложения..." - - find "$WEBROOT" -type f ! -name "db_config.php" -delete 2>/dev/null || true - - download_application_files - - create_htaccess_file - - setup_file_permissions -} - -download_application_files() { - local download_url="https://cloud.altcor.ru/setup/download.php" - - log_info "Загрузка файлов приложения..." - - if curl -f -L --max-time 30 -o "$WEBROOT/index.php" "$download_url" 2>/dev/null; then - if head -n 1 "$WEBROOT/index.php" | grep -q "/dev/null; then - log_success "Файлы приложения загружены" - return - fi + if ! sudo -u $WEBSERVER_USER test -r "$WEBROOT/db_config.php"; then + log_warning "Веб-сервер не может прочитать db_config.php, исправляем права..." + chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/db_config.php" + chmod 644 "$WEBROOT/db_config.php" fi - - log_warning "Не удалось загрузить файлы с $download_url, создаем резервную страницу" - create_fallback_index + + DOWNLOAD_URL="https://cloud.altcor.ru/setup/download.php" + TEMP_DOWNLOAD="/tmp/web_files_$(date +%s)" + + create_fallback_index() { + cat > "$WEBROOT/index.php" << 'EOF' +"; +echo ""; +echo ""; +echo ""; +echo ""; +echo "Сервер готов к работе"; +echo ""; +echo ""; +echo ""; +echo "
"; +echo "

Сервер готов к работе

"; +echo "
"; +echo "PHP " . phpversion() . " работает
"; +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 "
"; } -create_fallback_index() { - cat > "$WEBROOT/index.php" << 'EOF' - - - - - - - Altcor - Сервер готов - - - -
-

Altcor - Система готова

-
- PHP работает
- Время: -
-
✅ База данных подключена"; - } catch (PDOException $e) { - echo "info'>⚠️ БД: " . htmlspecialchars($e->getMessage()); - } - ?> -
-
- Установка завершена!
- Система готова для развертывания Altcor. -
-
- - +echo "
"; +echo "Диагностика конфигурации БД:
"; + +if (file_exists(__DIR__ . '/db_config.php')) { + echo "✓ Файл db_config.php существует
"; + echo "✓ Размер файла: " . filesize(__DIR__ . '/db_config.php') . " байт
"; + echo "✓ Права доступа: " . substr(sprintf('%o', fileperms(__DIR__ . '/db_config.php')), -4) . "
"; + + if (is_readable(__DIR__ . '/db_config.php')) { + echo "✓ Файл читаемый
"; + + try { + require_once __DIR__ . '/db_config.php'; + echo "✓ Файл успешно подключен
"; + echo "✓ DB_HOST: " . (defined('DB_HOST') ? DB_HOST : 'НЕ ОПРЕДЕЛЕН') . "
"; + echo "✓ DB_USER: " . (defined('DB_USER') ? DB_USER : 'НЕ ОПРЕДЕЛЕН') . "
"; + echo "✓ DB_NAME: " . (defined('DB_NAME') ? DB_NAME : 'НЕ ОПРЕДЕЛЕН') . "
"; + } catch (Exception $e) { + echo "✗ Ошибка подключения файла: " . htmlspecialchars($e->getMessage()) . "
"; + } + } else { + echo "✗ Файл НЕ читаемый
"; + } +} else { + 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 { + echo "
"; + echo "Не удалось загрузить конфигурацию БД"; + echo "
"; + } + + echo "
"; + echo ""; + echo ""; EOF -} + } + + log_step "Загрузка файлов приложения..." + find "$WEBROOT" -type f ! -name "db_config.php" -delete 2>/dev/null || true + + if curl -f -L --max-time 30 -o "$WEBROOT/index.php" "$DOWNLOAD_URL" 2>/dev/null; then + if ! head -n 1 "$WEBROOT/index.php" | grep -q "/dev/null; then + create_fallback_index + log_warning "Скачанный файл не является PHP-скриптом, создана резервная страница" + else + log_success "Файлы приложения загружены" + fi + else + create_fallback_index + log_warning "Не удалось загрузить файл с $DOWNLOAD_URL, создана резервная страница" + fi + + log_step "Настройка прав доступа к файлам..." + chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/index.php" + chmod 644 "$WEBROOT/db_config.php" + chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/db_config.php" -create_htaccess_file() { - log_info "Создание .htaccess файла..." - cat > "$WEBROOT/.htaccess" << 'EOF' -# Altcor .htaccess Configuration -# Безопасность - + Require all denied - + Require all denied -# Сжатие AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml -# Кэширование ExpiresActive On ExpiresByType image/jpg "access plus 1 month" @@ -1268,286 +973,394 @@ create_htaccess_file() { ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" - ExpiresByType image/webp "access plus 1 month" ExpiresByType text/css "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" ExpiresByType text/javascript "access plus 1 month" - ExpiresByType font/woff "access plus 1 month" - ExpiresByType font/woff2 "access plus 1 month" -# Заголовки безопасности Header always set X-Content-Type-Options nosniff - Header always set X-Frame-Options SAMEORIGIN + Header always set X-Frame-Options DENY Header always set X-XSS-Protection "1; mode=block" - Header always set Referrer-Policy "strict-origin-when-cross-origin" -# URL Rewriting RewriteEngine On # RewriteCond %{REQUEST_FILENAME} !-f # RewriteCond %{REQUEST_FILENAME} !-d # RewriteRule ^(.*)$ index.php [QSA,L] EOF -} -setup_file_permissions() { - log_info "Настройка прав доступа к файлам..." - - chown -R "$WEBSERVER_USER:$WEBSERVER_USER" "$WEBROOT" - - find "$WEBROOT" -type d -exec chmod 755 {} \; - find "$WEBROOT" -type f -exec chmod 644 {} \; - + chown -R $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT" + chmod -R 755 "$WEBROOT" + chmod 644 "$WEBROOT/.htaccess" 2>/dev/null || true chmod 600 "$WEBROOT/db_config.php" - log_success "Права доступа настроены" -} -start_services() { - log_step "Запуск и включение сервисов..." - - local services_to_restart="" - local services_to_enable="" - + log_step "Настройка базы данных MariaDB..." + + if ! systemctl is-active --quiet mariadb; then + log_error "MariaDB не запущен. Попытка запуска..." + systemctl start mariadb + sleep 3 + + if ! systemctl is-active --quiet mariadb; then + log_error "Не удалось запустить MariaDB" + exit 1 + fi + fi + + log_info "Выполнение базовой настройки безопасности MariaDB..." + + if mysql -u root -e "SELECT 1;" >/dev/null 2>&1; then + log_info "Первичная настройка MariaDB (подключение без пароля доступно)..." + + MYSQL_SECURE_SCRIPT="/tmp/mysql_secure_$(date +%s).sql" + cat > "$MYSQL_SECURE_SCRIPT" << MYSQL_SCRIPT +-- Устанавливаем пароль для root +ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_PASSWORD'; + +-- Удаляем анонимных пользователей +DELETE FROM mysql.user WHERE User=''; + +-- Удаляем root-доступ с удаленных хостов +DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); + +-- Удаляем тестовую базу данных +DROP DATABASE IF EXISTS test; +DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; + +-- Создаем нашу базу данных +CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- Даем права на новую базу данных +GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost'; + +-- Применяем изменения +FLUSH PRIVILEGES; +MYSQL_SCRIPT + + if mysql -u root < "$MYSQL_SECURE_SCRIPT" >/dev/null 2>&1; then + log_success "Первичная настройка MariaDB выполнена успешно" + else + log_error "Не удалось выполнить первичную настройку MariaDB" + rm -f "$MYSQL_SECURE_SCRIPT" + exit 1 + fi + rm -f "$MYSQL_SECURE_SCRIPT" + + elif mysql -u root -p"$DB_PASSWORD" -e "SELECT 1;" >/dev/null 2>&1; then + log_info "MariaDB уже настроен с текущим паролем..." + + MYSQL_UPDATE_SCRIPT="/tmp/mysql_update_$(date +%s).sql" + cat > "$MYSQL_UPDATE_SCRIPT" << MYSQL_SCRIPT +CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost'; +FLUSH PRIVILEGES; +MYSQL_SCRIPT + + if mysql -u root -p"$DB_PASSWORD" < "$MYSQL_UPDATE_SCRIPT" >/dev/null 2>&1; then + log_success "База данных ALTCor создана/обновлена" + else + log_error "Не удалось обновить базу данных" + rm -f "$MYSQL_UPDATE_SCRIPT" + exit 1 + fi + rm -f "$MYSQL_UPDATE_SCRIPT" + + else + log_error "Не удалось подключиться к MariaDB ни с пустым паролем, ни с текущим паролем" + log_info "Попытка сброса пароля root в MariaDB..." + + systemctl stop mariadb + + mysqld_safe --skip-grant-tables --skip-networking & + MYSQLD_SAFE_PID=$! + + sleep 5 + + MYSQL_RESET_SCRIPT="/tmp/mysql_reset_$(date +%s).sql" + cat > "$MYSQL_RESET_SCRIPT" << MYSQL_SCRIPT +USE mysql; +UPDATE user SET password=PASSWORD('$DB_PASSWORD') WHERE User='root'; +UPDATE user SET plugin='mysql_native_password' WHERE User='root'; +FLUSH PRIVILEGES; +MYSQL_SCRIPT + + if mysql -u root < "$MYSQL_RESET_SCRIPT" >/dev/null 2>&1; then + log_info "Пароль root сброшен" + + kill $MYSQLD_SAFE_PID 2>/dev/null || true + sleep 2 + killall mysqld_safe 2>/dev/null || true + killall mysqld 2>/dev/null || true + sleep 3 + + systemctl start mariadb + sleep 3 + + if systemctl is-active --quiet mariadb && mysql -u root -p"$DB_PASSWORD" -e "SELECT 1;" >/dev/null 2>&1; then + MYSQL_FINAL_SCRIPT="/tmp/mysql_final_$(date +%s).sql" + cat > "$MYSQL_FINAL_SCRIPT" << MYSQL_SCRIPT +CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost'; +FLUSH PRIVILEGES; +MYSQL_SCRIPT + + if mysql -u root -p"$DB_PASSWORD" < "$MYSQL_FINAL_SCRIPT" >/dev/null 2>&1; then + log_success "MariaDB настроен после сброса пароля" + else + log_error "Не удалось создать базу данных после сброса пароля" + exit 1 + fi + rm -f "$MYSQL_FINAL_SCRIPT" + else + log_error "MariaDB не запустился после сброса пароля" + exit 1 + fi + else + log_error "Не удалось сбросить пароль root в MariaDB" + kill $MYSQLD_SAFE_PID 2>/dev/null || true + exit 1 + fi + rm -f "$MYSQL_RESET_SCRIPT" + fi + + log_success "База данных настроена" + + log_step "Проверка конфигурации Apache..." if [ "$DISTRO_FAMILY" = "debian" ]; then - services_to_restart="apache2 mariadb" - services_to_enable="apache2 mariadb" - else - services_to_restart="$PHP_FPM_SERVICE httpd mariadb" - services_to_enable="$PHP_FPM_SERVICE httpd mariadb" - fi - - if systemctl list-unit-files | grep -q "redis-server.service"; then - services_to_restart="$services_to_restart redis-server" - services_to_enable="$services_to_enable redis-server" - elif systemctl list-unit-files | grep -q "redis.service"; then - services_to_restart="$services_to_restart redis" - services_to_enable="$services_to_enable redis" - fi - - for service in $services_to_restart; do - if safe_execute "Перезапуск $service" systemctl restart "$service"; then - log_success "$service перезапущен" - else - log_error "Не удалось перезапустить $service" + if ! apache2ctl configtest >/dev/null 2>&1; then + log_error "Конфигурация Apache содержит ошибки." + apache2ctl configtest + exit 1 fi - done - - for service in $services_to_enable; do - safe_execute "Включение $service в автозагрузку" systemctl enable "$service" || true - done - - log_success "Все сервисы настроены" -} + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + if ! httpd -t >/dev/null 2>&1; then + log_error "Конфигурация Apache (httpd) содержит ошибки." + httpd -t + exit 1 + fi + fi + log_success "Конфигурация Apache проверена" -final_verification() { - log_step "Финальная проверка работоспособности..." - - local errors=0 - - if ! systemctl is-active --quiet "$WEBSERVER_SERVICE"; then - log_error "Веб-сервер ($WEBSERVER_SERVICE) не запущен" - ((errors++)) - else - log_success "Веб-сервер работает" + log_step "Запуск и включение сервисов..." + + if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then + log_info "Настройка SELinux..." + setsebool -P httpd_can_network_connect 1 >/dev/null 2>&1 || true + setsebool -P httpd_execmem 1 >/dev/null 2>&1 || true + semanage fcontext -a -t httpd_exec_t "/var/opt/remi/php83/run/php-fpm/www.sock" >/dev/null 2>&1 || true + restorecon -R /var/www/html >/dev/null 2>&1 || true + restorecon -R /var/opt/remi/php83/run/php-fpm/ >/dev/null 2>&1 || true fi - - if [ "$DISTRO_FAMILY" = "rhel" ] && [ -n "$PHP_FPM_SERVICE" ]; then - if ! systemctl is-active --quiet "$PHP_FPM_SERVICE"; then - log_error "PHP-FPM ($PHP_FPM_SERVICE) не запущен" - ((errors++)) - else - log_success "PHP-FPM работает" + + if [ "$DISTRO_FAMILY" = "debian" ]; then + systemctl restart apache2 >/dev/null 2>&1 + systemctl enable apache2 >/dev/null 2>&1 + WEBSERVER_SERVICE="apache2" + + elif [ "$DISTRO_FAMILY" = "rhel" ]; then + if [ "$DISTRO" != "fedora" ]; then + log_info "Запуск PHP-FPM..." + systemctl stop php83-php-fpm >/dev/null 2>&1 || true + systemctl start php83-php-fpm >/dev/null 2>&1 + systemctl enable php83-php-fpm >/dev/null 2>&1 + + sleep 3 + + if ! systemctl is-active --quiet php83-php-fpm; then + log_error "PHP-FPM не запустился" + systemctl status php83-php-fpm --no-pager -l + exit 1 + fi fi + + systemctl restart httpd >/dev/null 2>&1 + systemctl enable httpd >/dev/null 2>&1 + WEBSERVER_SERVICE="httpd" fi - + + systemctl restart mariadb >/dev/null 2>&1 + systemctl restart redis-server >/dev/null 2>&1 || systemctl restart redis >/dev/null 2>&1 || true + + systemctl enable mariadb >/dev/null 2>&1 + systemctl enable redis-server >/dev/null 2>&1 || systemctl enable redis >/dev/null 2>&1 || true + + log_success "Все сервисы запущены и добавлены в автозагрузку" + + log_step "Настройка брандмауэра..." + if command -v ufw >/dev/null 2>&1 && ufw status | grep -q "Status: active"; then + log_info "Открываем порт 80 в UFW..." + ufw allow 80/tcp >/dev/null 2>&1 || true + elif command -v firewall-cmd >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then + log_info "Открываем порт 80 в firewalld..." + firewall-cmd --permanent --add-service=http >/dev/null 2>&1 || true + firewall-cmd --reload >/dev/null 2>&1 || true + elif command -v iptables >/dev/null 2>&1; then + log_info "Открываем порт 80 в iptables..." + iptables -I INPUT -p tcp --dport 80 -j ACCEPT >/dev/null 2>&1 || true + fi + log_success "Брандмауэр настроен" + + log_step "Финальная проверка работоспособности..." + if ! systemctl is-active --quiet $WEBSERVER_SERVICE; then + log_error "Веб-сервер не запущен" + systemctl status $WEBSERVER_SERVICE --no-pager -l + exit 1 + fi + if ! systemctl is-active --quiet mariadb; then log_error "MariaDB не запущен" - ((errors++)) - else - log_success "MariaDB работает" + exit 1 fi - - if ! php -r "echo 'PHP OK';" >/dev/null 2>&1; then - log_error "PHP не работает корректно" - ((errors++)) - else - log_success "PHP работает корректно" - fi - - if [ -f "$WEBROOT/db_config.php" ]; then - if php -r " - require '$WEBROOT/db_config.php'; - try { - \$pdo = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET, DB_USER, DB_PASS); - echo 'DB OK'; - } catch (Exception \$e) { - exit(1); - } - " >/dev/null 2>&1; then - log_success "Подключение к базе данных работает" - else - log_error "Не удается подключиться к базе данных" - ((errors++)) - fi - else - log_error "Файл конфигурации БД не найден" - ((errors++)) - fi - - if [ $errors -eq 0 ]; then - log_success "Все компоненты работают корректно" - return 0 - else - log_error "Обнаружено $errors ошибок в работе системы" - return 1 - fi -} -show_final_info() { - local db_password="$1" - local ip_addr=$(hostname -I | awk '{print $1}' 2>/dev/null || echo "N/A") - + PHP_WORKS=false + if php -r "echo phpversion();" >/dev/null 2>&1; then + PHP_WORKS=true + elif [ -f "/opt/remi/php83/root/usr/bin/php" ] && /opt/remi/php83/root/usr/bin/php -r "echo phpversion();" >/dev/null 2>&1; then + PHP_WORKS=true + fi + + if [ "$PHP_WORKS" = false ]; then + log_error "PHP не работает корректно" + exit 1 + fi + + if [ "$DISTRO_FAMILY" = "rhel" ] && [ "$DISTRO" != "fedora" ]; then + if ! systemctl is-active --quiet php83-php-fpm; then + log_error "PHP-FPM не запущен" + systemctl status php83-php-fpm --no-pager -l + exit 1 + fi + + if [ ! -S "/var/opt/remi/php83/run/php-fpm/www.sock" ]; then + log_warning "Сокет PHP-FPM не найден" + ls -la /var/opt/remi/php83/run/php-fpm/ 2>/dev/null || true + fi + fi + + if ! mysql -u root -p"$DB_PASSWORD" -e "USE ALTCor; SELECT 1;" >/dev/null 2>&1; then + log_error "Не удается подключиться к базе данных ALTCor" + exit 1 + fi + + cat > "$WEBROOT/test.php" << 'EOF' + +EOF + chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/test.php" + + sleep 2 + if curl -s "http://localhost/test.php" 2>/dev/null | grep -q "PHP.*работает"; then + log_success "PHP работает через веб-сервер" + rm -f "$WEBROOT/test.php" + else + log_warning "Не удается проверить работу PHP через веб-сервер" + log_info "Проверьте вручную: curl http://localhost/test.php" + fi + + log_success "Все компоненты работают корректно" + + log_step "Сохранение учетных данных..." + DB_CREDENTIALS_FILE="/root/.db_password" + cat > "$DB_CREDENTIALS_FILE" << EOF + +DB_HOST=localhost +DB_USER=root +DB_PASSWORD=$DB_PASSWORD +DB_NAME=ALTCor +EOF + + chmod 600 "$DB_CREDENTIALS_FILE" + log_info "Учетные данные сохранены в $DB_CREDENTIALS_FILE" + + ALL_IPS=$(hostname -I | tr ' ' '\n' | grep -v '^$' | head -5) + EXTERNAL_IP=$(curl -s ifconfig.me 2>/dev/null || echo "недоступен") + echo "" if [ "$REINSTALL" = true ]; then - log_success "Переустановка Altcor успешно завершена" + log_success "Переустановка Altcor успешно завершена." else - log_success "Установка Altcor успешно завершена" + log_success "Установка Altcor успешно завершена." fi echo "" - echo -e "${CYAN}Доступ к сайту:${NC}" + echo " Доступ к сайту:" echo " • http://localhost/" - echo " • http://$ip_addr/" + while IFS= read -r ip; do + [ -n "$ip" ] && echo " • http://$ip/" + done <<< "$ALL_IPS" + if [ "$EXTERNAL_IP" != "недоступен" ] && [ "$EXTERNAL_IP" != "" ]; then + echo " • http://$EXTERNAL_IP/ (внешний IP)" + fi echo "" - echo -e "${CYAN}Доступ к БД:${NC}" + echo " Доступ к БД:" echo " • Хост: localhost" echo " • Логин: root" - echo " • Пароль: $db_password" + echo " • Пароль: $DB_PASSWORD" echo " • База данных: ALTCor" echo "" - echo -e "${CYAN}Расположение файлов:${NC}" + echo " Расположение файлов:" echo " • Веб-корень: $WEBROOT" echo " • Конфигурация БД: $WEBROOT/db_config.php" echo " • Логи Apache: /var/log/apache2/ или /var/log/httpd/" - echo " • Лог установки: $LOG_FILE" echo "" - echo -e "${CYAN}Дополнительная информация:${NC}" - echo " • Учетные данные БД: /root/.db_password" - echo " • Для удаления: $0 -u" - echo " • Для переустановки: $0 -r" - echo "" - echo -e "${GREEN}Система готова к работе!${NC}" - echo "==============================================================" + echo " Дополнительная информация:" + echo " • Учетные данные БД: $DB_CREDENTIALS_FILE" + echo " • Для удаления: ./install.sh -u" + echo " • Для переустановки: ./install.sh -r" echo "" } -proceed_with_installation() { - echo "" - echo "Начинаем установку Altcor..." - echo "" - - update_system - - setup_php_repositories - - install_components - - configure_apache_php - - local db_password - db_password=$(configure_database) - - setup_web_application - - start_services - - if final_verification; then - show_final_info "$db_password" - else - log_error "Установка завершена с ошибками. Проверьте лог: $LOG_FILE" - exit 1 +if [[ $EUID -ne 0 ]]; then + log_error "Запустите этот скрипт вместе с sudo." + exit 1 +fi + +if [ -f /etc/os-release ]; then + . /etc/os-release + DISTRO="$ID" + FAMILY="$ID_LIKE" +else + log_error "Не удалось определить дистрибутив." + exit 1 +fi + +if echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then + PKG_MANAGER="apt" + DISTRO_FAMILY="debian" +elif echo "$DISTRO $FAMILY" | grep -qi "rhel\|centos\|fedora"; then + PKG_MANAGER="dnf" + DISTRO_FAMILY="rhel" + if ! command -v dnf >/dev/null 2>&1; then + PKG_MANAGER="yum" fi -} +else + log_error "Ваш дистрибутив '$DISTRO' не поддерживается. Поддерживаются: Debian/Ubuntu, CentOS/RHEL/Fedora." + exit 1 +fi -handle_existing_installation() { - local need_reinstall=$1 +if [ "$UNINSTALL" = true ]; then + full_uninstall +elif [ "$REINSTALL" = true ]; then + echo "" + log_step "Начинаем переустановку Altcor..." + echo "" - if [ $need_reinstall -eq 0 ]; then + full_uninstall + + proceed_with_installation +else + check_result=0 + check_existing_installation || check_result=$? + + if [ $check_result -eq 1 ]; then if [ "$REINSTALL" = true ]; then - log_warning "Обнаружена существующая установка. Начинаем переустановку..." - return 1 - else - log_success "Все компоненты уже установлены и работают корректно" - echo "" - echo -e "${YELLOW}Altcor уже полностью установлен и функционирует.${NC}" - echo "" - read -p "Хотите переустановить систему? [y/n]: " -n 1 -r - echo "" - if [[ $REPLY =~ ^[Yy]$ ]]; then - log_info "Начинаем переустановку по запросу пользователя..." - REINSTALL=true - return 1 - else - echo "" - log_info "Переустановка отменена. Система остается без изменений." - echo "" - echo "Для принудительной переустановки используйте: $0 -r" - echo "" - exit 0 - fi + full_uninstall fi - else - log_warning "Обнаружены проблемы с установленными компонентами." - echo "" - read -p "Хотите переустановить всю систему? [y/n]: " -n 1 -r - echo "" - if [[ $REPLY =~ ^[Yy]$ ]]; then - log_info "Начинаем полную переустановку..." - REINSTALL=true - return 1 - else - log_info "Продолжаем обычную установку/обновление компонентов..." - return 0 - fi - fi -} - -main() { - log_to_file "Начало установки Altcor $(date)" - - check_root - - detect_distro - - if [ "$UNINSTALL" = true ]; then - full_uninstall - elif [ "$REINSTALL" = true ]; then - echo "" - log_step "Начинаем переустановку Altcor..." - echo "" - full_uninstall proceed_with_installation - else - local check_result=0 - check_existing_installation || check_result=$? - - local action_result=0 - handle_existing_installation $check_result || action_result=$? - - if [ $action_result -eq 1 ]; then - if [ "$REINSTALL" = true ]; then - full_uninstall - fi - proceed_with_installation - elif [ $action_result -eq 0 ]; then - proceed_with_installation - fi + elif [ $check_result -eq 0 ]; then + proceed_with_installation fi - - log_to_file "=== Завершение установки Altcor $(date) ===" -} - -trap 'log_error "Установка прервана пользователем"; exit 130' INT TERM -main "$@" \ No newline at end of file +fi \ No newline at end of file