From a7beaff4c25985b176f91585a43adc1a1e3980ef Mon Sep 17 00:00:00 2001 From: hosh1 Date: Thu, 14 Aug 2025 08:48:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.sh | 187 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 168 insertions(+), 19 deletions(-) diff --git a/install.sh b/install.sh index 7ec3fd9..4216498 100644 --- a/install.sh +++ b/install.sh @@ -907,6 +907,8 @@ EOF chmod 600 "$WEBROOT/db_config.php" 2>/dev/null || true log_success "Права доступа настроены" + log_info "Текущий пользователь: $CURRENT_USER" + log_step "Настройка базы данных MariaDB..." # Проверка и запуск MariaDB @@ -923,35 +925,182 @@ EOF CURRENT_USER=$(logname 2>/dev/null || whoami) log_info "Текущий пользователь: $CURRENT_USER" - # Функция для выполнения SQL с подробным логированием - execute_sql() { - local user="$1" - local password="$2" - local sql_script="$3" - local connection_params="" + # Функция для безопасного выполнения SQL с детальными ошибками + execute_sql_safe() { + local connection_cmd="$1" + local description="$2" + local sql_commands="$3" - if [[ -n "$password" ]]; then - connection_params="-u $user -p$password" - else - connection_params="-u $user" - fi + log_info "$description" - log_info "Попытка выполнения SQL как пользователь: $user" - - # Создаем временный файл для вывода ошибок + local temp_file="/tmp/mysql_commands_$$.sql" local error_file="/tmp/mysql_error_$$.log" - if echo "$sql_script" | mysql $connection_params 2>"$error_file"; then - rm -f "$error_file" + echo "$sql_commands" > "$temp_file" + + if eval "$connection_cmd < '$temp_file'" 2>"$error_file"; then + rm -f "$temp_file" "$error_file" + log_success "Выполнено: $description" return 0 else - log_error "Ошибка выполнения SQL:" - cat "$error_file" >&2 - rm -f "$error_file" + log_error "Ошибка: $description" + if [[ -s "$error_file" ]]; then + cat "$error_file" | head -10 >&2 + fi + rm -f "$temp_file" "$error_file" return 1 fi } + # Функция создания базы данных (минимальный набор команд) + create_database_only() { + local connection_cmd="$1" + local sql="CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" + + if execute_sql_safe "$connection_cmd" "Создание базы данных ALTCor" "$sql"; then + return 0 + else + return 1 + fi + } + + # Функция для современной установки пароля MariaDB + set_password_modern() { + local connection_cmd="$1" + local password="$2" + + # Используем только современные команды MariaDB + local sql=" +-- Установка пароля современным способом +ALTER USER 'root'@'localhost' IDENTIFIED BY '$password'; +FLUSH PRIVILEGES;" + + if execute_sql_safe "$connection_cmd" "Установка пароля root (современный способ)" "$sql"; then + return 0 + else + # Если не получилось, попробуем SET PASSWORD + local sql_alt=" +SET PASSWORD FOR 'root'@'localhost' = PASSWORD('$password'); +FLUSH PRIVILEGES;" + + if execute_sql_safe "$connection_cmd" "Установка пароля root (альтернативный способ)" "$sql_alt"; then + return 0 + else + return 1 + fi + fi + } + + # Основная логика - пробуем разные способы подключения + DB_CONFIGURED=false + + log_info "Попытка подключения к MariaDB..." + + # 1. Попробуем подключиться как root без пароля + if mysql -u root -e "SELECT 1;" >/dev/null 2>&1; then + log_success "Подключение как root без пароля успешно" + + # Сначала создаем базу данных + if create_database_only "mysql -u root"; then + log_success "База данных создана" + + # Пытаемся установить пароль (не критично, если не получится) + if set_password_modern "mysql -u root" "$DB_PASSWORD"; then + log_success "Пароль root установлен" + DB_CONFIGURED=true + else + log_info "Пароль не установлен, но база данных создана" + DB_CONFIGURED=true + fi + fi + + # 2. Попробуем подключиться как root с паролем + elif mysql -u root -p"$DB_PASSWORD" -e "SELECT 1;" >/dev/null 2>&1; then + log_success "Подключение как root с паролем успешно" + + if create_database_only "mysql -u root -p$DB_PASSWORD"; then + log_success "База данных проверена/создана" + DB_CONFIGURED=true + fi + + # 3. Попробуем подключиться как текущий пользователь + elif mysql -u "$CURRENT_USER" -e "SELECT 1;" >/dev/null 2>&1; then + log_success "Подключение как $CURRENT_USER без пароля успешно" + + if create_database_only "mysql -u $CURRENT_USER"; then + log_success "База данных создана пользователем $CURRENT_USER" + DB_CONFIGURED=true + fi + + # 4. Попробуем через sudo + elif sudo mysql -e "SELECT 1;" >/dev/null 2>&1; then + log_success "Подключение через sudo успешно" + + if create_database_only "sudo mysql"; then + log_success "База данных создана через sudo" + + # Попробуем установить пароль через sudo + local sql="ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_PASSWORD'; FLUSH PRIVILEGES;" + if echo "$sql" | sudo mysql >/dev/null 2>&1; then + log_success "Пароль root установлен через sudo" + else + log_info "Пароль не удалось установить, но база создана" + fi + DB_CONFIGURED=true + fi + + # 5. Последняя попытка - возможно MariaDB запущен в безопасном режиме + elif systemctl stop mariadb && mysqld_safe --skip-grant-tables --skip-networking & + then + sleep 5 + MYSQL_PID=$! + + if mysql -u root -e "SELECT 1;" >/dev/null 2>&1; then + log_info "Подключение в безопасном режиме успешно" + + if create_database_only "mysql -u root"; then + log_success "База данных создана в безопасном режиме" + DB_CONFIGURED=true + fi + fi + + # Завершаем безопасный режим + kill $MYSQL_PID 2>/dev/null || true + sleep 2 + systemctl start mariadb + fi + + # Проверяем результат + if [[ "$DB_CONFIGURED" == "true" ]]; then + log_success "База данных настроена успешно" + + # Финальная проверка - можем ли мы подключиться к созданной базе + if mysql -u root -e "USE ALTCor; SELECT 'OK' as status;" >/dev/null 2>&1; then + log_success "Подключение к базе ALTCor как root работает" + elif mysql -u root -p"$DB_PASSWORD" -e "USE ALTCor; SELECT 'OK' as status;" >/dev/null 2>&1; then + log_success "Подключение к базе ALTCor как root с паролем работает" + elif mysql -u "$CURRENT_USER" -e "USE ALTCor; SELECT 'OK' as status;" >/dev/null 2>&1; then + log_success "Подключение к базе ALTCor как $CURRENT_USER работает" + else + log_info "База создана, но требуется проверка подключения" + fi + else + log_error "Не удалось настроить базу данных автоматически" + log_info "" + log_info "Попробуйте выполнить настройку вручную:" + log_info "1. Проверьте статус MariaDB: sudo systemctl status mariadb" + log_info "2. Запустите мастер настройки: sudo mysql_secure_installation" + log_info "3. Создайте базу данных вручную:" + log_info " sudo mysql -e \"CREATE DATABASE ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\"" + log_info "4. Или создайте отдельного пользователя:" + log_info " sudo mysql -e \"CREATE USER 'altcor'@'localhost' IDENTIFIED BY 'password';\"" + log_info " sudo mysql -e \"CREATE DATABASE ALTCor; GRANT ALL ON ALTCor.* TO 'altcor'@'localhost';\"" + + exit 1 + fi + + log_success "Настройка базы данных завершена" + # Функция для проверки подключения test_connection() { local user="$1"