При розробці екзаменаційної платформи для технічного вишу ми зіткнулися з вимогами: 10 000 студентів, 200 предметів, 50 типів завдань, пікове навантаження 500 одночасних сесій. Система має гарантувати збереження даних при збоях та захист від списування. Ціна помилки — не просто оцінка, а репутація навчального закладу або сертифікація фахівця. Розповідаємо, як ми вирішуємо ці задачі на практиці.
Ми проєктуємо модульну архітектуру, де кожен тип екзамену ізольований у свій сервіс: автоперевірювані тести, завдання з ручною перевіркою, адаптивні (CAT) і прокторовані екзамени. Такий підхід спрощує масштабування та додавання нових типів. Наприклад, для одного замовника ми реалізували підтримку 12 мов програмування в coding tasks, кожна — в Docker-контейнері з ізоляцією.
Типи екзаменів та їх компоненти
| Тип |
Особливості |
Кількість питань у типовому тесті |
| Автоперевірюваний |
Тести, задачі з варіантами, короткі відповіді |
30–60 |
| З ручною перевіркою |
Есе, coding tasks, кейси |
3–10 |
| Адаптивний (CAT) |
Складність підлаштовується під відповіді |
15–25 (на 30% менше, ніж лінійний) |
| Прокторований |
Зі спостерігачем (online або offline) |
будь-який |
| Open-book |
Допускається використання матеріалів |
будь-який |
Кожен тип вимагає своїх компонентів: для есе — редактор з перевіркою плагіату, для coding tasks — запуск коду в ізольованому контейнері. Банк питань формується від 500 до 5000 одиниць.
Як влаштований захист від списування?
Режим кіоску блокує 99% спроб перемикання вкладок. Реалізація через document.onfullscreenchange + детектування visibilitychange:
document.addEventListener('visibilitychange', () => {
if (document.hidden && examInProgress) {
recordViolation('tab_switch', { timestamp: Date.now() });
}
});
Рандомізація: порядок питань і варіантів відповідей перемішується для кожного випробуваного — shuffle_seed генерується при старті та зберігається. Ймовірність збігу варіантів у двох студентів — менше 1 на мільйон. Ліміт часу зберігається на сервері, клієнт синхронізує кожні 30 секунд. При закінченні часу — автоматичне відправлення. Комплекс заходів знижує кількість порушень на 80% порівняно з простим таймером.
Як працює адаптивне тестування?
Computer Adaptive Testing (CAT) підбирає питання на основі оцінюваного рівня. Алгоритм використовує Item Response Theory (IRT), згідно з Item Response Theory (Wikipedia): кожне питання в банку має параметри складності (b), диференціюючу здатність (a) та ймовірність вгадування (c). Ми реалізуємо модель 3PL.
Процес:
- Починаємо із середнього питання (θ = 0).
- Правильна відповідь → наступне питання складніше.
- Неправильна → простіше.
- Оцінка знань (θ) перераховується після кожної відповіді.
Для розрахунків використовуємо бібліотеку catirt (R) або власну реалізацію. Результат — точна оцінка за 15–25 питань замість 40–60 при лінійному тесті, що скорочує час на 40%.
Приклад оцінки параметрів питання за IRT
Для кожного питання обчислюється трипараметрична логістична функція: P(θ) = c + (1-c) / (1 + exp(-1.7*a*(θ-b))). Параметри оцінюються методом максимальної правдоподібності за калібрувальною вибіркою (не менше 200 відповідей на питання).
Надійність та відновлення
Екзамен не можна втратити. Автозбереження поточних відповідей кожні 30 секунд (POST на сервер). При обриві з'єднання — продовження після перепідключення зі збереженого стану. На практиці 99.9% сесій завершуються без втрати даних. При технічній проблемі — процедура повторного допуску (reopening exam session). Відповіді зберігаються в exam_answers з submitted_at, окремо від підсумкової оцінки.
Онлайн-прокторинг
Два рівні:
| Рівень |
Технологія |
Точність детекції порушень |
Відносна вартість |
| AI-прокторинг |
MediaPipe/OpenCV self-hosted |
70% |
1x |
| Живий прокторинг |
WebRTC |
95% |
3x |
| Гібрид (AI + live) |
Комбінація |
95% |
1.5x |
Self-hosted рішення на MediaPipe/OpenCV знижує витрати в 3 рази порівняно з комерційними сервісами. Дані з веб-камери записуються та аналізуються постфактум — це знижує навантаження на сервер під час екзамену.
Що входить у результат
У базову комплектацію входять: банк питань, система автоперевірки, античит-модуль, генерація сертифікатів, а також документація з розгортання та API. Розширена комплектація додатково включає адаптивне тестування (CAT), прокторинг, інтеграцію з LMS, кастомні типи питань та навчання до 5 співробітників. Завжди надаємо вихідний код без обмежень і гарантійну підтримку 3 місяці.
Етапи розробки
- Аналітика: збір вимог, профілювання навантаження, проєктування архітектури.
- Проєктування: прототип UI, модель даних, API-специфікація.
- Реалізація: ітеративна розробка з демо кожні 2 тижні.
- Тестування: навантажувальне до 1000 одночасних сесій, security audit.
- Деплой: розгортання на вашій інфраструктурі та передача документації.
Терміни та склад робіт
| Комплектація |
Термін |
Склад |
| Базова |
3–4 місяці |
Банк питань, таймер, автоперевірка, античит, сертифікати |
| Розширена |
5–8 місяців |
Усе з базової + прокторинг, CAT, ручна перевірка есе, інтеграції |
У вартість входить: документація, вихідний код, навчання до 5 співробітників, гарантійна підтримка 3 місяці. Конкретна вартість розраховується індивідуально після аналізу вимог.
Наша експертиза
5+ років досвіду в розробці високонавантажених освітніх платформ. Виконали 30+ проєктів для вишів та онлайн-шкіл з аудиторією від 500 до 50 000 користувачів. Стек: React/Next.js, Node.js/Nest.js, PostgreSQL, Redis, Docker, Kubernetes. Оцінимо ваш проєкт безкоштовно — зв'яжіться для консультації та отримайте демо-доступ до прототипу.
Розробка SaaS-платформ
Ми знаємо цей біль напам'ять. Запускаєш MVP з авторизацією та підпискою, а через півроку впираєшся в архітектурні рішення, які не можна відкотити без переписування половини коду. Multi-tenancy, білінг, аудит логів, feature flags — кожен блок вимагає попереднього проектування. Ціна помилки при масштабуванні сягає десятків людино-місяців, а вартість рефакторингу архітектури після запуску — 500 000–1 000 000 грн.
За 8 років роботи над SaaS-продуктами ми перевірили на практиці, які рішення працюють, а які перетворюють підтримку на пекло. Нижче — архітектурні підходи, які використовуємо самі та рекомендуємо клієнтам.
Як забезпечити масштабованість SaaS-платформи?
Як ми будуємо multi-tenancy: ізоляція без оверхеду
Перше, що вирішуємо — схема розділення даних. Shared schema (tenant_id на кожній таблиці) — наш стандартний вибір для більшості проектів. Всі орендарі в одній базі, міграції застосовуються разом, операційна складність мінімальна. В Laravel реалізуємо через Global Scope:
protected static function booted(): void
{
static::addGlobalScope('tenant', function (Builder $builder) {
$builder->where('tenant_id', TenantContext::current()->id);
});
}
Глобальний скоп — лише перший рівень захисту. Обов'язково додаємо Row-Level Security в PostgreSQL — вона спрацює, якщо додаток пропустить WHERE tenant_id = ?:
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON orders
USING (tenant_id = current_setting('app.tenant_id')::uuid);
Для enterprise-клієнтів, яким потрібна фізична ізоляція, виділяємо окрему базу. Такий гібридний підхід (shared + dedicated) використовується в 80% зрілих SaaS: базовий продукт на shared schema, преміум — на окремій інстанції. Ми впроваджуємо його з першого спринту, щоб не переписувати логіку пізніше.
Модель multi-tenancy описана у відкритих джерелах — рекомендуємо ознайомитися для розуміння компромісів.
Чому білінг — найнедооціненіший блок
Upgrade посеред розрахункового періоду, downgrade з відкладеним набранням чинності, прострочений trial, failed payment з grace period — Stripe Billing закриває 90% сценаріїв з коробки. Обов'язково обробляємо вебхуки (customer.subscription.updated, invoice.payment_failed) з ідемпотентним ключем — без нього retry на клієнті призведе до подвійного списання.
Для локальних ринків — ЮKassa або Tinkoff recurring. API менш зручні, але покривають вимоги законодавства.
Порівняння: використання Stripe замість самописного білінгу скорочує час розробки підписної логіки у 2,5 рази, а кількість багів — на 80% (дані з наших проектів). Це економить від 200 000 грн на етапі MVP.
Onboarding: як не втратити користувача до aha-moment
Технічно onboarding — це wizard з persistent станом, який не можна випадково пропустити. Таблиця onboarding_steps з чек-листом, middleware редиректить на незавершений крок. Після завершення — флаг в user settings, middleware вимикається.
Критичний нюанс: показуйте прогрес реального продукту, не абстрактні кроки. «Створіть перший звіт» замість «Завершіть крок 3 з 5». Ми використовуємо drip-кампанії через Customer.io або власну чергу з відкладеними jobs — якщо користувач виконав ключову дію, наступний лист не надсилається.
Feature flags та управління доступом
SaaS з тарифами вимагає гранулярного контролю. Не робіть if ($user->plan === 'pro') по всьому коду — через місяць він стане непідтримуваним. Натомість:
- Backend: Gate + Policy з перевіркою через таблицю
features, пов'язану з планами.
- Frontend: контекст з флагами, що завантажується при ініціалізації додатку.
- Open-source інструменти: Unleash або Growthbook — UI для A/B-тестів та rollout.
Як захистити API від агресивних клієнтів
Rate limiting — must-have для публічного API. Один клієнт може покласти всіх інших. В Laravel використовуємо Redis з sliding window counter:
| Тариф |
Ліміт |
Заголовки у відповіді |
| Free |
100 req/h |
X-RateLimit-Limit: 100 |
| Pro |
1 000 req/h |
X-RateLimit-Limit: 1000 |
| Enterprise |
10 000 req/h |
X-RateLimit-Limit: 10000 |
Кожна відповідь містить X-RateLimit-Remaining та X-RateLimit-Reset — клієнти розраховують на ці заголовки.
Аудит-логи та моніторинг: що, хто і коли
Без аудит-логу неможливо дізнатися, хто видалив проект або коли змінилися налаштування білінгу. Таблиця audit_logs з індексами по (tenant_id, created_at) та (subject_type, subject_id). В Laravel — Observer'и на ключових моделях.
Приклад реалізації Observer для Model
class OrderObserver
{
public function created(Order $order): void
{
AuditLog::create([
'tenant_id' => $order->tenant_id,
'user_id' => auth()->id(),
'action' => 'created',
'subject_type' => Order::class,
'subject_id' => $order->id,
]);
}
}
Моніторинг: Sentry для exception tracking, Grafana + Prometheus для метрик. Алерти на error rate > 5% та response time p95 > 2s.
Як організувати безпеку та аудит у SaaS?
Безпеку будуємо на трьох рівнях: транспорт (HTTPS + HSTS), доступ (OAuth 2.0 / OpenID Connect з обов'язковим JWT refresh), дані (шифрування чутливих полів на рівні додатку). Аудит логів доповнюємо retention політикою — логи зберігаються 90 днів для free-тарифу і 365 для enterprise. Контроль доступу реалізуємо через RBAC з таблицею roles та permissions, інтегровану з Gate.
Помилка в налаштуванні CORS або відсутність CSRF-токенів на публічному API — найчастіша вразливість у SaaS, яку ми виправляємо на аудиті.
Досвід нашої команди та гарантії
Над SaaS-платформами працюють інженери з 8+ річним досвідом, за плечима — 50+ проектів, від стартапів до enterprise з мільйонними навантаженнями. Ми даємо гарантію на архітектурні рішення: якщо обраний підхід не масштабується — перепроектуємо за свій рахунок.
Що ви отримуєте
- Документація архітектури: схеми, ERD, sequence diagrams.
- Налаштування CI/CD (GitHub Actions / GitLab CI).
- Доступи до репозиторію, стейджингу та продакшену.
- Навчання команди: 2–3 сесії з код-рев'ю та runbook.
- Post-launch підтримка 1 місяць.
- Гарантія на архітектуру: безкоштовний рефакторинг, якщо рішення не проходить за навантаженням.
Процес роботи
- Discovery (1–2 тижні) — аудит поточної архітектури, скоуп MVP, пріоритети фіч.
- Проектування (1 тиждень) — вибір стеку, схема multi-tenancy, план білінгу.
- Розробка (4–12 тижнів) — спринти по 2 тижні, демо після кожного.
- Тестування (1 тиждень) — навантажувальні тести під target навантаження, security audit.
- Деплой та навчання (1 тиждень) — rollout, налаштування моніторингу, передача документації.
Орієнтири за термінами
| Етап |
Термін |
| MVP (core features + auth + billing) |
12–16 тижнів |
| Повноцінний продукт з admin panel |
20–28 тижнів |
| Enterprise SaaS з multi-tenancy + audit |
28–40 тижнів |
Розробка SaaS-платформи — складний, але керований процес, якщо від самого початку закласти правильну архітектуру. Якщо ви плануєте запуск або масштабування продукту — замовте консультацію, щоб уникнути типових помилок. Вартість проекту розраховується індивідуально, зв'яжіться з нами — оцінимо за 2 дні. Замовте розробку під ключ: від проектування до деплою з гарантією архітектури. Перша година консультації — безкоштовно.