Min första professionella SaaS app och många frågor. Upplägg, kostnad?

Permalänk
Avstängd

Min första professionella SaaS app och många frågor. Upplägg, kostnad?

Om det här projektet blir bra kommer jag starta ett företag (igen), och förse bolag inom en viss sektor med min app som tjänst. Bolagen arbetar projektvis. Min app kommer underlätta en liten del av varje projekt enormt, framförallt för de projektanställda men även för själva bolaget. Det är en administrativ process som i dagsläget sköts manuellt av varje projektanställd och är tidskrävande men som kan automatiseras nästan helt.

Fråga nr 1): Är en sådan app/tjänst det som kallas för SaaS, dvs software as a service? Om inte, kallas denna typ av tjänst för något annat?

Min app kommer tillhandahållas för en projektanställd genom en React Native-app på Android och iOS. Den behöver plocka info, i princip bara några kb, från varje anställd, varje dag, och se till att det sparas i en databas. Bolaget som prenumenerar på tjänsten ska få tillgång till en websida som aggregerar informationen från varje anställd i projektet och redovisar det grafiskt och överskådligt.

Informationen som hanteras är inte av känslig natur.
Detta är appens grundfunktionalitet och den viktigaste funktionen. Resten är oväsentligt.

Min första tanke på hur detta ska gå till i praktiken:
Frontend: React.js/React Native
Databas: PostgreSQL
Backend: Behöver kunna hantera upp till 100 anställda per projekt samtidigt, och upp till 30 projekt samtidigt. Det enda som kommer göras är i princip att spara mycket små JSON till en databas och alla CRUD operationer på denna data. Varje klient/anställd kräver ett eget inlogg och databasen får inte råka raderas eller ändras av en obehörig/annan användare. Jag tänker spontant antingen row level security för respektive anställd och att databasen får en ROLE för varje anställd, något som klienten inte hanterar själv utan sköts av back end. Lättare vore dock om man kan lägga upp det så att back enden inte kan råka göra fel, eftersom jag saknar erfarenhet vet jag inte hur det går till oftast.
Fråga nr 2) Kallas den typen av säkerhet på databasen jag är ute efter för något särskilt som jag kan googla vidare? Eller är det bara att skapa en vanlig db med inlogg som bara back enden har tillgång till, och så är det tillräckligt säkert så länge jag inte kodar backenden kasst och ett logikfel sabbar allt?

Fråga nr 3) Jag kan språken java och python förutom js. Eftersom jag vill lära mig Rust så funderar jag på att skriva backenden i Rust, hade vart coolt att ha en app i det språket. Python hade varit lättast dock. Finns det något man bör tänka på här vad gäller säkerhet och prestanda som föranleder vilket språk jag bör skriva i? Är det helt overkill att välja Rust eller dåligt val av annan anledning?

Fråga 4) Min app kommer alltså hantera mycket små mängder data och maximala anrop kommer inte överstiga 1000 per sekund. 95% av tiden kanske max 50 per sekund, och oftast inte ens det. Mellan tumme och lillfinger, vad kommer hosting av det här att gå på i månaden?

Stort tack!

Permalänk
Inaktiv

Tidskrivning?

Permalänk
Avstängd
Skrivet av anon334363:

Tidskrivning?

Va?

Permalänk
Medlem

Användarna av din applikation ska aldrig skriva direkt till databasen. Du skriver en backend som är den enda som skriver till databasen.

Permalänk
Medlem
Skrivet av first:

Tror personen gissar att du har en app för att rapportera arbetstid. D.v.s. tidsskrivning.

Visa signatur

5700x3D | RTX 2060 Super | 2 TB M.2 | 32 GB RAM | Gigabyte DS3H| 750 WATT

Permalänk
Medlem

1) Jag skulle använt en Key/Value store istället, också kallat Document DB, eller Table Storage, möjligen Firebase, se brasklapp nedan. Serverless är att föredra i många fall.

