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
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
SetHandler "proxy:unix:/var/opt/remi/php83/run/php-fpm/www.sock|fcgi://localhost"
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
Require all denied
Require all denied
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"
ErrorLog /var/log/httpd/error.log
CustomLog /var/log/httpd/access.log combined
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
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'
Сервер готов";
echo "";
echo "Сервер готов к работе
";
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 "✓ Подключение к базе данных '" . DB_NAME . "' успешно.
";
} catch (PDOException $e) {
echo "✗ Не удалось подключиться к БД: " . htmlspecialchars($e->getMessage()) . "
";
}
} else {
echo "✗ Файл db_config.php не найден.
";
}
echo "";
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 "/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'
Require all denied
Require all denied
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
ExpiresActive On
ExpiresDefault "access plus 1 month"
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
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_step "Настройка базы данных 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
log_info "Выполнение базовой настройки безопасности MariaDB..."
if mysql -u root -e "SELECT 1;" >/dev/null 2>&1; then
log_info "Первичная настройка MariaDB (подключение без пароля доступно)..."
MYSQL_SECURE_SCRIPT="/tmp/mysql_secure.sql"
cat > "$MYSQL_SECURE_SCRIPT" << MYSQL_SCRIPT
ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_PASSWORD';
DELETE FROM mysql.user WHERE User='';
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 -u root -p"$DB_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS ALTCor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" >/dev/null 2>&1
log_success "База данных ALTCor создана/проверена"
else
log_error "Не удалось подключиться к MariaDB. Попробуйте проверить пароль root вручную."
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
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