Files
altcorAutoinstall/install.sh

509 lines
19 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
# Скрипт для чистой установки и настройки 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 "=============================================="