Архітектура наших систем: фронтенд, бекенд та інфраструктура на Fractal 2

Як ми будуємо системи для бізнесу: опис трьома мовами замість ручного коду, React і TypeScript на фронтенді, Yii 2 і REST API на бекенді, Docker і спостереження в інфраструктурі, ШІ під контролем перевірок.

Архітектура наших систем: фронтенд, бекенд та інфраструктура на Fractal 2
INGELLO / BUSINESS3055

Більшість систем, які ми робимо для бізнесу, не набирають вручну з нуля, а описують. Структуру даних, екрани та зв’язки між ними ми задаємо трьома невеликими мовами, а генератор Fractal 2 перетворює опис на базу даних, REST API з документацією, адмінку, інтерфейс на React і технічне завдання. Далі про те, як це влаштовано: фронтенд, бекенд, інфраструктура, місце ШІ в процесі та перевірки, без яких генерації не можна довіряти.

Усі скриншоти зняті з робочого стенда. Наскрізний приклад: меблева фабрика «Дубрава», дані в ньому тестові. Студія Fractal 2 на скриншотах має російськомовний інтерфейс, а сам застосунок «Дубрави» україномовний.

Студія Fractal 2: технічне завдання меблевої фабрики та карта екранів ISFL, яку Claude зібрав із нього
Шість рядків ТЗ від клієнта і карта екранів, яку з них зібрав Claude: 18 екранів і 15 моделей

Підхід: опис замість коду

Звичайна розробка тримає одну й ту саму систему в кількох місцях одночасно: у ТЗ, у схемі бази, у коді бекенду, у типах фронтенду, у документації API. Кожну зміну треба внести всюди, і за пів року ці місця починають розходитися. Документація бреше, фронтенд чекає на поле, якого вже немає, а інтеграція ламається на рівному місці.

У Fractal джерело одне, і воно написане трьома мовами:

  • SFL (Structurer Fractal Language) описує дані: таблиці, поля, типи, зв’язки та модулі;
  • IFL (Interface Fractal Language) описує екрани: сітку, компоненти, поля й переходи, а також директиви бізнес-логіки;
  • ISFL описує карту екранів: які екрани є, на яких патернах вони побудовані та як пов’язані між собою.

З цього опису генератор отримує все інше. Тому зміна структури займає хвилини, а документація й код не розходяться за визначенням: вони збираються з одного місця.

Схема: ТЗ клієнта, ISFL, SFL та IFL надходять до генератора Fractal 2, на виході база, моделі, REST API, типи, адмінка, екрани, тестові дані та ТЗ
З одного опису виходять вісім частин системи

Так виглядає SFL. Один рядок описує одну колонку, поле із закінченням _id стає зовнішнім ключем, знак оклику робить поле обов’язковим:

Користувач|user
Ім’я|name !
Пошта|email !

Замовлення|order
Користувач|user_id !
Сума|sum float(10,2)
Статус|status
Створено|created_at

Префікс назви таблиці задає модуль, як в Odoo: sales_order потрапляє в модуль продажів, wh_stock у складський. За модулями автоматично діляться меню адмінки, розділи API, ER-діаграми та розділи технічного завдання.

Від ТЗ клієнта до робочої системи

У фабрики «Дубрава» сорок працівників, два цехи, склад плит і фурнітури, три салони та сайт. Усе в Excel і месенджерах, замовлення губляться, терміни зриваються. Директор хоче бачити кожне замовлення від заміру до монтажу, рахувати вартість із матеріалів і робіт, планувати завантаження цехів, вести склад і закупівлі та контролювати оплати.

Цей текст аналітик вставляє в студію як є, файлом або голосом. Далі шлях такий:

  1. Claude розкладає ТЗ на екрани, патерни та моделі. Виходить карта ISFL, яку аналітик править на графі: додає екрани, з’єднує переходи стрілками.
  2. За картою Claude проєктує схему даних із модулями та коментарями. Парсер SFL перевіряє відповідь і в разі помилок повертає її на виправлення.
  3. Генератор будує базу, бекенд, API, адмінку та екрани, а потім перевіряє, що все відповідає.

Для «Дубрави» це 22 таблиці та 157 колонок у трьох модулях (клієнти й замовлення, виробництво, склад) і 18 екранів, у яких 60 компонентів і 237 елементів. Жодної помилки й жодного попередження парсера.

