From 07ea392c8a83c1a51e964019fc591a8a1bf660d0 Mon Sep 17 00:00:00 2001 From: hosh1 Date: Sat, 9 Aug 2025 23:29:05 +0300 Subject: [PATCH] Update --- install.sh | 596 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 430 insertions(+), 166 deletions(-) diff --git a/install.sh b/install.sh index 68649ce..09979e0 100644 --- a/install.sh +++ b/install.sh @@ -1,143 +1,219 @@ #!/bin/bash -# Исправленный скрипт для автоматической установки и настройки LEMP +# Скрипт для чистой установки и настройки LAMP (Apache, MariaDB, PHP 8.3) set -e +# Цвета для вывода +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Функция для вывода сообщений +log_info() { echo -e "${BLUE}[INFO]${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"; } + # --- 1. ПРОВЕРКА СИСТЕМЫ И ПРАВ --- +log_info "Проверка прав доступа..." if [[ $EUID -ne 0 ]]; then - echo "Ошибка: Запустите этот скрипт с правами суперпользователя (используйте sudo)." + log_error "Запустите этот скрипт с правами суперпользователя (используйте sudo)." exit 1 fi +log_info "Определение операционной системы..." if [ -f /etc/os-release ]; then . /etc/os-release DISTRO="$ID" FAMILY="$ID_LIKE" VERSION_ID="${VERSION_ID:-unknown}" else - echo "Ошибка: Не удалось определить дистрибутив." + log_error "Не удалось определить дистрибутив." exit 1 fi -echo "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)" +log_success "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)" -# --- 2. УСТАНОВКА ДЛЯ DEBIAN-ПОДОБНЫХ СИСТЕМ --- - -if echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then - echo "Начало установки LEMP для Debian-подобной системы..." - - apt update -y - apt install -y software-properties-common lsb-release ca-certificates curl wget gnupg2 - - # Добавление PPA ondrej/php для PHP 8.3 - if ! apt-cache show php8.3-fpm &>/dev/null; then - echo "PHP 8.3 не найден. Добавляем PPA ondrej/php..." - CODENAME=$(lsb_release -sc) - if ! curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/php-archive-keyring.gpg; then - echo "ОШИБКА: Не удалось загрузить GPG-ключ для репозитория PHP." - exit 1 - fi - echo "deb [signed-by=/usr/share/keyrings/php-archive-keyring.gpg] https://packages.sury.org/php/ $CODENAME main" > /etc/apt/sources.list.d/php.list - apt update -y - fi - - # Проверка доступности пакетов - if ! apt-cache show php8.3-fpm &>/dev/null; then - echo "ОШИБКА: PHP 8.3-FPM все еще недоступен. Установка невозможна." - exit 1 - fi - - echo "Установка пакетов: nginx, mariadb, redis, php-fpm..." - - # Останавливаем Apache, если он запущен, и удаляем его - systemctl stop apache2 2>/dev/null || true - systemctl disable apache2 2>/dev/null || true - apt remove -y apache2 apache2-common apache2-utils 2>/dev/null || true - - # Устанавливаем только нужные пакеты - apt install -y nginx mariadb-server redis-server libreoffice default-jre - - # Устанавливаем PHP 8.3-FPM и расширения - PHP_PACKAGES="php8.3-fpm 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" - - if ! apt install -y $PHP_PACKAGES; then - echo "ОШИБКА: Не удалось установить PHP 8.3-FPM и/или его расширения." - exit 1 - fi - - # Проверка установленной версии PHP - if systemctl is-active --quiet php8.3-fpm; then - INSTALLED_PHP_VERSION=$(php8.3 --version 2>/dev/null | head -n1 | grep -o "8\.3\.[0-9]*" || php --version 2>/dev/null | head -n1 | grep -o "8\.3\.[0-9]*" || echo "8.3.x") - echo "PHP 8.3 ($INSTALLED_PHP_VERSION) успешно установлен и запущен." - else - echo "ОШИБКА: PHP 8.3-FPM не запущен." - exit 1 - fi - - systemctl enable --now mariadb redis-server php8.3-fpm - -else - echo "ОШИБКА: Ваш дистрибутив '$DISTRO' не поддерживается этим скриптом. Поддерживаются только Debian/Ubuntu." +# Проверка поддерживаемых дистрибутивов +if ! echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then + log_error "Ваш дистрибутив '$DISTRO' не поддерживается. Поддерживаются только Debian/Ubuntu." exit 1 fi -# --- 3. НАСТРОЙКА NGINX --- +# --- 2. ОЧИСТКА СУЩЕСТВУЮЩИХ УСТАНОВОК --- + +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 + +# --- 4. ДОБАВЛЕНИЕ РЕПОЗИТОРИЯ PHP 8.3 --- + +log_info "Добавление репозитория для PHP 8.3..." +CODENAME=$(lsb_release -sc) + +if ! curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/php-archive-keyring.gpg; then + log_error "Не удалось загрузить GPG-ключ для репозитория PHP." + exit 1 +fi + +echo "deb [signed-by=/usr/share/keyrings/php-archive-keyring.gpg] https://packages.sury.org/php/ $CODENAME main" > /etc/apt/sources.list.d/php.list + +log_info "Обновление списка пакетов с новым репозиторием..." +apt update -y + +# --- 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 php8.3-json libapache2-mod-php8.3" + +if ! apt install -y $PHP_PACKAGES; then + log_error "Не удалось установить PHP 8.3 и/или его расширения." + exit 1 +fi + +# --- 6. НАСТРОЙКА APACHE --- + +log_info "Настройка Apache..." + +# Включаем необходимые модули +a2enmod php8.3 rewrite ssl headers expires deflate + +# Отключаем старые модули PHP, если они были включены +for php_ver in 7.4 8.0 8.1 8.2; do + a2dismod php$php_ver 2>/dev/null || true +done WEBROOT="/var/www/html" -echo "Корневая директория веб-сервера: $WEBROOT" mkdir -p "$WEBROOT" -# Создание правильной конфигурации Nginx -NGINX_CONF="/etc/nginx/sites-available/default" -echo "Создание конфигурации Nginx в $NGINX_CONF..." +# Создание конфигурации виртуального хоста +APACHE_CONF="/etc/apache2/sites-available/000-default.conf" +log_info "Создание конфигурации Apache в $APACHE_CONF..." -cat > "$NGINX_CONF" < "$APACHE_CONF" < + DocumentRoot $WEBROOT + ServerName localhost + ServerAlias www.localhost - root $WEBROOT; - index index.php index.html index.htm; - server_name _; + + 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 + + - # Основная обработка файлов - location / { - try_files \$uri \$uri/ =404; - } + # Обработка PHP файлов + + SetHandler application/x-httpd-php + - # Обработка PHP файлов через PHP-FPM - location ~ \.php$ { - include snippets/fastcgi-php.conf; - fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; - fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; - include fastcgi_params; - } + # Безопасность - защита конфигурационных файлов + + Require all denied + + + + Require all denied + - # Запрет доступа к .htaccess файлам - location ~ /\.ht { - deny all; - } + + Require all denied + # Кэширование статических файлов - location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } -} + + 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 -# Проверка конфигурации Nginx -if ! nginx -t; then - echo "ОШИБКА: Конфигурация Nginx содержит ошибки." - exit 1 +# --- 7. НАСТРОЙКА PHP --- + +log_info "Настройка PHP 8.3 для Apache..." + +PHP_INI_APACHE="/etc/php/8.3/apache2/php.ini" +if [ -f "$PHP_INI_APACHE" ]; then + # Создаем резервную копию + cp "$PHP_INI_APACHE" "${PHP_INI_APACHE}.backup.$(date +%Y%m%d_%H%M%S)" + + # Настройки производительности и безопасности + 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 -# Убеждаемся, что PHP-FPM активен -systemctl enable --now php8.3-fpm +# --- 8. СОЗДАНИЕ ВЕБ-ФАЙЛОВ --- -# --- 4. СОЗДАНИЕ ВЕБ-ФАЙЛОВ --- +log_info "Создание веб-файлов..." # Создаем db_config.php cat > "$WEBROOT/db_config.php" << 'EOF' @@ -152,7 +228,7 @@ define('DB_CHARSET', 'utf8mb4'); ?> EOF -# Создаем index.php (тот же код что и в оригинале) +# Создаем index.php cat > "$WEBROOT/index.php" << 'EOF' - Статус сервера LEMP (Nginx + PHP 8.3) + Статус сервера LAMP (Apache + PHP 8.3)
-

