Links

Технически изисквания

Въведение

Изисквания към техническата разработка на проекта с отворен код Подкрепи.бг.

Обхват

Да се създаде безплатна и напълно прозрачна онлайн платформа за дарения, която да може да се използва свободно от граждани и организации.

Изисквания

Публичност

  • Кодът на Проекта трябва да е публичен и това да не компрометира сигурността;
  • Да има публична и лична част на платформата;
  • Всеки да може да се регистрира с популярни социални платформи (Google, Facebook);
  • Дарителите да имат възможност да останат анонимни, ако желаят;
  • Всички работни пароли трябва да се намират извън кода на Проекта.

Разработка от доброволци

  • Да има добра документация:
    • на архитектурата;
    • на връзките между компонентите;
    • на API ниво чрез swagger или подобни инструменти.
  • Да се използват разпространени технологии и работни рамки (frameworks);
  • Да се използва език със стриктно типизиране;
  • Да поддържа бърза разработка на стандартни функционалности;
  • Да може да се стартира целият Проект локално, без голямо натоварване и сложност;
  • Да има безопасни за разработка среди (dev, staging);
  • Да има автоматично:
    • проверка на стила на кода;
    • тестване при създаване на pull request;
    • създаване на контейнери;
    • качване на кода към различните среди.

Споделеност

  • По възможност, да се преизползват общи:
    • правила за валидация на frontend и backend;
    • типове на данните;
    • константни стойности;
    • преводи;
    • функционалности.
  • По възможност, да се използва един и същи език за програмиране.

Сигурност

  • Да се избягват директни външни промени по базата данни;
  • Всеки потребител да има достъп само до своите данни;
  • Да има автоматични тестове, които потвърждават липсата на изтичане на данни;
  • Всички заявки за включване на код да минават през код ревю процес, включващ повече от един технически координатор.

Одит и прозрачност

  • Всяка промяна на базата данни да се записва;
  • Всяко качване или изтриване на файл да се записва;
  • Да има вътрешни статистики за употребата на платформата;
  • Да се пазят статистиките за определено време;
  • Да има скалиране на системата за одит при повишаване на трафика.

Хранилище за файлове

  • Потребителите да имат достъп само до своите и споделените им файлове;
  • Потребителите да могат да свалят всичките си файлове при желание (GDPR);
  • Да има автоматично резервно копие на файловете във външна за платформата среда.

Бази данни

  • Да се използва установена и стабилна база данни;
  • Да се използват миграции на базата данни;
  • Да се използват отделни потребители с ограничени права за различни нужди;
  • Да се използват общи типове на данните за тип на колоните (домейн, тип);
  • Да се използва row level security (RLS), при възможност.

Инфраструктура

  • Да бъде подходящо оразмерена спрямо нуждите на платформата;
  • Да поддържа платформата в добро общо състояние;
  • Да има добра видимост над натоварването на платформата;
  • Да разпределя трафика към различните модули;
  • Да бъде осигурена с контрол на достъпа;
  • При възможност, да поддържа автоматично скалиране, при повече трафик.

Възстановяване след бедствие

  • Да се съхранява кодът за възстановяване на системата (manifests);
  • Да се извършват автоматични резервни копия на базата данни;
  • Да се извършват автоматични резервни копия на хранилището за файлове;
  • Да има ясна процедура по възстановяване на резервни копия.

Злоупотреба и атаки

  • Да се въведат рейт лимити на входящите заявки;
  • Да се използват системи за превенция на DDoS атаки;
  • Да има мрежови ограничения за намаляване рисковете от злоупотреби;
  • Базите данни да не са достъпни извън Системата;
  • Да има валидация на входящите данни на всеки слой.

Възможни варианти

Frontend

Backend

Инфраструктура

  • Kubernetes:
    • Управляван от доставчика на облачни услуги
    • On premise
  • Docker-compose (локално):
    • On premise

Какво имаме разработено до момента?

От възможните работни рамки, базирани на TypeScript, най-подходяща се оказа NestJS.
Бяха взети предвид следните съображения:

Една база данни

Използвайки една база и една схема, вместо отделни, ние даваме възможност да се изгради начална работеща версия на приложението, без излишни технически препятствия. Когато се намери подходящ сценарий, който изисква отделни схеми и бази, той ще бъде имплементиран.
Подходящо решение, което да ни позволи бързо действие и еднотипни промени по базата, е Prisma, свързана с PostgreSQL.
Чрез това решение ние:
  • ще намалим времето за разписване на схемата на базата;
  • ще се подсигурим, че връзките между обектите са в синхрон;
  • ще генерираме типове за обектите в базата автоматично;
  • ще генерираме миграционни скриптове автоматично.
Разбира се, това решение, както и всички останали, би имало недостатъци: