Files
altcorAutoinstall/install.sh
2025-08-09 23:43:11 +03:00

589 lines
22 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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
# --- 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 "Создание веб-файлов..."
# Создаем db_config.php
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
# Создаем index.php
cat > "$WEBROOT/index.php" << 'EOF'
<?php
require_once __DIR__ . '/db_config.php';
// Проверка версии PHP
$php_version = phpversion();
$is_php83 = version_compare($php_version, '8.3.0', '>=') && version_compare($php_version, '8.4.0', '<');
// Проверка подключения к БД
$db_status = "";
$db_error = false;
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=" . DB_CHARSET, $db_user, $db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db_status = "Подключение к базе данных успешно!";
} catch (PDOException $e) {
$db_status = "Ошибка подключения к БД: " . $e->getMessage();
$db_error = true;
}
// Проверка расширений PHP
$extensions = [
'pdo_mysql' => extension_loaded('pdo_mysql'),
'curl' => extension_loaded('curl'),
'gd' => extension_loaded('gd'),
'mbstring' => extension_loaded('mbstring'),
'xml' => extension_loaded('xml'),
'zip' => extension_loaded('zip'),
'opcache' => extension_loaded('opcache'),
'intl' => extension_loaded('intl'),
'bcmath' => extension_loaded('bcmath'),
'json' => extension_loaded('json')
];
// Проверка статуса OPcache
$opcache_enabled = function_exists('opcache_get_status') && opcache_get_status(false)['opcache_enabled'];
// Информация о сервере
$server_info = $_SERVER['SERVER_SOFTWARE'] ?? 'Неизвестно';
$apache_version = apache_get_version() ?? 'Версия недоступна';
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Статус сервера LAMP (Apache + PHP 8.3)</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #333;
margin: 0;
padding: 20px;
min-height: 100vh;
}
.container {
max-width: 900px;
margin: auto;
background: #fff;
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0,0,0,0.1);
overflow: hidden;
}
h1, h2 {
padding: 20px 25px;
margin: 0;
background: linear-gradient(135deg, #d73502 0%, #f56500 100%);
color: #fff;
text-shadow: 0 1px 2px rgba(0,0,0,0.2);
}
h1 { font-size: 28px; }
h2 { font-size: 20px; background: linear-gradient(135deg, #e56b47 0%, #f78a65 100%); margin-top: 10px; }
.content { padding: 30px; }
.status {
padding: 20px;
margin-bottom: 20px;
border-left: 5px solid;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.05);
}
.success { background: linear-gradient(135deg, #e6fffa 0%, #b2f5ea 100%); border-color: #38b2ac; color: #234e52; }
.error { background: linear-gradient(135deg, #fed7d7 0%, #feb2b2 100%); border-color: #e53e3e; color: #742a2a; }
.info { background: linear-gradient(135deg, #ebf8ff 0%, #bee3f8 100%); border-color: #4299e1; color: #2a4365; }
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 15px;
margin-top: 15px;
}
.grid-item {
padding: 15px;
border-radius: 8px;
text-align: center;
font-weight: 500;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.ok { background: linear-gradient(135deg, #c6f6d5 0%, #9ae6b4 100%); color: #22543d; }
.missing { background: linear-gradient(135deg, #fed7d7 0%, #feb2b2 100%); color: #742a2a; }
strong { color: #2d3748; }
.server-badge {
display: inline-block;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 5px 12px;
border-radius: 15px;
font-size: 12px;
font-weight: bold;
margin-left: 10px;
}
</style>
</head>
<body>
<div class="container">
<h1>🚀 Статус сервера LAMP <span class="server-badge">Apache + PHP 8.3</span></h1>
<div class="content">
<div class="status <?= $is_php83 ? 'success' : 'error' ?>">
<strong>🐘 Версия PHP:</strong> <?= htmlspecialchars($php_version) ?>
<?= $is_php83 ? '<strong style="color:#38b2ac;">✓ PHP 8.3 активен</strong>' : '<strong style="color:#e53e3e;">✗ НЕ PHP 8.3</strong>' ?>
</div>
<div class="status <?= $db_error ? 'error' : 'success' ?>">
<strong>🗄️ База данных:</strong> <?= htmlspecialchars($db_status) ?>
</div>
<div class="status <?= $opcache_enabled ? 'success' : 'error' ?>">
<strong>⚡ OPcache:</strong> <?= $opcache_enabled ? '✓ Включен и работает' : '✗ Отключен или не загружен' ?>
</div>
<h2>🔧 Расширения PHP</h2>
<div class="grid">
<?php foreach ($extensions as $ext => $loaded): ?>
<div class="grid-item <?= $loaded ? 'ok' : 'missing' ?>">
<strong><?= htmlspecialchars($ext) ?>:</strong><br>
<?= $loaded ? '✅ Загружено' : '❌ Отсутствует' ?>
</div>
<?php endforeach; ?>
</div>
<h2> Информация о системе</h2>
<div class="status info">
<strong>☕ Java:</strong> <?php
$java_version = shell_exec('java -version 2>&1 | head -n1');
echo $java_version ? htmlspecialchars(trim($java_version)) : 'Не найдена';
?><br>
<strong>🌐 Веб-сервер:</strong> <?= htmlspecialchars($apache_version) ?><br>
<strong>⚙️ PHP SAPI:</strong> <?= php_sapi_name() ?><br>
<strong>📁 Document Root:</strong> <?= htmlspecialchars($_SERVER['DOCUMENT_ROOT'] ?? '/var/www/html') ?><br>
<strong>🕒 Время сервера:</strong> <?= date('Y-m-d H:i:s T') ?><br>
<strong>💾 Загруженные модули Apache:</strong>
<?php
if (function_exists('apache_get_modules')) {
$modules = apache_get_modules();
$php_modules = array_filter($modules, function($mod) { return strpos($mod, 'php') !== false; });
echo $php_modules ? implode(', ', $php_modules) : 'mod_php8.3';
} else {
echo 'Информация недоступна';
}
?>
</div>
</div>
</div>
</body>
</html>
EOF
# --- 8. СОЗДАНИЕ .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"
chmod 600 "$WEBROOT/db_config.php"
# --- 9. НАСТРОЙКА БАЗЫ ДАННЫХ ---
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"
# --- 10. ПРОВЕРКА КОНФИГУРАЦИИ И ЗАПУСК ---
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
# --- 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 -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 ""
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 "=============================================="