| @copyright 2007-2026 (c) AVE.cms
| @link https://ave-cms.ru
| @version 3.3
*/
define('AVE_SETUP', true);
define('BASE_PATH', str_replace('\\', '/', dirname(__DIR__)));
@ini_set('display_errors', '0');
@ini_set('default_charset', 'UTF-8');
$setupSessionError = '';
$setupSessionPath = BASE_PATH . '/tmp/sessions';
if (!is_dir($setupSessionPath) && !@mkdir($setupSessionPath, 0775, true)) {
$setupSessionError = 'Не удалось создать каталог tmp/sessions для сессии установщика.';
} elseif (!is_writable($setupSessionPath)) {
$setupSessionError = 'Каталог tmp/sessions недоступен для записи.';
}
if ($setupSessionError === '') {
@ini_set('session.save_handler', 'files');
if (strtolower((string) ini_get('session.save_handler')) === 'files') {
@session_save_path($setupSessionPath);
}
}
@ini_set('session.use_cookies', '1');
@ini_set('session.use_only_cookies', '1');
@ini_set('session.use_strict_mode', '1');
@ini_set('session.cookie_httponly', '1');
@ini_set('session.cookie_samesite', 'Lax');
$setupScriptDirectory = rtrim(str_replace('\\', '/', dirname(isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : '/setup/index.php')), '/');
$setupCookiePath = preg_replace('#/setup$#', '', $setupScriptDirectory) . '/';
$setupCookiePath = $setupCookiePath === '//' ? '/' : $setupCookiePath;
$setupCookieSecure = (!empty($_SERVER['HTTPS']) && strtolower((string) $_SERVER['HTTPS']) !== 'off')
|| (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower((string) $_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https');
session_set_cookie_params(array(
'lifetime' => 0,
'path' => $setupCookiePath,
'domain' => '',
'secure' => $setupCookieSecure,
'httponly' => true,
'samesite' => 'Lax',
));
session_name('AVE_SETUP');
if (!@session_start() && $setupSessionError === '') {
$setupSessionError = 'Не удалось запустить сессию установщика в tmp/sessions. Проверьте права на каталог tmp.';
}
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Expires: 0');
if (empty($_SESSION['setup_csrf'])) {
$_SESSION['setup_csrf'] = bin2hex(random_bytes(32));
}
require_once __DIR__ . '/Localization.php';
$requestedSetupLanguage = isset($_POST['setup_language'])
? (string) $_POST['setup_language']
: (isset($_GET['lang']) ? (string) $_GET['lang'] : '');
AveSetupLocale::boot($requestedSetupLanguage);
$setupLanguage = AveSetupLocale::current();
require_once __DIR__ . '/PackageExtractor.php';
$packageExtractor = new AvePackageExtractor(BASE_PATH);
if ($packageExtractor->available()) {
$base = rtrim(str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])), '/');
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['extract_runtime'])) {
header('Content-Type: application/json; charset=UTF-8');
try {
$token = isset($_POST['_csrf']) ? (string) $_POST['_csrf'] : '';
if (!hash_equals((string) $_SESSION['setup_csrf'], $token)) {
throw new RuntimeException('Сессия распаковки устарела. Обновите страницу.');
}
echo json_encode(
AveSetupLocale::translatePayload($packageExtractor->step()),
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
);
} catch (Throwable $e) {
http_response_code(422);
echo json_encode(
array('success' => false, 'message' => AveSetupLocale::translate($e->getMessage())),
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
);
}
exit;
}
$css = __DIR__ . '/assets/installer.css';
$js = __DIR__ . '/assets/installer.js';
$escape = function ($value) { return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); };
ob_start();
?>
Подготовка AVE.cms
⇩
Компактная поставка
Распаковываем AVE.cms
Проверяем архив и готовим файлы системы. Не закрывайте эту страницу.
Подготовка проверки 0%
Распаковка остановлена Повторить
officialRepositoryProfile();
$release = is_file(BASE_PATH . '/system/release.php') ? require BASE_PATH . '/system/release.php' : array();
$releaseVersion = isset($release['version']) ? (string) $release['version'] : '3.3';
$releaseBuild = isset($release['build']) ? (string) $release['build'] : '0.20';
$adminPasswordMinLength = AveInstaller::ADMIN_PASSWORD_MIN_LENGTH;
$requirements = $installer->requirements();
if ($setupSessionError !== '') {
array_unshift($requirements, array(
'label' => 'Сессия установщика',
'passed' => false,
'detail' => $setupSessionError,
'required' => true,
));
}
$requirementsPassed = $installer->requirementsPassed($requirements);
$state = $installer->installationState();
$existingConfig = $installer->existingDatabaseConfig();
$adminDirectory = $installer->configuredAdminDirectory();
$error = '';
$success = null;
$base = rtrim(str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])), '/');
$rootUrl = preg_replace('#/setup$#', '', $base);
$progressRequest = $_SERVER['REQUEST_METHOD'] === 'POST'
&& isset($_SERVER['HTTP_X_SETUP_PROGRESS'])
&& $_SERVER['HTTP_X_SETUP_PROGRESS'] === '1';
$emitProgress = function (array $payload) use ($progressRequest) {
if (!$progressRequest) { return; }
echo json_encode(
AveSetupLocale::translatePayload($payload),
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
) . "\n";
@ob_flush();
flush();
};
if ($progressRequest) {
header('Content-Type: application/x-ndjson; charset=UTF-8');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('X-Accel-Buffering: no');
@ini_set('output_buffering', '0');
@ini_set('zlib.output_compression', '0');
while (ob_get_level() > 0) { @ob_end_flush(); }
ob_implicit_flush(true);
}
$defaults = array(
'dbhost' => $existingConfig && isset($existingConfig['dbhost']) ? $existingConfig['dbhost'] : '127.0.0.1',
'dbport' => $existingConfig && isset($existingConfig['dbport']) && $existingConfig['dbport'] ? $existingConfig['dbport'] : '3306',
'dbname' => $existingConfig && isset($existingConfig['dbname']) ? $existingConfig['dbname'] : '',
'dbuser' => $existingConfig && isset($existingConfig['dbuser']) ? $existingConfig['dbuser'] : '',
'dbpref' => $existingConfig && isset($existingConfig['dbpref']) ? $existingConfig['dbpref'] : 'ave',
'site_name' => AveSetupLocale::translate('Новый сайт на AVE.cms'),
'admin_name' => AveSetupLocale::translate('Администратор'),
'admin_login' => 'admin',
'admin_email' => '',
'admin_directory' => 'adminx',
);
$resetPrefixRequested = $_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['reset_prefix']);
$resetPrefixConfirmation = $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['reset_prefix_confirmation'])
? (string) $_POST['reset_prefix_confirmation']
: '';
$repositoryMode = $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['repository_mode'])
? strtolower(trim((string) $_POST['repository_mode']))
: (!empty($officialRepository['available']) ? 'official' : 'disabled');
$customRepositoryProfile = $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['repository_profile'])
? (string) $_POST['repository_profile']
: '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && empty($state['installed'])) {
try {
if ($setupSessionError !== '') {
throw new RuntimeException($setupSessionError);
}
$token = isset($_POST['_csrf']) ? (string) $_POST['_csrf'] : '';
if (!hash_equals((string) $_SESSION['setup_csrf'], $token)) {
throw new RuntimeException('Сессия установки устарела. Обновите страницу.');
}
if (!$requirementsPassed) {
throw new RuntimeException('Сначала устраните обязательные ошибки окружения.');
}
$database = $existingConfig ?: array(
'dbhost' => isset($_POST['dbhost']) ? $_POST['dbhost'] : '',
'dbport' => isset($_POST['dbport']) ? $_POST['dbport'] : 3306,
'dbname' => isset($_POST['dbname']) ? $_POST['dbname'] : '',
'dbuser' => isset($_POST['dbuser']) ? $_POST['dbuser'] : '',
'dbpass' => isset($_POST['dbpass']) ? $_POST['dbpass'] : '',
'dbpref' => isset($_POST['dbpref']) ? $_POST['dbpref'] : 'ave',
);
$site = array(
'site_name' => isset($_POST['site_name']) ? $_POST['site_name'] : '',
'admin_name' => isset($_POST['admin_name']) ? $_POST['admin_name'] : '',
'admin_login' => isset($_POST['admin_login']) ? $_POST['admin_login'] : '',
'admin_email' => isset($_POST['admin_email']) ? $_POST['admin_email'] : '',
'admin_password' => isset($_POST['admin_password']) ? $_POST['admin_password'] : '',
'admin_directory' => isset($_POST['admin_directory']) ? $_POST['admin_directory'] : 'adminx',
'admin_language' => $setupLanguage,
);
$repositories = $installer->validateRepositorySelection($repositoryMode, $customRepositoryProfile);
$success = $installer->install($database, $site, array(
'reset_prefix' => $resetPrefixRequested,
'reset_prefix_confirmation' => $resetPrefixConfirmation,
'repositories' => $repositories,
'progress' => function (array $progress) use ($emitProgress) {
$progress['type'] = 'progress';
$emitProgress($progress);
},
));
$_SESSION['setup_csrf'] = bin2hex(random_bytes(32));
$adminDirectory = isset($success['admin_directory']) ? $success['admin_directory'] : 'adminx';
$defaults = array_merge($defaults, array_intersect_key($site, $defaults));
if ($progressRequest) {
$emitProgress(array(
'type' => 'complete',
'summary' => $success,
'admin_url' => $rootUrl . '/' . rawurlencode($adminDirectory) . '/login',
'site_url' => $rootUrl . '/',
));
exit;
}
} catch (Throwable $e) {
$error = $e->getMessage();
if ($progressRequest) {
$emitProgress(array('type' => 'error', 'message' => $error));
exit;
}
foreach ($defaults as $key => $value) {
if (isset($_POST[$key])) { $defaults[$key] = (string) $_POST[$key]; }
}
}
}
function setup_escape($value)
{
return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
}
function setup_asset_version($path)
{
$hash = is_file($path) ? hash_file('sha256', $path) : false;
return $hash ? substr($hash, 0, 12) : 'missing';
}
$installerCssVersion = setup_asset_version(__DIR__ . '/assets/installer.css');
$installerJsVersion = setup_asset_version(__DIR__ . '/assets/installer.js');
ob_start();
?>
Установка AVE.cms
✓
Система настроена
Установщик заблокирован
= setup_escape($state['reason']) ?> Для повторной установки удалите локальные configs/db.config.php и storage/installed.lock. После этого можно выбрать свободный префикс либо очистить таблицы прежнего префикса в форме.
✓
Готово
AVE.cms установлена
Создано = (int) $success['tables'] ?> системных таблиц, один администратор, стартовая страница и служебная страница 404. Установленных модулей: = (int) $success['modules'] ?>.
1 шаблон1 рубрика2 поля2 документа
Чистая установка
Базовая система без модулей
Установщик создаст только ядро AVE.cms, первого администратора и минимальную публичную страницу. Товары, заказы, оплаты, формы, RSS и остальные пакеты останутся доступными для отдельной установки.
Установка остановлена = setup_escape($error) ?>
Установка
Подготовка Проверяем введённые данные
0%
1 Проверка Окружение и параметры
2 Подключение Доступ к базе данных
3 Структура Таблицы и индексы
4 Данные Настройки и документы
5 Завершение Конфигурация и кеш
Установка остановлена Вернуться к форме
✓
Готово
AVE.cms установлена
Созданы системные таблицы, один администратор, стартовая страница и служебная страница 404. Модули не устанавливались.
1 шаблон1 рубрика2 поля2 документа