#!/bin/bash set -e UNINSTALL=false while getopts ":u" opt; do case $opt in u) UNINSTALL=true ;; \?) echo -e "${RED}[ERROR]${NC} Неизвестный параметр: -$OPTARG" >&2 exit 1 ;; esac done RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } full_uninstall() { echo -e "${YELLOW}[INFO]${NC} Начинаем полное удаление LAMP-окружения..." systemctl stop nginx apache2 httpd php*-fpm mariadb mysql redis 2>/dev/null || true if [ "$DISTRO_FAMILY" = "debian" ]; then apt purge -y nginx* apache2* php* mariadb* mysql* redis* 2>/dev/null || true apt autoremove -y 2>/dev/null || true else $PKG_MANAGER remove -y nginx httpd php* mariadb* mysql* redis* 2>/dev/null || true fi rm -rf \ /etc/nginx \ /etc/apache2 \ /etc/httpd \ /etc/php* \ /var/www/html/* \ /var/lib/mysql* \ /var/lib/redis* \ ~/.mysql_history \ /root/.mysql_history 2>/dev/null || true echo -e "${GREEN}[SUCCESS]${NC} Полное удаление завершено!" exit 0 } if [[ $EUID -ne 0 ]]; then log_error "Запустите этот скрипт вместе с sudo." exit 1 fi if [ -f /etc/os-release ]; then . /etc/os-release DISTRO="$ID" FAMILY="$ID_LIKE" else log_error "Не удалось определить дистрибутив." exit 1 fi if echo "$DISTRO $FAMILY" | grep -qi "debian\|ubuntu"; then PKG_MANAGER="apt" DISTRO_FAMILY="debian" elif echo "$DISTRO $FAMILY" | grep -qi "rhel\|centos\|fedora"; then PKG_MANAGER="dnf" DISTRO_FAMILY="rhel" if ! command -v dnf >/dev/null 2>&1; then PKG_MANAGER="yum" fi else log_error "Ваш дистрибутив '$DISTRO' не поддерживается. Поддерживаются: Debian/Ubuntu, CentOS/RHEL/Fedora." exit 1 fi if [ "$UNINSTALL" = true ]; then full_uninstall fi systemctl stop nginx httpd apache2 php*-fpm 2>/dev/null || true systemctl disable nginx httpd 2>/dev/null || true echo "Установка Altcor..." if [ "$DISTRO_FAMILY" = "debian" ]; then apt remove -y nginx nginx-common nginx-core >/dev/null 2>&1 || true 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* >/dev/null 2>&1 || true elif [ "$DISTRO_FAMILY" = "rhel" ]; then $PKG_MANAGER remove -y nginx >/dev/null 2>&1 || true $PKG_MANAGER remove -y php php7* php80* php81* php82* >/dev/null 2>&1 || true fi if [ "$DISTRO_FAMILY" = "debian" ]; then apt update -y >/dev/null 2>&1 apt install -y software-properties-common lsb-release ca-certificates curl wget gnupg2 apt-transport-https unzip >/dev/null 2>&1 elif [ "$DISTRO_FAMILY" = "rhel" ]; then $PKG_MANAGER update -y >/dev/null 2>&1 $PKG_MANAGER install -y epel-release >/dev/null 2>&1 || true $PKG_MANAGER install -y curl wget gnupg2 unzip >/dev/null 2>&1 fi if [ "$DISTRO_FAMILY" = "debian" ]; then if ! apt-cache show php8.3 &>/dev/null; then if ! add-apt-repository ppa:ondrej/php -y >/dev/null 2>&1; then log_error "Не удалось добавить PPA ondrej/php." exit 1 fi apt update -y >/dev/null 2>&1 if ! apt-cache show php8.3 &>/dev/null; then log_error "PHP 8.3 все еще недоступен после добавления PPA." exit 1 fi fi elif [ "$DISTRO_FAMILY" = "rhel" ]; then if [ "$DISTRO" = "fedora" ]; then $PKG_MANAGER install -y https://rpms.remirepo.net/fedora/remi-release-$(rpm -E %fedora).rpm >/dev/null 2>&1 || true else $PKG_MANAGER install -y https://rpms.remirepo.net/enterprise/remi-release-$(rpm -E %rhel).rpm >/dev/null 2>&1 || true fi if command -v dnf >/dev/null 2>&1; then dnf module reset php -y >/dev/null 2>&1 || true dnf module enable php:remi-8.3 -y >/dev/null 2>&1 || true fi if ! $PKG_MANAGER list available php83* php8.3* >/dev/null 2>&1; then log_error "PHP 8.3 недоступен в репозиториях." exit 1 fi fi if [ "$DISTRO_FAMILY" = "debian" ]; then apt install -y apache2 >/dev/null 2>&1 apt install -y mariadb-server >/dev/null 2>&1 apt install -y redis-server libreoffice default-jre >/dev/null 2>&1 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 >/dev/null 2>&1; then log_error "Не удалось установить PHP 8.3 и/или его расширения." exit 1 fi elif [ "$DISTRO_FAMILY" = "rhel" ]; then $PKG_MANAGER install -y httpd >/dev/null 2>&1 $PKG_MANAGER install -y mariadb-server >/dev/null 2>&1 $PKG_MANAGER install -y redis libreoffice java-11-openjdk >/dev/null 2>&1 if [ "$DISTRO" = "fedora" ]; then PHP_PACKAGES="php php-cli php-common php-mysqlnd php-curl php-gd \ php-mbstring php-xml php-zip php-opcache php-intl \ php-bcmath" else PHP_PACKAGES="php83 php83-php php83-php-cli php83-php-common php83-php-mysqlnd php83-php-curl php83-php-gd \ php83-php-mbstring php83-php-xml php83-php-zip php83-php-opcache php83-php-intl \ php83-php-bcmath" fi if ! $PKG_MANAGER install -y $PHP_PACKAGES >/dev/null 2>&1; then log_error "Не удалось установить PHP 8.3 и/или его расширения." exit 1 fi if command -v php83 >/dev/null 2>&1 && [ ! -f /usr/bin/php ]; then ln -sf /usr/bin/php83 /usr/bin/php >/dev/null 2>&1 || true fi fi if [ "$DISTRO_FAMILY" = "debian" ]; then a2enmod php8.3 rewrite ssl headers expires deflate >/dev/null 2>&1 for php_ver in 7.4 8.0 8.1 8.2; do a2dismod php$php_ver >/dev/null 2>&1 || true done WEBROOT="/var/www/html" APACHE_CONF="/etc/apache2/sites-available/000-default.conf" WEBSERVER_USER="www-data" elif [ "$DISTRO_FAMILY" = "rhel" ]; then WEBROOT="/var/www/html" APACHE_CONF="/etc/httpd/conf.d/000-default.conf" WEBSERVER_USER="apache" cat > "/etc/httpd/conf.d/php.conf" << 'EOF' LoadModule php_module modules/libphp.so LoadModule rewrite_module modules/mod_rewrite.so SetHandler application/x-httpd-php EOF fi mkdir -p "$WEBROOT" cat > "$APACHE_CONF" < DocumentRoot $WEBROOT ServerName localhost ServerAlias www.localhost Options -Indexes +FollowSymLinks AllowOverride All Require all granted 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 SetHandler application/x-httpd-php Require all denied Require all denied Require all denied 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" ErrorLog \${APACHE_LOG_DIR}/error.log CustomLog \${APACHE_LOG_DIR}/access.log combined EOF if [ "$DISTRO_FAMILY" = "debian" ]; then PHP_INI_PATH="/etc/php/8.3/apache2/php.ini" elif [ "$DISTRO_FAMILY" = "rhel" ]; then if [ "$DISTRO" = "fedora" ]; then PHP_INI_PATH="/etc/php.ini" else PHP_INI_PATH="/etc/opt/remi/php83/php.ini" [ ! -f "$PHP_INI_PATH" ] && PHP_INI_PATH="/etc/php.ini" fi fi if [ -f "$PHP_INI_PATH" ]; then cp "$PHP_INI_PATH" "${PHP_INI_PATH}.backup.$(date +%Y%m%d_%H%M%S)" sed -i 's/;*upload_max_filesize = .*/upload_max_filesize = 64M/' "$PHP_INI_PATH" sed -i 's/;*post_max_size = .*/post_max_size = 64M/' "$PHP_INI_PATH" sed -i 's/;*max_execution_time = .*/max_execution_time = 300/' "$PHP_INI_PATH" sed -i 's/;*memory_limit = .*/memory_limit = 256M/' "$PHP_INI_PATH" sed -i 's/;*max_input_vars = .*/max_input_vars = 3000/' "$PHP_INI_PATH" sed -i 's/;*opcache.enable=.*/opcache.enable=1/' "$PHP_INI_PATH" sed -i 's/;*opcache.enable_cli=.*/opcache.enable_cli=1/' "$PHP_INI_PATH" sed -i 's/;*opcache.memory_consumption=.*/opcache.memory_consumption=128/' "$PHP_INI_PATH" sed -i 's/;*opcache.revalidate_freq=.*/opcache.revalidate_freq=2/' "$PHP_INI_PATH" sed -i 's/;*opcache.max_accelerated_files=.*/opcache.max_accelerated_files=4000/' "$PHP_INI_PATH" sed -i 's/;*expose_php = .*/expose_php = Off/' "$PHP_INI_PATH" sed -i 's/;*display_errors = .*/display_errors = Off/' "$PHP_INI_PATH" sed -i 's/;*log_errors = .*/log_errors = On/' "$PHP_INI_PATH" fi cat > "$WEBROOT/db_config.php" << 'EOF' EOF DOWNLOAD_URL="https://cloud.altcor.ru/setup/download.php" TEMP_DOWNLOAD="/tmp/web_files_$(date +%s)" create_fallback_index() { cat > "$WEBROOT/index.php" << 'EOF' "; echo ""; echo ""; echo ""; echo ""; echo "Сервер LAMP - Готов к работе"; echo ""; echo ""; echo ""; echo "
"; echo "

