SuraqHub платформасы туралы Кіріспе

SuraqHub — интерактивті электрондық формаларды жобалауға, сауалнамалар өткізуге, құрылымдық деректерді жинауға, оларды валидациялауға, антивирустық тексеруге және сыртқы аналитикалық қоймаларға нақты уақыт режимінде жеткізуге арналған корпоративтік ақауға төзімді платформа.

⚡ Негізгі мүмкіндіктер
  • Визуалды конструктор — 30-дан астам компонент түрін, бейімделгіш торлар мен формулаларды қолдайды (толық нұсқаулық).
  • Антивирустық қорғаныс: әрбір жүктелетін файл қоймаға түспей тұрып оқшауланады және ClamAV арқылы тексеріледі.
  • Асинхронды архитектура: жүздеген мың сауалнаманы Excel-ге (XLSX) экспорттау RabbitMQ арқылы фондық режимде орындалады.
  • Корпоративтік деңгейдегі интеграциялар: M2M кілттері арқылы синхронды GraphQL API, HMAC-SHA256 криптографиялық қолтаңбасы бар лездік вебхуктар және Power BI үшін арнайы деректер базасы схемасы арқылы аналитиканың pull-арнасы.
  • Стандарттарға сәйкестік: жарық/қараңғы тақырыптарды қолдау, WCAG 2.2 AA қолжетімділігі және Content Security Policy (CSP) қатаң қауіпсіздік саясаттары.

Тұжырымдамалар және негізгі нысандар Архитектура

SuraqHub архитектурасының негізінде сұрақтар құрылымы (схема) мен сауалнамаға кіру нүктесі (жарияланым) арасындағы айқын бөлінуде жатыр:

📝 Форма үлгісі (Form Schema)

Бұл сұрақтарды, валидацияны, өріс түрлерін, ашылмалы тізімдер мен шартты логиканы сипаттайтын JSON-құрылым. Үлгілер өзгермейді: әр сақтау кезінде нұсқалар тарихында жаңа ревизия жасалады, бұл бұрын жиналған жауаптардың тұтастығын қамтамасыз етеді.

🌐 Жарияланым (Publication)

Бұл сауалнама веб-бетінің конфигурациясы. Онда Slug (адам оқитын мекенжай, мысалы /f/feedback), қолжетімділік статусы (Белсенді / Белсенді емес), брендинг (Header, Footer), безендіру тақырыбы және форма үлгісінің нақты нұсқасына байланыс бар.

💡 Бөлудің артықшылығы:

Форманың жаңа нұсқаларын алдын ала құрастырып, тексеріп көруге болады, содан кейін бір басумен пайдаланушыларға үзіліс келтірмей және сілтеме мекенжайын өзгертпей жарияланымды жаңа нұсқаға ауыстыруға болады.

Форма жасаудың өмірлік циклі Workflow

Идеядан дайын есептерді алуға дейінгі стандартты жұмыс процесі 5 қадамнан тұрады:

  1. Жарияланымды жасау («Негізгі» экраны): сауалнаманың атауын және болашақ веб-мекенжайын (Slug) көрсетіңіз.
  2. Сұрақтарды құрастыру («Конструктор» экраны): өрістер құрылымын жинаңыз, міндеттілікті, кеңестер мен көрсету логикасын параметрлеңіз.
  3. Брендинг және локализация («Дизайн» және «Аудармалар» экрандары): компания шапкасын (header) және подвалын (footer) параметрлеңіз, қазақ/ағылшын тілдеріне аударманы қосыңыз.
  4. Алдын ала көру және тексеру («Алдын ала көру» экраны): тестілік сауалнаманы толтырып, есептеулер мен валидацияның дұрыстығына көз жеткізіңіз.
  5. Белсендіру және жауаптарды жинау: «Статус: Белсенді» ажыратқышын қосыңыз және нәтижелерді «Есептілік» экранында немесе Webhooks/API арқылы талдаңыз.

«Негізгі» бөлімі (Жарияланымдарды басқару) Экран

Жарияланған барлық сауалнамаларды бақылауға және ревизияларды басқаруға арналған орталық экран.

Басқару элементтері

  • «Жаңа жарияланым» түймесі: Жасау формасын тазартып, менеджерді жаңа мекенжай тіркеу режиміне ауыстырады.
  • Іздеу (Тік сүзгі): Жарияланымдар тізімін атауы немесе слагы бойынша лезде сүзеді.
  • «Жарияланым тақырыбы» өрісі: Пайдаланушыларға браузер қойындысының тақырыбында және сауалнама шапкасында (header) көрсетілетін атау.
  • «URL (Мекенжай)» өрісі / Slug: Латин әліпбиімен жазылған бірегей жол (мысалы, anketa-2026). Формаға түпкі сілтеме: https://domain/f/anketa-2026.
  • «Статус: Белсенді» ажыратқышы: Өшірулі болса, пайдаланушылар толтыруға әрекеттенгенде жауап қабылдау аяқталған экраны көрсетіледі (Inactive Screen).
  • Ревизиялар тарихы және қайтару (Rollback): Карточканың төменгі бөлігінде күні мен авторы бар сақталған барлық нұсқалардың таймлайы көрсетіледі. Ревизияны басу конструкторға форманың тарихи нұсқасын лезде жүктейді.

Жарияланымдардың әкімшілік тізімі

