#!/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'
SetHandler "proxy:unix:/var/opt/remi/php83/run/php-fpm/www.sock|fcgi://localhost"
DirectoryIndex index.php index.html index.htm
Require all granted
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 "/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 "На