#!/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 } cleanup_apache_config() { log_info "Очистка конфигурации Apache от дубликатов..." if [ "$DISTRO_FAMILY" = "debian" ]; then if [ -f /etc/apache2/ports.conf ]; then cp /etc/apache2/ports.conf /etc/apache2/ports.conf.backup.$(date +%Y%m%d_%H%M%S) # Удаляем все Listen директивы для порта 80 grep -v "^Listen\s\+.*:80$" /etc/apache2/ports.conf > /etc/apache2/ports.conf.tmp || true grep -v "^Listen\s\+80$" /etc/apache2/ports.conf.tmp > /etc/apache2/ports.conf.tmp2 || true # Добавляем одну Listen директиву echo "Listen *:80" >> /etc/apache2/ports.conf.tmp2 mv /etc/apache2/ports.conf.tmp2 /etc/apache2/ports.conf rm -f /etc/apache2/ports.conf.tmp fi elif [ "$DISTRO_FAMILY" = "rhel" ]; then HTTPD_CONF="/etc/httpd/conf/httpd.conf" if [ -f "$HTTPD_CONF" ]; then cp "$HTTPD_CONF" "${HTTPD_CONF}.backup.$(date +%Y%m%d_%H%M%S)" # Удаляем все Listen директивы для порта 80 grep -v "^Listen.*:80$" "$HTTPD_CONF" > "${HTTPD_CONF}.tmp" || true grep -v "^Listen 80$" "${HTTPD_CONF}.tmp" > "${HTTPD_CONF}.tmp2" || true # Добавляем одну Listen директиву echo "Listen 80" >> "${HTTPD_CONF}.tmp2" mv "${HTTPD_CONF}.tmp2" "$HTTPD_CONF" rm -f "${HTTPD_CONF}.tmp" fi # Также очищаем PHP-FPM конфигурацию от дублирующихся модулей if [ -f "/etc/httpd/conf.d/php-fpm.conf" ]; then log_info "Очистка PHP-FPM конфигурации от LoadModule директив..." cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF' SetHandler "proxy:unix:/var/opt/remi/php83/run/php-fpm/www.sock|fcgi://localhost" DirectoryIndex index.php index.html index.htm Require all granted EOF fi fi log_success "Конфигурация Apache очищена от дубликатов" } 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 altcor_installed=false local components_installed=false 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 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 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 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 nginx_installed=false if command -v nginx >/dev/null 2>&1; then nginx_installed=true components_installed=true fi 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}" ;; 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 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 "" log_info "Начинаем чистую установку Altcor..." return 0 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 "На