Әкімшілерге платформаның барлық сауалнамаларын, оның ішінде басқа пайдаланушылар жасағандарын да қамтитын «Жарияланымдар» тізімі қолжетімді:

  • Іздеу: жарияланым атауы, slug немесе форма атауы бойынша.
  • Сүзгілер: күй (белсенді/белсенді емес), қолжетімділік түрі (ашық, жабық, рөлдер бойынша) және иесі.
  • Әрекеттер: кез келген жарияланымды редакциялауға өту, белсендіру/өшіру; кестеде жауаптар саны мен қабылдау аяқталу күні көрінеді.
  • Әкімші рөлі жоқ жасаушылар «Негізгі» бөлімінде тек өз жарияланымдарын көреді.

«Форма конструкторы» бөлімі Экран

Цифрлық формалар мен интерактивті сауалнамалардың визуалды drag-and-drop редакторы.

Жұмыс ортасының құрылымы

  • Сол жақ компонент палитрасы: Негізгі өрістер (Мәтін, Сан, Құсбелгі, Файлдар) және разметка элементтері (Панельдер, Бағандар) бар. Оларды тышқанмен оң жақтағы жұмыс аймағына сүйреп әкеліңіз. Барлық компоненттердің толық анықтамалығы — конструктор нұсқаулығында.
  • Жұмыс кенебі: Болашақ форманың интерактивті макетін көрсетеді. Кез келген компонентке курсор апарғанда жылдам әрекеттер панелі қолжетімді:
    • Параметрлер: Валидация, API-кілті мен кеңестердің параметрлері бар диалог ашады.
    • Көшіру: Өрісті барлық ішкі ережелерімен бірге клондау.
    • Төменге қою: Бұрын көшірілген компонентті қояды.
    • JSON: Өріс схемасын тікелей редакциялау (Кеңейтілген режимде қолжетімді).
    • Жылжыту: Компонентті кенепте басқа орынға қолмен жылжыту.
    • Жою: Компонентті схемадан жояды.
⚙️ Кеңейтілген режим (Advanced Mode)

«Параметрлер» бөлімінде қосылады. Тәжірибелі әзірлеушілерге теңшеулі есептеу формулаларын, JSONLogic, PDF интеграциясын конфигурациялауға және компоненттер схемасының JSON-ын тікелей редакциялауға мүмкіндік береді. Толық нұсқаулық.

«Жарияланым дизайны» бөлімі Экран

Респонденттерге көрсетілетін веб-беттердің сыртқы түрін басқару.

Теңшеу мүмкіндіктері

  • Дайын үлгілерді (Ассеттер) таңдау: Орталықтандырылған ассеттер анықтамалығынан корпоративтік шапканы (header), подвальді (footer) немесе белсенді емес экранды жылдам қосу.
  • Код редакторы (Ace Editor): Өз безендіруін жазуға арналған HTML/CSS синтаксисін түрлендіретін кірістірілген редактор.
  • Тік алдын ала көру панелі (Preview Box): Код енгізіле тұрып верстканы нақты уақыт режимінде көрсетеді.
  • Тақырыпты безендіру: Жарық тақырыпты (Corporate Light) және жоғары контрастты қараңғы тақырыпты (Dark Enterprise) қолдау.

Сауалнаманы басқа сайтқа ендіру

Жарияланымды сыртқы сайтқа — мысалы, корпоративтік порталға — фрейм ретінде ендіруге болады: респонденттер сауалнаманы әдеттегі сайттан кетпей толтырады.

  1. «Дизайн» қойындысында «Ендіру (Embed)» карточкасындағы «Сауалнаманы сыртқы сайттарға ендіруге рұқсат беру» ауыстырғышын қосыңыз.
  2. Рұқсат етілген домендерді көрсетіңіз — бір жолда біреу, https://www.ktz.kz форматында. Сауалнаманы тек тізімде домені бар сайтқа ғана ендіуге болады (CSP frame-ancestors арқылы кез келген ресурсқа ендіруден қорғау), 10 доменге дейін.
  3. «Дизайнды сақтау» түймесін басыңыз — теңшеу бірнеше секундтан кейін күшіне енеді.
  4. «Кодты көшіру» түймесімен дайын ендіру кодын көшіріп, сайт иесіне беріңіз. Код фреймді және биіктікті автоматты реттеу скриптін қамтиды.

Хост-сайт жағынан ештеңе қажет емес: әзірлеуші алған кодты бетке қана қояды — кілттер, токендер мен тіркелу талап етілмейді. Сауалнама мекенжайына өз фреймін жазу да жұмыс істейді, бірақ сниппеттегі скриптсіз биіктікті бекітілген етіп көрсету керек. Ретін сақтаңыз: сайт домені олардың жағында код жарияланғанға дейін тізімге енуі керек, әйтпесе браузер фреймді блоктайды.

Шектеулер:

  • Рөлдік қолжетімділіктегі сауалнамалар да ендіріле алады: фрейм ішінде «Кіру» түймесі пайда болады, кіру жеке терезеде (брендтелген біртұтас кіру беті) ашылады, кіргеннен кейін форма автоматты түрде жүктеледі — хост-бет қайта жүктелмейді.
  • Міндетті қолтаңбамен (NCALayer) сауалнамалар браузер шектеулеріне байланысты (Private Network Access) фреймнен қолтаңба бағдарламасына қол жеткізе алмауы мүмкін. Мұндай жағдайда форма «Жаңа қойындыда ашу» ұсынысын көрсетеді — жеке қойындыда қолтаңба жұмыс істейді. Мақсатты сайтта тексеріңіз.
  • Ауыстырғыш қосулы, бірақ домендер тізімі бос болса, ендіруге тыйым салынады — сауалнама фреймге орналастырылудан сақталады.

