#!/bin/bash clear set -e UNINSTALL=false REINSTALL=false while getopts ":ur" opt; do case $opt in u) UNINSTALL=true ;; r) REINSTALL=true ;; \?) echo -e "${RED}[Ошибка]${NC} Неизвестный параметр: -$OPTARG" >&2 echo "Использование: $0 [-u] [-r]" echo " -u Полное удаление" echo " -r Переустановка (удаление + установка)" exit 1 ;; esac done 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() { openssl rand -base64 32 | tr -d "=+/" | cut -c1-16 } check_component() { local component=$1 local command_check=$2 local service_check=$3 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 else return 1 fi else return 0 fi else return 2 fi } check_existing_installation() { log_step "Проверка существующей установки..." local apache_status=2 php_status=2 mariadb_status=2 redis_status=2 local need_reinstall=false log_info "Проверка Apache..." if [ "$DISTRO_FAMILY" = "debian" ]; then if command -v apache2 >/dev/null 2>&1; then 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 if systemctl is-active --quiet httpd 2>/dev/null; then apache_status=0 else apache_status=1 fi else apache_status=2 fi fi log_info "Проверка PHP..." if command -v php >/dev/null 2>&1; then php_status=0 else php_status=2 fi log_info "Проверка MariaDB..." if command -v mysql >/dev/null 2>&1; then if systemctl is-active --quiet mariadb 2>/dev/null; then mariadb_status=0 else mariadb_status=1 fi else mariadb_status=2 fi log_info "Проверка Redis..." 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 "" case $apache_status in 0) echo -e "Apache: ${GREEN}Установлен и работает${NC}" ;; 1) echo -e "Apache: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;; 2) echo -e "Apache: ${RED}Не установлен${NC}"; need_reinstall=true ;; 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 "неизвестно") if [[ "$php_version" == "8.3" ]]; then echo -e "PHP: ${GREEN}Установлен (версия $php_version)${NC}" else echo -e "PHP: ${YELLOW}Установлен (версия $php_version, требуется 8.3)${NC}" need_reinstall=true fi ;; 2) echo -e "PHP: ${RED}Не установлен${NC}"; need_reinstall=true ;; esac case $mariadb_status in 0) echo -e "MariaDB: ${GREEN}Установлен и работает${NC}" ;; 1) echo -e "MariaDB: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;; 2) echo -e "MariaDB: ${RED}Не установлен${NC}"; need_reinstall=true ;; esac case $redis_status in 0) echo -e "Redis: ${GREEN}Установлен и работает${NC}" ;; 1) echo -e "Redis: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;; 2) echo -e "Redis: ${RED}Не установлен${NC}"; need_reinstall=true ;; esac if [ -f "/var/www/html/db_config.php" ]; then echo -e "Конфигурация БД: ${GREEN}Найдена${NC}" else echo -e "Конфигурация БД: ${RED}Не найдена${NC}" need_reinstall=true fi echo "" if [ "$need_reinstall" = false ] && [ "$apache_status" -eq 0 ] && [ "$php_status" -eq 0 ] && [ "$mariadb_status" -eq 0 ]; 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 fi else if [ "$need_reinstall" = true ]; then 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 else log_info "Обнаружены отсутствующие компоненты. Продолжаем установку..." return 0 fi fi } full_uninstall() { log_step "Начинаем полное удаление Altcor..." log_info "Остановка сервисов..." 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 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 apt purge -y nginx* apache2* php* mariadb* mysql* redis* 2>/dev/null || true apt autoremove -y 2>/dev/null || true else $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 2>/dev/null || true log_success "Полное удаление завершено." if [ "$REINSTALL" = false ]; then exit 0 else log_info "Переустановка: удаление завершено, продолжаем установку..." echo "" fi } 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 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 "Старые пакеты удалены" 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 "Добавление PPA ondrej/php..." if ! add-apt-repository ppa:ondrej/php -y >/dev/null 2>&1; then log_error "Не удалось добавить PPA ondrej/php." exit 1 fi 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 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 dnf module reset php -y >/dev/null 2>&1 || true dnf module enable php:remi-8.3 -y >/dev/null 2>&1 || true fi 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 log_step "Установка Apache..." if [ "$DISTRO_FAMILY" = "debian" ]; then 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 log_success "Apache установлен" log_step "Установка 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 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 log_info "Запуск MariaDB..." systemctl start mariadb >/dev/null 2>&1 systemctl enable mariadb >/dev/null 2>&1 log_info "Ожидание полного запуска MariaDB..." sleep 5 if ! systemctl is-active --quiet mariadb; then log_error "MariaDB не смог запуститься" exit 1 fi log_success "MariaDB установлен и запущен" log_step "Установка дополнительных компонентов (Redis, LibreOffice, Java)..." if [ "$DISTRO_FAMILY" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive 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_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 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 пакеты. Подробности:" 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 # Определяем, какие пакеты 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-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 пакеты. Подробности:" $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 и модулей..." if [ "$DISTRO_FAMILY" = "debian" ]; then 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 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/altcor.conf" WEBSERVER_USER="apache" # Отключаем старые конфигурации PHP и mod_php rm -f /etc/httpd/conf.d/php.conf /etc/httpd/conf.modules.d/*php*.conf # Определяем, какой PHP-FPM сервис и путь к конфигурации использовать if [ -f "/etc/opt/remi/php83/php-fpm.d/www.conf" ]; then 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-fpm.d/www.conf" ]; then PHP_FPM_CONF="/etc/php-fpm.d/www.conf" PHP_FPM_SERVICE="php-fpm" SOCKET_PATH="/run/php-fpm/www.sock" else log_error "Не найден конфигурационный файл PHP-FPM" exit 1 fi # Создаем конфигурацию только для PHP-FPM (без mod_php) cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF' # PHP-FPM configuration for Apache # ВАЖНО: НЕ загружаем mod_php - используем только PHP-FPM # Базовые модули Apache (проверяем, не загружены ли уже) 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_PLACEHOLDER|fcgi://localhost" # Настройки директивы для улучшения производительности ProxyTimeout 300 ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:SOCKET_PATH_PLACEHOLDER|fcgi://localhost/var/www/html/ EOF # Заменяем плейсхолдер на реальный путь к сокету sed -i "s|SOCKET_PATH_PLACEHOLDER|$SOCKET_PATH|g" "/etc/httpd/conf.d/php-fpm.conf" log_info "Настройка PHP-FPM..." # Создаем резервную копию конфигурации cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)" # Настраиваем PHP-FPM pool 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" # Настраиваем производительность PHP-FPM 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" # Создаем директорию для socket SOCKET_DIR=$(dirname "$SOCKET_PATH") mkdir -p "$SOCKET_DIR" chown apache:apache "$SOCKET_DIR" # Запускаем и включаем PHP-FPM systemctl start $PHP_FPM_SERVICE >/dev/null 2>&1 systemctl enable $PHP_FPM_SERVICE >/dev/null 2>&1 if ! systemctl is-active --quiet $PHP_FPM_SERVICE; then log_error "PHP-FPM не удалось запустить" systemctl status $PHP_FPM_SERVICE --no-pager -l exit 1 fi log_success "PHP-FPM настроен и запущен" fi cat > "/etc/httpd/conf.d/altcor.conf" << 'EOF' # Altcor main configuration # Отключаем информацию о сервере для безопасности ServerTokens Prod ServerSignature Off # Основные настройки директории 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 "^Mozilla/4\.[0678]" 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/ico "access plus 1 month" ExpiresByType image/x-icon "access plus 1 month" # CSS и JS 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" # HTML и PHP - без кэширования 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 Require all denied # Запрет доступа к директориям .git и подобным Require all denied # Дополнительная защита от выполнения скриптов в uploads Require all denied Require all denied Require all denied Require all denied Require all denied Require all denied Require all denied EOF fi log_success "Модули Apache настроены" log_step "Создание конфигурации виртуального хоста..." mkdir -p "$WEBROOT" # Для Debian/Ubuntu создаем стандартный VirtualHost if [ "$DISTRO_FAMILY" = "debian" ]; then cat > "$APACHE_CONF" < DocumentRoot $WEBROOT ServerName localhost ServerAlias www.localhost Options -Indexes +FollowSymLinks AllowOverride All Require all granted 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 SetHandler application/x-httpd-php 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 \${APACHE_LOG_DIR}/error.log CustomLog \${APACHE_LOG_DIR}/access.log combined EOF fi log_success "Конфигурация виртуального хоста создана" 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 PHP_INI_PATH="/etc/opt/remi/php83/php.ini" [ ! -f "$PHP_INI_PATH" ] && PHP_INI_PATH="/etc/php.ini" fi fi 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 настроен" 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 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 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 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 "
"; // Диагностика конфигурации БД 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" cat > "$WEBROOT/.htaccess" << 'EOF' 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" 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" Header always set X-Content-Type-Options nosniff Header always set X-Frame-Options DENY Header always set X-XSS-Protection "1; mode=block" RewriteEngine On # RewriteCond %{REQUEST_FILENAME} !-f # RewriteCond %{REQUEST_FILENAME} !-d # RewriteRule ^(.*)$ index.php [QSA,L] EOF 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 "Права доступа настроены" 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 if ! apache2ctl configtest >/dev/null 2>&1; then log_error "Конфигурация Apache содержит ошибки." apache2ctl configtest # Показываем ошибки для диагностики exit 1 fi WEBSERVER_SERVICE="apache2" elif [ "$DISTRO_FAMILY" = "rhel" ]; then # Для Rocky Linux/RHEL сначала проверим синтаксис конфигурации if ! httpd -t >/dev/null 2>&1; then log_error "Конфигурация Apache (httpd) содержит ошибки:" echo "" httpd -t # Показываем детали ошибок echo "" log_info "Попытка исправления..." # Проверяем наличие основных модулей if ! httpd -M 2>/dev/null | grep -q "rewrite_module"; then echo "LoadModule rewrite_module modules/mod_rewrite.so" >> /etc/httpd/conf.d/altcor.conf fi # Повторная проверка if ! httpd -t >/dev/null 2>&1; then log_error "Не удалось исправить конфигурацию Apache:" httpd -t exit 1 else log_success "Конфигурация исправлена" fi fi WEBSERVER_SERVICE="httpd" fi log_success "Конфигурация Apache проверена" log_step "Запуск и включение сервисов..." if [ "$DISTRO_FAMILY" = "debian" ]; then systemctl restart apache2 >/dev/null 2>&1 systemctl enable apache2 >/dev/null 2>&1 elif [ "$DISTRO_FAMILY" = "rhel" ]; then # Сначала запускаем PHP-FPM, потом Apache if [ -n "$PHP_FPM_SERVICE" ]; then systemctl restart $PHP_FPM_SERVICE >/dev/null 2>&1 systemctl enable $PHP_FPM_SERVICE >/dev/null 2>&1 fi systemctl restart httpd >/dev/null 2>&1 systemctl enable httpd >/dev/null 2>&1 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 "Все сервисы запущены и добавлены в автозагрузку" # В секции финальной проверки добавьте проверку PHP-FPM: log_step "Финальная проверка работоспособности..." if ! systemctl is-active --quiet $WEBSERVER_SERVICE; then log_error "Веб-сервер не запущен" exit 1 fi if [ "$DISTRO_FAMILY" = "rhel" ] && [ -n "$PHP_FPM_SERVICE" ]; then if ! systemctl is-active --quiet $PHP_FPM_SERVICE; then log_error "PHP-FPM не запущен" exit 1 fi fi if ! systemctl is-active --quiet mariadb; then log_error "MariaDB не запущен" exit 1 fi if ! php -r "echo phpversion();" >/dev/null 2>&1; then log_error "PHP не работает корректно" exit 1 fi if ! mysql -u root -p"$DB_PASSWORD" -e "USE ALTCor; SELECT 1;" >/dev/null 2>&1; then log_error "Не удается подключиться к базе данных ALTCor" exit 1 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" IP_ADDR=$(hostname -I | awk '{print $1}') echo "" if [ "$REINSTALL" = true ]; then log_success "Переустановка Altcor успешно завершена." else log_success "Установка Altcor успешно завершена." fi echo "" echo " Доступ к сайту:" echo " • http://localhost/" echo " • http://$IP_ADDR/" echo "" echo " Доступ к БД:" echo " • Хост: localhost" echo " • Логин: root" echo " • Пароль: $DB_PASSWORD" echo " • База данных: ALTCor" echo "" echo " Расположение файлов:" echo " • Веб-корень: $WEBROOT" echo " • Конфигурация БД: $WEBROOT/db_config.php" echo " • Логи Apache: /var/log/apache2/ или /var/log/httpd/" echo "" echo " Дополнительная информация:" echo " • Учетные данные БД: $DB_CREDENTIALS_FILE" echo " • Для удаления: ./install.sh -u" echo " • Для переустановки: ./install.sh -r" echo "" } 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 if [ "$UNINSTALL" = true ]; then full_uninstall elif [ "$REINSTALL" = true ]; then echo "" log_step "Начинаем переустановку Altcor..." echo "" full_uninstall proceed_with_installation else check_result=0 check_existing_installation || check_result=$? if [ $check_result -eq 1 ]; then if [ "$REINSTALL" = true ]; then full_uninstall fi proceed_with_installation elif [ $check_result -eq 0 ]; then proceed_with_installation fi