diff --git a/install.sh b/install.sh index 05a61bb..f6c2941 100644 --- a/install.sh +++ b/install.sh @@ -215,7 +215,7 @@ full_uninstall() { log_step "Начинаем полное удаление Altcor... :(" log_info "Остановка сервисов..." - systemctl stop nginx apache2 httpd php*-fpm mariadb mysql redis-server redis 2>/dev/null || true + systemctl stop nginx apache2 httpd php*-fpm mariadb mysql redis 2>/dev/null || true log_info "Удаление пакетов..." if [ "$DISTRO_FAMILY" = "debian" ]; then @@ -283,18 +283,11 @@ 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 +DB_PASSWORD=$(generate_password) 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 stop nginx httpd apache2 php*-fpm mariadb mysql 2>/dev/null || true systemctl disable nginx httpd 2>/dev/null || true log_info "Ожидание полной остановки служб..." @@ -460,7 +453,7 @@ elif [ "$DISTRO_FAMILY" = "rhel" ]; then APACHE_CONF="/etc/httpd/conf.d/000-default.conf" WEBSERVER_USER="apache" - cat > "/etc/httpd/conf.d/php.conf" << 'PHP_CONF_EOF' + cat > "/etc/httpd/conf.d/php.conf" << 'EOF' LoadModule php_module modules/libphp.so LoadModule rewrite_module modules/mod_rewrite.so @@ -474,7 +467,7 @@ log_success "Модули Apache настроены" log_step "Создание конфигурации виртуального хоста..." mkdir -p "$WEBROOT" -cat > "$APACHE_CONF" < "$APACHE_CONF" < DocumentRoot $WEBROOT ServerName localhost @@ -564,7 +557,6 @@ else log_warning "Файл PHP.ini не найден по пути: $PHP_INI_PATH" fi -# ИСПРАВЛЕНИЕ 1: Всегда пересоздаем конфигурацию БД с актуальным паролем log_step "Создание конфигурации базы данных..." if [ "$DISTRO_FAMILY" = "debian" ]; then DB_SOCKET="/var/run/mysqld/mysqld.sock" @@ -572,10 +564,7 @@ else DB_SOCKET="/var/lib/mysql/mysql.sock" fi -# Удаляем старый конфиг, если есть -rm -f "$WEBROOT/db_config.php" - -cat > "$WEBROOT/db_config.php" << DB_CONFIG_EOF +cat > "$WEBROOT/db_config.php" << 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" @@ -598,11 +583,7 @@ TEMP_DOWNLOAD="/tmp/web_files_$(date +%s)" create_fallback_index() { cat > "$WEBROOT/index.php" << 'EOF' "; echo ""; @@ -617,7 +598,6 @@ echo "h1 { color: #2c5282; margin-top: 0; }"; echo ".status { padding: 15px; margin: 10px 0; border-radius: 5px; }"; echo ".success { background: #c6f6d5; color: #22543d; border-left: 4px solid #38a169; }"; echo ".warning { background: #fef5e7; color: #744210; border-left: 4px solid #ed8936; }"; -echo ".error { background: #fed7d7; color: #742a2a; border-left: 4px solid #e53e3e; }"; echo ""; echo ""; echo ""; @@ -638,7 +618,7 @@ try { echo "Хост: " . DB_HOST; echo ""; } catch (PDOException $e) { - echo "
"; + echo "
"; echo "Проблема с БД: " . htmlspecialchars($e->getMessage()); echo "
"; } @@ -653,4 +633,302 @@ echo "
"; echo ""; echo ""; echo ""; -?> \ No newline at end of file +?> +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/index.php" + +cat > "$WEBROOT/.htaccess" << 'EOF' + + Require all denied + + + + 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 содержит ошибки." + exit 1 + fi + + WEBSERVER_SERVICE="apache2" + +elif [ "$DISTRO_FAMILY" = "rhel" ]; then + if ! httpd -t >/dev/null 2>&1; then + log_error "Конфигурация Apache (httpd) содержит ошибки." + exit 1 + 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 + 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 "Все сервисы запущены и добавлены в автозагрузку" + +log_step "Финальная проверка работоспособности..." +if ! systemctl is-active --quiet $WEBSERVER_SERVICE; then + log_error "Веб-сервер не запущен" + exit 1 +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 +# Учетные данные базы данных ALTCor + +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 "" +log_success "Установка Altcor успешно завершена." +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 -f" +echo " • Для удаления: ./install.sh -u" +echo "" \ No newline at end of file