Модульдік брендинг & White-label (ҚТЖ Forms) Платформа

Платформаны корпоративтік тапсырыс берушіге бейімдеу архитектурасы — Co-branding / White-label («Powered by SuraqHub») үлгісі бойынша.

«ҚТЖ Forms by SuraqHub» тұжырымдамасы

«Қазақстан темір жолы» ҰК» АҚ корпоративтік ортасына енгізу үшін жүйе ко-брендинг режімінде бапталған: қызметкерлер мен филиалдар үшін сервис «ҚТЖ Forms» ішкі сенімді корпоративтік жүйесі ретінде, ал негізгі қозғалтқышы «by SuraqHub» белгісімен ұсынылады.

  • Форктарсыз және кодты қайталамау: SuraqHub біртұтас бастапқы коды стандартты орнатуларды да, брендтелген арнайы инстанстарды да бірдей қамтамасыз етеді.
  • Қайта құрастырусыз жылдам конфигурация: брендинг параметрлері Kubernetes ConfigMap (suraqhub-frontend-env) және env.js файлы арқылы басқарылады.
  • Zero Downtime & Лездік жаңарту: конфигурация no-cache тақырыптарымен қорғалған, өзгерістер Docker бейнесін қайта жинаусыз бірден қолданысқа енеді.

Брендинг элементтері

