SLOT-H: Мультипроектность



Система изначально спроектирована для работы с неограниченным количеством проектов. Каждый проект представляет собой отдельный сайт со своей конфигурацией, пользователями и данными.




Как это работает



Каждый проект идентифицируется через поле `project_id` во всех таблицах, где требуется изоляция данных. Это позволяет хранить данные разных проектов в одной базе данных, но при этом они остаются изолированными друг от друга.

При запросе к базе данных ORM автоматически добавляет условие по `project_id`, если класс таблицы наследуется от `DatabaseNormalProject` или `DatabaseExtendProject`. Это гарантирует, что пользователь видит только данные своего проекта.




Создание нового проекта



Для создания нового проекта необходимо:

1. Добавить запись в таблицу `projects`. Поле `project_id` является первичным ключом и идентификатором проекта.

2. Создать ini-файл в папке `Config/Domens`. Имя файла должно соответствовать веб-адресу проекта. Если доступ осуществляется по порту, двоеточие в имени заменяется на точку.

Пример: `127.0.0.1:81` → `127.0.0.1.81.ini`

3. Создать папку для логов в `Config/Logs` с именем, соответствующим имени ini-файла, и назначить права на эту папку для пользователя `www-data`.

4. Создать папку `Modules/Free/Views/Project_<номер проекта>/Index` и внутри неё разместить файл `index.phtml`. Это будет соответствовать экшену `index` в контроллере `Modules/Free/Index`.

Модуль `Free`, контроллер `Index` и экшен `index` задаются в ini-файле как стартовая страница проекта и могут быть переопределены в конфигурации.

После выполнения этих шагов проект становится доступным по указанному адресу.




Определение проекта



Проект определяется по домену (или IP-адресу с портом), с которого пришёл запрос. По этому параметру определяется ini-файл. Затем система проверяет соответствие домена из запроса и идентификатора проекта в базе данных и ini-файле.

Это гарантирует, что проект доступен только по тому адресу, который был указан при его создании.




Изоляция данных



Данные разных проектов изолированы на уровне базы данных. Поле `project_id` присутствует во всех таблицах, где данные должны быть разделены по проектам.

Таблицы без `project_id` содержат общие данные, доступные всем проектам. Например, таблицы с геоданными (страны, города, языки) являются общими для всей системы.




Пользователи и проекты



В демо-версии системы каждый пользователь привязан к одному проекту. В боевой сборке доступны два дополнительных сценария:

- Доступ к проектам вне основного - администратор может иметь доступ к административным панелям разных проектов под одним аккаунтом.
- Связь аккаунтов разных проектов - учётные записи пользователей из разных проектов могут быть связаны между собой.




Конфигурация проекта



Каждый проект имеет свой конфигурационный файл. В нём указываются параметры, специфичные для данного проекта:

- Подключение к базам данных (можно использовать отдельную базу для каждого проекта)
- Модуль, контроллер и экшен главной страницы
- Базовые язык, валюта и часовой пояс
- Дополнительные параметры, переопределяющие глобальные настройки

Это позволяет запускать проекты с разными настройками на одной системе.




Виртуальные хосты



Для каждого проекта требуется настройка виртуального хоста на сервере. Система не создаёт их автоматически - это задача администратора сервера.

При этом все проекты обслуживаются одним экземпляром кода (единой точкой входа `index.php`), а различие между ними достигается через конфигурацию и изоляцию данных.




Масштабирование



Благодаря тому, что проекты изолированы только на уровне данных, система может обслуживать любое количество проектов без изменения кода.

Единственное ограничение - производительность сервера и базы данных. При росте числа проектов может потребоваться увеличение ресурсов или переход на отдельные базы данных для крупных проектов.




Что дальше?



- ➡️ Раздел 11. Модуль Base
- ➡️ Раздел 12. Модуль Free
- ➡️ Раздел 13. Модуль Geo