Files
altcorAutoinstall/install.sh
2025-08-11 01:13:46 +03:00

657 lines
24 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
FORCE_REINSTALL=false
while getopts ":uf" opt; do
case $opt in
u)
UNINSTALL=true
;;
f)
FORCE_REINSTALL=true
;;
\?)
echo -e "${RED}[Ошибка]${NC} Неизвестный параметр: -$OPTARG" >&2
echo "Использование: $0 [-u] [-f]"
echo " -u Полное удаление"
echo " -f Принудительная переустановка"
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
}
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 need_reinstall=false
log_info "Проверка Apache..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
if command -v apache2 >/dev/null 2>&1; then
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
if systemctl is-active --quiet httpd 2>/dev/null; then
apache_status=0
else
apache_status=1
fi
else
apache_status=2
fi
fi
log_info "Проверка PHP..."
if command -v php >/dev/null 2>&1; then
php_status=0
else
php_status=2
fi
log_info "Проверка MariaDB..."
if command -v mysql >/dev/null 2>&1; then
if systemctl is-active --quiet mariadb 2>/dev/null; then
mariadb_status=0
else
mariadb_status=1
fi
else
mariadb_status=2
fi
log_info "Проверка Redis..."
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
echo ""
HTACCESS_PHP_CONF_APACHE_CONF_DB_CONFIG_CREDENTIALS_EOF
case $apache_status in
0) echo -e "Apache: ${GREEN}Установлен и работает${NC}" ;;
1) echo -e "Apache: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;;
2) echo -e "Apache: ${RED}Не установлен${NC}"; need_reinstall=true ;;
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 "неизвестно")
if [[ "$php_version" == "8.3" ]]; then
echo -e "PHP: ${GREEN}Установлен (версия $php_version)${NC}"
else
echo -e "PHP: ${YELLOW}Установлен (версия $php_version, требуется 8.3)${NC}"
need_reinstall=true
fi
;;
2) echo -e "PHP: ${RED}Не установлен${NC}"; need_reinstall=true ;;
esac
case $mariadb_status in
0) echo -e "MariaDB: ${GREEN}Установлен и работает${NC}" ;;
1) echo -e "MariaDB: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;;
2) echo -e "MariaDB: ${RED}Не установлен${NC}"; need_reinstall=true ;;
esac
case $redis_status in
0) echo -e "Redis: ${GREEN}Установлен и работает${NC}" ;;
1) echo -e "Redis: ${YELLOW}Установлен, но не работает${NC}"; need_reinstall=true ;;
2) echo -e "Redis: ${RED}Не установлен${NC}"; need_reinstall=true ;;
esac
if [ -f "/var/www/html/db_config.php" ]; then
echo -e "Конфигурация БД: ${GREEN}Найдена${NC}"
else
echo -e "Конфигурация БД: ${RED}Не найдена${NC}"
need_reinstall=true
fi
echo ""
if [ "$need_reinstall" = false ] && [ "$apache_status" -eq 0 ] && [ "$php_status" -eq 0 ] && [ "$mariadb_status" -eq 0 ]; then
log_success "Все компоненты уже установлены и работают корректно"
echo ""
if [ "$FORCE_REINSTALL" = false ]; then
echo "Система уже настроена и работает."
echo ""
read -p "Выполнить полную переустановку? [y/n]: " choice
case $choice in
[Yy]|[Yy][Ee][Ss])
log_info "Начинаем полную переустановку..."
return 0
;;
[Nn]|[Nn][Oo])
log_info "Переустановка отменена."
IP_ADDR=$(hostname -I | awk '{print $1}')
if [ -f "/root/.db_password" ]; then
EXISTING_PASSWORD=$(grep "DB_PASSWORD=" /root/.db_password | cut -d'=' -f2)
else
EXISTING_PASSWORD="(не найден в /root/.db_password)"
fi
echo ""
echo "🌐 Доступ к сайту:"
echo " • http://localhost/"
echo " • http://$IP_ADDR/"
echo ""
echo "🗄️ Доступ к БД:"
echo " • Логин: root"
echo " • Пароль: $EXISTING_PASSWORD"
echo ""
exit 0
;;
*)
log_info "Неверный ввод. Переустановка отменена."
exit 0
;;
esac
else
log_info "Форсируем переустановку всех компонентов..."
return 0
fi
else
log_info "Обнаружены отсутствующие или неработающие компоненты. Продолжаем установку..."
return 0
fi
}
full_uninstall() {
log_step "Начинаем полное удаление Altcor... :("
log_info "Остановка сервисов..."
systemctl stop nginx apache2 httpd php*-fpm mariadb mysql redis-server redis 2>/dev/null || true
log_info "Удаление пакетов..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
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 "Полное удаление завершено."
exit 0
}
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
fi
check_existing_installation
INSTALL_TYPE=$?
if [ "$INSTALL_TYPE" -eq 1 ]; then
SKIP_PACKAGE_INSTALL=true
else
SKIP_PACKAGE_INSTALL=false
fi
# ВАЖНО: Генерируем новый пароль только при полной установке
if [ -f "/root/.db_password" ] && [ "$FORCE_REINSTALL" = false ] && [ "$SKIP_PACKAGE_INSTALL" = true ]; then
DB_PASSWORD=$(grep "DB_PASSWORD=" /root/.db_password | cut -d'=' -f2)
log_info "Используем существующий пароль БД"
else
DB_PASSWORD=$(generate_password)
log_info "Сгенерирован новый пароль БД"
fi
if [ "$SKIP_PACKAGE_INSTALL" = false ]; then
log_step "Остановка конфликтующих сервисов..."
systemctl stop nginx httpd apache2 php*-fpm mariadb mysql redis-server redis 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
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
env DEBIAN_FRONTEND=noninteractive 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
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
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
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, Java)..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
apt install -y redis-server libreoffice default-jre >/dev/null 2>&1
elif [ "$DISTRO_FAMILY" = "rhel" ]; then
$PKG_MANAGER install -y redis libreoffice java-11-openjdk >/dev/null 2>&1
fi
log_success "Дополнительные компоненты установлены"
log_step "Установка PHP 8.3 и расширений..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
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"
else
PHP_PACKAGES="php83 php83-php 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"
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 /usr/bin/php83 /usr/bin/php >/dev/null 2>&1 || true
fi
fi
log_success "PHP 8.3 и расширения установлены"
else
log_info "Пропускаем установку пакетов (используем существующие)"
fi
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"
cat > "/etc/httpd/conf.d/php.conf" << 'PHP_CONF_EOF'
LoadModule php_module modules/libphp.so
LoadModule rewrite_module modules/mod_rewrite.so
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
EOF
fi
log_success "Модули Apache настроены"
log_step "Создание конфигурации виртуального хоста..."
mkdir -p "$WEBROOT"
cat > "$APACHE_CONF" <<APACHE_CONF_EOF
<VirtualHost *:80>
DocumentRoot $WEBROOT
ServerName localhost
ServerAlias www.localhost
<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 "db_config.php">
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
log_success "Конфигурация виртуального хоста создана"
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
PHP_INI_PATH="/etc/opt/remi/php83/php.ini"
[ ! -f "$PHP_INI_PATH" ] && PHP_INI_PATH="/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 настроен"
else
log_warning "Файл PHP.ini не найден по пути: $PHP_INI_PATH"
fi
# ИСПРАВЛЕНИЕ 1: Всегда пересоздаем конфигурацию БД с актуальным паролем
log_step "Создание конфигурации базы данных..."
if [ "$DISTRO_FAMILY" = "debian" ]; then
DB_SOCKET="/var/run/mysqld/mysqld.sock"
else
DB_SOCKET="/var/lib/mysql/mysql.sock"
fi
# Удаляем старый конфиг, если есть
rm -f "$WEBROOT/db_config.php"
cat > "$WEBROOT/db_config.php" << DB_CONFIG_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
# ИСПРАВЛЕНИЕ 2: Устанавливаем правильные права доступа на конфиг БД сразу
chmod 600 "$WEBROOT/db_config.php"
chown root:root "$WEBROOT/db_config.php"
log_success "Конфигурация БД создана"
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
if (file_exists(__DIR__ . '/db_config.php')) {
require_once __DIR__ . '/db_config.php';
} else {
die('Конфигурация базы данных не найдена');
}
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 ".error { background: #fed7d7; color: #742a2a; border-left: 4px solid #e53e3e; }";
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 error'>";
echo "<strong>Проблема с БД:</strong> " . htmlspecialchars($e->getMessage());
echo "</div>";
}
echo "<div class='status warning'>";
echo "<strong>Внимание:</strong> Используется временная страница.<br>";
echo "Основные файлы приложения не были загружены с удаленного сервера.<br>";
echo "Для загрузки файлов вручную выполните:<br>";
echo "<code>cd /var/www/html && wget https://cloud.altcor.ru/setup/download.php -O files.download</code>";
echo "</div>";
echo "</div>";
echo "</body>";
echo "</html>";
?>