Интерфейс аймағы ҚТЖ үшін көрсетілім Баптау параметрі
Браузер қойындысы (Title) КТЖ Forms powered by SuraqHub | Корпоративная система форм PAGE_TITLE / APP_NAME
Фавикон ҚТЖ ресми белгісі (ktz-icon.svg) FAVICON_URL
Жүктелу экраны (Preloader) ҚТЖ эмблемасы, КТЖ Forms тақырыбы және «ҚТЖ» ҰК» АҚ • powered by SuraqHub бейджі LOADER_BADGE, POWERED_BY
Негізгі тақырып (Header) ҚТЖ векторлық эмблемасы + КТЖ Forms атауы + powered by SuraqHub бейджі LOGO_URL, APP_NAME
Кіру терезесі (Login Gate) ҚТЖ логотипі, КТЖ Forms және мемлекеттік тілдегі нұсқау LOGIN_HINTS (kk/ru/en)
Корпоративтік түс ҚТЖ корпоративтік көк түсі (#0066b2) PRIMARY_COLOR

«Аудармалар» бөлімі (Локализация) Экран

Орыс-, қазақ- және халықаралық аудиторияға арналған сауалнамалардың көптілділігін қамтамасыз етеді.

Локализация қалай жұмыс істейді

  1. Қойындыға өткенде жүйе форманың ағымдағы схемасын автоматты түрде талдап, барлық мәтіндік жолдарды табады: өріс белгілерін, кеңестерді (placeholder), сипаттамалар мен қате мәтіндерін.
  2. Интерактивті кестеде тілдер бойынша бағандар шығады: Орыс (RU), Қазақ (KK) және Ағылшын (EN).
  3. CSV-ге экспорт: Кестені кәсіби аудармашыларға беру үшін файлға шығарып алуға болады.
  4. Сауалнаманы толтқан кезде респондент ажыратқыштан ыңғайлы тілді таңдайды және форманың барлық сұрақтары бетті қайта жүктемей лезде аударылады.

«Анықтамалықтар (НАА)» бөлімі Экран

Нормативтік-анықтамалық ақпаратты орталықтандырып жүргізу: бөлімшелер, өңірлер, санаттар және формалардың ашылмалы тізімдерінде қолданылатын басқа да мәндер тізімдері.

Тізілім және редактор

  • Анықтамалықтар тізілімі: күйі, өндірістік нұсқасы және жаңарту күні бар барлық анықтамалықтар кестесі. Жаңа анықтамалық жасау түймесі арқылы тіркеледі.
  • Кірістірілген редактор: жазбаларды кестеде редакциялау — жол қосу, кесте бойынша тік іздеу, ячейканы қос шертіп редакциялау.
  • Импорт және экспорт: мәндерді Excel/CSV файлынан жаппай жүктеу, ағымдағы жобаны Excel-ге шығару, буфер алмасуы арқылы жол қосу (Excel-де Ctrl+C → кестені шертіңіз → Ctrl+V).
  • Жоба және жариялау: түзетулер «Жобаны сақтау» түймесімен жобаға сақталады; «Жариялау» жобаны формалар мәндерді оқитын өндірістік нұсқаға айналдырады.
  • Сыртқы анықтамалықтар: бұлт белгісі бар жолда соңғы синхрондау күйі көрсетіледі, найзағай түймесі қолмен синхрондауды іске қосады.

Сыртқы анықтамалықтар (автосинхрондау)

Анықтамалық мәндерді сыртқы дереккөзден автоматты ала алады: платформа деректерді өзі алады (server-to-server), анықтамалық келісімшартына салып, жаңа өндірістік нұсқаны жариялайды — деректер шын өзгерген жағдайда ғана. Тән жағдай — сыртқы онтологиялық API жүргізетін көлік анықтамалықтары (станциялар, пойыз санаттары).

  • Баптау: бұлт түймесі дереккөз карточкасын ашады — ресурс URL-і, трансформер (өрістерді салыстыру), тіркелгі деректері бар орта айнымалысы (Basic), жаңарту аралығы (минут), қосу/өшіру.
  • Қолмен синхрондау: тізілім жолындағы (немесе дереккөз карточкасындағы) найзағай түймесі аралықты күтпей қосымша жаңарту жүргізеді.
  • Жаңарту журналы: дереккөз карточкасында соңғы әрекеттер журналы көрінеді — уақыты, күйі, HTTP коды, алынған және өзгертілген жазбалар саны, жарияланған ревизия.
  • Ревизиялар және дәйектілік: дереккөздің әрбір өзгерісі сыртқы деректер жиынының нұсқасы белгіленген жаңа өзгермейтін ревизия ретінде жазылады. Сыртқы дереккөз қолжетімсіз болса да, формалар мәндерді оқи береді — соңғы жарияланған нұсқа қолданылады. Сыртқы анықтамалықтың жобасын қолмен редакциялау тыйылады: келесі синхрондау оның үстінен жазады.
  • Қайтару: жариялау тарихы арқылы кез келген бұрынғы ревизияға бірден оралуға болады — қарапайым анықтамалықтардағыдай.

Поляларды пайдаланушы бойынша авто толтыру (префилл)

Форманың өрістерін форманы ашқан пайдаланушының профилінен автоматты толтыруға болады: аты-жөні — тіркелгіден (Keycloak), нысандар (участкілер, станциялар) — «Тағайындаулар» қойындысында жүргізілетін жеке тағайындаулардан.

  • Қалай жұмыс істейді: форманың өрісі prefill қасиетін алып жүреді — форма ашылғанда мән профильден толтырылады (аты-жөні редакциялаудан бұғатталады), ал ашылмалы тізім опциялары пайдаланушыға тағайындалған нысандарға дейін сүзгіленеді.
  • Сервердегі кепілдік: анкета жіберілгенде сервер деректерді браузерге тәуелсіз тексереді — аты-жөні әрқашан тіркелгі мәнімен алмастырылады, нысан таңдауы тағайындаулармен салыстырылады. DevTools арқылы бұрмалау мүмкін емес.
  • Тағайындаулар жоқ болса: нысандар тізімі толық қалады (fallback режимі), пайдаланушының таңдауы қолмен таңдалған деп белгіленеді. Мұндай мәндер «Тағайындаулар» қойындысына кандидат ретінде түседі — әкімші мақұлдаған соң өрістер келесі жолы автоматты толтырылады.
  • «Тағайындаулар» қойындысы: қолмен тағайындау (email арқылы пайдаланушыны іздеу), белсенді тағайындаулар мен кандидаттар тізімі, мақұлдау және жою. Кандидаттар пайдаланушы нысанды қолмен таңдаған сабмиттерден автоматты жасалады.
🔐 Сыртқы дереккөздердің тіркелгі деректері:

Basic тіркелгі деректері (user:password) әр анықтамалық үшін дереккөз карточкасында көрсетіліп, қорғалған кестеде сақталады; интерфейске ешқашан қайтарылмайды. Балама ретінде орта айнымалысының атын көрсетуге болады — сол кезде оның мәні аутентификацияға қолданылады.

💡 Анықтамалықты формаға қосу:

Конструктордың ашылмалы тізімінде дереккөз түрі «URL» деп көрсетіп, сөздік мекенжайын жазыңыз: /api/v1/dictionaries/{код}. Анықтамалық жаңартылғанда форма жаңа мәндерді автоматты қабылдайды — форманың жаңа ревизиясы қажет емес. Қадамдық рецепт — конструктор нұсқаулығының Практикалық сценарийлер бөлімінде.

🔐 Рұқсат:

Қойынды admin және dictionary_manager рөлдеріне қолжетімді — Қауіпсіздік бөліміндегі «Рөлдер және қолжетімділік құқықтары» карточкасын қараңыз.

«Алдын ала көру» бөлімі Экран

Жарияламас бұрын дайын сауалнаманы верификациялауға арналған интерактивті орта.

Экран респондент көретін нақты интерфейстің дәл көшірмесін барлық қосылған стильдер, қаріптер, шапка (header) және подвалмен (footer) көрсетеді. Форманы жіберу, міндетті өрістер, телефон маскалары, файлдарды тіркеу және сұрақтардың тармақталу логикасын тексеріп көруге мүмкіндік береді.

«Есептілік және аналитика» бөлімі Экран

Деректерді визуализациялау және жиналған жауаптарды экспорттау құралдары.

Аналитика мүмкіндіктері

  • Нақты уақыттағы санағыштар: Жіберілген сауалнамалардың (сабмишндердің) жалпы саны және соңғы жауаптың күні.
  • «Жауаптар динамикасы» графигі: Сауалнаманың күндер бойынша толтырылу уақыт шкаласы.
  • Жауаптардың географиялық картасы: Сауалнамалар жіберілген нүктелерді кластерлеуі бар Қазақстанның интерактивті картасы (геолокация жинайтын формалар үшін).
  • Өрістер бойынша детализация: Ашылмалы тізімнен бір немесе бірнеше сұрақты таңдаңыз — жүйе жауап нұсқаларының таралуының дөңгелек және бағандық диаграммаларын автоматты түрде құрастырады.
  • Excel-ге асинхронды экспорт (XLSX): «Excel жүктіп алу» түймесін бассаңыз, тапсырма RabbitMQ воркерлеріне беріледі. Дайын есеп лезде жүктіп алынады, интерфейс жұмысын блоктамайды.

«Жүйе параметрлері» бөлімі Экран

Платформаның қауіпсіздік, антивирус және қызмет көрсету параметрлері.

Жүйелік параметрлер

  • Жүктеудің максималды өлшемі: Формаларға тіркеуге рұқсат етілген файлдардың өлшем шектеуі (МБ).
  • Платформа уақыт белдеуі: Аналитика мен Excel экспорттарында таймстемптердің дұрыс есептелуін анықтайды.
  • Формалар аудармаларының тілдері: «Аудармалар» қойындысында және жарияланған формаларда қолжетімді тілдерді басқарады. Орыс тілі негізгі болып қалады; қазақ, қырғыз, ағылшын және өзбек тілдерін қосуға/өшіруге болады.
  • Антивирустық сканер (ClamAV): Файлдарды вирустарға тексеруді қосу және сервис мекенжайы.
  • Keycloak рөлдерінің анықтамалығы: Платформаның жүйелік рөлдерін (Admin, Creator, Viewer) Keycloak токендерімен сәйкестендіру.
  • Диагностика пакеті: Микросервистік логтарды, RabbitMQ кезектерінің күйін және DLQ қате кезегін қамтитын біртұтас архивті құрастырады — жылдам техникалық қолдау үшін.

«Жүйе күйі» панелі

«Қызмет көрсету» бөлімінде инфрақұрылымның жанды көрсеткіштері көрсетіледі. Панель «Жаңарту» түймесімен және қойындыны әр ашқан сайын жаңартылады. Көрсеткіштерді қалай оқу керек:

ПараметрНорма және дабыл белгілері
Жұмыс кезектері (form_submissions, templates.v1, publications.modular, reports.tasks, files.quarantine)Тереңдік 0 — норма (шың жүктеме кезінде бірнеше хабарламаның секундтық өсуі рұқсат етіледі). Тұтынушылар (consumer) саны ≥ 1 болуы керек. Дабыл: тереңдік өсіп, төмендемейді немесе тұтынушылар 0 — өңдеуіш құлаған немесе деректер базасы қолжетімсіз.
Retry-кезектері (submissions_retry_queue және ұқсас)Тыныш күйде тереңдік 0; бірлік хабарламалар — норма (кешігумен қайталаулар). Тұтынушылар 0 — норма: бұл таймері бар тұрақтау орны, оларды брокердің өзі таймаут бойынша оқиды.
Қате кезектері (DLQ) (dead_letter_queue, webhooks.failed, reports.failed)Норма — қатаң түрде 0. Нөлден үлкен кез келген мән — тексерудің сигналы: DLQ өз-өзінен тартылмайды. Жолдар қызыл түспен жарықтандырылады.
RabbitMQ / Деректер базасы / RedisЖасыл белгі — компонент қолжетімді. Қызыл крест — сервис қолжетімсіз; курсор апарғанда себебі көрсетіледі.
Сауалнамалар сағат ішінде / 24 сағаттаКүтілетін трафикке сәйкес болуы тиіс. Белсенді трафик кезінде нөл — сынға толы белгі: толтырушылардың жауаптары сақталмайды.
Идемпотенттік жазбаларМонотон өсу — норма (көшірмелерден қорғаныс). Тазартылмаған ондаған мың жазба өңдеуді баяулатады — деректер базасы әкімшісіне арналған сұрақ.
Белсенді webhook-жазылыстарҚанша жазылу оқиғаларды нақты қабылдайды. Нөл — оқиғалар еш жерге жіберілмейді («Интеграциялар» қойындысын тексеріңіз). Жеткізілуі үнемі сәтсіз аяқталатын жазылыс webhooks.failed ішінде қателерді жинайды.
💡 Қысқа ереже

Жұмыс кезектері: 0 — жақсы, тұтынушылар міндетті. Retry: нөл және тұтынушылар нөл — қалыпты. DLQ: тек нөл. Сауалнамалар санағышы нөлде тұр, ал адамдар формаларды толтырып жатса — savetodb логтарын дереу қараңыз.

API кілттері (M2M Integration & GraphQL) Интеграциялар

Сыртқы BI/ETL жүйелерінің (PowerBI, Tableau, корпоративтік CRM) Keycloak арқылы интерактивті кірмей-ақ аналитика мен экспорттарға синхронды қол жеткізуі.

API-токендердің қауіпсіздігі

  • Префикс whsec_: Токен криптографиялық тұрақты генератормен жасалады және жасалған кезде тек бір рет көрсетіледі.
  • SHA-256 хэштеу: Платформа деректер базасында токеннің тек хэші сақталады. База қауіпке ұшыраған жағдайдың өзінде бастапқы кілтті қалпына келтіру мүмкін емес.
  • Көрініс шектеуі (Scopes): Кілтті глобалды етіп жасауға немесе тек таңдалған жарияланымдарға қол жеткізумен шектеуге болады.

cURL арқылы GraphQL-сұрау мысалы

curl -X POST https://suraqhub.domain.com/graphql \
  -H "Content-Type: application/json" \
  -H "X-API-Key: whsec_your_secret_api_key_here" \
  -d '{
    "query": "query GetPubStats($id: UUID!) { publicationStats(publicationId: $id) { totalSubmissions lastSubmissionDate } }",
    "variables": { "id": "16a5ff0e-f1ff-4b8a-9887-c5f907912ea1" }
  }'

