Огляд
Гуманітарна організація, що веде польові операції в кількох регіонах, звернулася до нас із робочим процесом, склеєним із таблиць. Польовий персонал, проєктні менеджери та центральний офіс вели власні файли; дані переносилися копіюванням між ними; підготовка донорських 5W-звітів займала дні. Клієнту потрібна була єдина внутрішня платформа, яка б могла:
- Вести облік бенефіціарів та їхніх профілів вразливості
- Реєструвати кожну подію та активність партнерів, прив’язану до конкретного проєкту
- Забезпечити строгу рольову видимість (польовий персонал бачить лише дані своєї організації, HQ бачить усе)
- Формувати 5W-звіти для донорів на запит
- Синхронізувати живі дані в Google Sheets, щоб партнерські організації споживали їх без прямого доступу до бази
- Дозволити нетехнічним менеджерам ставити запитання до даних природною мовою
Нами спроєктовано та реалізовано платформу від початку до кінця на Go.
Архітектура у двох словах
┌────────────────────────────────┐
Браузер → │ Go HTTP server (HTMX) │ ← часткові рендери, без JS-фреймворку
└─────────────┬──────────────────┘
│
Handler → Service → Repository → Cache
│
┌────────────┬───────────┼───────────┬────────────┬──────────────┐
▼ ▼ ▼ ▼ ▼ ▼
RBAC 5W GPT-4 Google WebSocket Audit
(4 ролі) звіти SQL-асистент Sheets Hub Log
Auto-Import
│
PostgreSQL (sqlx) · Redis (сесії, кеш)
Довідкові дані гарячо завантажуються в in-memory кеш при старті; сесії живуть у Redis; GPT-4 асистент виконує SQL через захищений шлюз; фоновий воркер відправляє результати запитів у Google Spreadsheets з налаштовуваним інтервалом.
Що нами розроблено
Доменна модель і RBAC
- Бенефіціари з 13-категорійною таксономією вразливості
- Події, активності партнерів, проєкти, організації, місця
- Append-only журнал аудиту з автоматичною очисткою за політикою зберігання
- Чотирирольова система дозволів — Admin, HQ DB Manager, Project Manager, Manager, User — зі скоупінгом за проєктом та організацією, що забезпечується на рівні service-шару
AI-асистент для SQL-запитів
- GPT-4 з OpenAI function-calling, що дозволяє адміністраторам запитувати базу даних звичайною мовою
- Захищено чорним списком деструктивних ключових слів (
DROP / DELETE / INSERT / UPDATE / SET) - Обмеження розміру відповіді та доступ лише для адмінів
Engine автоімпорту в Google Sheets
- Фоновий воркер виконує користувацькі
SELECT-запити з налаштовуваним інтервалом - Відправляє результати в Google Spreadsheets через Service Account-облікові дані на користувача
- Забезпечує майже-реалтайм обмін даними із зовнішніми стейкхолдерами — без ручного копіювання
Оновлення в реальному часі
- WebSocket-хаб (gorilla/websocket) для живих сповіщень між сесіями
Звітність
- Два генератори звітів, включаючи галузевий стандарт гуманітарного сектору 5W (Who, What, Where, When, for Whom)
- Звіти, готові до завантаження для донорських пакетів
Server-rendered UI
- Go
html/template+ HTMX для швидких часткових оновлень сторінок без JS-фреймворку - Легкий бандл, підтримуваний код, без SPA-тулчейну
Авторизація та сесії
- Вхід через Google OAuth
- Сесії в Redis через
scs/v2
Інфраструктура
- Dockerized two-stage build
- Пайплайн GitLab CI/CD з автодеплоєм на production VPS при кожному push у
main - golang-migrate для версіонування схеми
- Автоматичне очищення журналу аудиту за політикою зберігання
Наскрізна інженерна робота
- Чиста шарувата архітектура: handler → service → repository → cache
- Сирий SQL через sqlx для повного контролю над запитами
- In-memory кеш для довідкових даних, гарячо завантажений при старті
- Перевірки прав на рівні service-шару, без жодної довіри до UI
- Continuous delivery з
mainу production
Технологічний стек
| Шар | Технологія |
|---|---|
| Мова | Go (Golang) |
| База даних | PostgreSQL |
| Кеш / сесії | Redis |
| HTTP / UI | Go html/template + HTMX |
| Real-time | WebSocket (gorilla/websocket) |
| AI | OpenAI GPT-4 (function-calling) |
| Зовнішні інтеграції | Google Sheets API, Google OAuth 2.0 |
| Сесії | scs/v2 (Redis store) |
| SQL | sqlx (сирий SQL) |
| Міграції | golang-migrate |
| Контейнери | Docker, Docker Compose |
| Деплой | GitLab CI/CD → VPS |
Результат
Платформа замінила табличний робочий процес клієнта і стала єдиним джерелом істини для його польових операцій.
- Польовий персонал реєструє події прямо з поля
- Проєктні менеджери формують скоуповані звіти без допомоги IT
- HQ збирає 5W-звіти для донорів за хвилини, а не за дні
- Engine автоімпорту усунув ручне копіювання при обміні даними з партнерами
- GPT-4 SQL-асистент дозволяє нетехнічним менеджерам самостійно відповідати на запитання до даних
Система працює в продакшні з continuous delivery через GitLab CI/CD. Модульна шарувата архітектура дозволила легко розширювати систему — роль HQ DB Manager та модуль активностей партнерів додано вже після запуску, без жодного рефакторингу наявного коду.