Редактор SFL у студії Fractal 2 та ER-діаграма на 22 таблиці з фільтром за модулями
SFL із підсвічуванням і перевіркою на льоту, праворуч ER-діаграма з фільтром за модулями
Редактор IFL у студії: екрани списку та створення замовлення і їхній попередній перегляд із компонентів
IFL: екран описаний рядами, колонками й компонентами, праворуч попередній перегляд

Фронтенд: React, що збирається з опису

Кожен екран IFL стає сторінкою на React 19 і TypeScript 7 з компонентів нашого UI-кіту на Material UI 9. Дані надходять через TanStack Query, збиранням займається Vite, графіки малює Chart.js, мапи Leaflet. Інтерфейс адаптивний від 360 px, є світла й темна теми, мови українська, російська та англійська.

Головне архітектурне рішення тут: типи TypeScript і клієнт API генеруються з тієї самої схеми, що й бекенд. Якщо в SFL змінилося поле, фронтенд дізнається про це на етапі перевірки типів, а не від користувача в продакшені.

Фронтенд лише показує. Розрахунки, перевірки та зміни даних живуть на сервері, тому правила неможливо обійти з браузера. Компоненти, які не можна описати стандартними патернами, створюються заготовкою один раз і далі належать розробникові: генератор їх не перезаписує.

Згенерований екран списку замовлень у застосунку «Дубрава»: таблиця з фільтрами за клієнтом, салоном, типом меблів, статусом і етапом
Екран «Замовлення»: таблиця із сортуванням і рядком фільтрів за кожним полем і зв’язком
Картка замовлення з клієнтом, салоном, етапом, сумами, оплатою та позиціями кошторису
Картка замовлення: пов’язані записи підтягуються з API одним запитом
Той самий список замовлень на екрані телефона завширшки 390 пікселів
Той самий екран на телефоні

Адмінку не пишуть окремо. Вона будується за метаданими схеми: таблиця, пошук, фільтри, сортування, картка з пов’язаними записами, форма й видалення для кожної моделі, меню за модулями.

Адмінка, згенерована за схемою: моделі згруповані за модулями, біля кожної кількість записів
Адмінка за трьома модулями: клієнти й замовлення, виробництво, склад

Бекенд: спершу API, логіка тільки на сервері

Сервер працює на PHP 8.4 і Yii 2, база MySQL 8.4 на InnoDB із зовнішніми ключами та utf8mb4. Кожна таблиця одразу стає REST-ресурсом: списки зі сторінками, фільтри за полями та зв’язками, пошук, сортування, розкриття зв’язків одним запитом, агрегати, дії та методи сервісів. Опис API у форматі OpenAPI 3.1 генерується з SFL, інтерактивна документація відкривається за адресою /docs.

Фронтенд і адмінка звертаються до того самого API, що й зовнішні системи. Тому інтеграція з CRM, 1С, сайтом чи ШІ-агентом не потребує окремої розробки: API вже є і вже описаний.

Документація REST API проєкту в Scalar за специфікацією OpenAPI 3.1
Документація API збирається автоматично, з прикладами запитів

Бізнес-логіка живе тільки в сервісах на сервері. Директиви IFL перетворюються на їхні методи: події до і після збереження, дії кнопок, розрахунки для екранів. Тіло методу пише людина або КодГен, про нього нижче.

Безпека ввімкнена за замовчуванням:

  • права за ролями перевіряються на сервері, інтерфейс їх лише відображає;
  • секретні колонки облікових записів недоступні у фільтрах та агрегатах;
  • токен приймається тільки в заголовку Authorization: Bearer;
  • запити студії, що змінюють дані, несуть окремий заголовок проти CSRF, а після 10 невдалих входів за 10 хвилин вхід блокується.

Чому Yii 2, а не модний фреймворк? Ядро 2.0.55 без відомих вразливостей працює на PHP 8.4 і MySQL 8.4. Переписувати робочий фундамент заради моди означає витрачати гроші клієнта на те, чого він не побачить.

Схема запиту: працівник, Caddy, застосунок на React, REST API, сервіси, MySQL; інфраструктура Docker і спостереження OpenTelemetry та ClickStack
Шлях запиту в згенерованому застосунку

Конвеєр генерації та зміни без втрати даних

Генерація йде фоновим завданням із журналом кроків: у PHP-FPM ліміт 45 секунд, а збирання проєкту триває довше. Студія показує перебіг кроків у реальному часі.