Нақты уақыттағы вебхуктар (Webhooks) Real-Time

SuraqHub-та оқиға орын алғанда серверлеріңізге HTTP POST хабарламаларды асинхронды жіберу.

Оқиға түрлері:

  • submission.created — пайдаланушы форманы толтырып, сәтті жіберді.
  • form.saved — форманың сұрақтар құрылымы өзгертілді немесе сақталды.
  • publication.saved — жарияланым өзгертілді немесе белсендірілді.

JSON Payload спецификациясы:

{
  "event": "submission.created",
  "event_id": "9f1c2d3e-4b5a-6c7d-8e9f-0a1b2c3d4e5f",
  "timestamp": "2026-09-02T15:30:00.000Z",
  "publication_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "form_id": "f5e4d3c2-b1a0-9876-5432-10fedcba9876",
  "submission_id": "77aa88bb-99cc-00dd-11ee-22ff33aa44bb",
  "data": {
    "fullName": "Алексей Смирнов",
    "phoneNumber": "+77015554433",
    "score": 5,
    "comment": "Отличная скорость работы!"
  }
}

HMAC-SHA256 қолтаңбасын тексеру (X-SuraqHub-Signature тақырыбы)

Әр сұрау сіздің жазылу құпиясыңызбен қолтаңбаланады. Сервер-қабылдағыш өңдеу алдында қолтаңбаны тексеруі міндетті:

