Files
altcorAutoinstall/install.sh

441 lines
17 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
}
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 "На