Files
altcorAutoinstall/install.sh
2025-08-14 23:06:33 +03:00

1259 lines
50 KiB
Bash
Raw Permalink 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)
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
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)"
grep -v "^Listen.*:80$" "$HTTPD_CONF" > "${HTTPD_CONF}.tmp" || true
grep -v "^Listen 80$" "${HTTPD_CONF}.tmp" > "${HTTPD_CONF}.tmp2" || true
echo "Listen 80" >> "${HTTPD_CONF}.tmp2"
mv "${HTTPD_CONF}.tmp2" "$HTTPD_CONF"
rm -f "${HTTPD_CONF}.tmp"
fi
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
log_error "Altcor уже установлен"
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
log_warning "Обнаружен существующие Веб-компоненты"
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
log_success "Система готова к установке"
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() {
log_step "Установка необходимых зависимостей для генерации пароля..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
apt install -y openssl >/dev/null 2>&1
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
$PKG_MANAGER install -y openssl >/dev/null 2>&1
fi
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 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)..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
export DEBIAN_FRONTEND=noninteractive
if apt install -y redis-server libreoffice default-jre >/dev/null 2>&1; then
log_success "Дополнительные компоненты установлены"
else
echo "Ошибка установки пакетов для Debian/Ubuntu"
exit 1
fi
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
if $PKG_MANAGER install -y hostname redis libreoffice >/dev/null 2>&1; then
log_success "Дополнительные компоненты установлены"
else
echo "Ошибка установки пакетов для RHEL/CentOS"
exit 1
fi
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
PHP_PACKAGES="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"
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 /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/000-default.conf"
WEBSERVER_USER="apache"
rm -f /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php-fpm.conf 2>/dev/null || true
log_info "Настройка PHP-FPM для Apache..."
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
if [ -f "/etc/opt/remi/php83/php-fpm.d/www.conf" ]; then
PHP_FPM_CONF="/etc/opt/remi/php83/php-fpm.d/www.conf"
cp "$PHP_FPM_CONF" "${PHP_FPM_CONF}.backup.$(date +%Y%m%d_%H%M%S)"
sed -i 's/^user = .*/user = apache/' "$PHP_FPM_CONF"
sed -i 's/^group = .*/group = apache/' "$PHP_FPM_CONF"
sed -i 's/^listen = .*/listen = \/var\/opt\/remi\/php83\/run\/php-fpm\/www.sock/' "$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"
log_info "PHP-FPM пул настроен для RHEL/CentOS/Fedora"
fi
mkdir -p /var/opt/remi/php83/run/php-fpm
chown apache:apache /var/opt/remi/php83/run/php-fpm
HTTPD_CONF="/etc/httpd/conf/httpd.conf"
log_step "Очистка дублирующихся Listen директив..."
cp "$HTTPD_CONF" "${HTTPD_CONF}.backup.$(date +%Y%m%d_%H%M%S)"
sed -i '/^Listen.*:80$/d' "$HTTPD_CONF"
sed -i '/^Listen 80$/d' "$HTTPD_CONF"
if ! grep -q "^Listen 80$" "$HTTPD_CONF"; then
echo "Listen 80" >> "$HTTPD_CONF"
fi
log_success "Listen директивы очищены"
fi
log_success "Модули Apache настроены"
log_step "Создание конфигурации виртуального хоста..."
mkdir -p "$WEBROOT"
SERVER_IP=$(hostname -I | awk '{print $1}')
if [ "$DISTRO_FAMILY" = "debian" ]; then
cat > "$APACHE_CONF" <<EOF
<VirtualHost *:80>
DocumentRoot $WEBROOT
ServerName localhost
ServerAlias www.localhost $SERVER_IP $(hostname -f) $(hostname -s)
DirectoryIndex index.php index.html
<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
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
cat > "$APACHE_CONF" <<EOF
<VirtualHost *:80>
DocumentRoot $WEBROOT
ServerName localhost
ServerAlias www.localhost $SERVER_IP $(hostname -f 2>/dev/null || hostname) $(hostname -s 2>/dev/null || hostname)
DirectoryIndex index.php index.html
<Directory $WEBROOT>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/opt/remi/php83/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
<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>
<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 /var/log/httpd/error.log
CustomLog /var/log/httpd/access.log combined
</VirtualHost>
EOF
fi
log_success "Конфигурация виртуального хоста создана"
cleanup_apache_config
log_step "Настройка PHP.ini..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
PHP_INI_PATH="/etc/php/8.3/apache2/php.ini"
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
PHP_INI_PATH="/etc/php.ini"
if [ -f "/etc/opt/remi/php83/php.ini" ]; then
PHP_INI_PATH="/etc/opt/remi/php83/php.ini"
elif [ -f "/opt/remi/php83/root/etc/php.ini" ]; then
PHP_INI_PATH="/opt/remi/php83/root/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 настроен ($PHP_INI_PATH)"
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
DOWNLOAD_URL="https://cloud.altcor.ru/setup/download.php"
create_fallback_index() {
cat > "$WEBROOT/index.php" << 'EOF'
<?php
echo "<!DOCTYPE html><html lang='ru'><head><meta charset='UTF-8'><title>Сервер готов</title>";
echo "<style>body{font-family:sans-serif;margin:40px;}.ok{color:green;}.fail{color:red;}</style></head><body>";
echo "<h1>Сервер готов к работе</h1>";
if (file_exists(__DIR__ . '/db_config.php')) {
require_once __DIR__ . '/db_config.php';
try {
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
echo "<p class='ok'>✓ Подключение к базе данных '" . DB_NAME . "' успешно.</p>";
} catch (PDOException $e) {
echo "<p class='fail'>✗ Не удалось подключиться к БД: " . htmlspecialchars($e->getMessage()) . "</p>";
}
} else {
echo "<p class='fail'>✗ Файл db_config.php не найден.</p>";
}
echo "</body></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 ! 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 "Настройка прав доступа к файлам..."
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
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
</IfModule>
<IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
</IfModule>
RewriteEngine On
EOF
chown -R $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT"
find "$WEBROOT" -type d -exec chmod 755 {} \;
find "$WEBROOT" -type f -exec chmod 644 {} \;
chmod 600 "$WEBROOT/db_config.php" 2>/dev/null || true
log_success "Права доступа настроены"
log_info "Текущий пользователь: $CURRENT_USER"
log_step "Настройка базы данных MariaDB..."
# Проверка и запуск MariaDB
if ! systemctl is-active --quiet mariadb; then
log_info "MariaDB не запущен. Попытка запуска..."
systemctl start mariadb
sleep 3
if ! systemctl is-active --quiet mariadb; then
log_error "Не удалось запустить MariaDB"
exit 1
fi
fi
CURRENT_USER=$(logname 2>/dev/null || whoami)
log_info "Текущий пользователь: $CURRENT_USER"
# Функция для безопасного выполнения SQL с детальными ошибками
execute_sql_safe() {
local connection_cmd="$1"
local description="$2"
local sql_commands="$3"
log_info "$description"
local temp_file="/tmp/mysql_commands_$$.sql"
local error_file="/tmp/mysql_error_$$.log"
echo "$sql_commands" > "$temp_file"
if eval "$connection_cmd < '$temp_file'" 2>"$error_file"; then
rm -f "$temp_file" "$error_file"
log_success "Выполнено: $description"
return 0
else
log_error "Ошибка: $description"
if [[ -s "$error_file" ]]; then
cat "$error_file" | head -5 >&2
fi
rm -f "$temp_file" "$error_file"
return 1
fi
}
# Функция создания базы данных (минимальный набор команд)
create_database_only() {
local connection_cmd="$1"
local sql="CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
if execute_sql_safe "$connection_cmd" "Создание базы данных ALTCor" "$sql"; then
return 0
else
return 1
fi
}
# Функция для проверки подключения
test_connection() {
local user="$1"
local password="$2"
local connection_params=""
if [[ -n "$password" ]]; then
connection_params="-u $user -p$password"
else
connection_params="-u $user"
fi
mysql $connection_params -e "SELECT 1;" >/dev/null 2>&1
}
# Основная логика - пробуем разные способы подключения
DB_CONFIGURED=false
log_info "Попытка подключения к MariaDB..."
# 1. Попробуем подключиться как root без пароля
if test_connection "root" ""; then
log_success "Подключение как root без пароля успешно"
if create_database_only "mysql -u root"; then
log_success "База данных создана"
DB_CONFIGURED=true
# Попробуем установить пароль (не критично если не получится)
log_info "Попытка установки пароля для root..."
local sql="ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_PASSWORD'; FLUSH PRIVILEGES;"
if echo "$sql" | mysql -u root >/dev/null 2>&1; then
log_success "Пароль root установлен"
else
log_info "Не удалось установить пароль, но база данных создана"
fi
fi
# 2. Попробуем подключиться как root с паролем
elif test_connection "root" "$DB_PASSWORD"; then
log_success "Подключение как root с паролем успешно"
if create_database_only "mysql -u root -p$DB_PASSWORD"; then
log_success "База данных проверена/создана"
DB_CONFIGURED=true
fi
# 3. Попробуем подключиться как текущий пользователь
elif test_connection "$CURRENT_USER" ""; then
log_success "Подключение как $CURRENT_USER без пароля успешно"
if create_database_only "mysql -u $CURRENT_USER"; then
log_success "База данных создана пользователем $CURRENT_USER"
DB_CONFIGURED=true
fi
# 4. Попробуем подключиться как текущий пользователь с паролем
elif test_connection "$CURRENT_USER" "$DB_PASSWORD"; then
log_success "Подключение как $CURRENT_USER с паролем успешно"
if create_database_only "mysql -u $CURRENT_USER -p$DB_PASSWORD"; then
log_success "База данных создана пользователем $CURRENT_USER"
DB_CONFIGURED=true
fi
# 5. Попробуем через sudo
elif sudo mysql -e "SELECT 1;" >/dev/null 2>&1; then
log_success "Подключение через sudo успешно"
if create_database_only "sudo mysql"; then
log_success "База данных создана через sudo"
DB_CONFIGURED=true
# Попробуем установить пароль через sudo
log_info "Попытка установки пароля через sudo..."
local sql="ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_PASSWORD'; FLUSH PRIVILEGES;"
if echo "$sql" | sudo mysql >/dev/null 2>&1; then
log_success "Пароль root установлен через sudo"
else
log_info "Пароль не удалось установить, но база создана"
fi
fi
else
log_error "Не удалось подключиться к MariaDB ни одним из способов"
log_info ""
log_info "Попробуйте выполнить настройку вручную:"
log_info "1. Проверьте статус MariaDB: sudo systemctl status mariadb"
log_info "2. Запустите мастер настройки: sudo mysql_secure_installation"
log_info "3. Создайте базу данных вручную:"
log_info " sudo mysql -e \"CREATE DATABASE ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\""
log_info "4. Или создайте отдельного пользователя:"
log_info " sudo mysql -e \"CREATE USER 'altcor'@'localhost' IDENTIFIED BY 'password';\""
log_info " sudo mysql -e \"CREATE DATABASE ALTCor; GRANT ALL ON ALTCor.* TO 'altcor'@'localhost';\""
exit 1
fi
# Проверяем результат
if [[ "$DB_CONFIGURED" == "true" ]]; then
log_success "База данных настроена успешно"
# Финальная проверка - можем ли мы подключиться к созданной базе
if mysql -u root -e "USE ALTCor; SELECT 'OK' as status;" >/dev/null 2>&1; then
log_success "Подключение к базе ALTCor как root работает"
elif mysql -u root -p"$DB_PASSWORD" -e "USE ALTCor; SELECT 'OK' as status;" >/dev/null 2>&1; then
log_success "Подключение к базе ALTCor как root с паролем работает"
elif mysql -u "$CURRENT_USER" -e "USE ALTCor; SELECT 'OK' as status;" >/dev/null 2>&1; then
log_success "Подключение к базе ALTCor как $CURRENT_USER работает"
else
log_info "База создана, но требуется проверка подключения"
fi
else
log_error "Не удалось настроить базу данных"
exit 1
fi
log_success "Настройка базы данных завершена"
log_step "Проверка конфигурации Apache..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
if ! apache2ctl configtest 2>/dev/null; then
log_error "Ошибка в конфигурации Apache"
apache2ctl configtest
exit 1
fi
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
if ! httpd -t 2>/dev/null; then
log_error "Ошибка в конфигурации Apache"
httpd -t
exit 1
fi
fi
log_success "Конфигурация Apache корректна"
log_step "Запуск и включение сервисов..."
if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then
log_info "Настройка SELinux..."
setsebool -P httpd_can_network_connect 1 >/dev/null 2>&1 || true
semanage fcontext -a -t httpd_exec_t "/var/opt/remi/php83/run/php-fpm/www.sock" >/dev/null 2>&1 || true
restorecon -R /var/www/html >/dev/null 2>&1 || true
fi
if [ "$DISTRO_FAMILY" = "debian" ]; then
systemctl restart apache2 >/dev/null 2>&1
systemctl enable apache2 >/dev/null 2>&1
WEBSERVER_SERVICE="apache2"
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
log_info "Запуск PHP-FPM..."
systemctl restart php83-php-fpm >/dev/null 2>&1
systemctl enable php83-php-fpm >/dev/null 2>&1
sleep 2
if ! systemctl is-active --quiet php83-php-fpm; then
log_error "PHP-FPM не запустился"
systemctl status php83-php-fpm --no-pager -l
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 enable mariadb >/dev/null 2>&1
systemctl restart redis-server >/dev/null 2>&1 || systemctl restart redis >/dev/null 2>&1 || true
systemctl enable redis-server >/dev/null 2>&1 || systemctl enable redis >/dev/null 2>&1 || true
log_success "Все сервисы запущены и добавлены в автозагрузку"
log_step "Настройка брандмауэра..."
if command -v ufw >/dev/null 2>&1 && ufw status | grep -q "Status: active"; then
log_info "Открываем порт 80 в UFW..."
ufw allow 80/tcp >/dev/null 2>&1
elif command -v firewall-cmd >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then
log_info "Открываем порт 80 в firewalld..."
firewall-cmd --permanent --add-service=http >/dev/null 2>&1
firewall-cmd --reload >/dev/null 2>&1
fi
log_success "Брандмауэр настроен"
log_step "Финальная проверка работоспособности..."
cat > "$WEBROOT/test.php" << EOF
<?php echo "PHP " . phpversion() . " работает!"; ?>
EOF
chown $WEBSERVER_USER:$WEBSERVER_USER "$WEBROOT/test.php"
sleep 2
if curl -s "http://localhost/test.php" 2>/dev/null | grep -q "PHP.*работает"; then
log_success "PHP работает через веб-сервер"
rm -f "$WEBROOT/test.php"
else
log_warning "Не удается проверить работу PHP через веб-сервер"
log_info "Проверьте вручную: curl http://localhost/test.php"
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"
ALL_IPS=$(hostname -I | tr ' ' '\n' | grep -v '^$' | head -5)
EXTERNAL_IP=$(curl -s icanhazip.com 2>/dev/null || echo "недоступен")
echo ""
if [ "$REINSTALL" = true ]; then
log_success "Переустановка Altcor успешно завершена."
else
log_success "Установка Altcor успешно завершена."
fi
echo ""
echo " Доступ к сайту:"
echo " • http://localhost/"
while IFS= read -r ip; do
[ -n "$ip" ] && echo " • http://$ip/"
done <<< "$ALL_IPS"
if [ "$EXTERNAL_IP" != "недоступен" ] && [ ! -z "$EXTERNAL_IP" ]; then
echo " • http://$EXTERNAL_IP/ (внешний IP)"
fi
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 ""
}
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