Як створити Job Board: портал вакансій та рекрутингу
Клієнт приходить зі скаргою: «Щомісяця ми витрачаємо значні кошти на hh.ru, а кандидати все одно не ті». І це не про ірраціональність — це про відсутність нішевого інструменту. Вертикальні Job Board вирішують проблему точково: для IT-контракторів, медичних працівників, будівельників або регіональних ринків. Наша технологія дозволяє запустити MVP за 2–3 місяці, а не за рік, як у конкурентів. При цьому з перших днів ви отримуєте пошук на Elasticsearch, адаптивну верстку та готову монетизацію. Перехід на власний Job Board може заощадити значну частину бюджету на комісіях рекрутингових платформ. Зв'яжіться з нами, щоб обговорити проєкт та отримати попередню оцінку. Замовте розробку нішевого порталу під ваш ринок вже сьогодні.
Основні сутності системи
Вакансія: посада, опис, вимоги, зарплатна вилка (з/без), локація + remote-опція, тип зайнятості, компанія, теги/навички, статус (active/expired/draft).
Резюме: ПІБ (або псевдонім), бажана посада, досвід (список позицій з датами), освіта, навички, зарплатні очікування, локація, готовність до переїзду/remote.
Відгук (application): зв'язок кандидат ↔ вакансія. Статус, супровідний лист, дата.
Організація пошуку: Elasticsearch vs PostgreSQL
Пошук — ключова функція. Для невеликих обсягів (до 100К вакансій) використовуємо PostgreSQL Full-Text Search:
SELECT * FROM vacancies
WHERE to_tsvector('ukrainian', title || ' ' || description)
@@ plainto_tsquery('ukrainian', 'розробник python')
AND salary_from <= 250000
AND location @> '{"city": "Київ"}'::jsonb
ORDER BY ts_rank(...) DESC;
Для великих платформ з фасетною фільтрацією, typo-tolerance та релевантним ранжуванням обираємо Elasticsearch або Typesense. Elasticsearch швидше PostgreSQL в 10 разів при обсязі 1 млн записів, що критично для користувацького досвіду.
За даними Elasticsearch: The Definitive Guide, при обсязі 1 млн записів швидкість пошуку на Elasticsearch на порядок вища.
Налаштування аналізатора для української мови в Elasticsearch
Для коректної морфології використовуємо аналізатор `elasticsearch-analysis-morfologik` або `elasticsearch-analysis-icu` з конфігурацією синонімів та стоп-слів.
Фільтри: зарплата, досвід (немає досвіду / 1–3 роки / 3–6 років / 6+ років), локація, тип зайнятості, remote/office/hybrid, компанія, дата публікації.
| Критерій |
PostgreSQL FTS |
Elasticsearch |
Typesense |
| Швидкість |
до 500 мс при 100К |
до 50 мс при 1M |
до 30 мс при 1M |
| Typo-tolerance |
Ні |
Так |
Так |
| Фасетна фільтрація |
Складно |
З коробки |
З коробки |
| Вартість |
Безкоштовно |
Безкоштовно / платний кластер |
Платний хмарний сервіс |
Для індексу вакансій на Elasticsearch ми визначаємо маппінг з мультифілдами (українська/англійська), налаштовуємо аналізатор з морфологією та синонімами. Фасетна фільтрація реалізується через aggregations. Це забезпечує typo-tolerance та релевантне ранжування.
Чому швидкий пошук критичний для конверсії?
Time-to-hire безпосередньо впливає на бізнес. Якщо пошук гальмує, рекрутери йдуть до конкурентів. Наш стек (Laravel 11 + Vue 3 + Elasticsearch) забезпечує INP < 200 мс навіть на слабких пристроях. Для порівняння: на шаред-хостингу з MySQL пошук займає 3–5 секунд — це провал Core Web Vitals.
Особисті кабінети: функціонал для кандидата та роботодавця
Кандидат:
- Створення/редагування резюме (User Profile система)
- Відгуки та їх статуси (система відгуків)
- Збережені вакансії
- Алерти за пошуком (email при нових вакансіях за фільтрами)
- Налаштування видимості резюме
Роботодавець:
- Профіль компанії (сторінка роботодавця)
- Управління вакансіями
- Відгуки з воронкою (inbox → screening → interview → offer)
- Пошук по базі резюме (за підпискою)
- Статистика вакансій (перегляди, відгуки)
Email-алерти: кандидат налаштовує пошуковий алерт «надсилай нові вакансії Python розробник в Києві від 150K». Cron-задача раз на день запускає збережені пошуки та надсилає дайджест.
Способи монетизації порталу
- Pay-per-post: роботодавець платить за розміщення однієї вакансії (30 днів)
- Пакети: 5/10/20 вакансій за зниженою ціною
- Підписка для роботодавців: необмежені вакансії + доступ до бази резюме
- Highlighted/featured вакансії: оплачене просування в топ видачі
- Branded employer page: розширена сторінка компанії
| Функція |
Безкоштовно |
Базова |
Преміум |
| Розміщення вакансій |
1 |
10 |
необмежено |
| Доступ до резюме |
ні |
так |
так |
| Аналітика |
ні |
базова |
розширена |
Як досягти швидкої індексації вакансій?
Кожна вакансія — окрема сторінка з розміткою JobPosting schema.org в JSON-LD. Sitemap оновлюється при публікації. Завдяки серверному рендерингу (SSR) на Nuxt 3 сторінки індексуються за добу. Додатково використовуємо динамічні sitemap та пріоритезацію в robots.txt.
Процес реалізації проєкту
-
Аудит та проєктування. Визначаємо ключові сутності, бізнес-логіку, способи монетизації. Збираємо вимоги до пошуку та інтеграцій.
-
Прототипування інтерфейсів. Малюємо екрани для кандидата та роботодавця, погоджуємо user flow.
- Розробка backend. Laravel 11 (PHP 8.3+) з Repository-паттерном, Elasticsearch для пошуку, Redis для кешу.
- Frontend. Vue 3 (Nuxt 3) з SSR, Tailwind — швидкий інтерфейс та SEO.
- Інтеграція з ATS. REST API або webhook для обміну даними.
- Тестування. Навантажувальне тестування (k6) та перевірка Core Web Vitals.
- Деплой. Налаштування CI/CD (GitHub Actions), Docker Compose, моніторинг.
Що входить в роботу
- Репозиторій з повним кодом та міграціями бази даних.
- Документація API (OpenAPI 3.0).
- Налаштований CI/CD (GitHub Actions + Docker Compose).
- Навчання команди замовника (2 вебінари).
- Гарантія на код — 6 місяців після здачі.
- Технічна підтримка протягом гарантійного терміну.
- Доступ до адмін-панелі та системи моніторингу.
- Впровадження парсингу вакансій із зовнішніх джерел.
Терміни та гарантії
MVP (публікація вакансій, пошук, відгуки, ОК роботодавця та кандидата): 2–3 місяці. З аналітикою, алертами, ATS-функціями, базою резюме з пошуком: 3–5 місяців.
Наш досвід: більше 10 років у веб-розробці, більше 50 реалізованих проєктів. Оцінимо ваш проєкт за 2 дні — зв'яжіться з нами, щоб обговорити деталі. Отримайте консультацію по вашому проєкту вже сьогодні.
Розробка корпоративних порталів та внутрішніх систем
Ми займаємося розробкою корпоративних порталів — CRM, ERP, LMS та Intranet. Кожен такий проект починається не з верстки лендінгу, а з того, як бізнес-правила ляжуть в архітектуру: хто бачить які дані, як синхронізуються 1С та облікова система, як 500 контактів перетворюються на 500 000 без падіння продуктивності. За 7 років ми реалізували понад 40 порталів для компаній з чисельністю від 50 до 5000 співробітників. Оцінимо ваш проект за два робочі дні — просто зв'яжіться з нами.
Як ми забезпечуємо якість архітектури?
Публічний сайт можна запустити без детального проектування — ітеративно виправляти за фідбеком. З корпоративним порталом так не працює: вартість виправлення архітектурних рішень після запуску на 200 користувачів неспівставно вища. Тому ми приділяємо 70% часу аналітиці та прототипуванню, а код пишемо тільки після узгодження рольової матриці та інтеграційної схеми.
Три зони, де найчастіше приймаються погані рішення, — модель прав доступу, продуктивність на великих даних та real-time оновлення.
Як побудувати рольову модель для 30 відділів?
Модель прав доступу. «Менеджер бачить тільки своїх клієнтів, керівник відділу — весь відділ, директор — всю компанію, але фінансові дані — тільки фінансовий директор і вище». Це не три ролі — це матриця з ролей, дозволів, організаційних одиниць та володіння записами. Якщо це реалізувати через if ($user->role === 'manager') в контролерах — через півроку код стане непідтримуваним.
Правильний підхід: Spatie Laravel Permission для базової рольової моделі + Policy класи для object-level permission (can('view', $deal) перевіряє не тільки роль, але й володіння). Для складних ієрархічних структур — ABAC (Attribute-Based Access Control) замість RBAC.
Продуктивність на великих даних. CRM з 500 000 контактів, фільтрація по 10 полях, сортування за активністю — це задача, де наївна реалізація видає 15-секундні запити. Composite indexes, денормалізація агрегатів (last_activity_at на самому записі замість MAX по зв'язаній таблиці), Elasticsearch для full-text пошуку по контактах.
Real-time оновлення. Декілька співробітників працюють з одним документом або задачею. Без WebSocket — постійні setInterval з polling кожні 5 секунд, зайве навантаження на сервер, затримка оновлень. Laravel Broadcasting + Pusher/Soketi або власний WebSocket сервер на Node.js — для сповіщень та змін у реальному часі.
CRM-системи
Типовий набір: контакти, компанії, угоди, активності, воронка продажів, звіти. Технічно це нескладно. Складність — в деталях.
Pipeline з кастомними стадіями. Кожна компанія хоче свою воронку. Стадії повинні бути налаштовуваними без деплою. Таблиця pipeline_stages з position, color, is_final, probability — і drag-and-drop для зміни порядку на UI (React DnD або dnd-kit).
Історія змін. Хто і коли змінив статус угоди, поміняв відповідального, додав нотатку. Audit log через Observer або spatie/laravel-activitylog. На UI — timeline з фільтрацією за типом активності.
Інтеграція з поштою. IMAP/SMTP для підключення корпоративної скриньки, автоматична прив'язка вхідних листів до контактів за email-адресою. Це надійно працює тільки при правильній обробці bounce, spam, авто-відповідей — потрібна фільтрація.
Чому ERP — не про код, а про дані?
ERP — це коли CRM, склад, виробництво, бухгалтерія та HR об'єднані в єдину систему. Повний ERP з нуля — рідкісна задача (зазвичай інтегруються з існуючими системами), але модульні системи під конкретний бізнес — регулярна.
Ключовий принцип: фінансові операції повинні бути незмінними. Не UPDATE orders SET status = 'cancelled' — а створення нового запису order_cancellations з посиланням на вихідне замовлення. Це принцип immutable ledger, який спрощує аудит та reconciliation.
Інтеграція з 1С — майже завжди частина ERP-проекту. Двостороння синхронізація: з 1С в портал (довідники, залишки, ціни) та з порталу в 1С (замовлення, документи). RabbitMQ як шина подій між системами надійніше прямого HTTP-взаємодії — у випадку недоступності 1С повідомлення чекають в черзі.
Як влаштовані LMS: платформи навчання
Learning Management System — це курси, модулі, уроки, тести, сертифікати, прогрес користувачів.
Відео-контент — найбільш навантажена частина LMS. Зберігати відео на власному сервері та віддавати через Nginx — погана ідея: дорого, повільно, немає адаптивного бітрейту. Правильно: завантаження в S3/Cloudflare R2, транскодування через AWS Elemental MediaConvert або Mux, HLS-плейлист для адаптивного стрімінгу через Video.js або Plyr.
Прогрес перегляду — через періодичне відправлення watch_position з фронтенду (кожні 10–30 секунд), зберігання в Redis з періодичною синхронізацією в PostgreSQL. Не зберігати кожну секунду в БД — це вб'є продуктивність.
SCORM-сумісність — якщо потрібна інтеграція з корпоративними тренінговими матеріалами. Окремий модуль, є готові бібліотеки (scorm-again).
Intranet та HR-портали
Корпоративний інтранет: новини, документи, оргструктура, HR-процеси (відпустки, заявки, KPI).
Оргструктура в базі даних — це ієрархічна структура. Adjacency list (parent_id на кожному записі) простий в реалізації, але повільний при рекурсивних запитах. Nested Sets або Closure Table швидше для читання ієрархії, складніше при змінах. В PostgreSQL — рекурсивні CTE (WITH RECURSIVE) з adjacency list — баланс між простотою та продуктивністю.
Погодження документів та заявок — workflow engine. Прості лінійні погодження (співробітник → менеджер → HR → бухгалтер) можна зробити без спеціального движка. Нелінійні (паралельні гілки, умовні переходи, делегування) — варто розглянути готові рішення: Temporal.io для workflow orchestration або власний скінченний автомат на базі патерну state-machine.
Що входить в роботу
При замовленні розробки корпоративного порталу ви отримуєте:
- Архітектурну документацію (ER-діаграми, схема інтеграцій, матриця ролей)
- Повний код в Git-репозиторії з CI/CD
- Доступи до інфраструктури (хостинг, бази даних, сховища)
- Навчання адміністраторів та ключових користувачів (2–3 сесії)
- Гарантійну підтримку на 3 місяці після запуску
Наші принципи проєктування спираються на офіційну документацію Laravel з авторизації (Policies) та рекомендації щодо роботи з чергами.
Технічний стек для порталів
| Слой |
Інструменти |
| Backend |
Laravel + PostgreSQL |
| Frontend |
React + TypeScript (Inertia.js або окремий SPA) |
| Real-time |
Laravel Echo + Soketi / Pusher |
| Пошук |
Meilisearch (швидкий старт) або Elasticsearch (об'єм) |
| Черги |
Laravel Queue + Redis |
| Файли |
S3-compatible (MinIO self-hosted або AWS S3) |
| Моніторинг |
Sentry + Telescope (dev) |
Орієнтири за термінами
| Тип порталу |
Термін |
| CRM (базовий) |
10–16 тижнів |
| LMS (курси + відео + тести) |
14–22 тижні |
| HR-портал (відпустки, KPI, оргструктура) |
12–20 тижнів |
| Корпоративний ERP (модульний) |
24–52 тижні |
Вартість розраховується індивідуально після детальної аналітики вимог та рольової моделі. Щоб отримати попередню оцінку, напишіть нам — ми проаналізуємо вашу задачу та запропонуємо оптимальне рішення під ключ.