2) Det räcker att backenden vet vad den gör. Om du kör Firebase som databärare till din app har den inbyggd "data-per-användare" grejer och lite annat smått och gott som är trevligt i app-världen, men jag är osäker på hur bra den är om man skulle vilja lägga den bakom en backend, då en stor del av enkelheten att använda med Firebase är att den har utmärkt SDK för att leverera push-liknande funktionalitet. Är också osäker på huruvida den stödjer ordentliga backup-möjligheter utifall du skulle göra ett misstag.

3) Spelar ingen superstor roll vad du skriver i för språk, men Python är nog lite mindre lämpligt annat än som en proof of concept, det skalar rätt illa. Java eller Node backend är nog lämpligast då det finns mest "off-the-shelf" grejer som är klara och redo att agera Web API för de ekosystemen.

4) Redan 50 anrop per sekund är väldigt massivt. Jag tror inte du kommer ha i närheten av det. 1000 anrop per sekund skulle kosta miljoner per år. Om du bygger dina grejer i valfritt moln, kan du skala upp och ut vid behov, börja med gratisnivåerna på allt som går.

Permalänk
Medlem

Jag tycker också volymen verkar… intressant. 50 anrop/s motsvarar ju 1 anrop per minut och användare (30x100 användare). Jag fick det till 1,44 miljoner anrop per dag på en åtta timmars arbetsdag. Om det ska skapas en databasrad/dokument per anrop så blir det snabbt intressant att ha bra index.

Jag skulle också i ett tidigt skede titta på en lösning för att inte dra för mycket batteri ur mobilerna om appen faktiskt ska vara aktiv så mycket.

Det känns som om mycket av valen kring säkerhet i den här lösningen kommer att hänga på kontoadministrationen. Vem skapar konton? Vem kopplar ett konto till en viss kundorganisation? (Det styr ju i förlängningen fakturering) Användningsfallen behöver komma före tekniken på det området, men det kanske bara är otydligt i trådstarten.

Permalänk

Passande nog så har jag nyss påbörjat kurserna Databaser och PHP Programmering i min Webbutvecklingsutbildning så mina svar kan skilja idag och om cirka 7 veckor!

Du bör börja med en Verksamhetsbeskrivning för att ta fram en "Entitets-relationsmodell" för att få ett "hum" om vad som (inte) ska ingå i databasen. Databasen bör utgå från vad verksamheten anser sig behöva data om.

Rörande säkerheten så låter det som "Integritetsvillkor" för att bestämma vem, vilka, var, när och hur de (inte) ska få åtkomst till olika Tabell(er) i olika Databas(er) samt datatypskontroller vid inmatning av användare.

Möjligen kanske du vill implementera så att inloggningsuppgifterna också är kopplade till arbetstelefonernas simkortsnummer för att öka säkerheten? (Givetvis lite extra teknisk support som då krävs när arbetstelefon måste bytas ut)

Är det verkligen så många anrop per sekund? Hur lyckas de projektanställda att uppnå sådana "manuella anrop"? Måste de skriva ned varje fotsteg de tar?

Du kan ju alltid kontakta diverse svenska webb- och/eller serverhotell och ge dem en ungefärlig anropssiffra per sekund av så många personer per sekund och då få en ungefärlig månadskostnad tänker jag?

Mvh,
WKL.

Skrivet av Ernesto:

3) Spelar ingen superstor roll vad du skriver i för språk, men Python är nog lite mindre lämpligt annat än som en proof of concept, det skalar rätt illa. Java eller Node backend är nog lämpligast då det finns mest "off-the-shelf" grejer som är klara och redo att agera Web API för de ekosystemen.

Av ren nyfikenhet så undrar jag vad det är som gör Python dåligt att skala upp med? Syftar du då också på Python som Backend-lösning som talar med databas(er) och klient(er)?

Visa signatur

"Den säkraste koden är den som aldrig skrivs"

Permalänk
Medlem
Skrivet av first:

Den behöver plocka info, i princip bara några kb, från varje anställd, varje dag, och se till att det sparas i en databas.

[...]

Det enda som kommer göras är i princip att spara mycket små JSON till en databas och alla CRUD operationer på denna data.

