> For the complete documentation index, see [llms.txt](https://docs.johncms.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.johncms.com/10.0/nachalo-raboty/obnovlenie-s-versii-9.9.md).

# Обновление с версии 9.9

{% hint style="warning" %}
Обновляться на 10.0 можно **только с версии 9.9**. Если у вас более старая версия, сначала обновитесь до 9.9 по инструкции в [документации ветки 9.9](https://github.com/johncms/documentation/tree/9.9), а затем возвращайтесь сюда.
{% endhint %}

## Главное изменение: корень сайта переехал в `public/`

Раньше корнем сайта (document root) была корневая папка JohnCMS. Это означало, что по прямому адресу были доступны и `config/`, и `system/`, и `vendor/`, и файл `.env` — от чтения их спасали только правила в `.htaccess`.

Теперь по HTTP доступна только папка **`public/`**. Код, конфигурация и шаблоны остались в корне и больше не отдаются веб-сервером.

**Адреса страниц и файлов при этом не изменились.** Структура внутри `public/` повторяет прежнюю, поэтому `/themes/default/assets/css/app.css`, `/upload/...` и `/install/` открываются по тем же адресам, что и раньше.

### Что нужно сделать при обновлении

#### 1. Переведите корень сайта на папку `public`

Это главный и обязательный шаг.

* **Обычный хостинг с панелью управления.** В настройках сайта найдите поле «Корневая директория сайта» (или «Document root») и укажите в нём папку `public` внутри каталога сайта. Например, было `/var/www/mysite`, стало `/var/www/mysite/public`.
* **Nginx.** В конфигурации сервера измените директиву `root`:

  ```nginx
  server {
      # было: root /var/www/mysite;
      root /var/www/mysite/public;
      index index.php;
  }
  ```
* **Apache.** Измените `DocumentRoot` в конфигурации виртуального хоста:

  ```apache
  DocumentRoot /var/www/mysite/public
  <Directory /var/www/mysite/public>
      AllowOverride All
      Require all granted
  </Directory>
  ```

#### 2. Перезапустите PHP

После обновления обязательно перезапустите **php-fpm** (или веб-сервер, если PHP работает как модуль Apache). PHP кэширует пути к файлам (realpath cache), и без перезапуска сайт может продолжать искать файлы по старым адресам.

```bash
sudo systemctl restart php8.2-fpm
```

#### 3. Обновите зависимости

```bash
composer install
```

{% hint style="danger" %}
Если корень сайта не перевести на `public/`, сайт перестанет открываться: в корневой папке больше нет файла `index.php`.
{% endhint %}

### Если корень сайта сменить нельзя

На некоторых дешёвых хостингах корневую папку сайта поменять невозможно. Для таких случаев в корне JohnCMS лежит файл `.htaccess`, который перенаправляет все запросы в `public/` и закрывает доступ к папкам с кодом. Он подхватится сам, и сайт продолжит работать.

{% hint style="warning" %}
Это запасной вариант, а не полноценная замена. Код при нём физически остаётся внутри веб-дерева, и защита держится на правилах `.htaccess`. Работает он **только на Apache**: если у вас nginx, единственный способ — перевести корень сайта на `public/`.
{% endhint %}

### Что это значит для авторов шаблонов

Шаблон теперь разложен по двум местам:

* исходники и шаблоны страниц остались в корне — `themes/<ваш шаблон>/src/` и `themes/<ваш шаблон>/templates/`;
* собранные стили, скрипты и картинки переехали в `public/themes/<ваш шаблон>/assets/`.

Если вы собираете стили через webpack, поправьте пути назначения в `webpack.<ваш шаблон>.mix.js` — они должны указывать в `public/themes/<ваш шаблон>/assets/`. Адреса файлов в браузере при этом не меняются, функция `asset()` в шаблонах работает как прежде.

## Удалены скрипты обновления со старых версий

Из папки `install` удалены разовые скрипты обновления с версий ниже 9.9, конвертеры данных и скрипты доустановки модулей 9.9 (`install_collections.php`, `install_consent.php`, `install_contacts.php`, `update_counters_cookie_consent.php`). Теперь папка `install` содержит только веб-инсталлятор.

Если вы обновляетесь с версии ниже 9.9, эти скрипты и инструкции к ним остались в ветке `9.x` и в [документации ветки 9.9](https://github.com/johncms/documentation/tree/9.9). Выполните их **до** перехода на 10.0.

## Зависимости переехали в `vendor/`

Composer-зависимости, которые раньше лежали в `system/vendor`, теперь устанавливаются в стандартную папку `vendor/` в корне. При обновлении удалите старую папку и переустановите зависимости:

```bash
rm -rf system/vendor
composer install
```
