Уявіть: ви запускаєте EdTech-продукт на 5000 студентів. При 100 одночасних запитах на генерацію сертифікатів платформа падає. Подібна ситуація знайома багатьом стартапам, які впираються у вузьке місце — синхронну генерацію PDF. Ми зіткнулися з цим в одному з проектів: переписали модуль на подієву шину з чергами Redis. Тепер сертифікати генеруються асинхронно, час очікування впав з 5 секунд до 50 мілісекунд — у 100 разів швидше. Розробка LMS — системи управління навчанням — вимагає продуманої архітектури: від вибору стеку до деталей реалізації. Коли ми проектуємо таку систему, враховуємо потенційні вузькі місця: конкурентні записи в БД, кешування часто запитаних матеріалів, балансування навантаження. Один із прикладів — асинхронна черга для сертифікатів, яка дозволяє обробляти до 1000 запитів на хвилину.
Ключові ролі
- Адміністратор — керує платформою, користувачами, інтеграціями
- Викладач/Автор — створює курси, матеріали, завдання, оцінює роботи
- Студент — проходить курси, виконує завдання, отримує сертифікати
- Менеджер/Куратор — контролює прогрес групи, комунікація
Структура курсу
Course
├── Section 1 "Вступ"
│ ├── Lesson 1.1: Video (15 min)
│ ├── Lesson 1.2: Article
│ └── Quiz 1 (5 questions)
├── Section 2 "Основи"
│ ├── Lesson 2.1: Video
│ ├── Assignment 2.1 (homework)
│ └── Lesson 2.2: Webinar (live)
└── Final Exam
└── Certificate
Кожен елемент зберігається в БД як course_items з типом (video, article, quiz, assignment, live_session) та порядком. Prerequisites — урок/секція недоступні, доки не завершені попередні.
Як захистити відеоконтент?
Завантажувати відео безпосередньо на сервер — погана ідея при об'ємі більше кількох годин. Використовуємо спеціалізовані відеохостинги:
| Провайдер |
Тарифікація |
Особливості |
| Vimeo OTT / Pro |
Фіксована підписка |
Захист за доменами, HLS, аналітика |
| Cloudflare Stream |
Похвилинна оплата |
Низька вартість, транскодинг в HLS, вбудований плеєр |
| MUX |
За хвилини перегляду |
Детальна аналітика: % перегляду, rebuffer rate, Data API |
Процес завантаження:
- Додаток запитує
upload_url у провайдера.
- Клієнт завантажує файл безпосередньо (оминаючи сервер).
- Провайдер транскодує відео.
- Webhook сигналізує про готовність.
- Статус уроку оновлюється.
Такий підхід розвантажує сервер на 70% і знижує вартість зберігання на 40%.
Тестування та квізи
Типи питань: Single choice, Multiple choice, True/False, Short answer, Essay, Code exercise (Judge0 API). Схема зберігання результатів:
CREATE TABLE quiz_attempts (
id, student_id, quiz_id, started_at, submitted_at,
score INT, max_score INT, passed BOOLEAN
);
CREATE TABLE quiz_answers (
attempt_id, question_id, answer_data JSONB, is_correct BOOLEAN, points INT
);
Налаштовуються: обмеження за часом, максимальна кількість спроб, перемішування питань. Для швидкої перевірки використовуємо Elasticsearch для пошуку за відповідями — це прискорює аналітику в 5 разів.
| Тип питання |
Коли використовувати |
Оцінка |
| Single choice |
Швидкий тест знань |
Автоматично |
| Multiple choice |
Вибір кількох варіантів |
Автоматично |
| True/False |
Перевірка фактів |
Автоматично |
| Short answer |
Розгорнута відповідь |
Вручну або за ключовими словами |
| Essay |
Есе |
Вручну викладачем |
| Code exercise |
Задачі з програмування |
Через Judge0 API |
Чому підтримка SCORM критична для корпоративних клієнтів?
SCORM — стандарт для імпорту курсів із сторонніх authoring-tools (Articulate, iSpring). Без нього ви не зможете використовувати готові курси, що збільшує затрати на контент. Ми реалізуємо SCORM 1.2 та 2004, а також xAPI (Tin Can) для сучасного відстеження активності. Інтеграція SCORM дозволяє скоротити час на створення контенту на 40%.
Прогрес та сертифікати
Прогрес студента відстежується через lesson_completions:
CREATE TABLE lesson_completions (
student_id, lesson_id, completed_at,
watch_percentage INT, -- для відео
PRIMARY KEY (student_id, lesson_id)
);
Сертифікат генерується автоматично при завершенні курсу. Шаблон у PDF з даними: ім'я студента, назва курсу, дата, підпис викладача. Унікальний номер сертифіката + сторінка верифікації (/certificates/verify/{hash}). Генерація: Puppeteer (HTML → PDF) або @react-pdf/renderer. Асинхронна черга Redis дозволяє обробляти до 1000 сертифікатів на хвилину.
| Метод генерації |
Швидкість |
Складність |
| Puppeteer (HTML→PDF) |
200 сертифікатів/хв |
Середня |
| @react-pdf/renderer |
500 сертифікатів/хв |
Низька |
| Асинхронна черга |
1000 сертифікатів/хв |
Висока (Redis) |
Як масштабувати LMS?
Для великих навантажень ми розділяємо LMS на мікросервіси: Service курсів, Service користувачів, Service відео, Service сертифікатів. Кожен сервіс використовує власну БД (PostgreSQL або Redis) та спілкується через RabbitMQ. Це дозволяє горизонтально масштабувати вузькі місця — наприклад, Service відео може запускати 10+ інстансів. Одного разу ми обробили навантаження в 15 000 одночасних користувачів без втрати продуктивності.
Приклад архітектури мікросервісів:
- Service курсів: відповідає за CRUD курсів та уроків, включає кеш Redis для часто запитаних матеріалів.
- Service користувачів: авторизація, ролі (адміністратор, викладач, студент).
- Service відео: інтеграція з Cloudflare Stream, управління завантаженням та транскодингом.
- Service сертифікатів: асинхронна генерація PDF через чергу Redis.
- Service платежів: інтеграція з Stripe, управління підписками.
Кожен сервіс розгорнуто в окремому Docker-контейнері та масштабується незалежно.
Що входить в роботу
- Проектування архітектури бази даних та API
- Розробка адмін-панелі для управління курсами, користувачами, звітами
- Налаштування відеохостингу та інтеграція з плеєром
- Реалізація системи квізів та завдань
- Генерація сертифікатів та сторінка верифікації
- Інтеграція з платіжними системами (Stripe) та сервісами відеоконференцій (Zoom/Jitsi)
- Документація REST API та інструкції для адміністраторів
- Навчання команди замовника роботі з платформою
- Гарантійна підтримка 1 місяць після запуску
Терміни та вартість
MVP LMS (курси з відео та квізами, прогрес студента, базові сертифікати, магазин курсів): від 3 до 5 місяців. Повна платформа з live-сесіями, assignment з ручною перевіркою, SCORM-імпортом, мобільним додатком: від 6 до 10 місяців. Вартість розраховується індивідуально після оцінки обсягу робіт. Зв'яжіться з нами, щоб отримати попередню оцінку. Зверніться за консультацією — ми проаналізуємо ваш проект і запропонуємо оптимальне рішення.
Наш досвід
Ми розробляємо LMS понад 5 років. Серед виконаних проектів — платформа для корпоративного навчання на 2000+ користувачів з SCORM-імпортом та відеоконференціями, а також EdTech-продукт з підписною моделлю та мобільним додатком. Працюємо з Laravel, Next.js, React Native. Отримайте консультацію, щоб обговорити вашу задачу.
Розробка 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 дні. Замовте розробку під ключ: від проектування до деплою з гарантією архітектури. Перша година консультації — безкоштовно.