[...]

Min app kommer alltså hantera mycket små mängder data och maximala anrop kommer inte överstiga 1000 per sekund. 95% av tiden kanske max 50 per sekund, och oftast inte ens det.

Det jag reagerar på är det här. Du säger att:

  • Det ska sparas några KB data för varje anställd varje dag.

  • Det ska sparas i JSON.

  • Du förväntar dig typ ett anrop per anställd per minut, om jag förstår saken rätt.

Det här går inte ihop för mig. Varför i JSON? Ska du spara typ 500 JSON-poster per anställd per dag, och sedan aggregera det? Eller ska du aggregera datat i den JSON du sparar? Varför lagra JSON över huvud taget?

Jag förstår att du är vag när du beskriver din idé, men som det är nu är problemet för dåligt beskrivet för att du ska få ett vettigt svar.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Om ett anrop per minut/anställd, varför inte cache:a i appen?
Om det görs manuellt idag så borde även en fördröjning på 15 minuter innan datan syns i databasen vara tillräckligt.

Vilka resurser använder du på telefonen? Appen ska ju skicka något varje gång, den data som den skicka är det positionsdata eller annan data som kräver att andra funktioner används på telefonen (GPS, Bluetooth etc)?
Har du tänkt på hur mycket batteri appen kommer att konsumera med både att den ska skicka data ofta och hur denna data samlas ihop?

Sedan GDPR. Du kommer att behöva veta hur detta gäller för dig. Gör detta redan i början så att du vet vad du måste hålla reda på under utvecklingen av din lösning. (Vilken information som sparas och varför till exempel.)
Sedan behöver du en funktion som också raderar data enligt GDPR, enkelt i två nivåer (du ser säkert detta när du läser på själv). Den ena är när användaren ber om att data ska raderas, den andra är när data ska raderas för att den inte behövs.
Skillnaden är att när en användare ber om att data ska raderas så innebär det inte att data som omfattas av andra lagar ska raderas, till exempel i ett lönesystem så styr bokföringslagen hur länge data ska sparas. Men det kan finnas annan data som inte behövs enligt bokföringslagen (i detta exempel) som isf ska raderas om användaren ber om det.

När jag läste din OP kom jag tänka på ett system som används för tidsredovisning av en städfirma. Där de anställda checkar in på varje ställe där de ska jobba och checkar ut. Det finns geo-funktioner i systemet så att de inte kan checkan in om de faktiskt inte är på plats. Vet inte om det finns automation (nu) för in/ut checkning baserat på geo lokation.

Visa signatur

Dator: MSI X570 Tomahawk, AMD 5600x, 64 GB RAM, 2xNVMe, 2xSATA SSD, 10 GBit NIC, Grafik Nvidia 3060 12 GB RAM
Skärm: Dell U3821DW 38" ultrawide Bärbar dator: MBA M1
Synology DS1821+ (10Gbit) - Dockers, VM, Surveillance Station 9 kameror
DS3612xs (10Gbit) - Backup sparas till denna från ovan
Skrev jag något vettig? "Tumme up":a så vet jag att det fanns nytta i min post.

Permalänk
Avstängd
Skrivet av Phod:

Det jag reagerar på är det här. Du säger att:

  • Det ska sparas några KB data för varje anställd varje dag.

  • Det ska sparas i JSON.

  • Du förväntar dig typ ett anrop per anställd per minut, om jag förstår saken rätt.

Det här går inte ihop för mig. Varför i JSON? Ska du spara typ 500 JSON-poster per anställd per dag, och sedan aggregera det? Eller ska du aggregera datat i den JSON du sparar? Varför lagra JSON över huvud taget?

Jag förstår att du är vag när du beskriver din idé, men som det är nu är problemet för dåligt beskrivet för att du ska få ett vettigt svar.

Det är bara jag som är dålig på att förklara och har utelämnat en del info.

Datan som ska sparas sänds som en JSON. Det ska inte sparas i databasen som en JSON utan som vanlig text. Det kommer behöva göras ett par gånger om dagen. Ibland kommer många göra det samtidigt.