Конвеєр генерації з 10 кроків: перевірка, база, бекенд, дані, клієнт, екрани, документи, збирання, перевірка API, маніфест
Генерація вважається успішною, лише якщо кожен ресурс і екран відповіли

Дві речі роблять перегенерацію безпечною на будь-якому етапі проєкту:

  • Власний код не губиться. Базові класи й тека _generated перезаписуються, заготовки створюються один раз, а маніфест зберігає хеші файлів і видаляє застарілий файл, тільки якщо його ніхто не правив.
  • База змінюється міграціями. Режим змін порівнює SFL із живою базою, пише міграцію Yii з відкатом і застосовує її. Колонки, яких немає в описі, не видаляються. Історія міграцій і кнопка відкату є в студії.

Тому систему клієнта можна розвивати разом з описом, а не заморожувати після першої версії.

Де працює ШІ і чому йому можна довіряти

У генераторі працює Claude Opus 5.5 через Agent SDK за підпискою. Він розкладає ТЗ на екрани, проєктує схему даних, наповнює довідники (статуси, типи, етапи) і пише користувацькі компоненти та методи сервісів. Ми використовуємо його у двох режимах, і обидва обмежені:

Схема роботи ШІ: студія, міст на Node з Agent SDK, Claude; режим відповіді за JSON-схемою і режим агента з обмеженням файлів; що закрито для ШІ
ШІ проходить ті самі перевірки, що й код людини
  • Відповідь суворо за JSON-схемою. Без інструментів і доступу до файлів. Відповідь перевіряє парсер, а в разі помилки вона до двох разів повертається на виправлення.
  • Агент КодГену. Читає тільки код проєкту і пише тільки в дозволені файли: користувацький компонент і сервіси екрана. Після правок запускається перевірка типів, помилки йдуть на одне коло виправлення, заборонені виклики відкочуються.

Файли .env, секрети й рантайм для ШІ закриті, оточення моста урізане до токена підписки та шляху до програм. Завдання для КодГену можна надиктувати голосом просто в студії: компонент додається рядком в IFL, генератор створює заготовку, агент її дописує.

Вкладка КодГен у студії: вибір екрана, опис завдання, мікрофон і запуск агента
КодГен у студії: екран, завдання текстом або голосом, запуск агента
Екран календаря замірів і монтажів у застосунку «Дубрава» із заготовкою користувацького компонента для доопрацювання
Заготовка компонента «Календар» до роботи КодГену: завдання і шлях до файлу вже на екрані

Інфраструктура: одна для всіх проєктів

Усі проєкти працюють у Docker Compose. Контейнер застосунку з PHP-FPM 8.4 і Node 24 спільний для проєктів, зі спільним vendor, MySQL 8.4 окремо, з резервними копіями та завданнями за розкладом. Вхід для всіх адрес тримає Caddy з TLS.

Кожен контейнер має ліміт пам’яті та процесора. Це свідоме рішення: генерація, тести й відео мають іти поруч з іншою роботою, а не з’їдати машину. Журнали й метрики контейнерів збирає OpenTelemetry і надсилає в ClickStack (ClickHouse і HyperDX), налаштований ощадливо.

Стек Fractal 2 з логотипами: React, TypeScript, Material UI, TanStack Query, Vite, Chart.js, Leaflet, PHP, Yii 2, MySQL, Composer, OpenAPI, Scalar, Claude, Agent SDK, Node.js, Docker, Caddy, OpenTelemetry, ClickStack, Git, Playwright, FFmpeg
Версії зафіксовані в образах; згенерований проєкт отримує той самий стек

Перевірки: генерації не можна вірити на слово

Fractal 2 перевіряється на трьох рівнях:

  • Тести генератора: 45 тестів і 1 277 перевірок за 1,3 секунди. Парсери, патерни, модулі, міграції з відкатом, генератори коду, ТЗ і захист КодГену.
  • Кожна генерація: перевірка типів усього фронтенду та HTTP-перевірка: вхід, список і запис кожного ресурсу з розкриттям зв’язків, методи сервісів, кожен екран і адмінка.
  • Браузер: Playwright відкриває кожен екран, заповнює й надсилає форми, застосовує фільтри, сортує таблиці, створює та видаляє записи в адмінці.

