Files
altcorAutoinstall/install.sh
2025-08-11 04:12:19 +03:00

1268 lines
49 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
clear
set -e
UNINSTALL=false
REINSTALL=false
while getopts ":ur" opt; do
case $opt in
u)
UNINSTALL=true
;;
r)
REINSTALL=true
;;
\?)
echo -e "${RED}[Ошибка]${NC} Неизвестный параметр: -$OPTARG" >&2
echo "Использование: $0 [-u] [-r]"
echo " -u Полное удаление"
echo " -r Переустановка (удаление + установка)"
exit 1
;;
esac
done
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
log_success() { echo -e "${GREEN}[Успех]${NC} $1"; }
log_error() { echo -e "${RED}[Ошибка]${NC} $1"; }
log_info() { echo -e "${BLUE}[Инфо]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[Предупреждение]${NC} $1"; }
log_step() { echo -e "${CYAN}[Шаг]${NC} $1"; }
generate_password() {
openssl rand -base64 32 | tr -d "=+/" | cut -c1-16
}
check_component() {
local component=$1
local command_check=$2
local service_check=$3
if [[ -n "$command_check" && $(command -v "$command_check" 2>/dev/null) ]]; then
if [[ -n "$service_check" ]]; then
if systemctl is-active --quiet "$service_check" 2>/dev/null; then
return 0
else
return 1
fi
else
return 0
fi
else
return 2
fi
}
check_existing_installation() {
log_step "Проверка существующей установки..."
local apache_status=2 php_status=2 mariadb_status=2 redis_status=2
local need_reinstall=false
log_info "Проверка Apache..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
if command -v apache2 >/dev/null 2>&1; then
if systemctl is-active --quiet apache2 2>/dev/null; then
apache_status=0
else
apache_status=1
fi
else
apache_status=2
fi
else
if command -v httpd >/dev/null 2>&1; then
if systemctl is-active --quiet httpd 2>/dev/null; then
apache_status=0
else
apache_status=1
fi
else
apache_status=2
fi
fi
log_info "Проверка PHP..."
if command -v php >/dev/null 2>&1; then
php_status=0
else
php_status=2
fi
log_info "Проверка MariaDB..."
if command -v mysql >/dev/null 2>&1; then
if systemctl is-active --quiet mariadb 2>/dev/null; then
mariadb_status=0
else
mariadb_status=1
fi
else
mariadb_status=2
fi
log_info "Проверка Redis..."
if command -v redis-cli >/dev/null 2>&1; then
if systemctl is-active --quiet redis-server 2>/dev/null || systemctl is-active --quiet redis 2>/dev/null; then
redis_status=0
else
redis_status=1
fi
else
redis_status=2
fi
echo ""
case $apache_status in
0) echo -e "Apache: ${GREEN}Установлен и работает${NC}" ;;
1) echo -e "Apache: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;;
2) echo -e "Apache: ${RED}Не установлен${NC}"; need_reinstall=true ;;
esac
case $php_status in
0)
php_version=$(php -v 2>/dev/null | head -1 | cut -d' ' -f2 | cut -d'.' -f1,2 2>/dev/null || echo "неизвестно")
if [[ "$php_version" == "8.3" ]]; then
echo -e "PHP: ${GREEN}Установлен (версия $php_version)${NC}"
else
echo -e "PHP: ${YELLOW}Установлен (версия $php_version, требуется 8.3)${NC}"
need_reinstall=true
fi
;;
2) echo -e "PHP: ${RED}Не установлен${NC}"; need_reinstall=true ;;
esac
case $mariadb_status in
0) echo -e "MariaDB: ${GREEN}Установлен и работает${NC}" ;;
1) echo -e "MariaDB: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;;
2) echo -e "MariaDB: ${RED}Не установлен${NC}"; need_reinstall=true ;;
esac
case $redis_status in
0) echo -e "Redis: ${GREEN}Установлен и работает${NC}" ;;
1) echo -e "Redis: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;;
2) echo -e "Redis: ${RED}Не установлен${NC}"; need_reinstall=true ;;
esac
if [ -f "/var/www/html/db_config.php" ]; then
echo -e "Конфигурация БД: ${GREEN}Найдена${NC}"
else
echo -e "Конфигурация БД: ${RED}Не найдена${NC}"
need_reinstall=true
fi
echo ""
if [ "$need_reinstall" = false ] && [ "$apache_status" -eq 0 ] && [ "$php_status" -eq 0 ] && [ "$mariadb_status" -eq 0 ]; then
if [ "$REINSTALL" = true ]; then
log_warning "Обнаружена существующая установка. Начинаем переустановку..."
return 1
else
log_success "Все компоненты уже установлены и работают корректно"
echo ""
echo -e "${YELLOW}Altcor уже полностью установлен и функционирует.${NC}"
echo ""
read -p "Хотите переустановить систему? [y/n]: " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
log_info "Начинаем переустановку по запросу пользователя..."
REINSTALL=true
return 1
else
echo ""
log_info "Переустановка отменена. Система остается без изменений."
echo ""
echo "Для принудительной переустановки используйте: $0 -r"
echo ""
exit 0
fi
fi
else
if [ "$need_reinstall" = true ]; then
log_warning "Обнаружены проблемы с установленными компонентами."
echo ""
read -p "Хотите переустановить всю систему? [y/n]: " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Yy]$ ]]; then
log_info "Начинаем полную переустановку..."
REINSTALL=true
return 1
else
log_info "Продолжаем обычную установку/обновление компонентов..."
return 0
fi
else
log_info "Обнаружены отсутствующие компоненты. Продолжаем установку..."
return 0
fi
fi
}
full_uninstall() {
log_step "Начинаем полное удаление Altcor..."
log_info "Остановка сервисов..."
systemctl stop nginx apache2 httpd php*-fpm mariadb mysql redis redis-server 2>/dev/null || true
log_info "Удаление пакетов..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
echo "mariadb-server mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
echo "mariadb-server-10.* mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
echo "mysql-server-* mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
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
log_info "Удаление файлов конфигурации и данных..."
rm -rf \
/etc/nginx \
/etc/apache2 \
/etc/httpd \
/etc/php* \
/var/www/html/* \
/var/lib/mysql* \
/var/lib/redis* \
~/.mysql_history \
/root/.mysql_history \
/root/.db_password 2>/dev/null || true
log_success "Полное удаление завершено."
if [ "$REINSTALL" = false ]; then
exit 0
else
log_info "Переустановка: удаление завершено, продолжаем установку..."
echo ""
fi
}
proceed_with_installation() {
DB_PASSWORD=$(generate_password)
log_step "Остановка конфликтующих сервисов..."
systemctl stop nginx httpd apache2 php*-fpm mariadb mysql 2>/dev/null || true
systemctl disable nginx httpd 2>/dev/null || true
log_info "Ожидание полной остановки служб..."
sleep 3
echo ""
echo "Начинаем установку Altcor..."
echo ""
log_step "Удаление старых версий пакетов..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
echo "mariadb-server mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
echo "mariadb-server-10.3 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
echo "mariadb-server-10.5 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
echo "mariadb-server-10.6 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
echo "mariadb-server-10.11 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
echo "mysql-server-5.7 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
echo "mysql-server-8.0 mysql-server/remove-data-dir boolean true" | debconf-set-selections 2>/dev/null || true
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
apt remove --purge -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" mariadb* mysql* </dev/null >/dev/null 2>&1 || true
apt autoremove -y >/dev/null 2>&1 || true
rm -rf /var/lib/mysql* /etc/mysql* /var/log/mysql* 2>/dev/null || 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
$PKG_MANAGER remove -y mariadb* mysql* >/dev/null 2>&1 || true
rm -rf /var/lib/mysql* /etc/my.cnf* /var/log/mysql* 2>/dev/null || true
fi
log_success "Старые пакеты удалены"
log_step "Обновление списка пакетов..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
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
log_success "Система обновлена, базовые пакеты установлены"
log_step "Добавление репозиториев для PHP 8.3..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
if ! apt-cache show php8.3 &>/dev/null; then
log_info "Добавление PPA ondrej/php..."
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
log_success "PPA добавлен успешно"
else
log_success "PHP 8.3 уже доступен в репозиториях"
fi
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
log_info "Добавление репозитория Remi..."
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
log_success "Репозиторий Remi добавлен успешно"
fi
log_step "Установка Apache..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
apt install -y apache2 >/dev/null 2>&1
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
$PKG_MANAGER install -y httpd >/dev/null 2>&1
fi
log_success "Apache установлен"
log_step "Установка MariaDB..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
echo "mariadb-server mysql-server/root_password password ''" | debconf-set-selections 2>/dev/null || true
echo "mariadb-server mysql-server/root_password_again password ''" | debconf-set-selections 2>/dev/null || true
apt install -y mariadb-server >/dev/null 2>&1
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
$PKG_MANAGER install -y mariadb-server >/dev/null 2>&1
fi
log_info "Запуск MariaDB..."
systemctl start mariadb >/dev/null 2>&1
systemctl enable mariadb >/dev/null 2>&1
log_info "Ожидание полного запуска MariaDB..."
sleep 5
if ! systemctl is-active --quiet mariadb; then
log_error "MariaDB не смог запуститься"
exit 1
fi
log_success "MariaDB установлен и запущен"
log_step "Установка дополнительных компонентов (Redis, LibreOffice, Java)..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
apt install -y redis-server libreoffice default-jre >/dev/null 2>&1
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
$PKG_MANAGER install -y redis libreoffice java-11-openjdk >/dev/null 2>&1
fi
log_success "Дополнительные компоненты установлены"
log_step "Установка PHP 8.3 и расширений..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
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
if [ "$DISTRO" = "fedora" ]; then
# Для Fedora используем PHP-FPM
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 php-fpm"
else
# Для Rocky Linux/CentOS используем PHP-FPM из Remi
PHP_PACKAGES="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 php83-php-fpm"
fi
if ! $PKG_MANAGER install -y $PHP_PACKAGES >/dev/null 2>&1; then
log_error "Не удалось установить PHP 8.3 и/или его расширения."
exit 1
fi
# Создаем символические ссылки для PHP83 если нужно
if command -v php83 >/dev/null 2>&1 && [ ! -f /usr/bin/php ]; then
ln -sf /opt/remi/php83/root/usr/bin/php /usr/bin/php >/dev/null 2>&1 || true
ln -sf /opt/remi/php83/root/usr/bin/php-fpm /usr/bin/php-fpm >/dev/null 2>&1 || true
fi
fi
log_success "PHP 8.3 и расширения установлены"
log_step "Настройка Apache и модулей..."
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/altcor.conf"
WEBSERVER_USER="apache"
# Отключаем старые конфигурации PHP и mod_php
rm -f /etc/httpd/conf.d/php.conf /etc/httpd/conf.modules.d/*php*.conf
# Определяем, какой PHP-FPM сервис и путь к конфигурации использовать
if [ -f "/etc/opt/remi/php83/php-fpm.d/www.conf" ]; then
PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf"
PHP_FPM_SERVICE="php83-php-fpm"
SOCKET_PATH="/var/opt/remi/php83/run/php-fpm/www.sock"
elif [ -f "/etc/php-fpm.d/www.conf" ]; then
PHP_FPM_CONF="/etc/php-fpm.d/www.conf"
PHP_FPM_SERVICE="php-fpm"
SOCKET_PATH="/run/php-fpm/www.sock"
else
log_error "Не найден конфигурационный файл PHP-FPM"
exit 1
fi
# Создаем конфигурацию только для PHP-FPM (без mod_php)
cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF'
# PHP-FPM configuration for Apache
# ВАЖНО: НЕ загружаем mod_php - используем только PHP-FPM
# Базовые модули Apache (проверяем, не загружены ли уже)
<IfModule !mod_rewrite.c>
LoadModule rewrite_module modules/mod_rewrite.so
</IfModule>
<IfModule !mod_headers.c>
LoadModule headers_module modules/mod_headers.so
</IfModule>
<IfModule !mod_expires.c>
LoadModule expires_module modules/mod_expires.so
</IfModule>
<IfModule !mod_deflate.c>
LoadModule deflate_module modules/mod_deflate.so
</IfModule>
<IfModule !mod_proxy.c>
LoadModule proxy_module modules/mod_proxy.so
</IfModule>
<IfModule !mod_proxy_fcgi.c>
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
</IfModule>
# Обработка PHP файлов через PHP-FPM
<FilesMatch \.php$>
SetHandler "proxy:unix:SOCKET_PATH_PLACEHOLDER|fcgi://localhost"
</FilesMatch>
# Настройки директивы для улучшения производительности
ProxyTimeout 300
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:SOCKET_PATH_PLACEHOLDER|fcgi://localhost/var/www/html/
EOF
# Заменяем плейсхолдер на реальный путь к сокету
sed -i "s|SOCKET_PATH_PLACEHOLDER|$SOCKET_PATH|g" "/etc/httpd/conf.d/php-fpm.conf"
log_info "Настройка PHP-FPM..."
# Создаем резервную копию конфигурации
cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)"
# Настраиваем PHP-FPM pool
sed -i 's/;*listen = .*/listen = '"${SOCKET_PATH//\//\\/}"'/' "$PHP_FPM_CONF"
sed -i 's/;*listen.owner = .*/listen.owner = apache/' "$PHP_FPM_CONF"
sed -i 's/;*listen.group = .*/listen.group = apache/' "$PHP_FPM_CONF"
sed -i 's/;*listen.mode = .*/listen.mode = 0660/' "$PHP_FPM_CONF"
sed -i 's/;*user = .*/user = apache/' "$PHP_FPM_CONF"
sed -i 's/;*group = .*/group = apache/' "$PHP_FPM_CONF"
# Настраиваем производительность PHP-FPM
sed -i 's/;*pm = .*/pm = dynamic/' "$PHP_FPM_CONF"
sed -i 's/;*pm.max_children = .*/pm.max_children = 50/' "$PHP_FPM_CONF"
sed -i 's/;*pm.start_servers = .*/pm.start_servers = 5/' "$PHP_FPM_CONF"
sed -i 's/;*pm.min_spare_servers = .*/pm.min_spare_servers = 5/' "$PHP_FPM_CONF"
sed -i 's/;*pm.max_spare_servers = .*/pm.max_spare_servers = 35/' "$PHP_FPM_CONF"
# Создаем директорию для socket
SOCKET_DIR=$(dirname "$SOCKET_PATH")
mkdir -p "$SOCKET_DIR"
chown apache:apache "$SOCKET_DIR"
# Запускаем и включаем PHP-FPM
systemctl start $PHP_FPM_SERVICE >/dev/null 2>&1
systemctl enable $PHP_FPM_SERVICE >/dev/null 2>&1
if ! systemctl is-active --quiet $PHP_FPM_SERVICE; then
log_error "PHP-FPM не удалось запустить"
systemctl status $PHP_FPM_SERVICE --no-pager -l
exit 1
fi
log_success "PHP-FPM настроен и запущен"
fi
cat > "/etc/httpd/conf.d/altcor.conf" << 'EOF'
# Altcor main configuration
# Отключаем информацию о сервере для безопасности
ServerTokens Prod
ServerSignature Off
# Основные настройки директории
<Directory "/var/www/html">
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
# Настройки сжатия
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
# Исключаем уже сжатые файлы
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|ico|exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
# Исключаем старые браузеры
SetEnvIfNoCase User-Agent "^Mozilla/4\.0[678]" no-gzip
SetEnvIfNoCase User-Agent "^Mozilla/4\.[0678]" no-gzip
SetEnvIfNoCase User-Agent "MSIE [1-6]\." no-gzip
</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 image/webp "access plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
# CSS и JS
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
# Шрифты
ExpiresByType font/woff "access plus 1 month"
ExpiresByType font/woff2 "access plus 1 month"
ExpiresByType font/ttf "access plus 1 month"
ExpiresByType font/otf "access plus 1 month"
# HTML и PHP - без кэширования
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType application/x-httpd-php "access plus 0 seconds"
</IfModule>
# Заголовки безопасности
<IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options SAMEORIGIN
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Добавляем заголовки кэширования для статических файлов
<FilesMatch "\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|otf)$">
Header set Cache-Control "public, max-age=2592000"
</FilesMatch>
</IfModule>
</Directory>
# Запрет доступа к служебным файлам
<Files "*.conf">
Require all denied
</Files>
<Files ".htaccess">
Require all denied
</Files>
<Files ".env">
Require all denied
</Files>
<Files "*.log">
Require all denied
</Files>
# Запрет доступа к директориям .git и подобным
<DirectoryMatch "^\.|\/\.">
Require all denied
</DirectoryMatch>
# Дополнительная защита от выполнения скриптов в uploads
<Directory "/var/www/html/uploads">
<Files "*.php">
Require all denied
</Files>
<Files "*.phtml">
Require all denied
</Files>
<Files "*.pl">
Require all denied
</Files>
<Files "*.py">
Require all denied
</Files>
<Files "*.jsp">
Require all denied
</Files>
<Files "*.asp">
Require all denied
</Files>
<Files "*.sh">
Require all denied
</Files>
</Directory>
EOF
fi
log_success "Модули Apache настроены"
log_step "Создание конфигурации виртуального хоста..."
mkdir -p "$WEBROOT"
# Для Debian/Ubuntu создаем стандартный VirtualHost
if [ "$DISTRO_FAMILY" = "debian" ]; then
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>
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
<Files "*.conf">
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
fi
log_success "Конфигурация виртуального хоста создана"
log_step "Настройка PHP.ini..."
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"
log_success "PHP.ini настроен"
else
log_warning "Файл PHP.ini не найден по пути: $PHP_INI_PATH"
fi
log_step "Создание конфигурации базы данных..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
DB_SOCKET="/var/run/mysqld/mysqld.sock"
else
DB_SOCKET="/var/lib/mysql/mysql.sock"
fi
cat > "$WEBROOT/db_config.php" << EOF
<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '$DB_PASSWORD');
define('DB_NAME', 'ALTCor');
define('DB_SOCKET', '$DB_SOCKET');
define('DB_CHARSET', 'utf8mb4');
define('OFFICE', '/usr/bin/libreoffice');
?>
EOF
log_success "Конфигурация БД создана"
chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/db_config.php"
chmod 644 "$WEBROOT/db_config.php"
if sudo -u $WEBSERVER_USER test -r "$WEBROOT/db_config.php"; then
log_success "Веб-сервер может читать db_config.php"
else
log_error "Веб-сервер НЕ МОЖЕТ читать db_config.php"
fi
if [ ! -f "$WEBROOT/db_config.php" ]; then
log_error "Не удалось создать файл db_config.php"
exit 1
fi
if ! sudo -u $WEBSERVER_USER test -r "$WEBROOT/db_config.php"; then
log_warning "Веб-сервер не может прочитать db_config.php, исправляем права..."
chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/db_config.php"
chmod 644 "$WEBROOT/db_config.php"
fi
DOWNLOAD_URL="https://cloud.altcor.ru/setup/download.php"
TEMP_DOWNLOAD="/tmp/web_files_$(date +%s)"
create_fallback_index() {
cat > "$WEBROOT/index.php" << 'EOF'
<?php
require_once __DIR__ . '/db_config.php';
echo "<!DOCTYPE html>";
echo "<html lang='ru'>";
echo "<head>";
echo "<meta charset='UTF-8'>";
echo "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
echo "<title>Сервер готов к работе</title>";
echo "<style>";
echo "body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; margin: 40px; background: #f5f5f5; }";
echo ".container { max-width: 800px; margin: 0 auto; background: white; padding: 40px; border-radius: 10px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); }";
echo "h1 { color: #2c5282; margin-top: 0; }";
echo ".status { padding: 15px; margin: 10px 0; border-radius: 5px; }";
echo ".success { background: #c6f6d5; color: #22543d; border-left: 4px solid #38a169; }";
echo ".warning { background: #fef5e7; color: #744210; border-left: 4px solid #ed8936; }";
echo "</style>";
echo "</head>";
echo "<body>";
echo "<div class='container'>";
echo "<h1>Сервер готов к работе</h1>";
echo "<div class='status success'>";
echo "<strong>PHP " . phpversion() . " работает</strong><br>";
echo "Время сервера: " . date('Y-m-d H:i:s T') . "<br>";
echo "Document Root: " . $_SERVER['DOCUMENT_ROOT'];
echo "</div>";
// Проверка подключения к БД
try {
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET, DB_USER, DB_PASS);
echo "<div class='status success'>";
echo "<strong>База данных подключена</strong><br>";
echo "База данных: " . DB_NAME . "<br>";
echo "Хост: " . DB_HOST;
echo "</div>";
} catch (PDOException $e) {
echo "<div class='status warning'>";
echo "<strong>Проблема с БД:</strong> " . htmlspecialchars($e->getMessage());
echo "</div>";
}
// Проверка подключения к БД
echo "<div class='status warning'>";
echo "<strong>Диагностика конфигурации БД:</strong><br>";
if (file_exists(__DIR__ . '/db_config.php')) {
echo "✓ Файл db_config.php существует<br>";
echo "✓ Размер файла: " . filesize(__DIR__ . '/db_config.php') . " байт<br>";
echo "✓ Права доступа: " . substr(sprintf('%o', fileperms(__DIR__ . '/db_config.php')), -4) . "<br>";
if (is_readable(__DIR__ . '/db_config.php')) {
echo "✓ Файл читаемый<br>";
try {
require_once __DIR__ . '/db_config.php';
echo "✓ Файл успешно подключен<br>";
echo "✓ DB_HOST: " . (defined('DB_HOST') ? DB_HOST : 'НЕ ОПРЕДЕЛЕН') . "<br>";
echo "✓ DB_USER: " . (defined('DB_USER') ? DB_USER : 'НЕ ОПРЕДЕЛЕН') . "<br>";
echo "✓ DB_NAME: " . (defined('DB_NAME') ? DB_NAME : 'НЕ ОПРЕДЕЛЕН') . "<br>";
} catch (Exception $e) {
echo "✗ Ошибка подключения файла: " . htmlspecialchars($e->getMessage()) . "<br>";
}
} else {
echo "✗ Файл НЕ читаемый<br>";
}
} else {
echo "✗ Файл db_config.php НЕ существует<br>";
}
echo "</div>";
// Теперь пробуем подключиться к БД
if (file_exists(__DIR__ . '/db_config.php') && is_readable(__DIR__ . '/db_config.php')) {
try {
require_once __DIR__ . '/db_config.php';
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET, DB_USER, DB_PASS);
echo "<div class='status success'>";
echo "<strong>База данных подключена</strong><br>";
echo "База данных: " . DB_NAME . "<br>";
echo "Хост: " . DB_HOST;
echo "</div>";
} catch (PDOException $e) {
echo "<div class='status warning'>";
echo "<strong>Проблема с БД:</strong> " . htmlspecialchars($e->getMessage());
echo "</div>";
}
} else {
echo "<div class='status warning'>";
echo "<strong>Не удалось загрузить конфигурацию БД</strong>";
echo "</div>";
}
echo "</div>";
echo "</body>";
echo "</html>";
EOF
}
log_step "Загрузка файлов приложения..."
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 "<?php" && ! grep -q "<?php" "$WEBROOT/index.php" 2>/dev/null; then
create_fallback_index
log_warning "Скачанный файл не является PHP-скриптом, создана резервная страница"
else
log_success "Файлы приложения загружены"
fi
else
create_fallback_index
log_warning "Не удалось загрузить файл с $DOWNLOAD_URL, создана резервная страница"
fi
log_step "Настройка прав доступа к файлам..."
chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/index.php"
chmod 644 "$WEBROOT/db_config.php"
chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/db_config.php"
cat > "$WEBROOT/.htaccess" << 'EOF'
<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>
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"
log_success "Права доступа настроены"
log_step "Настройка базы данных MariaDB..."
if ! systemctl is-active --quiet mariadb; then
log_error "MariaDB не запущен. Попытка запуска..."
systemctl start mariadb
sleep 3
if ! systemctl is-active --quiet mariadb; then
log_error "Не удалось запустить MariaDB"
exit 1
fi
fi
log_info "Выполнение базовой настройки безопасности MariaDB..."
if mysql -u root -e "SELECT 1;" >/dev/null 2>&1; then
log_info "Первичная настройка MariaDB (подключение без пароля доступно)..."
MYSQL_SECURE_SCRIPT="/tmp/mysql_secure_$(date +%s).sql"
cat > "$MYSQL_SECURE_SCRIPT" << MYSQL_SCRIPT
-- Устанавливаем пароль для root
ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_PASSWORD';
-- Удаляем анонимных пользователей
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;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
-- Создаем нашу базу данных
CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Даем права на новую базу данных
GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost';
-- Применяем изменения
FLUSH PRIVILEGES;
MYSQL_SCRIPT
if mysql -u root < "$MYSQL_SECURE_SCRIPT" >/dev/null 2>&1; then
log_success "Первичная настройка MariaDB выполнена успешно"
else
log_error "Не удалось выполнить первичную настройку MariaDB"
rm -f "$MYSQL_SECURE_SCRIPT"
exit 1
fi
rm -f "$MYSQL_SECURE_SCRIPT"
elif mysql -u root -p"$DB_PASSWORD" -e "SELECT 1;" >/dev/null 2>&1; then
log_info "MariaDB уже настроен с текущим паролем..."
MYSQL_UPDATE_SCRIPT="/tmp/mysql_update_$(date +%s).sql"
cat > "$MYSQL_UPDATE_SCRIPT" << MYSQL_SCRIPT
CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost';
FLUSH PRIVILEGES;
MYSQL_SCRIPT
if mysql -u root -p"$DB_PASSWORD" < "$MYSQL_UPDATE_SCRIPT" >/dev/null 2>&1; then
log_success "База данных ALTCor создана/обновлена"
else
log_error "Не удалось обновить базу данных"
rm -f "$MYSQL_UPDATE_SCRIPT"
exit 1
fi
rm -f "$MYSQL_UPDATE_SCRIPT"
else
log_error "Не удалось подключиться к MariaDB ни с пустым паролем, ни с текущим паролем"
log_info "Попытка сброса пароля root в MariaDB..."
systemctl stop mariadb
mysqld_safe --skip-grant-tables --skip-networking &
MYSQLD_SAFE_PID=$!
sleep 5
MYSQL_RESET_SCRIPT="/tmp/mysql_reset_$(date +%s).sql"
cat > "$MYSQL_RESET_SCRIPT" << MYSQL_SCRIPT
USE mysql;
UPDATE user SET password=PASSWORD('$DB_PASSWORD') WHERE User='root';
UPDATE user SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;
MYSQL_SCRIPT
if mysql -u root < "$MYSQL_RESET_SCRIPT" >/dev/null 2>&1; then
log_info "Пароль root сброшен"
kill $MYSQLD_SAFE_PID 2>/dev/null || true
sleep 2
killall mysqld_safe 2>/dev/null || true
killall mysqld 2>/dev/null || true
sleep 3
systemctl start mariadb
sleep 3
if systemctl is-active --quiet mariadb && mysql -u root -p"$DB_PASSWORD" -e "SELECT 1;" >/dev/null 2>&1; then
MYSQL_FINAL_SCRIPT="/tmp/mysql_final_$(date +%s).sql"
cat > "$MYSQL_FINAL_SCRIPT" << MYSQL_SCRIPT
CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON ALTCor.* TO 'root'@'localhost';
FLUSH PRIVILEGES;
MYSQL_SCRIPT
if mysql -u root -p"$DB_PASSWORD" < "$MYSQL_FINAL_SCRIPT" >/dev/null 2>&1; then
log_success "MariaDB настроен после сброса пароля"
else
log_error "Не удалось создать базу данных после сброса пароля"
exit 1
fi
rm -f "$MYSQL_FINAL_SCRIPT"
else
log_error "MariaDB не запустился после сброса пароля"
exit 1
fi
else
log_error "Не удалось сбросить пароль root в MariaDB"
kill $MYSQLD_SAFE_PID 2>/dev/null || true
exit 1
fi
rm -f "$MYSQL_RESET_SCRIPT"
fi
log_success "База данных настроена"
log_step "Проверка конфигурации Apache..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
if ! apache2ctl configtest >/dev/null 2>&1; then
log_error "Конфигурация Apache содержит ошибки."
apache2ctl configtest # Показываем ошибки для диагностики
exit 1
fi
WEBSERVER_SERVICE="apache2"
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
# Для Rocky Linux/RHEL сначала проверим синтаксис конфигурации
if ! httpd -t >/dev/null 2>&1; then
log_error "Конфигурация Apache (httpd) содержит ошибки:"
echo ""
httpd -t # Показываем детали ошибок
echo ""
log_info "Попытка исправления..."
# Проверяем наличие основных модулей
if ! httpd -M 2>/dev/null | grep -q "rewrite_module"; then
echo "LoadModule rewrite_module modules/mod_rewrite.so" >> /etc/httpd/conf.d/altcor.conf
fi
# Повторная проверка
if ! httpd -t >/dev/null 2>&1; then
log_error "Не удалось исправить конфигурацию Apache:"
httpd -t
exit 1
else
log_success "Конфигурация исправлена"
fi
fi
WEBSERVER_SERVICE="httpd"
fi
log_success "Конфигурация Apache проверена"
log_step "Запуск и включение сервисов..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
systemctl restart apache2 >/dev/null 2>&1
systemctl enable apache2 >/dev/null 2>&1
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
# Сначала запускаем PHP-FPM, потом Apache
if [ -n "$PHP_FPM_SERVICE" ]; then
systemctl restart $PHP_FPM_SERVICE >/dev/null 2>&1
systemctl enable $PHP_FPM_SERVICE >/dev/null 2>&1
fi
systemctl restart httpd >/dev/null 2>&1
systemctl enable httpd >/dev/null 2>&1
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
log_success "Все сервисы запущены и добавлены в автозагрузку"
# В секции финальной проверки добавьте проверку PHP-FPM:
log_step "Финальная проверка работоспособности..."
if ! systemctl is-active --quiet $WEBSERVER_SERVICE; then
log_error "Веб-сервер не запущен"
exit 1
fi
if [ "$DISTRO_FAMILY" = "rhel" ] && [ -n "$PHP_FPM_SERVICE" ]; then
if ! systemctl is-active --quiet $PHP_FPM_SERVICE; then
log_error "PHP-FPM не запущен"
exit 1
fi
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
if ! mysql -u root -p"$DB_PASSWORD" -e "USE ALTCor; SELECT 1;" >/dev/null 2>&1; then
log_error "Не удается подключиться к базе данных ALTCor"
exit 1
fi
log_success "Все компоненты работают корректно"
log_step "Сохранение учетных данных..."
DB_CREDENTIALS_FILE="/root/.db_password"
cat > "$DB_CREDENTIALS_FILE" << EOF
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=$DB_PASSWORD
DB_NAME=ALTCor
EOF
chmod 600 "$DB_CREDENTIALS_FILE"
log_info "Учетные данные сохранены в $DB_CREDENTIALS_FILE"
IP_ADDR=$(hostname -I | awk '{print $1}')
echo ""
if [ "$REINSTALL" = true ]; then
log_success "Переустановка Altcor успешно завершена."
else
log_success "Установка Altcor успешно завершена."
fi
echo ""
echo " Доступ к сайту:"
echo " • http://localhost/"
echo " • http://$IP_ADDR/"
echo ""
echo " Доступ к БД:"
echo " • Хост: localhost"
echo " • Логин: root"
echo " • Пароль: $DB_PASSWORD"
echo " • База данных: ALTCor"
echo ""
echo " Расположение файлов:"
echo "Веб-корень: $WEBROOT"
echo " • Конфигурация БД: $WEBROOT/db_config.php"
echo " • Логи Apache: /var/log/apache2/ или /var/log/httpd/"
echo ""
echo " Дополнительная информация:"
echo " • Учетные данные БД: $DB_CREDENTIALS_FILE"
echo " • Для удаления: ./install.sh -u"
echo " • Для переустановки: ./install.sh -r"
echo ""
}
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
elif [ "$REINSTALL" = true ]; then
echo ""
log_step "Начинаем переустановку Altcor..."
echo ""
full_uninstall
proceed_with_installation
else
check_result=0
check_existing_installation || check_result=$?
if [ $check_result -eq 1 ]; then
if [ "$REINSTALL" = true ]; then
full_uninstall
fi
proceed_with_installation
elif [ $check_result -eq 0 ]; then
proceed_with_installation
fi
fi