441 lines
17 KiB
Bash
441 lines
17 KiB
Bash
#!/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
|
||
}
|
||
|
||
cleanup_apache_config() {
|
||
log_info "Очистка конфигурации Apache от дубликатов..."
|
||
|
||
if [ "$DISTRO_FAMILY" = "debian" ]; then
|
||
if [ -f /etc/apache2/ports.conf ]; then
|
||
cp /etc/apache2/ports.conf /etc/apache2/ports.conf.backup.$(date +%Y%m%d_%H%M%S)
|
||
|
||
# Удаляем все Listen директивы для порта 80
|
||
grep -v "^Listen\s\+.*:80$" /etc/apache2/ports.conf > /etc/apache2/ports.conf.tmp || true
|
||
grep -v "^Listen\s\+80$" /etc/apache2/ports.conf.tmp > /etc/apache2/ports.conf.tmp2 || true
|
||
|
||
# Добавляем одну Listen директиву
|
||
echo "Listen *:80" >> /etc/apache2/ports.conf.tmp2
|
||
mv /etc/apache2/ports.conf.tmp2 /etc/apache2/ports.conf
|
||
rm -f /etc/apache2/ports.conf.tmp
|
||
fi
|
||
|
||
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
|
||
HTTPD_CONF="/etc/httpd/conf/httpd.conf"
|
||
if [ -f "$HTTPD_CONF" ]; then
|
||
cp "$HTTPD_CONF" "${HTTPD_CONF}.backup.$(date +%Y%m%d_%H%M%S)"
|
||
|
||
# Удаляем все Listen директивы для порта 80
|
||
grep -v "^Listen.*:80$" "$HTTPD_CONF" > "${HTTPD_CONF}.tmp" || true
|
||
grep -v "^Listen 80$" "${HTTPD_CONF}.tmp" > "${HTTPD_CONF}.tmp2" || true
|
||
|
||
# Добавляем одну Listen директиву
|
||
echo "Listen 80" >> "${HTTPD_CONF}.tmp2"
|
||
mv "${HTTPD_CONF}.tmp2" "$HTTPD_CONF"
|
||
rm -f "${HTTPD_CONF}.tmp"
|
||
fi
|
||
|
||
# Также очищаем PHP-FPM конфигурацию от дублирующихся модулей
|
||
if [ -f "/etc/httpd/conf.d/php-fpm.conf" ]; then
|
||
log_info "Очистка PHP-FPM конфигурации от LoadModule директив..."
|
||
|
||
cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF'
|
||
<FilesMatch \.php$>
|
||
SetHandler "proxy:unix:/var/opt/remi/php83/run/php-fpm/www.sock|fcgi://localhost"
|
||
</FilesMatch>
|
||
|
||
DirectoryIndex index.php index.html index.htm
|
||
|
||
<Files "*.php">
|
||
Require all granted
|
||
</Files>
|
||
EOF
|
||
fi
|
||
fi
|
||
|
||
log_success "Конфигурация Apache очищена от дубликатов"
|
||
}
|
||
|
||
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 altcor_installed=false
|
||
local components_installed=false
|
||
|
||
log_info "Проверка установки Altcor..."
|
||
|
||
local altcor_signs=0
|
||
|
||
if [ -f "/var/www/html/db_config.php" ]; then
|
||
if grep -q "ALTCor" "/var/www/html/db_config.php" 2>/dev/null && grep -q "DB_NAME" "/var/www/html/db_config.php" 2>/dev/null; then
|
||
altcor_signs=$((altcor_signs + 1))
|
||
log_info "✓ Найдена конфигурация БД Altcor"
|
||
fi
|
||
fi
|
||
|
||
|
||
if command -v mysql >/dev/null 2>&1 && systemctl is-active --quiet mariadb 2>/dev/null; then
|
||
if [ -f "/root/.db_password" ]; then
|
||
source "/root/.db_password" 2>/dev/null || true
|
||
if [ -n "$DB_PASSWORD" ] && mysql -u root -p"$DB_PASSWORD" -e "USE ALTCor; SELECT 1;" >/dev/null 2>&1; then
|
||
altcor_signs=$((altcor_signs + 1))
|
||
log_info "✓ Найдена рабочая база данных ALTCor"
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
if [ -f "/var/www/html/index.php" ]; then
|
||
if grep -q "ALTCor\|Altcor\|altcor" "/var/www/html/index.php" 2>/dev/null ||
|
||
(grep -q "<?php" "/var/www/html/index.php" 2>/dev/null &&
|
||
! grep -q "phpinfo\|Сервер готов к работе\|PHP.*работает" "/var/www/html/index.php" 2>/dev/null &&
|
||
wc -l < "/var/www/html/index.php" > 50); then
|
||
altcor_signs=$((altcor_signs + 1))
|
||
log_info "✓ Найдены файлы приложения Altcor"
|
||
fi
|
||
fi
|
||
|
||
if [ $altcor_signs -ge 2 ]; then
|
||
altcor_installed=true
|
||
log_success "Обнаружена существующая установка Altcor"
|
||
fi
|
||
|
||
log_info "Проверка веб-компонентов..."
|
||
|
||
if [ "$DISTRO_FAMILY" = "debian" ]; then
|
||
if command -v apache2 >/dev/null 2>&1; then
|
||
components_installed=true
|
||
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
|
||
components_installed=true
|
||
if systemctl is-active --quiet httpd 2>/dev/null; then
|
||
apache_status=0
|
||
else
|
||
apache_status=1
|
||
fi
|
||
else
|
||
apache_status=2
|
||
fi
|
||
fi
|
||
|
||
if command -v php >/dev/null 2>&1; then
|
||
components_installed=true
|
||
php_status=0
|
||
else
|
||
php_status=2
|
||
fi
|
||
|
||
if command -v mysql >/dev/null 2>&1; then
|
||
components_installed=true
|
||
if systemctl is-active --quiet mariadb 2>/dev/null || systemctl is-active --quiet mysql 2>/dev/null; then
|
||
mariadb_status=0
|
||
else
|
||
mariadb_status=1
|
||
fi
|
||
else
|
||
mariadb_status=2
|
||
fi
|
||
|
||
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
|
||
|
||
nginx_installed=false
|
||
if command -v nginx >/dev/null 2>&1; then
|
||
nginx_installed=true
|
||
components_installed=true
|
||
fi
|
||
|
||
if [ "$altcor_installed" = true ]; then
|
||
echo -e "${GREEN}✓ ALTCOR УЖЕ УСТАНОВЛЕН${NC}"
|
||
echo ""
|
||
echo "Обнаружена рабочая установка Altcor со следующими компонентами:"
|
||
echo ""
|
||
|
||
case $apache_status in
|
||
0) echo -e "Apache: ${GREEN}Установлен и работает${NC}" ;;
|
||
1) echo -e "Apache: ${YELLOW}Установлен, но не работает${NC}" ;;
|
||
2) echo -e "Apache: ${RED}Не установлен${NC}" ;;
|
||
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 "неизвестно")
|
||
echo -e "PHP: ${GREEN}Установлен (версия $php_version)${NC}"
|
||
;;
|
||
2) echo -e "PHP: ${RED}Не установлен${NC}" ;;
|
||
esac
|
||
|
||
case $mariadb_status in
|
||
0) echo -e "MariaDB: ${GREEN}Установлен и работает${NC}" ;;
|
||
1) echo -e "MariaDB: ${YELLOW}Установлен, но не работает${NC}" ;;
|
||
2) echo -e "MariaDB: ${RED}Не установлен${NC}" ;;
|
||
esac
|
||
|
||
case $redis_status in
|
||
0) echo -e "Redis: ${GREEN}Установлен и работает${NC}" ;;
|
||
1) echo -e "Redis: ${YELLOW}Установлен, но не работает${NC}" ;;
|
||
2) echo -e "Redis: ${RED}Не установлен${NC}" ;;
|
||
esac
|
||
|
||
echo ""
|
||
|
||
if [ "$REINSTALL" = true ]; then
|
||
log_warning "Принудительная переустановка запрошена через параметр -r"
|
||
echo ""
|
||
read -p "Подтвердите переустановку Altcor? [y/N]: " -n 1 -r
|
||
echo ""
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
log_info "Начинаем переустановку Altcor..."
|
||
return 1
|
||
else
|
||
log_info "Переустановка отменена."
|
||
exit 0
|
||
fi
|
||
else
|
||
echo -e "${YELLOW}Altcor уже полностью установлен и функционирует.${NC}"
|
||
echo ""
|
||
IP_ADDR=$(hostname -I | awk '{print $1}')
|
||
echo "Доступ к системе:"
|
||
echo "• http://localhost/"
|
||
echo "• http://$IP_ADDR/"
|
||
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
|
||
|
||
elif [ "$components_installed" = true ]; then
|
||
echo -e "${YELLOW}⚠ ОБНАРУЖЕНЫ СУЩЕСТВУЮЩИЕ ВЕБ-КОМПОНЕНТЫ${NC}"
|
||
echo ""
|
||
echo "На вашем сервере уже установлены следующие компоненты:"
|
||
echo ""
|
||
|
||
case $apache_status in
|
||
0) echo -e "Apache: ${GREEN}Установлен и работает${NC}" ;;
|
||
1) echo -e "Apache: ${YELLOW}Установлен, но не работает${NC}" ;;
|
||
2) echo -e "Apache: ${RED}Не установлен${NC}" ;;
|
||
esac
|
||
|
||
if [ "$nginx_installed" = true ]; then
|
||
if systemctl is-active --quiet nginx 2>/dev/null; then
|
||
echo -e "Nginx: ${GREEN}Установлен и работает${NC}"
|
||
else
|
||
echo -e "Nginx: ${YELLOW}Установлен, но не работает${NC}"
|
||
fi
|
||
fi
|
||
|
||
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}"
|
||
fi
|
||
;;
|
||
2) echo -e "PHP: ${RED}Не установлен${NC}" ;;
|
||
esac
|
||
|
||
case $mariadb_status in
|
||
0) echo -e "MariaDB: ${GREEN}Установлен и работает${NC}" ;;
|
||
1) echo -e "MariaDB: ${YELLOW}Установлен, но не работает${NC}" ;;
|
||
2) echo -e "MariaDB: ${RED}Не установлен${NC}" ;;
|
||
esac
|
||
|
||
case $redis_status in
|
||
0) echo -e "Redis: ${GREEN}Установлен и работает${NC}" ;;
|
||
1) echo -e "Redis: ${YELLOW}Установлен, но не работает${NC}" ;;
|
||
2) echo -e "Redis: ${RED}Не установлен${NC}" ;;
|
||
esac
|
||
|
||
echo ""
|
||
echo -e "${RED}ВНИМАНИЕ:${NC} Для установки Altcor необходимо переустановить"
|
||
echo "существующие компоненты с правильной конфигурацией."
|
||
echo ""
|
||
echo "Это может повлиять на работу других веб-приложений на этом сервере!"
|
||
echo ""
|
||
|
||
if [ "$REINSTALL" = true ]; then
|
||
log_warning "Принудительная установка запрошена через параметр -r"
|
||
echo ""
|
||
read -p "Подтвердите переустановку компонентов для Altcor? [y/N]: " -n 1 -r
|
||
echo ""
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
log_info "Начинаем установку с переустановкой компонентов..."
|
||
return 1
|
||
else
|
||
log_info "Установка отменена."
|
||
exit 0
|
||
fi
|
||
else
|
||
read -p "Переустановить компоненты и установить Altcor? [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
|
||
echo -e "${GREEN}✓ СИСТЕМА ГОТОВА К УСТАНОВКЕ${NC}"
|
||
echo ""
|
||
echo "Компоненты для установки:"
|
||
echo "• Apache веб-сервер"
|
||
echo "• PHP 8.3"
|
||
echo "• MariaDB база данных"
|
||
echo "• Redis кеш-сервер"
|
||
echo "• LibreOffice"
|
||
echo ""
|
||
log_info "Начинаем чистую установку Altcor..."
|
||
return 0
|
||
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 "На |