Добавлен возможность установки для RedHat дистриб.

This commit is contained in:
2025-08-10 01:23:40 +03:00
parent 7642aa81cb
commit 6b6fa15302

View File

@@ -1,139 +1,163 @@
#!/bin/bash #!/bin/bash
# Скрипт для чистой установки и настройки LAMP (Apache, MariaDB, PHP 8.3)
set -e set -e
# Цвета для вывода
RED='\033[0;31m' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m' NC='\033[0m'
NC='\033[0m' # No Color
# Функция для вывода сообщений
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# --- 1. ПРОВЕРКА СИСТЕМЫ И ПРАВ ---
log_info "Проверка прав доступа..."
if [[ $EUID -ne 0 ]]; then if [[ $EUID -ne 0 ]]; then
log_error "Запустите этот скрипт с правами суперпользователя (используйте sudo)." log_error "Запустите этот скрипт с правами суперпользователя (используйте sudo)."
exit 1 exit 1
fi fi
log_info "Определение операционной системы..."
if [ -f /etc/os-release ]; then if [ -f /etc/os-release ]; then
. /etc/os-release . /etc/os-release
DISTRO="$ID" DISTRO="$ID"
FAMILY="$ID_LIKE" FAMILY="$ID_LIKE"
VERSION_ID="${VERSION_ID:-unknown}"
else else
log_error "Не удалось определить дистрибутив." log_error "Не удалось определить дистрибутив."
exit 1 exit 1
fi fi
log_success "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)" if echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then
PKG_MANAGER="apt"
# Проверка поддерживаемых дистрибутивов DISTRO_FAMILY="debian"
if ! echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then elif echo "$DISTRO $FAMILY" | grep -qi "rhel\|centos\|fedora"; then
log_error "Ваш дистрибутив '$DISTRO' не поддерживается. Поддерживаются только Debian/Ubuntu." PKG_MANAGER="dnf"
exit 1 DISTRO_FAMILY="rhel"
fi if ! command -v dnf >/dev/null 2>&1; then
PKG_MANAGER="yum"
# --- 2. ОЧИСТКА СУЩЕСТВУЮЩИХ УСТАНОВОК --- fi
log_info "Очистка возможных предыдущих установок..."
# Останавливаем и удаляем конфликтующие сервисы
systemctl stop nginx apache2 php*-fpm 2>/dev/null || true
systemctl disable nginx 2>/dev/null || true
# Удаляем nginx, если установлен
apt remove -y nginx nginx-common nginx-core 2>/dev/null || true
# Удаляем старые версии PHP
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* 2>/dev/null || true
log_success "Очистка завершена."
# --- 3. ОБНОВЛЕНИЕ СИСТЕМЫ ---
log_info "Обновление списка пакетов..."
apt update -y
log_info "Установка базовых зависимостей..."
apt install -y software-properties-common lsb-release ca-certificates curl wget gnupg2 apt-transport-https unzip
# --- 4. ДОБАВЛЕНИЕ РЕПОЗИТОРИЯ PHP 8.3 ---
log_info "Проверка доступности PHP 8.3..."
# Сначала проверяем, доступен ли PHP 8.3 в стандартных репозиториях
if apt-cache show php8.3 &>/dev/null; then
log_success "PHP 8.3 доступен в текущих репозиториях."
else else
log_info "Добавление PPA ondrej/php для PHP 8.3..." log_error "Ваш дистрибутив '$DISTRO' не поддерживается. Поддерживаются: Debian/Ubuntu, CentOS/RHEL/Fedora."
# Используем официальный PPA от ondrej
if ! add-apt-repository ppa:ondrej/php -y; then
log_error "Не удалось добавить PPA ondrej/php."
exit 1
fi
log_info "Обновление списка пакетов..."
apt update -y
# Проверяем доступность после добавления PPA
if ! apt-cache show php8.3 &>/dev/null; then
log_error "PHP 8.3 все еще недоступен после добавления PPA."
exit 1
fi
log_success "PHP 8.3 теперь доступен через PPA ondrej/php."
fi
# --- 5. УСТАНОВКА LAMP КОМПОНЕНТОВ ---
log_info "Установка Apache2..."
apt install -y apache2
log_info "Установка MariaDB Server..."
apt install -y mariadb-server
log_info "Установка дополнительных пакетов..."
apt install -y redis-server libreoffice default-jre
log_info "Установка PHP 8.3 и модулей..."
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; then
log_error "Не удалось установить PHP 8.3 и/или его расширения."
exit 1 exit 1
fi fi
# --- 6. НАСТРОЙКА APACHE --- systemctl stop nginx httpd apache2 php*-fpm 2>/dev/null || true
systemctl disable nginx httpd 2>/dev/null || true
log_info "Настройка Apache..." 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
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
fi
# Включаем необходимые модули if [ "$DISTRO_FAMILY" = "debian" ]; then
a2enmod php8.3 rewrite ssl headers expires deflate 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
# Отключаем старые модули PHP, если они были включены if [ "$DISTRO_FAMILY" = "debian" ]; then
for php_ver in 7.4 8.0 8.1 8.2; do if ! apt-cache show php8.3 &>/dev/null; then
a2dismod php$php_ver 2>/dev/null || true if ! add-apt-repository ppa:ondrej/php -y >/dev/null 2>&1; then
done 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
fi
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
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
fi
if [ "$DISTRO_FAMILY" = "debian" ]; then
apt install -y apache2 >/dev/null 2>&1
apt install -y mariadb-server >/dev/null 2>&1
apt install -y redis-server libreoffice default-jre >/dev/null 2>&1
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
$PKG_MANAGER install -y httpd >/dev/null 2>&1
$PKG_MANAGER install -y mariadb-server >/dev/null 2>&1
$PKG_MANAGER install -y redis libreoffice java-11-openjdk >/dev/null 2>&1
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
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" << 'EOF'
LoadModule php_module modules/libphp.so
LoadModule rewrite_module modules/mod_rewrite.so
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
EOF
fi
WEBROOT="/var/www/html"
mkdir -p "$WEBROOT" mkdir -p "$WEBROOT"
# Создание конфигурации виртуального хоста
APACHE_CONF="/etc/apache2/sites-available/000-default.conf"
log_info "Создание конфигурации Apache в $APACHE_CONF..."
cat > "$APACHE_CONF" <<EOF cat > "$APACHE_CONF" <<EOF
<VirtualHost *:80> <VirtualHost *:80>
DocumentRoot $WEBROOT DocumentRoot $WEBROOT
@@ -145,7 +169,6 @@ cat > "$APACHE_CONF" <<EOF
AllowOverride All AllowOverride All
Require all granted Require all granted
# Включение сжатия
<IfModule mod_deflate.c> <IfModule mod_deflate.c>
SetOutputFilter DEFLATE SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \ SetEnvIfNoCase Request_URI \
@@ -155,12 +178,10 @@ cat > "$APACHE_CONF" <<EOF
</IfModule> </IfModule>
</Directory> </Directory>
# Обработка PHP файлов
<FilesMatch \.php$> <FilesMatch \.php$>
SetHandler application/x-httpd-php SetHandler application/x-httpd-php
</FilesMatch> </FilesMatch>
# Безопасность - защита конфигурационных файлов
<Files "*.conf"> <Files "*.conf">
Require all denied Require all denied
</Files> </Files>
@@ -173,7 +194,6 @@ cat > "$APACHE_CONF" <<EOF
Require all denied Require all denied
</Files> </Files>
# Кэширование статических файлов
<IfModule mod_expires.c> <IfModule mod_expires.c>
ExpiresActive On ExpiresActive On
ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpg "access plus 1 month"
@@ -191,42 +211,36 @@ cat > "$APACHE_CONF" <<EOF
</VirtualHost> </VirtualHost>
EOF EOF
# --- 7. НАСТРОЙКА PHP --- if [ "$DISTRO_FAMILY" = "debian" ]; then
PHP_INI_PATH="/etc/php/8.3/apache2/php.ini"
log_info "Настройка PHP 8.3 для Apache..." elif [ "$DISTRO_FAMILY" = "rhel" ]; then
if [ "$DISTRO" = "fedora" ]; then
PHP_INI_APACHE="/etc/php/8.3/apache2/php.ini" PHP_INI_PATH="/etc/php.ini"
if [ -f "$PHP_INI_APACHE" ]; then else
# Создаем резервную копию PHP_INI_PATH="/etc/opt/remi/php83/php.ini"
cp "$PHP_INI_APACHE" "${PHP_INI_APACHE}.backup.$(date +%Y%m%d_%H%M%S)" [ ! -f "$PHP_INI_PATH" ] && PHP_INI_PATH="/etc/php.ini"
fi
# Настройки производительности и безопасности
sed -i 's/;*upload_max_filesize = .*/upload_max_filesize = 64M/' "$PHP_INI_APACHE"
sed -i 's/;*post_max_size = .*/post_max_size = 64M/' "$PHP_INI_APACHE"
sed -i 's/;*max_execution_time = .*/max_execution_time = 300/' "$PHP_INI_APACHE"
sed -i 's/;*memory_limit = .*/memory_limit = 256M/' "$PHP_INI_APACHE"
sed -i 's/;*max_input_vars = .*/max_input_vars = 3000/' "$PHP_INI_APACHE"
# Настройки OPcache
sed -i 's/;*opcache.enable=.*/opcache.enable=1/' "$PHP_INI_APACHE"
sed -i 's/;*opcache.enable_cli=.*/opcache.enable_cli=1/' "$PHP_INI_APACHE"
sed -i 's/;*opcache.memory_consumption=.*/opcache.memory_consumption=128/' "$PHP_INI_APACHE"
sed -i 's/;*opcache.revalidate_freq=.*/opcache.revalidate_freq=2/' "$PHP_INI_APACHE"
sed -i 's/;*opcache.max_accelerated_files=.*/opcache.max_accelerated_files=4000/' "$PHP_INI_APACHE"
# Настройки безопасности
sed -i 's/;*expose_php = .*/expose_php = Off/' "$PHP_INI_APACHE"
sed -i 's/;*display_errors = .*/display_errors = Off/' "$PHP_INI_APACHE"
sed -i 's/;*log_errors = .*/log_errors = On/' "$PHP_INI_APACHE"
log_success "PHP 8.3 настроен."
else
log_warning "Не найден файл конфигурации $PHP_INI_APACHE"
fi fi
# --- 8. СОЗДАНИЕ КОНФИГУРАЦИОННОГО ФАЙЛА БД --- if [ -f "$PHP_INI_PATH" ]; then
cp "$PHP_INI_PATH" "${PHP_INI_PATH}.backup.$(date +%Y%m%d_%H%M%S)"
log_info "Создание файла конфигурации базы данных..."
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"
fi
cat > "$WEBROOT/db_config.php" << 'EOF' cat > "$WEBROOT/db_config.php" << 'EOF'
<?php <?php
@@ -240,89 +254,116 @@ define('DB_CHARSET', 'utf8mb4');
?> ?>
EOF EOF
# --- 9. ЗАГРУЗКА УДАЛЕННЫХ ФАЙЛОВ ---
log_info "Загрузка веб-файлов с удаленного сервера..."
DOWNLOAD_URL="https://cloud.altcor.ru/setup/download.php" DOWNLOAD_URL="https://cloud.altcor.ru/setup/download.php"
TEMP_DOWNLOAD="/tmp/web_files_$(date +%s).zip" TEMP_DOWNLOAD="/tmp/web_files_$(date +%s)"
# Проверка доступности сервера create_fallback_index() {
if ! curl -f -s --head "$DOWNLOAD_URL" > /dev/null; then
log_error "Удаленный сервер недоступен: $DOWNLOAD_URL"
log_warning "Создание простого тестового index.php..."
# Создаем простой index.php как fallback
cat > "$WEBROOT/index.php" << 'EOF' cat > "$WEBROOT/index.php" << 'EOF'
<?php <?php
echo "<h1>Сервер LAMP готов к работе</h1>"; require_once __DIR__ . '/db_config.php';
echo "<p>PHP " . phpversion() . " работает корректно!</p>";
echo "<p>Время: " . date('Y-m-d H:i:s') . "</p>"; echo "<!DOCTYPE html>";
echo "<html lang='ru'>";
echo "<head>";
echo "<meta charset='UTF-8'>";
echo "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
echo "<title>Сервер LAMP - Готов к работе</title>";
echo "<style>";
echo "body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; margin: 40px; background: #f5f5f5; }";
echo ".container { max-width: 800px; margin: 0 auto; background: white; padding: 40px; border-radius: 10px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }";
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 "</style>";
echo "</head>";
echo "<body>";
echo "<div class='container'>";
echo "<h1>🚀 Сервер LAMP готов к работе</h1>";
echo "<div class='status success'>";
echo "<strong>✅ PHP " . phpversion() . " работает корректно!</strong><br>";
echo "Время сервера: " . date('Y-m-d H:i:s T') . "<br>";
echo "Document Root: " . $_SERVER['DOCUMENT_ROOT'];
echo "</div>";
// Проверка подключения к БД
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8mb4", $db_user, $db_pass);
echo "<div class='status success'>";
echo "<strong>✅ База данных подключена успешно</strong><br>";
echo "База данных: $db_name<br>";
echo "Хост: $db_host";
echo "</div>";
} catch (PDOException $e) {
echo "<div class='status warning'>";
echo "<strong>⚠️ Проблема с базой данных:</strong> " . htmlspecialchars($e->getMessage());
echo "</div>";
}
echo "<div class='status warning'>";
echo "<strong>⚠️ Внимание:</strong> Используется временная страница.<br>";
echo "Основные файлы приложения не были загружены с удаленного сервера.<br>";
echo "Для загрузки файлов вручную выполните:<br>";
echo "<code>cd /var/www/html && wget https://cloud.altcor.ru/setup/download.php -O files.download</code>";
echo "</div>";
echo "</div>";
echo "</body>";
echo "</html>";
?> ?>
EOF EOF
}
log_warning "Создан временный index.php. Веб-файлы можно будет загрузить позже."
if ! curl -f -s --max-time 10 --head "$DOWNLOAD_URL" >/dev/null 2>&1; then
create_fallback_index
else else
log_info "Загрузка файлов..."
# Очищаем веб-директорию (оставляем только db_config.php)
find "$WEBROOT" -type f ! -name "db_config.php" -delete 2>/dev/null || true find "$WEBROOT" -type f ! -name "db_config.php" -delete 2>/dev/null || true
# Загружаем архив if curl -f -L --max-time 30 -o "$TEMP_DOWNLOAD" "$DOWNLOAD_URL" 2>/dev/null; then
if curl -f -s -o "$TEMP_DOWNLOAD" "$DOWNLOAD_URL"; then
log_success "Файлы успешно загружены."
log_info "Распаковка файлов..." FILE_TYPE=$(file -b "$TEMP_DOWNLOAD" 2>/dev/null || echo "unknown")
# Проверяем, что это ZIP-архив if file "$TEMP_DOWNLOAD" | grep -qi "zip\|archive"; then
if file "$TEMP_DOWNLOAD" | grep -q "Zip archive"; then if unzip -q "$TEMP_DOWNLOAD" -d "$WEBROOT" 2>/dev/null; then
if unzip -q "$TEMP_DOWNLOAD" -d "$WEBROOT"; then true
log_success "Файлы успешно распакованы в $WEBROOT"
else else
log_error "Ошибка при распаковке архива." unzip -o "$TEMP_DOWNLOAD" -d "$WEBROOT" >/dev/null 2>&1 || create_fallback_index
rm -f "$TEMP_DOWNLOAD"
exit 1
fi fi
else
log_info "Полученный файл не является ZIP-архивом. Попытка сохранить как PHP-файл..." elif file "$TEMP_DOWNLOAD" | grep -qi "gzip"; then
# Если это не архив, возможно это PHP-скрипт if gunzip -c "$TEMP_DOWNLOAD" > "$WEBROOT/index.php" 2>/dev/null; then
if head -n 1 "$TEMP_DOWNLOAD" | grep -q "<?php\|<!DOCTYPE"; then true
mv "$TEMP_DOWNLOAD" "$WEBROOT/index.php"
log_success "Файл сохранен как index.php"
else else
log_error "Неизвестный формат загруженного файла." create_fallback_index
rm -f "$TEMP_DOWNLOAD" fi
exit 1
elif head -n 1 "$TEMP_DOWNLOAD" | grep -q "<?php\|<!DOCTYPE\|<html"; then
cp "$TEMP_DOWNLOAD" "$WEBROOT/index.php"
elif head -n 1 "$TEMP_DOWNLOAD" | grep -q "{"; then
create_fallback_index
else
if head -10 "$TEMP_DOWNLOAD" | grep -qi "error\|404\|403\|500\|<title"; then
create_fallback_index
else
cp "$TEMP_DOWNLOAD" "$WEBROOT/index.php"
fi fi
fi fi
# Удаляем временный файл
rm -f "$TEMP_DOWNLOAD" rm -f "$TEMP_DOWNLOAD"
else else
log_error "Не удалось загрузить файлы с $DOWNLOAD_URL" if curl -L -k --user-agent "Mozilla/5.0 (Linux) Setup Script" --max-time 30 -o "$TEMP_DOWNLOAD" "$DOWNLOAD_URL" 2>/dev/null; then
log_warning "Создание простого тестового index.php..." cp "$TEMP_DOWNLOAD" "$WEBROOT/downloaded_file"
rm -f "$TEMP_DOWNLOAD"
fi
# Создаем простой index.php как fallback create_fallback_index
cat > "$WEBROOT/index.php" << 'EOF'
<?php
echo "<h1>Сервер LAMP готов к работе</h1>";
echo "<p>PHP " . phpversion() . " работает корректно!</p>";
echo "<p>Время: " . date('Y-m-d H:i:s') . "</p>";
echo "<p><strong>Внимание:</strong> Не удалось загрузить основные файлы приложения.</p>";
?>
EOF
log_warning "Создан временный index.php. Проверьте доступность удаленного сервера."
fi fi
fi fi
# --- 10. СОЗДАНИЕ .HTACCESS ---
log_info "Создание .htaccess для безопасности..."
cat > "$WEBROOT/.htaccess" << 'EOF' cat > "$WEBROOT/.htaccess" << 'EOF'
# Защита конфигурационных файлов
<Files "db_config.php"> <Files "db_config.php">
Require all denied Require all denied
</Files> </Files>
@@ -335,12 +376,10 @@ cat > "$WEBROOT/.htaccess" << 'EOF'
Require all denied Require all denied
</Files> </Files>
# Включение сжатия для лучшей производительности
<IfModule mod_deflate.c> <IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml
</IfModule> </IfModule>
# Кэширование статических файлов
<IfModule mod_expires.c> <IfModule mod_expires.c>
ExpiresActive On ExpiresActive On
ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpg "access plus 1 month"
@@ -353,157 +392,99 @@ cat > "$WEBROOT/.htaccess" << 'EOF'
ExpiresByType text/javascript "access plus 1 month" ExpiresByType text/javascript "access plus 1 month"
</IfModule> </IfModule>
# Защита от некоторых атак
<IfModule mod_headers.c> <IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY Header always set X-Frame-Options DENY
Header always set X-XSS-Protection "1; mode=block" Header always set X-XSS-Protection "1; mode=block"
</IfModule> </IfModule>
# Красивые URL (при необходимости)
RewriteEngine On RewriteEngine On
# RewriteCond %{REQUEST_FILENAME} !-f # RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d # RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^(.*)$ index.php [QSA,L] # RewriteRule ^(.*)$ index.php [QSA,L]
EOF EOF
# Установка правильных прав доступа chown -R $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT"
chown -R www-data:www-data "$WEBROOT"
chmod -R 755 "$WEBROOT" chmod -R 755 "$WEBROOT"
chmod 644 "$WEBROOT/.htaccess" 2>/dev/null || true chmod 644 "$WEBROOT/.htaccess" 2>/dev/null || true
chmod 600 "$WEBROOT/db_config.php" chmod 600 "$WEBROOT/db_config.php"
# --- 11. НАСТРОЙКА БАЗЫ ДАННЫХ ---
log_info "Настройка MariaDB..."
MYSQL_TMP_SCRIPT="/tmp/mysql_setup_$(date +%s).sql" MYSQL_TMP_SCRIPT="/tmp/mysql_setup_$(date +%s).sql"
cat > "$MYSQL_TMP_SCRIPT" << 'MYSQL_SCRIPT' cat > "$MYSQL_TMP_SCRIPT" << 'MYSQL_SCRIPT'
-- Безопасная настройка MariaDB
ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('muJh9tNY8sg0'); ALTER USER IF EXISTS 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('muJh9tNY8sg0');
-- Создание базы данных
CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Предоставление прав
GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost'; GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost';
FLUSH PRIVILEGES; FLUSH PRIVILEGES;
-- Удаление анонимных пользователей
DELETE FROM mysql.user WHERE user=''; DELETE FROM mysql.user WHERE user='';
-- Удаление удаленных root пользователей
DELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost', '127.0.0.1', '::1'); DELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost', '127.0.0.1', '::1');
-- Удаление тестовой базы данных
DROP DATABASE IF EXISTS test; DROP DATABASE IF EXISTS test;
-- Показать созданную БД
SHOW DATABASES; SHOW DATABASES;
MYSQL_SCRIPT MYSQL_SCRIPT
if mysql -u root < "$MYSQL_TMP_SCRIPT"; then if ! mysql -u root < "$MYSQL_TMP_SCRIPT" >/dev/null 2>&1; then
log_success "MariaDB успешно настроена."
else
log_error "Не удалось выполнить скрипт настройки MariaDB." log_error "Не удалось выполнить скрипт настройки MariaDB."
rm -f "$MYSQL_TMP_SCRIPT" rm -f "$MYSQL_TMP_SCRIPT"
exit 1 exit 1
fi fi
rm -f "$MYSQL_TMP_SCRIPT" rm -f "$MYSQL_TMP_SCRIPT"
# --- 12. ПРОВЕРКА КОНФИГУРАЦИИ И ЗАПУСК --- if [ "$DISTRO_FAMILY" = "debian" ]; then
if ! apache2ctl configtest >/dev/null 2>&1; then
log_error "Конфигурация Apache содержит ошибки."
exit 1
fi
systemctl restart apache2 >/dev/null 2>&1
systemctl enable apache2 >/dev/null 2>&1
WEBSERVER_SERVICE="apache2"
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
if ! httpd -t >/dev/null 2>&1; then
log_error "Конфигурация Apache (httpd) содержит ошибки."
exit 1
fi
systemctl restart httpd >/dev/null 2>&1
systemctl enable httpd >/dev/null 2>&1
WEBSERVER_SERVICE="httpd"
fi
log_info "Проверка конфигурации Apache..." systemctl restart mariadb >/dev/null 2>&1
if apache2ctl configtest; then systemctl restart redis-server >/dev/null 2>&1 || systemctl restart redis >/dev/null 2>&1 || true
log_success "Конфигурация Apache корректна."
else systemctl enable mariadb >/dev/null 2>&1
log_error "Конфигурация Apache содержит ошибки." systemctl enable redis-server >/dev/null 2>&1 || systemctl enable redis >/dev/null 2>&1 || true
if ! systemctl is-active --quiet $WEBSERVER_SERVICE; then
log_error "Веб-сервер не запущен"
exit 1 exit 1
fi fi
# Перезапуск и включение автозапуска служб if ! systemctl is-active --quiet mariadb; then
log_info "Запуск служб..."
systemctl restart apache2
systemctl restart mariadb
systemctl restart redis-server
systemctl enable apache2 mariadb redis-server
# --- 13. ФИНАЛЬНАЯ ПРОВЕРКА ---
log_info "Выполнение финальной проверки..."
# Проверка статуса служб
if systemctl is-active --quiet apache2; then
log_success "Apache2 запущен и работает"
else
log_error "Apache2 не запущен"
fi
if systemctl is-active --quiet mariadb; then
log_success "MariaDB запущен и работает"
else
log_error "MariaDB не запущен" log_error "MariaDB не запущен"
exit 1
fi fi
if systemctl is-active --quiet redis-server; then if ! php -r "echo phpversion();" >/dev/null 2>&1; then
log_success "Redis запущен и работает"
else
log_warning "Redis не запущен"
fi
# Проверка PHP
PHP_TEST=$(php -r "echo 'PHP работает: ' . phpversion();" 2>/dev/null || echo "PHP не работает")
if [[ "$PHP_TEST" == *"PHP работает"* ]]; then
log_success "$PHP_TEST"
else
log_error "PHP не работает корректно" log_error "PHP не работает корректно"
exit 1
fi fi
# Проверка загруженных файлов
if [ -f "$WEBROOT/index.php" ]; then
log_success "Веб-файлы найдены в $WEBROOT"
else
log_warning "Основной index.php не найден"
fi
# --- ЗАВЕРШЕНИЕ ---
IP_ADDR=$(hostname -I | awk '{print $1}') IP_ADDR=$(hostname -I | awk '{print $1}')
echo "" echo ""
echo "==============================================" echo "Установка успешно завершена."
echo -e "${GREEN} УСТАНОВКА LAMP ЗАВЕРШЕНА УСПЕШНО!${NC}" echo " Доступ к сайту:"
echo "=============================================="
echo ""
echo "📋 Конфигурация:"
echo " • Архитектура: LAMP (Linux + Apache + MariaDB + PHP)"
echo " • Версия PHP: $(php --version | head -n1)"
echo "Веб-директория: $WEBROOT"
echo " • База данных: ALTCor (пользователь: root)"
echo " • Источник файлов: $DOWNLOAD_URL"
echo ""
echo "🌐 Доступ к сайту:"
echo " • http://localhost/" echo " • http://localhost/"
echo " • http://$IP_ADDR/" echo " • http://$IP_ADDR/"
echo "" echo ""
echo "🔧 Управление сервисами:"
echo " • Apache: sudo systemctl [start|stop|restart|status] apache2"
echo " • MariaDB: sudo systemctl [start|stop|restart|status] mariadb"
echo " • Redis: sudo systemctl [start|stop|restart|status] redis-server"
echo ""
echo "📝 Логи:"
echo " • Apache: /var/log/apache2/error.log"
echo " • PHP: /var/log/php8.3.log"
echo " • MariaDB: /var/log/mysql/error.log"
echo ""
echo "🔐 Безопасность:"
echo " • Файл db_config.php защищен от прямого доступа"
echo " • Включены базовые заголовки безопасности"
echo " • OPcache оптимизирован для производительности"
echo ""
echo "⚠️ Примечание:"
echo " Если загрузка не удалась, можете повторно загрузить файлы:"
echo " cd $WEBROOT && wget $DOWNLOAD_URL -O files.zip && unzip files.zip"
echo ""
echo "=============================================="