#!/bin/bash # Скрипт для чистой установки и настройки 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 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 log_error "Не удалось определить дистрибутив." exit 1 fi log_success "Определен дистрибутив: $DISTRO (Семейство: ${FAMILY:-$DISTRO}, Версия: $VERSION_ID)" # Проверка поддерживаемых дистрибутивов if ! echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then log_error "Ваш дистрибутив '$DISTRO' не поддерживается. Поддерживаются только Debian/Ubuntu." exit 1 fi # --- 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 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 log_info "Добавление PPA ondrej/php для PHP 8.3..." # Используем официальный 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 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" mkdir -p "$WEBROOT" # Создание конфигурации виртуального хоста APACHE_CONF="/etc/apache2/sites-available/000-default.conf" log_info "Создание конфигурации Apache в $APACHE_CONF..." cat > "$APACHE_CONF" < DocumentRoot $WEBROOT ServerName localhost ServerAlias www.localhost 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 # Обработка PHP файлов SetHandler application/x-httpd-php # Безопасность - защита конфигурационных файлов Require all denied Require all denied Require all denied # Кэширование статических файлов 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 # --- 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 # --- 8. СОЗДАНИЕ КОНФИГУРАЦИОННОГО ФАЙЛА БД --- log_info "Создание файла конфигурации базы данных..." cat > "$WEBROOT/db_config.php" << 'EOF' EOF # --- 9. ЗАГРУЗКА УДАЛЕННЫХ ФАЙЛОВ --- log_info "Загрузка веб-файлов с удаленного сервера..." DOWNLOAD_URL="https://cloud.altcor.ru/setup/download.php" TEMP_DOWNLOAD="/tmp/web_files_$(date +%s).zip" # Проверка доступности сервера 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' Сервер LAMP готов к работе"; echo "

PHP " . phpversion() . " работает корректно!

"; echo "

Время: " . date('Y-m-d H:i:s') . "

"; ?> EOF log_warning "Создан временный index.php. Веб-файлы можно будет загрузить позже." else log_info "Загрузка файлов..." # Очищаем веб-директорию (оставляем только db_config.php) find "$WEBROOT" -type f ! -name "db_config.php" -delete 2>/dev/null || true # Загружаем архив if curl -f -s -o "$TEMP_DOWNLOAD" "$DOWNLOAD_URL"; then log_success "Файлы успешно загружены." log_info "Распаковка файлов..." # Проверяем, что это ZIP-архив if file "$TEMP_DOWNLOAD" | grep -q "Zip archive"; then if unzip -q "$TEMP_DOWNLOAD" -d "$WEBROOT"; then log_success "Файлы успешно распакованы в $WEBROOT" else log_error "Ошибка при распаковке архива." rm -f "$TEMP_DOWNLOAD" exit 1 fi else log_info "Полученный файл не является ZIP-архивом. Попытка сохранить как PHP-файл..." # Если это не архив, возможно это PHP-скрипт if head -n 1 "$TEMP_DOWNLOAD" | grep -q " "$WEBROOT/index.php" << 'EOF' Сервер LAMP готов к работе"; echo "

PHP " . phpversion() . " работает корректно!

"; echo "

Время: " . date('Y-m-d H:i:s') . "

"; echo "

Внимание: Не удалось загрузить основные файлы приложения.

"; ?> EOF log_warning "Создан временный index.php. Проверьте доступность удаленного сервера." fi fi # --- 10. СОЗДАНИЕ .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" 2>/dev/null || true chmod 600 "$WEBROOT/db_config.php" # --- 11. НАСТРОЙКА БАЗЫ ДАННЫХ --- log_info "Настройка MariaDB..." 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'; 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 log_success "MariaDB успешно настроена." else log_error "Не удалось выполнить скрипт настройки MariaDB." rm -f "$MYSQL_TMP_SCRIPT" exit 1 fi rm -f "$MYSQL_TMP_SCRIPT" # --- 12. ПРОВЕРКА КОНФИГУРАЦИИ И ЗАПУСК --- log_info "Проверка конфигурации Apache..." if apache2ctl configtest; then log_success "Конфигурация Apache корректна." else log_error "Конфигурация Apache содержит ошибки." exit 1 fi # Перезапуск и включение автозапуска служб 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 не запущен" 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 # Проверка загруженных файлов if [ -f "$WEBROOT/index.php" ]; then log_success "Веб-файлы найдены в $WEBROOT" else log_warning "Основной index.php не найден" fi # --- ЗАВЕРШЕНИЕ --- IP_ADDR=$(hostname -I | awk '{print $1}') echo "" echo "==============================================" echo -e "${GREEN} УСТАНОВКА LAMP ЗАВЕРШЕНА УСПЕШНО!${NC}" 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://$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 "⚠️ Примечание:" echo " Если загрузка не удалась, можете повторно загрузить файлы:" echo " cd $WEBROOT && wget $DOWNLOAD_URL -O files.zip && unzip files.zip" echo "" echo "=============================================="