509 lines
19 KiB
Bash
509 lines
19 KiB
Bash
#!/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" <<EOF
|
||
<VirtualHost *:80>
|
||
DocumentRoot $WEBROOT
|
||
ServerName localhost
|
||
ServerAlias www.localhost
|
||
|
||
<Directory $WEBROOT>
|
||
Options -Indexes +FollowSymLinks
|
||
AllowOverride All
|
||
Require all granted
|
||
|
||
# Включение сжатия
|
||
<IfModule mod_deflate.c>
|
||
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
|
||
</IfModule>
|
||
</Directory>
|
||
|
||
# Обработка PHP файлов
|
||
<FilesMatch \.php$>
|
||
SetHandler application/x-httpd-php
|
||
</FilesMatch>
|
||
|
||
# Безопасность - защита конфигурационных файлов
|
||
<Files "*.conf">
|
||
Require all denied
|
||
</Files>
|
||
|
||
<Files "db_config.php">
|
||
Require all denied
|
||
</Files>
|
||
|
||
<Files ".htaccess">
|
||
Require all denied
|
||
</Files>
|
||
|
||
# Кэширование статических файлов
|
||
<IfModule mod_expires.c>
|
||
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"
|
||
</IfModule>
|
||
|
||
ErrorLog \${APACHE_LOG_DIR}/error.log
|
||
CustomLog \${APACHE_LOG_DIR}/access.log combined
|
||
</VirtualHost>
|
||
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'
|
||
<?php
|
||
$db_host = 'localhost';
|
||
$db_user = 'root';
|
||
$db_pass = 'muJh9tNY8sg0';
|
||
$db_name = 'ALTCor';
|
||
|
||
define('OFFICE', '/usr/bin/libreoffice');
|
||
define('DB_CHARSET', 'utf8mb4');
|
||
?>
|
||
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'
|
||
<?php
|
||
echo "<h1>Сервер LAMP готов к работе</h1>";
|
||
echo "<p>PHP " . phpversion() . " работает корректно!</p>";
|
||
echo "<p>Время: " . date('Y-m-d H:i:s') . "</p>";
|
||
?>
|
||
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 "<?php\|<!DOCTYPE"; then
|
||
mv "$TEMP_DOWNLOAD" "$WEBROOT/index.php"
|
||
log_success "Файл сохранен как index.php"
|
||
else
|
||
log_error "Неизвестный формат загруженного файла."
|
||
rm -f "$TEMP_DOWNLOAD"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# Удаляем временный файл
|
||
rm -f "$TEMP_DOWNLOAD"
|
||
|
||
else
|
||
log_error "Не удалось загрузить файлы с $DOWNLOAD_URL"
|
||
log_warning "Создание простого тестового index.php..."
|
||
|
||
# Создаем простой index.php как fallback
|
||
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
|
||
|
||
# --- 10. СОЗДАНИЕ .HTACCESS ---
|
||
|
||
log_info "Создание .htaccess для безопасности..."
|
||
|
||
cat > "$WEBROOT/.htaccess" << 'EOF'
|
||
# Защита конфигурационных файлов
|
||
<Files "db_config.php">
|
||
Require all denied
|
||
</Files>
|
||
|
||
<Files "*.conf">
|
||
Require all denied
|
||
</Files>
|
||
|
||
<Files ".env">
|
||
Require all denied
|
||
</Files>
|
||
|
||
# Включение сжатия для лучшей производительности
|
||
<IfModule mod_deflate.c>
|
||
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml
|
||
</IfModule>
|
||
|
||
# Кэширование статических файлов
|
||
<IfModule mod_expires.c>
|
||
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"
|
||
</IfModule>
|
||
|
||
# Защита от некоторых атак
|
||
<IfModule mod_headers.c>
|
||
Header always set X-Content-Type-Options nosniff
|
||
Header always set X-Frame-Options DENY
|
||
Header always set X-XSS-Protection "1; mode=block"
|
||
</IfModule>
|
||
|
||
# Красивые 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 "==============================================" |