1473 lines
58 KiB
Bash
1473 lines
58 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 директив..."
|
||
|
||
if [ "$DISTRO" = "fedora" ]; then
|
||
cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF'
|
||
<FilesMatch \.php$>
|
||
SetHandler "proxy:fcgi://127.0.0.1:9000"
|
||
</FilesMatch>
|
||
|
||
DirectoryIndex index.php index.html index.htm
|
||
|
||
<Files "*.php">
|
||
Require all granted
|
||
</Files>
|
||
EOF
|
||
else
|
||
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
|
||
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 "Начинаем установку 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)..."
|
||
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
|
||
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
|
||
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
|
||
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"
|
||
fi
|
||
|
||
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
|
||
rm -f /etc/httpd/conf.d/php-fpm.conf
|
||
|
||
log_info "Настройка PHP-FPM для Apache..."
|
||
|
||
if [ "$DISTRO" = "fedora" ]; then
|
||
# Для Fedora используем стандартный PHP-FPM без LoadModule директив
|
||
cat > "/etc/httpd/conf.d/php-fpm.conf" << 'EOF'
|
||
<FilesMatch \.php$>
|
||
SetHandler "proxy:fcgi://127.0.0.1:9000"
|
||
</FilesMatch>
|
||
|
||
DirectoryIndex index.php index.html index.htm
|
||
|
||
<Files "*.php">
|
||
Require all granted
|
||
</Files>
|
||
EOF
|
||
|
||
# Настраиваем стандартный PHP-FPM для Fedora
|
||
if [ -f "/etc/php-fpm.d/www.conf" ]; then
|
||
PHP_FPM_CONF="/etc/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 = 127.0.0.1:9000/' "$PHP_FPM_CONF"
|
||
|
||
log_info "PHP-FPM пул настроен для Fedora"
|
||
|
||
# Запускаем и включаем PHP-FPM
|
||
systemctl enable php-fpm >/dev/null 2>&1
|
||
systemctl start php-fpm >/dev/null 2>&1
|
||
fi
|
||
|
||
else
|
||
# Для CentOS/RHEL/AlmaLinux с Remi репозиторием
|
||
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"
|
||
fi
|
||
|
||
mkdir -p /var/opt/remi/php83/run/php-fpm
|
||
chown apache:apache /var/opt/remi/php83/run/php-fpm
|
||
fi
|
||
|
||
# Очищаем дублирующиеся Listen директивы
|
||
HTTPD_CONF="/etc/httpd/conf/httpd.conf"
|
||
log_step "Очистка дублирующихся Listen директив..."
|
||
|
||
# Создаем резервную копию
|
||
cp "$HTTPD_CONF" "${HTTPD_CONF}.backup.$(date +%Y%m%d_%H%M%S)"
|
||
|
||
# Удаляем все существующие Listen директивы для порта 80
|
||
sed -i '/^Listen.*:80$/d' "$HTTPD_CONF"
|
||
sed -i '/^Listen 80$/d' "$HTTPD_CONF"
|
||
|
||
# Добавляем только одну Listen директиву в конец файла
|
||
if ! grep -q "^Listen 80$" "$HTTPD_CONF"; then
|
||
echo "Listen 80" >> "$HTTPD_CONF"
|
||
fi
|
||
|
||
log_success "Listen директивы очищены"
|
||
fi
|
||
|
||
# mkdir -p /var/opt/remi/php83/run/php-fpm
|
||
# chown apache:apache /var/opt/remi/php83/run/php-fpm
|
||
# fi
|
||
# 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)
|
||
|
||
<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)
|
||
|
||
<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 "Настройка Apache для прослушивания всех интерфейсов..."
|
||
# if [ "$DISTRO_FAMILY" = "debian" ]; then
|
||
# if ! grep -q "Listen.*:80" /etc/apache2/ports.conf; then
|
||
# echo "Listen *:80" >> /etc/apache2/ports.conf
|
||
# elif grep -q "Listen 127.0.0.1:80" /etc/apache2/ports.conf && ! grep -q "Listen \*:80\|Listen 0.0.0.0:80" /etc/apache2/ports.conf; then
|
||
# sed -i 's/Listen 127.0.0.1:80/Listen *:80/' /etc/apache2/ports.conf
|
||
# fi
|
||
# awk '!seen && /^Listen.*:80$/{seen=1; print "Listen *:80"; next} !/^Listen.*:80$/{print}' /etc/apache2/ports.conf > /etc/apache2/ports.conf.tmp && mv /etc/apache2/ports.conf.tmp /etc/apache2/ports.conf
|
||
|
||
# elif [ "$DISTRO_FAMILY" = "rhel" ]; then
|
||
# HTTPD_CONF="/etc/httpd/conf/httpd.conf"
|
||
|
||
# if ! grep -q "Listen.*:80" "$HTTPD_CONF"; then
|
||
# echo "Listen *:80" >> "$HTTPD_CONF"
|
||
# elif grep -q "Listen 127.0.0.1:80" "$HTTPD_CONF" && ! grep -q "Listen \*:80\|Listen 0.0.0.0:80" "$HTTPD_CONF"; then
|
||
# sed -i 's/Listen 127.0.0.1:80/Listen *:80/' "$HTTPD_CONF"
|
||
# fi
|
||
# awk '!seen && /^Listen.*:80$/{seen=1; print "Listen *:80"; next} !/^Listen.*:80$/{print}' "$HTTPD_CONF" > "$HTTPD_CONF.tmp" && mv "$HTTPD_CONF.tmp" "$HTTPD_CONF"
|
||
# fi
|
||
# log_success "Apache настроен для прослушивания всех интерфейсов"
|
||
|
||
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
|
||
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"
|
||
elif [ -f "/etc/php.ini" ]; then
|
||
PHP_INI_PATH="/etc/php.ini"
|
||
fi
|
||
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
|
||
|
||
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_success "Конфигурация Apache корректна"
|
||
else
|
||
log_error "Ошибка в конфигурации Apache"
|
||
apache2ctl configtest
|
||
return 1
|
||
fi
|
||
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
|
||
if httpd -t >/dev/null 2>&1; then
|
||
log_success "Конфигурация Apache корректна"
|
||
else
|
||
log_error "Ошибка в конфигурации Apache"
|
||
httpd -t
|
||
return 1
|
||
fi
|
||
fi
|
||
|
||
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
|
||
setsebool -P httpd_execmem 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
|
||
restorecon -R /var/opt/remi/php83/run/php-fpm/ >/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
|
||
if [ "$DISTRO" != "fedora" ]; then
|
||
log_info "Запуск PHP-FPM..."
|
||
systemctl stop php83-php-fpm >/dev/null 2>&1 || true
|
||
systemctl start php83-php-fpm >/dev/null 2>&1
|
||
systemctl enable php83-php-fpm >/dev/null 2>&1
|
||
|
||
sleep 3
|
||
|
||
if ! systemctl is-active --quiet php83-php-fpm; then
|
||
log_error "PHP-FPM не запустился"
|
||
systemctl status php83-php-fpm --no-pager -l
|
||
exit 1
|
||
fi
|
||
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 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 "Все сервисы запущены и добавлены в автозагрузку"
|
||
|
||
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 || true
|
||
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 || true
|
||
firewall-cmd --reload >/dev/null 2>&1 || true
|
||
elif command -v iptables >/dev/null 2>&1; then
|
||
log_info "Открываем порт 80 в iptables..."
|
||
iptables -I INPUT -p tcp --dport 80 -j ACCEPT >/dev/null 2>&1 || true
|
||
fi
|
||
log_success "Брандмауэр настроен"
|
||
|
||
log_step "Финальная проверка работоспособности..."
|
||
if ! systemctl is-active --quiet $WEBSERVER_SERVICE; then
|
||
log_error "Веб-сервер не запущен"
|
||
systemctl status $WEBSERVER_SERVICE --no-pager -l
|
||
exit 1
|
||
fi
|
||
|
||
if ! systemctl is-active --quiet mariadb; then
|
||
log_error "MariaDB не запущен"
|
||
exit 1
|
||
fi
|
||
|
||
PHP_WORKS=false
|
||
if php -r "echo phpversion();" >/dev/null 2>&1; then
|
||
PHP_WORKS=true
|
||
elif [ -f "/opt/remi/php83/root/usr/bin/php" ] && /opt/remi/php83/root/usr/bin/php -r "echo phpversion();" >/dev/null 2>&1; then
|
||
PHP_WORKS=true
|
||
fi
|
||
|
||
if [ "$PHP_WORKS" = false ]; then
|
||
log_error "PHP не работает корректно"
|
||
exit 1
|
||
fi
|
||
|
||
if [ "$DISTRO_FAMILY" = "rhel" ] && [ "$DISTRO" != "fedora" ]; then
|
||
if ! systemctl is-active --quiet php83-php-fpm; then
|
||
log_error "PHP-FPM не запущен"
|
||
systemctl status php83-php-fpm --no-pager -l
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -S "/var/opt/remi/php83/run/php-fpm/www.sock" ]; then
|
||
log_warning "Сокет PHP-FPM не найден"
|
||
ls -la /var/opt/remi/php83/run/php-fpm/ 2>/dev/null || true
|
||
fi
|
||
fi
|
||
|
||
if ! mysql -u root -p"$DB_PASSWORD" -e "USE ALTCor; SELECT 1;" >/dev/null 2>&1; then
|
||
log_error "Не удается подключиться к базе данных ALTCor"
|
||
exit 1
|
||
fi
|
||
|
||
cat > "$WEBROOT/test.php" << 'EOF'
|
||
<?php
|
||
echo "PHP " . phpversion() . " работает!";
|
||
echo "\nВремя: " . date('Y-m-d H:i:s');
|
||
?>
|
||
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 ifconfig.me 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" != "недоступен" ] && [ "$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 ""
|
||
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 |