Det kommer även göras en del andra små anrop av annan data som också tar lite plats. Sådant som hör till övrig funktionalitet.

Tack för att du fick mig att klargöra

Permalänk
Avstängd

Ska läsa alla svar under dagen och återkommer, tack!

Permalänk
Avstängd
Skrivet av Ernesto:

1) Jag skulle använt en Key/Value store istället, också kallat Document DB, eller Table Storage, möjligen Firebase, se brasklapp nedan. Serverless är att föredra i många fall.

2) Det räcker att backenden vet vad den gör. Om du kör Firebase som databärare till din app har den inbyggd "data-per-användare" grejer och lite annat smått och gott som är trevligt i app-världen, men jag är osäker på hur bra den är om man skulle vilja lägga den bakom en backend, då en stor del av enkelheten att använda med Firebase är att den har utmärkt SDK för att leverera push-liknande funktionalitet. Är också osäker på huruvida den stödjer ordentliga backup-möjligheter utifall du skulle göra ett misstag.

3) Spelar ingen superstor roll vad du skriver i för språk, men Python är nog lite mindre lämpligt annat än som en proof of concept, det skalar rätt illa. Java eller Node backend är nog lämpligast då det finns mest "off-the-shelf" grejer som är klara och redo att agera Web API för de ekosystemen.

4) Redan 50 anrop per sekund är väldigt massivt. Jag tror inte du kommer ha i närheten av det. 1000 anrop per sekund skulle kosta miljoner per år. Om du bygger dina grejer i valfritt moln, kan du skala upp och ut vid behov, börja med gratisnivåerna på allt som går.

Jag ska kolla in allt det där. I synnerhet Firebase. Och ok, det blir kanske en Java/Spring app då.

Jag var nog otydlig ang anrop per sekund. Den behöver inte klara av att hantera allt samtidigt, lite delay är lugnt. Och mycket kan nog pushas till klienter på olika tider. Dessutom var det nog en överdrift. Tack för svar.

Permalänk
Avstängd
Skrivet av KAD:

Jag tycker också volymen verkar… intressant. 50 anrop/s motsvarar ju 1 anrop per minut och användare (30x100 användare). Jag fick det till 1,44 miljoner anrop per dag på en åtta timmars arbetsdag. Om det ska skapas en databasrad/dokument per anrop så blir det snabbt intressant att ha bra index.

Jag skulle också i ett tidigt skede titta på en lösning för att inte dra för mycket batteri ur mobilerna om appen faktiskt ska vara aktiv så mycket.

Det känns som om mycket av valen kring säkerhet i den här lösningen kommer att hänga på kontoadministrationen. Vem skapar konton? Vem kopplar ett konto till en viss kundorganisation? (Det styr ju i förlängningen fakturering) Användningsfallen behöver komma före tekniken på det området, men det kanske bara är otydligt i trådstarten.

Jag har beskrivit kasst. Jag menade om alla användare skulle utföra en sak som bara sker 1 gång om dagen, men att alla gör det samtidigt.

Du har helt rätt i att kontoadministreringen kommer vara viktig. I dagsläget tänker jag att jag får en förfrågan ang nytt projekt. Jag ger ut en nyckel som hör till ett nytt projekt enligt kundens önskemål och alla med nyckeln kan signa upp sig på projektet. Det är som sagt ingen känslig info. Fakturering sker inte per person som är inlagd i projektet utan typ av projekt, något som jag kommer kunna sköta vid sidan av.

Om det här skulle ta fart så förväntar jag mig inte mer än ca 3-10 (upp mot 20 st om det faktiskt skulle bli lyckat på riktigt) projekt samtidigt och de löper över flera månader oftast.

Och ja den kommer bli frontend tung. Om det var det du menade dvs.

Permalänk
Avstängd
Skrivet av Gustav-P:

Om ett anrop per minut/anställd, varför inte cache:a i appen?
Om det görs manuellt idag så borde även en fördröjning på 15 minuter innan datan syns i databasen vara tillräckligt.

