Технически изисквания
Въведение
Изисквания към техническата разработка на проекта с отворен код Подкрепи.бг.
Обхват
Да се създаде безплатна и напълно прозрачна онлайн платформа за дарения, която да може да се използва свободно от граждани и организации.
Изисквания
Публичност
- Кодът на Проекта трябва да е публичен и това да не компрометира сигурността; 
- Да има публична и лична част на платформата; 
- Всеки да може да се регистрира с популярни социални платформи (Google, Facebook); 
- Дарителите да имат възможност да останат анонимни, ако желаят; 
- Всички работни пароли трябва да се намират извън кода на Проекта. 
Разработка от доброволци
- Да има добра документация: - на архитектурата; 
- на връзките между компонентите; 
- на API ниво чрез swagger или подобни инструменти. 
 
- Да се използват разпространени технологии и работни рамки (frameworks); 
- Да се използва език със стриктно типизиране; 
- Да поддържа бърза разработка на стандартни функционалности; 
- Да може да се стартира целият Проект локално, без голямо натоварване и сложност; 
- Да има безопасни за разработка среди (dev, staging); 
- Да има автоматично: - проверка на стила на кода; 
- тестване при създаване на pull request; 
- създаване на контейнери; 
- качване на кода към различните среди. 
 
Споделеност
- По възможност, да се преизползват общи: - правила за валидация на frontend и backend; 
- типове на данните; 
- константни стойности; 
- преводи; 
- функционалности. 
 
- По възможност, да се използва един и същи език за програмиране. 
Сигурност
- Да се избягват директни външни промени по базата данни; 
- Всеки потребител да има достъп само до своите данни; 
- Да има автоматични тестове, които потвърждават липсата на изтичане на данни; 
- Всички заявки за включване на код да минават през код ревю процес, включващ повече от един технически координатор. 
Одит и прозрачност
- Всяка промяна на базата данни да се записва; 
- Всяко качване или изтриване на файл да се записва; 
- Да има вътрешни статистики за употребата на платформата; 
- Да се пазят статистиките за определено време; 
- Да има скалиране на системата за одит при повишаване на трафика. 
Хранилище за файлове
- Потребителите да имат достъп само до своите и споделените им файлове; 
- Потребителите да могат да свалят всичките си файлове при желание (GDPR); 
- Да има автоматично резервно копие на файловете във външна за платформата среда. 
Бази данни
- Да се използва установена и стабилна база данни; 
- Да се използват миграции на базата данни; 
- Да се използват отделни потребители с ограничени права за различни нужди; 
- Да се използват общи типове на данните за тип на колоните (домейн, тип); 
- Да се използва row level security (RLS), при възможност. 
Инфраструктура
- Да бъде подходящо оразмерена спрямо нуждите на платформата; 
- Да поддържа платформата в добро общо състояние; 
- Да има добра видимост над натоварването на платформата; 
- Да разпределя трафика към различните модули; 
- Да бъде осигурена с контрол на достъпа; 
- При възможност, да поддържа автоматично скалиране, при повече трафик. 
Възстановяване след бедствие
- Да се съхранява кодът за възстановяване на системата (manifests); 
- Да се извършват автоматични резервни копия на базата данни; 
- Да се извършват автоматични резервни копия на хранилището за файлове; 
- Да има ясна процедура по възстановяване на резервни копия. 
Злоупотреба и атаки
- Да се въведат рейт лимити на входящите заявки; 
- Да се използват системи за превенция на DDoS атаки; 
- Да има мрежови ограничения за намаляване рисковете от злоупотреби; 
- Базите данни да не са достъпни извън Системата; 
- Да има валидация на входящите данни на всеки слой. 
Възможни варианти
Frontend
- Графична библиотека: 
Backend
- Основен транспорт на данни: - REST: 
 
- Работна рамка: - TypeScript: - https://nextjs.org/docs/api-routes (интегриран с фронтенд) 
 
- DB driven: 
 
- База данни: - Postgres 
- Миграции: 
 
Инфраструктура
- Kubernetes: - Управляван от доставчика на облачни услуги 
- On premise 
 
- Docker-compose (локално): - On premise 
 
Какво имаме разработено до момента?
От възможните работни рамки, базирани на TypeScript, най-подходяща се оказа NestJS.
Бяха взети предвид следните съображения:
- общност на Проекта (https://github.com/nestjs/nest 40k ⭐); 
- документация; 
- примерни проекти; 
- включени стандартни компоненти: - oбработка на грешки 
 
Една база данни
Използвайки една база и една схема, вместо отделни, ние даваме възможност да се изгради начална работеща версия на приложението, без излишни технически препятствия. Когато се намери подходящ сценарий, който изисква отделни схеми и бази, той ще бъде имплементиран.
Подходящо решение, което да ни позволи бързо действие и еднотипни промени по базата, е Prisma, свързана с PostgreSQL.
Чрез това решение ние:
- ще намалим времето за разписване на схемата на базата; 
- ще се подсигурим, че връзките между обектите са в синхрон; 
- ще генерираме типове за обектите в базата автоматично; 
- ще генерираме миграционни скриптове автоматично. 
Разбира се, това решение, както и всички останали, би имало недостатъци:
- притежава познати ограничения; 
- не можем да използваме абсолютно всичко, което базата поддържа. 
Last updated
Was this helpful?