Статус сервера LEMP

+

🚀 Статус сервера LAMP Apache + PHP 8.3

-
Версия PHP: ()
-
База данных:
-
OPcache:
+
+ 🐘 Версия PHP: + ✓ PHP 8.3 активен' : '✗ НЕ PHP 8.3' ?> +
+ +
+ 🗄️ База данных: +
+ +
+ ⚡ OPcache: +
-

Расширения PHP

+

🔧 Расширения PHP

$loaded): ?>
- : + :
+
-

Информация о системе

+

ℹ️ Информация о системе

- Java: &1 | head -n1'); echo $java_version ? htmlspecialchars(trim($java_version)) : 'Не найдена'; ?>
- Сервер:
- Web SAPI: + ☕ Java: &1 | head -n1'); + echo $java_version ? htmlspecialchars(trim($java_version)) : 'Не найдена'; + ?>
+ 🌐 Веб-сервер:
+ ⚙️ PHP SAPI:
+ 📁 Document Root:
+ 🕒 Время сервера:
+ 💾 Загруженные модули Apache: +
@@ -244,69 +396,181 @@ $opcache_enabled = function_exists('opcache_get_status') && opcache_get_status(f EOF +# --- 8. СОЗДАНИЕ .HTACCESS --- + +log_info "Создание .htaccess для безопасности..." + +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" + + +# Красивые URL (при необходимости) +RewriteEngine On +# RewriteCond %{REQUEST_FILENAME} !-f +# RewriteCond %{REQUEST_FILENAME} !-d +# RewriteRule ^(.*)$ index.php [QSA,L] +EOF + +# Установка правильных прав доступа chown -R www-data:www-data "$WEBROOT" chmod -R 755 "$WEBROOT" +chmod 644 "$WEBROOT/.htaccess" +chmod 600 "$WEBROOT/db_config.php" -# --- 5. НАСТРОЙКА PHP.INI ДЛЯ FPM --- +# --- 9. НАСТРОЙКА БАЗЫ ДАННЫХ --- -PHP_INI_FPM="/etc/php/8.3/fpm/php.ini" -echo "Настройка PHP-FPM в $PHP_INI_FPM..." +log_info "Настройка MariaDB..." -if [ -f "$PHP_INI_FPM" ]; then - cp "$PHP_INI_FPM" "${PHP_INI_FPM}.backup.$(date +%Y%m%d)" - sed -i 's/upload_max_filesize = .*/upload_max_filesize = 64M/' "$PHP_INI_FPM" - sed -i 's/post_max_size = .*/post_max_size = 64M/' "$PHP_INI_FPM" - sed -i 's/max_execution_time = .*/max_execution_time = 300/' "$PHP_INI_FPM" - sed -i 's/memory_limit = .*/memory_limit = 256M/' "$PHP_INI_FPM" - sed -i 's/;opcache.enable=.*/opcache.enable=1/' "$PHP_INI_FPM" - sed -i 's/;opcache.enable_cli=.*/opcache.enable_cli=1/' "$PHP_INI_FPM" - sed -i 's/;opcache.memory_consumption=.*/opcache.memory_consumption=128/' "$PHP_INI_FPM" - sed -i 's/;opcache.revalidate_freq=.*/opcache.revalidate_freq=2/' "$PHP_INI_FPM" -else - echo "ПРЕДУПРЕЖДЕНИЕ: Не найден файл конфигурации $PHP_INI_FPM" -fi - -# --- 6. НАСТРОЙКА БАЗЫ ДАННЫХ --- - -MYSQL_TMP_SCRIPT="/tmp/mysql_first_config.sql" +MYSQL_TMP_SCRIPT="/tmp/mysql_setup_$(date +%s).sql" cat > "$MYSQL_TMP_SCRIPT" << 'MYSQL_SCRIPT' +-- Безопасная настройка MariaDB 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; -GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost' IDENTIFIED BY 'muJh9tNY8sg0'; + +-- Предоставление прав +GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost'; FLUSH PRIVILEGES; + +-- Удаление анонимных пользователей 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; + +-- Показать созданную БД +SHOW DATABASES; MYSQL_SCRIPT -if ! mysql -u root < "$MYSQL_TMP_SCRIPT"; then - echo "ОШИБКА: Не удалось выполнить скрипт настройки MariaDB." +if mysql -u root < "$MYSQL_TMP_SCRIPT"; then + log_success "MariaDB успешно настроена." +else + log_error "Не удалось выполнить скрипт настройки MariaDB." rm -f "$MYSQL_TMP_SCRIPT" exit 1 fi rm -f "$MYSQL_TMP_SCRIPT" -echo "База данных успешно настроена." +# --- 10. ПРОВЕРКА КОНФИГУРАЦИИ И ЗАПУСК --- -# --- 7. ПЕРЕЗАПУСК СЛУЖБ И ФИНАЛЬНАЯ ПРОВЕРКА --- +log_info "Проверка конфигурации Apache..." +if apache2ctl configtest; then + log_success "Конфигурация Apache корректна." +else + log_error "Конфигурация Apache содержит ошибки." + exit 1 +fi -systemctl restart php8.3-fpm -systemctl restart nginx +# Перезапуск и включение автозапуска служб +log_info "Запуск служб..." -systemctl enable nginx php8.3-fpm mariadb redis-server +systemctl restart apache2 +systemctl restart mariadb +systemctl restart redis-server + +systemctl enable apache2 mariadb redis-server + +# --- 11. ФИНАЛЬНАЯ ПРОВЕРКА --- + +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 не запущен" +fi + +if systemctl is-active --quiet redis-server; 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 не работает корректно" +fi # --- ЗАВЕРШЕНИЕ --- IP_ADDR=$(hostname -I | awk '{print $1}') + echo "" -echo "=== УСТАНОВКА ЗАВЕРШЕНА ===" -echo " Архитектура: LEMP (Linux + Nginx + MariaDB + PHP)" -echo " Версия PHP: $(php --version | head -n1)" -echo " Веб-директория: $WEBROOT" +echo "==============================================" +echo -e "${GREEN} УСТАНОВКА LAMP ЗАВЕРШЕНА УСПЕШНО!${NC}" +echo "==============================================" echo "" -echo " Для проверки откройте в браузере:" -echo " -> http://localhost/" -echo " -> http://$IP_ADDR/" +echo "📋 Конфигурация:" +echo " • Архитектура: LAMP (Linux + Apache + MariaDB + PHP)" +echo " • Версия PHP: $(php --version | head -n1)" +echo " • Веб-директория: $WEBROOT" +echo " • База данных: ALTCor (пользователь: root)" echo "" -echo " Статус активных служб:" -systemctl is-active nginx php8.3-fpm mariadb redis-server || echo "ПРЕДУПРЕЖДЕНИЕ: Некоторые службы неактивны." -echo "" \ No newline at end of file +echo "🌐 Доступ к сайту:" +echo " • http://localhost/" +echo " • http://$IP_ADDR/" +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 "==============================================" \ No newline at end of file