🚀 Сервер LAMP готов к работе

"; echo "
"; echo "✅ PHP " . phpversion() . " работает корректно!
"; echo "Время сервера: " . date('Y-m-d H:i:s T') . "
"; echo "Document Root: " . $_SERVER['DOCUMENT_ROOT']; echo "
"; // Проверка подключения к БД try { $pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8mb4", $db_user, $db_pass); echo "
"; echo "✅ База данных подключена успешно
"; echo "База данных: $db_name
"; echo "Хост: $db_host"; echo "
"; } catch (PDOException $e) { echo "
"; echo "⚠️ Проблема с базой данных: " . htmlspecialchars($e->getMessage()); echo "
"; } echo "
"; echo "⚠️ Внимание: Используется временная страница.
"; echo "Основные файлы приложения не были загружены с удаленного сервера.
"; echo "Для загрузки файлов вручную выполните:
"; echo "cd /var/www/html && wget https://cloud.altcor.ru/setup/download.php -O files.download"; echo "
"; echo "
"; echo ""; echo ""; ?> EOF } find "$WEBROOT" -type f ! -name "db_config.php" -delete 2>/dev/null || true if curl -f -L --max-time 30 -o "$WEBROOT/index.php" "$DOWNLOAD_URL" 2>/dev/null; then if ! head -n 1 "$WEBROOT/index.php" | grep -q "/dev/null; then create_fallback_index log_warning "Скачанный файл не является PHP-скриптом, создана резервная страница" else echo "Ещё чуть-чуть... fi else create_fallback_index log_error "Не удалось загрузить файл с $DOWNLOAD_URL, создана резервная страница" fi chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/index.php" chmod 644 "$WEBROOT/index.php" cat > "$WEBROOT/.htaccess" << 'EOF' Require all denied Require all denied Require all denied AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json application/xml 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" Header always set X-Content-Type-Options nosniff Header always set X-Frame-Options DENY Header always set X-XSS-Protection "1; mode=block" RewriteEngine On # RewriteCond %{REQUEST_FILENAME} !-f # RewriteCond %{REQUEST_FILENAME} !-d # RewriteRule ^(.*)$ index.php [QSA,L] EOF chown -R $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT" chmod -R 755 "$WEBROOT" chmod 644 "$WEBROOT/.htaccess" 2>/dev/null || true chmod 600 "$WEBROOT/db_config.php" MYSQL_TMP_SCRIPT="/tmp/mysql_setup_$(date +%s).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'; 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; SHOW DATABASES; MYSQL_SCRIPT if ! mysql -u root < "$MYSQL_TMP_SCRIPT" >/dev/null 2>&1; then log_error "Не удалось выполнить скрипт настройки MariaDB." rm -f "$MYSQL_TMP_SCRIPT" exit 1 fi rm -f "$MYSQL_TMP_SCRIPT" if [ "$DISTRO_FAMILY" = "debian" ]; then if ! apache2ctl configtest >/dev/null 2>&1; then log_error "Конфигурация Apache содержит ошибки." exit 1 fi systemctl restart apache2 >/dev/null 2>&1 systemctl enable apache2 >/dev/null 2>&1 WEBSERVER_SERVICE="apache2" elif [ "$DISTRO_FAMILY" = "rhel" ]; then if ! httpd -t >/dev/null 2>&1; then log_error "Конфигурация Apache (httpd) содержит ошибки." exit 1 fi systemctl restart httpd >/dev/null 2>&1 systemctl enable httpd >/dev/null 2>&1 WEBSERVER_SERVICE="httpd" fi systemctl restart mariadb >/dev/null 2>&1 systemctl restart redis-server >/dev/null 2>&1 || systemctl restart redis >/dev/null 2>&1 || true systemctl enable mariadb >/dev/null 2>&1 systemctl enable redis-server >/dev/null 2>&1 || systemctl enable redis >/dev/null 2>&1 || true if ! systemctl is-active --quiet $WEBSERVER_SERVICE; then log_error "Веб-сервер не запущен" exit 1 fi if ! systemctl is-active --quiet mariadb; then log_error "MariaDB не запущен" exit 1 fi if ! php -r "echo phpversion();" >/dev/null 2>&1; then log_error "PHP не работает корректно" exit 1 fi IP_ADDR=$(hostname -I | awk '{print $1}') echo "" echo "Установка Altcor успешно завершена." echo " Доступ к сайту:" echo " • http://localhost/" echo " • http://$IP_ADDR/" echo ""