diff --git a/install.sh b/install.sh index 8ad22dd..d5bcf9e 100644 --- a/install.sh +++ b/install.sh @@ -2,13 +2,11 @@ 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' @@ -16,7 +14,6 @@ BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' -# Обработка параметров командной строки while getopts ":ur" opt; do case $opt in u) UNINSTALL=true ;; @@ -31,7 +28,6 @@ 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"; } @@ -39,17 +35,14 @@ 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"; } -# Генерация безопасного пароля generate_password() { if command -v openssl >/dev/null 2>&1; then openssl rand -base64 32 | tr -d "=+/" | cut -c1-16 else - # Fallback для систем без openssl head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 fi } -# Проверка прав администратора check_root() { if [[ $EUID -ne 0 ]]; then log_error "Запустите этот скрипт с правами администратора (sudo)." @@ -57,7 +50,6 @@ check_root() { fi } -# Определение дистрибутива detect_distro() { if [ -f /etc/os-release ]; then source /etc/os-release @@ -92,7 +84,6 @@ detect_distro() { PKG_MANAGER="yum" fi - # Определяем путь к PHP INI для RHEL семейства 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" @@ -113,7 +104,6 @@ detect_distro() { log_info "Обнаружен дистрибутив: $DISTRO ($DISTRO_FAMILY)" } -# Функция для безопасного выполнения команд safe_execute() { local description="$1" shift @@ -129,7 +119,6 @@ safe_execute() { fi } -# Проверка статуса компонента check_component_status() { local component=$1 local command_check=$2 @@ -138,26 +127,24 @@ check_component_status() { if command -v "$command_check" >/dev/null 2>&1; then if [[ -n "$service_check" ]]; then if systemctl is-active --quiet "$service_check" 2>/dev/null; then - return 0 # Установлен и работает + return 0 else - return 1 # Установлен, но не работает + return 1 fi else - return 0 # Установлен + return 0 fi else - return 2 # Не установлен + return 2 fi } -# Проверка существующей установки check_existing_installation() { log_step "Проверка существующей установки..." local apache_status php_status mariadb_status redis_status local need_reinstall=false - # Проверка Apache log_info "Проверка Apache..." if [ "$DISTRO_FAMILY" = "debian" ]; then check_component_status "Apache" "apache2" "apache2" @@ -167,17 +154,14 @@ check_existing_installation() { apache_status=$? fi - # Проверка PHP log_info "Проверка PHP..." check_component_status "PHP" "php" "" php_status=$? - # Проверка MariaDB log_info "Проверка MariaDB..." check_component_status "MariaDB" "mysql" "mariadb" mariadb_status=$? - # Проверка Redis 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 @@ -187,14 +171,12 @@ check_existing_installation() { 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 @@ -204,7 +186,6 @@ check_existing_installation() { echo "" - # Определяем необходимость переустановки if [[ $apache_status -ne 0 ]] || [[ $php_status -ne 0 ]] || [[ $mariadb_status -ne 0 ]]; then need_reinstall=true fi @@ -212,7 +193,6 @@ check_existing_installation() { return $([ "$need_reinstall" = "true" ] && echo 1 || echo 0) } -# Отображение статуса компонента display_component_status() { local name=$1 local status=$2 @@ -224,7 +204,6 @@ display_component_status() { esac } -# Отображение статуса PHP с проверкой версии display_php_status() { local status=$1 @@ -243,22 +222,18 @@ display_php_status() { return 0 } -# Полное удаление системы 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 - # Удаление пакетов log_info "Удаление пакетов..." if [ "$DISTRO_FAMILY" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive - # Подготавливаем автоматические ответы для удаления MariaDB/MySQL 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 @@ -273,7 +248,6 @@ full_uninstall() { $PKG_MANAGER remove -y nginx httpd php* mariadb* mysql* redis* 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 \ @@ -289,7 +263,6 @@ full_uninstall() { fi } -# Обновление системы и установка базовых пакетов update_system() { log_step "Обновление системы и установка базовых пакетов..." @@ -307,7 +280,6 @@ update_system() { fi } -# Настройка репозиториев PHP 8.3 setup_php_repositories() { log_step "Настройка репозиториев для PHP 8.3..." @@ -315,12 +287,10 @@ setup_php_repositories() { if ! apt-cache show php8.3 &>/dev/null; then log_info "Добавление репозитория Sury для PHP 8.3..." - # Добавляем ключ GPG 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 - # Добавляем репозиторий Sury 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 @@ -348,7 +318,6 @@ setup_php_repositories() { $PKG_MANAGER install -y "https://rpms.remirepo.net/enterprise/remi-release-${version_id}.rpm" fi - # Включаем модуль PHP 8.3 если доступен DNF 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 @@ -358,11 +327,9 @@ setup_php_repositories() { 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 @@ -371,34 +338,27 @@ install_components() { sleep 3 - # Удаление старых версий remove_old_packages - # Установка Apache if [ "$DISTRO_FAMILY" = "debian" ]; then safe_execute "Установка Apache" apt install -y apache2 else safe_execute "Установка Apache (httpd)" $PKG_MANAGER install -y httpd fi - # Установка MariaDB install_mariadb - # Установка PHP 8.3 install_php83 - # Установка дополнительных компонентов install_additional_components } -# Удаление старых пакетов remove_old_packages() { log_info "Удаление старых версий пакетов..." if [ "$DISTRO_FAMILY" = "debian" ]; then export DEBIAN_FRONTEND=noninteractive - # Настройка автоматических ответов для MySQL/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 @@ -413,11 +373,9 @@ remove_old_packages() { $PKG_MANAGER remove -y nginx php php7* php80* php81* php82* mariadb* mysql* 2>/dev/null || true fi - # Удаление файлов данных MySQL/MariaDB rm -rf /var/lib/mysql* /etc/mysql* /var/log/mysql* /etc/my.cnf* 2>/dev/null || true } -# Установка MariaDB install_mariadb() { log_info "Установка MariaDB..." @@ -430,11 +388,9 @@ install_mariadb() { safe_execute "Установка MariaDB" $PKG_MANAGER install -y mariadb-server fi - # Запуск и включение MariaDB safe_execute "Запуск MariaDB" systemctl start mariadb safe_execute "Включение MariaDB в автозагрузку" systemctl enable mariadb - # Ожидание полного запуска log_info "Ожидание полного запуска MariaDB..." local retry_count=0 while ! systemctl is-active --quiet mariadb && [ $retry_count -lt 10 ]; do @@ -448,7 +404,6 @@ install_mariadb() { fi } -# Установка PHP 8.3 install_php83() { log_info "Установка PHP 8.3 и расширений..." @@ -456,7 +411,6 @@ install_php83() { 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 - # Определяем доступные пакеты PHP для RHEL семейства if $PKG_MANAGER list available | grep -q "php83-php\b"; then 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" else @@ -470,17 +424,14 @@ install_php83() { exit 1 fi - # Создание символических ссылок для php83 (если нужно) 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 2>/dev/null || true echo 'export PATH=/opt/remi/php83/root/usr/bin:$PATH' > /etc/profile.d/php83.sh fi - # Проверка установки PHP verify_php_installation } -# Проверка установки PHP verify_php_installation() { log_info "Проверка установки PHP..." @@ -493,7 +444,6 @@ verify_php_installation() { if [[ "$php_version" != "8.3" ]]; then log_warning "PHP версия $php_version (ожидалась 8.3)" - # Попытка исправления версии для Debian 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 "неизвестно") @@ -507,11 +457,9 @@ verify_php_installation() { exit 1 fi - # Проверка расширений PHP verify_php_extensions } -# Проверка расширений PHP verify_php_extensions() { log_info "Проверка PHP расширений..." @@ -533,7 +481,6 @@ verify_php_extensions() { fi } -# Установка недостающих расширений PHP install_missing_php_extensions() { local missing_extensions="$1" @@ -556,7 +503,6 @@ install_missing_php_extensions() { fi } -# Установка дополнительных компонентов install_additional_components() { log_info "Установка дополнительных компонентов (Redis, LibreOffice, Java)..." @@ -570,7 +516,6 @@ install_additional_components() { fi } -# Настройка Apache и PHP configure_apache_php() { log_step "Настройка Apache и PHP..." @@ -580,47 +525,36 @@ configure_apache_php() { configure_apache_rhel fi - # Настройка PHP.ini configure_php_ini - # Создание виртуального хоста create_virtual_host - # Проверка конфигурации Apache verify_apache_config } -# Настройка Apache для Debian/Ubuntu configure_apache_debian() { log_info "Настройка Apache для Debian/Ubuntu..." - # Включение модулей a2enmod php8.3 rewrite ssl headers expires deflate 2>/dev/null || true - # Отключение старых версий PHP for php_ver in 7.4 8.0 8.1 8.2; do a2dismod "php$php_ver" 2>/dev/null || true done } -# Настройка Apache для RHEL семейства configure_apache_rhel() { log_info "Настройка Apache для RHEL семейства..." - # Удаление старых конфигураций PHP rm -f /etc/httpd/conf.d/php.conf /etc/httpd/conf.modules.d/*php*.conf 2>/dev/null || true - # Настройка PHP-FPM + configure_php_fpm - - # Создание конфигурации PHP-FPM для Apache + create_php_fpm_config - # Создание общей конфигурации Altcor create_altcor_config } -# Настройка PHP-FPM configure_php_fpm() { log_info "Настройка PHP-FPM..." @@ -629,30 +563,25 @@ configure_php_fpm() { exit 1 fi - # Создание резервной копии 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" - - # Настройка производительности + 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 local socket_dir=$(dirname "$SOCKET_PATH") mkdir -p "$socket_dir" chown apache:apache "$socket_dir" - # Запуск PHP-FPM safe_execute "Запуск PHP-FPM" systemctl start "$PHP_FPM_SERVICE" safe_execute "Включение PHP-FPM в автозагрузку" systemctl enable "$PHP_FPM_SERVICE" @@ -663,7 +592,6 @@ configure_php_fpm() { fi } -# Создание конфигурации PHP-FPM для Apache create_php_fpm_config() { log_info "Создание конфигурации PHP-FPM для Apache..." @@ -702,7 +630,6 @@ ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:$SOCKET_PATH|fcgi://localhost/var/www/htm EOF } -# Создание основной конфигурации Altcor create_altcor_config() { log_info "Создание конфигурации Altcor..." @@ -783,7 +710,6 @@ ServerSignature Off EOF } -# Настройка PHP.ini configure_php_ini() { log_info "Настройка PHP.ini..." @@ -792,24 +718,20 @@ configure_php_ini() { return 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" - # Настройки OPcache 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" @@ -817,7 +739,6 @@ configure_php_ini() { log_success "PHP.ini настроен" } -# Создание виртуального хоста create_virtual_host() { log_info "Создание конфигурации виртуального хоста..." @@ -869,7 +790,6 @@ EOF fi } -# Проверка конфигурации Apache verify_apache_config() { log_info "Проверка конфигурации Apache..." @@ -884,7 +804,6 @@ verify_apache_config() { log_error "Конфигурация Apache (httpd) содержит ошибки:" httpd -t 2>&1 | tee -a "$LOG_FILE" - # Попытка исправления 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 @@ -899,7 +818,6 @@ verify_apache_config() { log_success "Конфигурация Apache проверена" } -# Настройка базы данных configure_database() { log_step "Настройка базы данных MariaDB..." @@ -910,19 +828,15 @@ configure_database() { exit 1 fi - # Выполнение настройки безопасности MariaDB setup_mariadb_security "$db_password" - # Создание конфигурационного файла БД create_db_config "$db_password" - # Сохранение учетных данных save_db_credentials "$db_password" - echo "$db_password" # Возвращаем пароль для использования в main + echo "$db_password" } -# Настройка безопасности MariaDB setup_mariadb_security() { local db_password="$1" @@ -940,7 +854,6 @@ setup_mariadb_security() { fi } -# Первичная настройка MariaDB setup_fresh_mariadb() { local db_password="$1" local script_file="/tmp/mysql_secure_$(date +%s).sql" @@ -966,7 +879,6 @@ MYSQL_SCRIPT rm -f "$script_file" } -# Обновление существующей MariaDB update_existing_mariadb() { local db_password="$1" local script_file="/tmp/mysql_update_$(date +%s).sql" @@ -987,7 +899,6 @@ MYSQL_SCRIPT rm -f "$script_file" } -# Сброс пароля MariaDB reset_mariadb_password() { local db_password="$1" @@ -1030,7 +941,6 @@ MYSQL_SCRIPT rm -f "$reset_script" } -# Создание конфигурационного файла БД create_db_config() { local db_password="$1" @@ -1047,12 +957,10 @@ define('DB_CHARSET', 'utf8mb4'); define('OFFICE', '/usr/bin/libreoffice'); ?> 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" exit 1 @@ -1061,7 +969,6 @@ EOF log_success "Конфигурация БД создана" } -# Сохранение учетных данных save_db_credentials() { local db_password="$1" local credentials_file="/root/.db_password" @@ -1080,24 +987,18 @@ EOF log_info "Учетные данные сохранены в $credentials_file" } -# Установка веб-приложения setup_web_application() { log_step "Настройка веб-приложения..." - # Очистка старых файлов (кроме db_config.php) find "$WEBROOT" -type f ! -name "db_config.php" -delete 2>/dev/null || true - # Загрузка файлов приложения download_application_files - # Создание .htaccess create_htaccess_file - # Настройка прав доступа setup_file_permissions } -# Загрузка файлов приложения download_application_files() { local download_url="https://cloud.altcor.ru/setup/download.php" @@ -1110,17 +1011,13 @@ download_application_files() { fi fi - # Если загрузка не удалась, создаем резервную страницу log_warning "Не удалось загрузить файлы с $download_url, создаем резервную страницу" create_fallback_index } -# Создание резервной индексной страницы create_fallback_index() { cat > "$WEBROOT/index.php" << 'EOF' - +
@@ -1128,76 +1025,33 @@ require_once __DIR__ . '/db_config.php';Document Root: = $_SERVER['DOCUMENT_ROOT'] ?>
-Server Software: = $_SERVER['SERVER_SOFTWARE'] ?? 'N/A' ?>
-PHP Version: = phpversion() ?>
-База: " . DB_NAME . "
"; - echo "Хост: " . DB_HOST . "
"; - } catch (PDOException $e) { - echo "❌ Ошибка подключения
"; - echo "" . htmlspecialchars($e->getMessage()) . "
"; - } - ?> -