#!/bin/bash clear set -e UNINSTALL=false FORCE_REINSTALL=false while getopts ":uf" opt; do case $opt in u) UNINSTALL=true ;; f) FORCE_REINSTALL=true ;; \?) echo -e "${RED}[Ошибка]${NC} Неизвестный параметр: -$OPTARG" >&2 echo "Использование: $0 [-u] [-f]" echo " -u Полное удаление" echo " -f Принудительная переустановка" 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 log_success "Все компоненты уже установлены и работают корректно" echo "" if [ "$FORCE_REINSTALL" = false ]; then echo "Система уже настроена и работает." echo "" read -p "Выполнить полную переустановку? [y/n]: " choice case $choice in [Yy]|[Yy][Ee][Ss]) log_info "Начинаем полную переустановку..." return 0 ;; [Nn]|[Nn][Oo]) log_info "Переустановка отменена." IP_ADDR=$(hostname -I | awk '{print $1}') if [ -f "/root/.db_password" ]; then EXISTING_PASSWORD=$(grep "DB_PASSWORD=" /root/.db_password | cut -d'=' -f2) else EXISTING_PASSWORD="(не найден в /root/.db_password)" fi echo "" echo "🌐 Доступ к сайту:" echo " • http://localhost/" echo " • http://$IP_ADDR/" echo "" echo "🗄️ Доступ к БД:" echo " • Логин: root" echo " • Пароль: $EXISTING_PASSWORD" echo "" exit 0 ;; *) log_info "Неверный ввод. Переустановка отменена." exit 0 ;; esac else log_info "Форсируем переустановку всех компонентов..." return 0 fi else log_info "Обнаружены отсутствующие или неработающие компоненты. Продолжаем установку..." return 0 fi } full_uninstall() { log_step "Начинаем полное удаление Altcor... :(" log_info "Остановка сервисов..." systemctl stop nginx apache2 httpd php*-fpm mariadb mysql redis-server redis 2>/dev/null || true log_info "Удаление пакетов..." if [ "$DISTRO_FAMILY" = "debian" ]; then 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 "Полное удаление завершено." exit 0 } 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 fi check_existing_installation INSTALL_TYPE=$? if [ "$INSTALL_TYPE" -eq 1 ]; then SKIP_PACKAGE_INSTALL=true else SKIP_PACKAGE_INSTALL=false fi # ВАЖНО: Генерируем новый пароль только при полной установке if [ -f "/root/.db_password" ] && [ "$FORCE_REINSTALL" = false ] && [ "$SKIP_PACKAGE_INSTALL" = true ]; then DB_PASSWORD=$(grep "DB_PASSWORD=" /root/.db_password | cut -d'=' -f2) log_info "Используем существующий пароль БД" else DB_PASSWORD=$(generate_password) log_info "Сгенерирован новый пароль БД" fi if [ "$SKIP_PACKAGE_INSTALL" = false ]; then log_step "Остановка конфликтующих сервисов..." systemctl stop nginx httpd apache2 php*-fpm mariadb mysql redis-server redis 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 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 env DEBIAN_FRONTEND=noninteractive 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 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 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 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 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 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 ! apt install -y $PHP_PACKAGES >/dev/null 2>&1; then log_error "Не удалось установить PHP 8.3 и/или его расширения." exit 1 fi 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" else PHP_PACKAGES="php83 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" fi 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 /usr/bin/php83 /usr/bin/php >/dev/null 2>&1 || true fi fi log_success "PHP 8.3 и расширения установлены" else log_info "Пропускаем установку пакетов (используем существующие)" fi 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/000-default.conf" WEBSERVER_USER="apache" cat > "/etc/httpd/conf.d/php.conf" << 'PHP_CONF_EOF' LoadModule php_module modules/libphp.so LoadModule rewrite_module modules/mod_rewrite.so SetHandler application/x-httpd-php EOF fi log_success "Модули Apache настроены" log_step "Создание конфигурации виртуального хоста..." mkdir -p "$WEBROOT" 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 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 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 # ИСПРАВЛЕНИЕ 1: Всегда пересоздаем конфигурацию БД с актуальным паролем log_step "Создание конфигурации базы данных..." if [ "$DISTRO_FAMILY" = "debian" ]; then DB_SOCKET="/var/run/mysqld/mysqld.sock" else DB_SOCKET="/var/lib/mysql/mysql.sock" fi # Удаляем старый конфиг, если есть rm -f "$WEBROOT/db_config.php" cat > "$WEBROOT/db_config.php" << DB_CONFIG_EOF EOF # ИСПРАВЛЕНИЕ 2: Устанавливаем правильные права доступа на конфиг БД сразу chmod 600 "$WEBROOT/db_config.php" chown root:root "$WEBROOT/db_config.php" log_success "Конфигурация БД создана" 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 "
"; } echo "
"; echo "Внимание: Используется временная страница.
"; echo "Основные файлы приложения не были загружены с удаленного сервера.
"; echo "Для загрузки файлов вручную выполните:
"; echo "cd /var/www/html && wget https://cloud.altcor.ru/setup/download.php -O files.download"; echo "
"; echo "
"; echo ""; echo ""; ?>