Files
altcorAutoinstall/install.sh

320 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 (Nginx, MariaDB, PHP-FPM 8.3)
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-ПОДОБНЫХ СИСТЕМ (Debian, Ubuntu) ---
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 "Установка пакетов: apache2, nginx (для прокси), mariadb, redis, php-fpm..."
# Устанавливаем Nginx и PHP-FPM
apt install -y apache2 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
INSTALLED_PHP_VERSION=$(php --version 2>/dev/null | head -n1 | grep -o "8\.3\.[0-9]*" || echo "")
if [ -z "$INSTALLED_PHP_VERSION" ]; then
echo "ОШИБКА: PHP 8.3 не был установлен корректно."
exit 1
fi
echo "PHP 8.3 ($INSTALLED_PHP_VERSION) успешно установлен."
systemctl enable --now mariadb redis-server nginx php8.3-fpm
else
echo "ОШИБКА: Ваш дистрибутив '$DISTRO' не поддерживается этим скриптом. Поддерживаются только Debian/Ubuntu."
exit 1
fi
systemctl stop apache2 ngninx
WEBROOT="/var/www/html"
echo "Корневая директория веб-сервера: $WEBROOT"
mkdir -p "$WEBROOT"
APACHE_CONF="/etc/apache2/sites-available/000-default.conf"
echo "Настройка Apache в $APACHE_CONF..."
# Конфигурация Apache для работы с PHP-FPM
cat > "$APACHE_CONF" <<EOF
<VirtualHost *:8080>
DocumentRoot $WEBROOT
<Directory $WEBROOT>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog \${APACHE_LOG_DIR}/error.log
CustomLog \${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF
sed -i 's/Listen 80/Listen 8080/' /etc/apache2/ports.conf
# Создание конфигурации 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;
server_name _;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
location ~ \.php$ {
return 404;
}
}
EOF
a2enmod proxy_fcgi rewrite
systemctl restart apache2
# Проверка конфигурации Nginx
if ! nginx -t; then
echo "ОШИБКА: Конфигурация Nginx содержит ошибки."
exit 1
fi
# --- 4. СОЗДАНИЕ ВЕБ-ФАЙЛОВ ---
# Файлы db_config.php и index.php остаются такими же, как в предыдущей версии.
# Создаем 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; } /* Nginx green */
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'] ?? 'Неизвестно' ?><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
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"
# Явно включаем opcache
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 apache2
systemctl restart nginx
systemctl enable apache2 nginx php8.3-fpm mariadb redis-server
# --- ЗАВЕРШЕНИЕ ---
IP_ADDR=$(hostname -I | awk '{print $1}')
echo ""
echo ""
echo " Версия PHP: $(php --version | head -n1)"
echo " Веб-директория: $WEBROOT"
echo ""
echo " Для проверки откройте в браузере:"
echo " -> http://localhost/"
echo " -> http://$IP_ADDR/"
echo ""
echo " Статус активных служб:"
systemctl is-active apache2 nginx php8.3-fpm mariadb redis-server || echo "ПРЕДУПРЕЖДЕНИЕ: Некоторые службы неактивны."
echo ""