From 991be277da3230fbf646f2912033acfe1f4512c3 Mon Sep 17 00:00:00 2001 From: hosh1 Date: Mon, 11 Aug 2025 00:25:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=20=D0=91?= =?UTF-8?q?=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install.sh | 181 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 163 insertions(+), 18 deletions(-) diff --git a/install.sh b/install.sh index 51ac9b0..8b40f20 100644 --- a/install.sh +++ b/install.sh @@ -296,7 +296,7 @@ DB_PASSWORD=$(generate_password) if [ "$SKIP_PACKAGE_INSTALL" = false ]; then log_step "Остановка конфликтующих сервисов..." - systemctl stop nginx httpd apache2 php*-fpm 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 echo "" @@ -307,9 +307,18 @@ if [ "$SKIP_PACKAGE_INSTALL" = false ]; then 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 + # Полное удаление MariaDB/MySQL для чистой установки + apt remove --purge -y 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 + # Полное удаление MariaDB/MySQL для чистой установки + $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 "Старые пакеты удалены" @@ -378,7 +387,23 @@ if [ "$SKIP_PACKAGE_INSTALL" = false ]; then elif [ "$DISTRO_FAMILY" = "rhel" ]; then $PKG_MANAGER install -y mariadb-server >/dev/null 2>&1 fi - log_success "MariaDB установлен" + + # Важно: запускаем MariaDB сразу после установки + log_info "Запуск MariaDB..." + systemctl start mariadb >/dev/null 2>&1 + systemctl enable mariadb >/dev/null 2>&1 + + # Ждем, пока MariaDB полностью запустится + log_info "Ожидание полного запуска MariaDB..." + sleep 5 + + # Проверяем, что MariaDB действительно запущен + 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 @@ -692,31 +717,145 @@ chmod 600 "$WEBROOT/db_config.php" log_success "Права доступа настроены" log_step "Настройка базы данных MariaDB..." -MYSQL_TMP_SCRIPT="/tmp/mysql_setup_$(date +%s).sql" -cat > "$MYSQL_TMP_SCRIPT" << MYSQL_SCRIPT -ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('$DB_PASSWORD'); +# Проверяем, что 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 (подключение без пароля доступно)..." + + # Устанавливаем пароль root и очищаем ненужные данные + 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; - -DELETE FROM mysql.user WHERE user=''; - -DELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost', '127.0.0.1', '::1'); - -DROP DATABASE IF EXISTS test; - -SHOW DATABASES; MYSQL_SCRIPT -if ! mysql -u root < "$MYSQL_TMP_SCRIPT" >/dev/null 2>&1; then - log_error "Не удалось выполнить скрипт настройки MariaDB." - rm -f "$MYSQL_TMP_SCRIPT" - exit 1 + 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..." + + # Останавливаем 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 сброшен" + + # Убиваем mysqld_safe + 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 + + # Запускаем MariaDB нормально + 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 -rm -f "$MYSQL_TMP_SCRIPT" + log_success "База данных настроена" log_step "Проверка конфигурации Apache..." @@ -771,6 +910,12 @@ if ! php -r "echo phpversion();" >/dev/null 2>&1; then 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 "Сохранение учетных данных..."