Python мысалы (FastAPI / Flask):

import hmac, hashlib
from fastapi import FastAPI, Request, HTTPException, Header

app = FastAPI()
WEBHOOK_SECRET = "whsec_your_secret_key"

@app.post("/webhook")
async def receive_webhook(request: Request, x_suraqhub_signature: str = Header(None)):
    raw_body = await request.body()
    expected = hmac.new(WEBHOOK_SECRET.encode("utf-8"), raw_body, hashlib.sha256).hexdigest()

    if not x_suraqhub_signature or not hmac.compare_digest(expected, x_suraqhub_signature):
        raise HTTPException(status_code=403, detail="Invalid HMAC signature")

    payload = await request.json()
    print(f"✅ Успешно получено событие {payload['event']}")
    return {"status": "ok"}

Сенімділік кепілдіктері (SRE Retry Policy):

  • Manual ACK: Хабарлама RabbitMQ-да тек сіздің серверіңізден 200 OK HTTP-коды қабылданғаннан кейін ғана расталады.
  • Экспоненциалды Retry: Желілік қате немесе 5xx коды кезінде платформа жіберуді өсіп отыратын аралықпен 5 рет қайталайды.
  • Dead Letter Queue (DLQ): Фаталды қателер кезінде (404, 403) хабарлама қолмен талдау үшін suraqhub.webhooks.failed бұзылғандар кезегіне қауіпсіз сақталады.

BI үшін аналитика (analytics схемасы) Pull / BI

Power BI-ды (және PostgreSQL-коннекторы бар кез келген құралды) жиналған сауалнамалар бойынша дашбордтар мен есептер құруға арналған арнайы read-only деректер базасы схемасына тікелей қосу.

Бұл арна вебхуктардан және API кілттерінен неге өзгеше:

  • Вебхуктар — автоматтандыру жүйелері үшін лездік push-хабарламалар (оқиғаға секунд ішінде реакция).
  • API кілттері — сыртқы сервистерге арналған GraphQL API-ға синхронды сұраулар (нақты сауалнаманың деректері, бизнес-логика).
  • analytics схемасы — адамға арналған тарих: Power BI-дағы дашбордтар, воронкалар, кесте бойынша жаңартылатын жиынтық есептер.

Деректер моделі:

  • vw_submissions — сауалнама шапқылары: қашан, қай жарияланым, тіл, қолтаңбаның бар-жоғы. Жауап мазмұнынсыз.
  • vw_submission_answers — «ұзын» форматтағы жауаптар (бір жол = бір жауап). Кез келген формаға әмбебап: Power BI-да жиынтық кесте (Pivot) арқылы кең кестеге айналады.
  • vw_submission_geo — құрылғылар координаталары (ендік, бойлық, дәлдік) геолокация жинайтын формалар үшін.
  • vw_publications — жарияланымдар анықтамалығы: атаулары, жіберу саясаттары, қолтаңба мен геолокация, белсенділік кезеңдері.

Қауіпсіздік және құпиялық:

  • Қосу арнайы read-only powerbi_reader рөлімен жүргізіледі, оған тек analytics схемасы қолжетімді. Платформаның қызметтік кестелеріне (API кілттері, жазылыстар, аудит) рөлдің қол жеткізуі жоқ.
  • Жеке деректер берілмейді: ЖСН, криптографиялық қолтаңбалар мен шикі метадеректер вьюларға кірістірілмеген.
  • Жазу мүмкін емес — рөлде тек оқу құқығы бар.

Қосу:

Power BI Desktop-та: Деректерді алу → PostgreSQL, сервер мен suraqhub деректер базасының мекенжайын көрсетіңіз, авторизация — powerbi_reader тіркелгісімен (платформа әкімшісі береді). Жарияланған дашбордтар үшін сол дереккөзді жергілікті Data Gateway-ге қосыңыз.

Ұсыныс: импорт режимін (Import) қолданып, жаңартуды кесте бойынша конфигурациялаңыз (мысалы, сағат сайын немесе түнде) — ауыр дашбордтар базаны қажеттіліктен жиі сауаламауы тиіс.

Жоғары жүктемелі орналастырулар үшін платформа деректер базасының read-only репликасын қарастырады: әкімші аналитикалық есептер мен BI-қосылымдарды база көшірмесіне (DATABASE_RO_URL) бағыттап, негізгі базаны тек сауалнамаларды қабылдауға қалдыра алады. Толығырақ — suraqhub-docs/analytics_powerbi.md құжатында.

Файлдар мен медианы жүктіп алу (FileConductor API) File API