Vilka resurser använder du på telefonen? Appen ska ju skicka något varje gång, den data som den skicka är det positionsdata eller annan data som kräver att andra funktioner används på telefonen (GPS, Bluetooth etc)?
Har du tänkt på hur mycket batteri appen kommer att konsumera med både att den ska skicka data ofta och hur denna data samlas ihop?

Sedan GDPR. Du kommer att behöva veta hur detta gäller för dig. Gör detta redan i början så att du vet vad du måste hålla reda på under utvecklingen av din lösning. (Vilken information som sparas och varför till exempel.)
Sedan behöver du en funktion som också raderar data enligt GDPR, enkelt i två nivåer (du ser säkert detta när du läser på själv). Den ena är när användaren ber om att data ska raderas, den andra är när data ska raderas för att den inte behövs.
Skillnaden är att när en användare ber om att data ska raderas så innebär det inte att data som omfattas av andra lagar ska raderas, till exempel i ett lönesystem så styr bokföringslagen hur länge data ska sparas. Men det kan finnas annan data som inte behövs enligt bokföringslagen (i detta exempel) som isf ska raderas om användaren ber om det.

När jag läste din OP kom jag tänka på ett system som används för tidsredovisning av en städfirma. Där de anställda checkar in på varje ställe där de ska jobba och checkar ut. Det finns geo-funktioner i systemet så att de inte kan checkan in om de faktiskt inte är på plats. Vet inte om det finns automation (nu) för in/ut checkning baserat på geo lokation.

Viktigt ang GDPR där men det får bli ett senare problem.

Det här liknar tidsredovisningen du beskriver. Det kommer dock inte krävas någon geo. Och det är jag som var otydlig. Det kommer krävas minst ett anrop per dag per klient. Antagligen inte fler än 2 om jag inte implementerar fler funktioner. Jag vill bara inte att det ska uppstå problem om alla gör det samtidigt.

Permalänk

Har lite svårt att hänga med i din tankegång kring prestanda. Men mitt tips hade varit att helt enkelt bygga ett stresstest med Python och se hur hårt du kan trycka. Även om du kör allt lokalt så skaffar du dig en uppfattning.

Om det är så att det är väldigt viktigt att inte applikationen kraschar när alla gör något samtidigt så rekommenderar jag att du göra någon riskbedömning (kallas ibland minirisk) där du skriver upp olika scenarion som kan hända och vad påverkan är. Om du ex inte klarar 1000 request / minut, så är det kanske ok att dom tar 5 minuter?

Jag skulle rekommendera nedan youtube kanal ifall du vill få lite koll på benchmark för enkla http-requests. https://youtube.com/playlist?list=PLLXSvz_XUmmwm0iPJTk6V9__DF...

Permalänk
Medlem

Nu vet jag ju inte alls vilka kunder det rör sig om och så.

Men en tanke är väl att, istället för att du ska generera nycklar, bygga auth med t.ex. Azure AD (utgår då från att dina kunder använder Microsoft 365). Låt de skapa projekt själva, tracka hur många projekt de har i nån admin-vy och ta betalt per aktivt projekt eller annan lämplig modell. Med Azure AD och Graph API kan de sedan själva lägga till andra användare till projekten, förutsatt att användare finns i samma tenant.

Om data ändå ska skickas som JSON, varför inte spara som JSON direkt ned i t.ex. CosmosDB (dokumentdabas i Azure)?

Nu propagerar jag mycket för Azure här, men det du beskriver känns som att det överlag kan lösas med Azure Funtions som skriver/läser från en CosmosDB och så har du dina front ends i React/React Native.

Behöver du mer avancerad backend så tycker jag absolut att du ska undvika Python då alla projekt jag varit involverade med som har Python backend alltid slutar med att den byts ut mot något annat (.NET/C#/whatever).

Som andra har nämnt så gäller såklart GDPR. Jag föreslår att du ändå tar en del höjd för GDPR redan nu. Du är skyldig att följa GDPR och hantera radering/anonymisering av data.