Прогін за десятьма проєктами реєстру 27 жовтня 2026 року: 799 сторінок і 593 дії, нуль помилок. Той самий рушій записує відеопрезентації екранів з озвученням, а FFmpeg збирає їх у ролик.

Вкладка тестів у студії: 45 з 45 тестів генератора, 1277 перевірок
Тести генератора запускаються кнопкою просто в студії

ТЗ, яке збирається з того самого опису

Технічне завдання для погодження з клієнтом теж генерується: стек, модель даних за модулями з ER-діаграмами, вимоги з ідентифікаторами та критеріями приймання, екрани, API, нефункціональні вимоги, приймання та оцінка трудомісткості. Документ копіюється в Google Docs з таблицями й схемами або завантажується у DOCX.

Технічне завдання, згенероване з опису системи, з вивантаженням у Google Docs і DOCX
ТЗ українською або російською, вивантаження в Google Docs, DOCX і Markdown

Що це дає замовникові і де межа

  • Швидкість на старті. Робочий прототип з базою, API та екранами з’являється ще до того, як написано перший рядок бізнес-логіки, і на ньому сперечаються про продукт, а не про картинки.
  • Документація, яка не бреше. ТЗ, API і код збираються з одного опису.
  • Інтеграції без окремого проєкту. Усе, що бачить користувач, доступне через описаний API.
  • Звичайний код на виході. Це Yii 2 і React, які прочитає будь-який PHP- і React-розробник.

Чесна межа: генератор закриває типову частину системи. Правила, заради яких бізнес замовляє систему (розрахунок кошторису з матеріалів, планування завантаження цехів, складні статуси оплат), проєктуються разом із замовником і пишуться людьми або КодГеном під контролем перевірок. Як це розкладається на етапи й бюджети, описано в стратегії розробки застосунку, а прототип на Fractal відповідає етапу прототипування. Перше покоління генератора описане в кейсі Fractal.

На безкоштовній консультації архітектор Ingello розбере Ваше завдання і покаже, яка частина системи збереться з опису, а яка потребуватиме ручної роботи. Після неї Ви отримаєте розрахунок ціни та термінів за етапами. Записатися на консультацію.

Поширені питання

01Що таке Fractal 2 і чим він відрізняється від конструктора?

Fractal 2 це внутрішній генератор Ingello. Систему описують трьома мовами: SFL для даних, IFL для екранів і ISFL для карти екранів. З опису генератор будує базу MySQL, бекенд на Yii 2, REST API з OpenAPI 3.1, адмінку, екрани на React і технічне завдання. На відміну від конструктора, на виході звичайний код, який дописують і розвивають розробники.

02Який стек отримує система, згенерована на Fractal 2?

Фронтенд на React 19, TypeScript 7 і Material UI 9 з TanStack Query та збиранням Vite. Бекенд на PHP 8.4 і Yii 2, база MySQL 8.4. API описаний в OpenAPI 3.1, документація відкривається в Scalar. Інфраструктура в Docker Compose з Caddy, журнали й метрики збирає OpenTelemetry у ClickStack. Браузерні перевірки виконує Playwright.

03Чи не загубляться ручні доопрацювання під час перегенерації системи?

Ні. Генератор перезаписує тільки базові класи й теку _generated. Заготовки користувацьких компонентів і сервісів створюються один раз і далі належать розробникові. Маніфест зберігає хеші згенерованих файлів і видаляє застарілий файл, лише якщо його ніхто не правив. Структура бази змінюється міграціями з відкатом, без видалення даних.

04Як генератор використовує ШІ і чи це безпечно?

Claude Opus 5.5 працює через Agent SDK у двох режимах. У першому він відповідає суворо за JSON-схемою, відповідь перевіряє парсер і в разі помилки до двох разів повертає на виправлення. У другому агент читає тільки код проєкту і пише тільки в дозволені файли, після правок ідуть перевірка типів і відкат заборонених викликів. Файли .env, секрети й рантайм для ШІ закриті.

05Як перевіряється, що згенерована система справді працює?

На трьох рівнях. Тести генератора: 45 тестів і 1 277 перевірок. Під час кожної генерації перевіряються типи фронтенду, а також по HTTP кожен ресурс API та кожен екран. Браузерний прогін Playwright відкриває екрани, заповнює форми й створює записи: за десятьма проєктами 27.10.2026 це 799 сторінок і 593 дії без жодної помилки.