Респонденттер формаларға тіркеген тіркемелерді (фотосуреттер, бейне жазбалар, сканерлеулер) қауіпсіз бағдарламалық және пайдаланушылық жүктіп алу.

1. Файлдар сыртқы жүйелерге қалай беріледі

submission.created вебхугы қабылданғанда немесе есептерді Excel/CSV-ге экспорттағанда, тіркемелер submission_data ішіндегі объектілер массиві ретінде ұсынылады:

{
  "event": "submission.created",
  "submission_id": "123e4567-e89b-12d3-a456-426614174000",
  "submission_data": {
    "media_field": [
      {
        "file_id": "c0378e90-f99a-4c28-bb8d-d602ff59187a",
        "originalName": "photo_bridge.jpg",
        "size": 2450123,
        "type": "image/jpeg",
        "url": "/api/files/download/c0378e90-f99a-4c28-bb8d-d602ff59187a"
      }
    ]
  }
}

Әр файл тұрақты UUID (file_id) арқылы анықталады және жүктеуге арналған салыстырмалы URL қамтиды.

2. Аутентификация тәсілдері

/api/files/download/{file_id} эндпоинт қорғалған және келесі авторизация тәсілдерін қолдайды:

  • M2M API кілті (скриптер/ETL үшін ұсынылады): X-API-Key: whsec_... тақырыбында немесе ?api_key=whsec_... URL параметрімен беріледі. Кілттер менеджердің «Интеграциялар» қойындысында жасалады.
  • Keycloak Bearer JWT (ішкі сервистер үшін): Authorization: Bearer <token> тақырыбында немесе ?token=<token> параметрімен беріледі.

3. Жүктіп алу режимдері

А. Тікелей редирект (HTTP 302) — браузерлер мен утилиталар үшін

?redirect=true параметрі беріле (немесе браузерден өткенде) FileConductor шлюзі клиентті лезде (HTTP 302) дұрыс Content-Disposition тақырыбы бар S3 Presigned URL-ге бағыттайды. Файл бірден өз бастапқы атауымен жүктіп алынады (мысалы, photo_bridge.jpg):

# Пример скачивания через cURL с сохранением оригинального имени:
curl -L -O -J -H "X-API-Key: whsec_your_key_here" \
  "https://suraqhub.dostyq.app/api/files/download/c0378e90-f99a-4c28-bb8d-d602ff59187a?redirect=true"

Б. JSON-режимі (әдепкі) — екікезеңді интеграция үшін

redirect=true флагі болмағанда эндпоинт метадеректер мен S3-ке уақытша қолтаңбаланған сілтемені (ғұмыр мерзімі 15 минут) қамтитын JSON қайтарады:

GET /api/files/download/c0378e90-f99a-4c28-bb8d-d602ff59187a
X-API-Key: whsec_your_key_here

Ответ:
{
  "status": "success",
  "file_id": "c0378e90-f99a-4c28-bb8d-d602ff59187a",
  "filename": "photo_bridge.jpg",
  "download_url": "https://s3.ktz.dostyq.app/suraqhub-clean/c0378e90-...?X-Amz-Signature=..."
}

4. Интеграция мысалдары

Python (requests / httpx)

import requests

FILE_URL = "https://suraqhub.dostyq.app/api/files/download/c0378e90-f99a-4c28-bb8d-d602ff59187a"
HEADERS = {"X-API-Key": "whsec_your_secret_api_key"}

# Вариант 1: Прямое скачивание с редиректом
response = requests.get(f"{FILE_URL}?redirect=true", headers=HEADERS, stream=True)
if response.status_code == 200:
    with open("downloaded_media.jpg", "wb") as f:
        for chunk in response.iter_content(chunk_size=8192):
            f.write(chunk)
    print("✅ Файл успешно сохранен!")

# Вариант 2: Получение метаданных и presigned URL
meta_resp = requests.get(FILE_URL, headers=HEADERS).json()
print("Имя файла:", meta_resp["filename"])
print("S3 ссылка:", meta_resp["download_url"])

Node.js / JavaScript (fetch)

const fs = require('fs');
const { pipeline } = require('stream/promises');

async function downloadFile(fileId, apiKey) {
  const url = `https://suraqhub.dostyq.app/api/files/download/${fileId}?redirect=true`;
  const res = await fetch(url, {
    headers: { 'X-API-Key': apiKey }
  });

  if (!res.ok) throw new Error(`Download failed: ${res.statusText}`);
  await pipeline(res.body, fs.createWriteStream('downloaded_media.jpg'));
  console.log('✅ Файл успешно загружен');
}
🛡️ Қауіпсіздік саясаттары және suraqhub_downloader рөлі
  • Keycloak рөлі: жүйеде арнайы suraqhub_downloader рөлі енгізілген (Файлдар мен медиатіркемелерді жүктіп алу құқығы). Оны сенімді қызметкерлерге немесе сыртқы жүйенің сервистік тіркелгісіне тағайындап, «Жүйе параметрлерінен» таңдауға болады. Әкімшілерде (suraqhub_admin) жүктіп алуға әрқашан қол жетімді.
  • Антивирустық карантин: ClamAV қызметі файлға CLEAN статусын бермей тұрып, оны жүктіп алу мүмкін емес. Жұққан файлды жүктіп алуға әрекеттенгенде 403 Forbidden қатесі қайтарады.
  • Рұқсаттарды басқару: «Жүйе параметрлерінде» әкімші M2M API кілттері бойынша жүктіп алуды қосу/өшіріп, қажетті рөлді таңдай алады.

