Files
altcorAutoinstall/install.sh

312 lines
13 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

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
# Исправленный скрипт для автоматической установки и настройки LEMP
set -e
# --- 1. ПРОВЕРКА СИСТЕМЫ И ПРАВ ---
if [[ $EUID -ne 0 ]]; then
echo "Ошибка: Запустите этот скрипт с правами суперпользователя (используйте sudo)."
exit 1
fi
if [ -f /etc/os-release ]; then
. /etc/os-release
DISTRO="$ID"
FAMILY="$ID_LIKE"
VERSION_ID="${VERSION_ID:-unknown}"
else
echo "Ошибка: Не удалось определить дистрибутив."
exit 1
fi
echo "Определен дистрибутив: $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."
exit 1
fi
# --- 3. НАСТРОЙКА NGINX ---
WEBROOT="/var/www/html"
echo "Корневая директория веб-сервера: $WEBROOT"
mkdir -p "$WEBROOT"
# Создание правильной конфигурации Nginx
NGINX_CONF="/etc/nginx/sites-available/default"
echo "Создание конфигурации Nginx в $NGINX_CONF..."
cat > "$NGINX_CONF" <<EOF
server {
listen 80 default_server;
listen [::]:80 default_server;
root $WEBROOT;
index index.php index.html index.htm;
server_name _;
# Основная обработка файлов
location / {
try_files \$uri \$uri/ =404;
}
# Обработка 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;
}
# Запрет доступа к .htaccess файлам
location ~ /\.ht {
deny all;
}
# Кэширование статических файлов
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
EOF
# Проверка конфигурации Nginx
if ! nginx -t; then
echo "ОШИБКА: Конфигурация Nginx содержит ошибки."
exit 1
fi
# Убеждаемся, что PHP-FPM активен
systemctl enable --now php8.3-fpm
# --- 4. СОЗДАНИЕ ВЕБ-ФАЙЛОВ ---
# Создаем 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'];
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Статус сервера LEMP (Nginx + PHP 8.3)</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background-color: #f4f7f9; color: #333; margin: 0; padding: 20px; }
.container { max-width: 800px; margin: auto; background: #fff; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); overflow: hidden; }
h1, h2 { padding: 20px 25px; margin: 0; background: #009639; color: #fff; }
h1 { font-size: 24px; }
h2 { font-size: 18px; background: #68a068; margin-top: 10px; }
.content { padding: 25px; }
.status { padding: 15px; margin-bottom: 15px; border-left: 5px solid; border-radius: 4px; }
.success { background-color: #e6fffa; border-color: #38b2ac; color: #234e52; }
.error { background-color: #fed7d7; border-color: #e53e3e; color: #742a2a; }
.info { background-color: #ebf8ff; border-color: #4299e1; color: #2a4365; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; }
.grid-item { padding: 10px; border-radius: 4px; text-align: center; }
.ok { background: #c6f6d5; }
.missing { background: #fed7d7; }
strong { color: #2d3748; }
</style>
</head>
<body>
<div class="container">
<h1>Статус сервера LEMP</h1>
<div class="content">
<div class="status <?= $is_php83 ? 'success' : 'error' ?>"><strong>Версия PHP:</strong> <?= htmlspecialchars($php_version) ?> (<?= $is_php83 ? '✓ PHP 8.3' : '✗ НЕ PHP 8.3' ?>)</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' ?>">
<?= htmlspecialchars($ext) ?>: <?= $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> <?= $_SERVER['SERVER_SOFTWARE'] ?? 'Nginx' ?><br>
<strong>Web SAPI:</strong> <?= php_sapi_name() ?>
</div>
</div>
</div>
</body>
</html>
EOF
chown -R www-data:www-data "$WEBROOT"
chmod -R 755 "$WEBROOT"
# --- 5. НАСТРОЙКА PHP.INI ДЛЯ FPM ---
PHP_INI_FPM="/etc/php/8.3/fpm/php.ini"
echo "Настройка PHP-FPM в $PHP_INI_FPM..."
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"
cat > "$MYSQL_TMP_SCRIPT" << 'MYSQL_SCRIPT'
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';
FLUSH PRIVILEGES;
DELETE FROM mysql.user WHERE user='';
DELETE FROM mysql.user WHERE user='root' AND host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
MYSQL_SCRIPT
if ! mysql -u root < "$MYSQL_TMP_SCRIPT"; then
echo "ОШИБКА: Не удалось выполнить скрипт настройки MariaDB."
rm -f "$MYSQL_TMP_SCRIPT"
exit 1
fi
rm -f "$MYSQL_TMP_SCRIPT"
echo "База данных успешно настроена."
# --- 7. ПЕРЕЗАПУСК СЛУЖБ И ФИНАЛЬНАЯ ПРОВЕРКА ---
systemctl restart php8.3-fpm
systemctl restart nginx
systemctl enable nginx php8.3-fpm mariadb redis-server
# --- ЗАВЕРШЕНИЕ ---
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 " Для проверки откройте в браузере:"
echo " -> http://localhost/"
echo " -> http://$IP_ADDR/"
echo ""
echo " Статус активных служб:"
systemctl is-active nginx php8.3-fpm mariadb redis-server || echo "ПРЕДУПРЕЖДЕНИЕ: Некоторые службы неактивны."
echo ""