Есептерді өз S3-қоймасына экспорттау Storage

Жасалған есептерді тікелей корпоративтік AWS S3, MinIO немесе Ceph бакетіне сақтау мүмкіндігі.

🔒 Fernet мұқабалық шифрлауы

Сіздің S3 рұқсат деректеріңіз (Access Key, Secret Key) createReport GraphQL-мутациясын шақырғанда Fernet алгоритмімен жедел шифрланып, тек оқшауланған фондық воркер ішінде ғана шешіледі.

Қауіпсіздік, ClamAV және қолжетімділік Security

🛡 ClamAV антивирустық кедергісі

Пайдаланушы файлдары ортақ файлдық жүйеге тікелей сақталмайды. Олар оқшауланған ClamAV демоны арқылы автоматты тексеруден өтеді. Жұққан файлдар операторларға немесе экспорттарға түспей тұрып блокталады.

🔐 Content Security Policy (CSP)

SuraqHub интерфейсі қатаң CSP стандарты бойынша жобаланған: unsafe-inline скриптерлері алынып тасталған, барлық оқиғалар модульдік тыңдаушыларға шығарылған — бұл XSS-шабуылдар мен сессия ұрлауының алдын алады.

♿ Интерфейстің қолжетімділігі (WCAG 2.2 AA)

Формалар мүмкіндігі шектеулі адамдар үшін толық қолжетімді: пернетақтамен навигация, семантикалық WAI-ARIA атрибуттары (aria-live, role="region"), экрандық дикторлар (Screen Readers) және контрастты түс палитралары қолдау табады.

👥 Рөлдер және қолжетімділік құқықтары

Рөлдер әкімші тарапынан Keycloak Admin Console-да тағайындалады; платформа ішінде пайдаланушылардың тек оқуға арналған шолуы жүргізіледі:

  • admin — толық қолжетімділік: жүйе параметрлері, интеграциялар, анықтамалықтар, барлық жарияланымдар мен есептер;
  • creator — формалар жасау және тек өз жарияланымдарымен және олар бойынша есептілікпен жұмыс;
  • dictionary_manager — жасаушы құқығынсыз анықтамалықтарды (НАА) жүргізу;
  • suraqhub_downloader — файлдар мен медиатіркемелерді File API арқылы жүктіп алу құқығы (қараңыз: Файлдарды жүктіп алу).

Сонымен қатар әр жарияланымның қолжетімділік деңгейі бар: Public (сілтеме бойынша барлығына ашық) немесе Role Based (тек таңдалған Keycloak рөлдері бар пайдаланушыларға). Мерзімді есептілік тек Role Based режимінде қолжетімді.

Жиі қойылатын сұрақтар (FAQ) Білім базасы

Форма жарияланғаннан кейін оның мекенжайын қалай өзгертуге болады?
«Негізгі» экранында «URL (Мекенжай)» өрісіндегі мәнді өзгертіп, «Жарияланымды сақтау» түймесін басыңыз. Ескеріңіз: ескі сілтеме жұмыс істемей қалады, сондықтан респонденттерге жаңартылған мекенжайды жолдаңыз.
Форма сұрақтарын редакциялағанда ескі жауаптарға не болады?
Бұрын жиналған барлық жауаптар деректер базасында бастапқы күйінде сақталады. Редакциялау кезінде форманың жаңа ревизиясы жасалады. Excel экспортында жауаптар жіберілген сәттегі барлық өрістерімен болады.
Excel экспорты неге асинхронды құрылады?
RabbitMQ арқылы асинхронды өңдеу файлдары бар 500 000+ жауапты экспорттағанда да веб-сервердің таймаутқа ілініспеуін және пайдаланушы интерфейсінің жылдам әрі жауапты болып қалуын қамтамасыз етеді.
Жаңа нұсқа қатесімен сақталса, форманың алдыңғы нұсқасын қалай қайтаруға болады?
«Негізгі» экранында «Ревизиялар тарихы» блогында қажетті күн/уақытты тауып, жазбаға шертіңіз. Жүйе осы ревизия схемасын конструкторға қайтарады. Тексергеннен кейін «Форманы сақтау» түймесін басыңыз.
Вебхук сыртқы жүйеге жетпесе, не істеу керек?
1. URL-эндпоинттеріңіздің кластер желісінен қолжетімділігін тексеріңіз.
2. Серверіңіз 200 OK HTTP-кодын қайтаратынына көз жеткізіңіз.
3. X-SuraqHub-Signature қолтаңбасының валидациясын жазылу құпиясыңызбен дұрыс тексеріңіз.
4. suraqhub.webhooks.failed кезегін талдау үшін «Параметрлер» экранынан диагностика пакетін жүктіп алыңыз.

Мерзімді есептілік

«Толтыру параметрлерінде» күнделікті, апталық немесе айлық есептілікті қосуға болады. Бұл параметр тек Role Based рұқсаты бар жарияланымдар үшін қолжетімді.

  • Ағымдағы есепті жалғастыру: сол кезеңде қайта ашқанда соңғы жіберілген нұсқа көрсетіледі; жаңа жіберу жеке нұсқа ретінде сақталады.
  • Бір рет: кезеңде бір ғана жіберу рұқсат етіледі.
  • Қайта толтыру: әр жіберу дербес.

Жаңа кезеңнің бастапқы деректерін бос қалдыруға немесе өткен кезеңнен көшіруге болады. Бұл параметр жаңа кезеңде форманы алғаш ашқанда ғана қолданылады. Әзірлеушілерге толығырақ: docs/periodic-reporting.md.