Fra studenthybel og en Raspberry Pi, til Firebase og hundrevis av lesere.
Hva
RBKNytt.no er en nettside som samler nyheter om Rosenborg Ballklub fra ulike kilder og presenterer dem på én side. Hovedmålet er at man skal slippe å måtte besøke mange ulike nettsider for å holde seg oppdatert på alt som rører seg i og rundt RBK. Jeg viser kun tittel, ingress og bilde fra sakene og henviser alltid til original-kilde hvis man vil lese nyheten.
Egentlig bare en veldig spisset RSS-feed for meg selv og noen hundre andre.
Hvorfor
Som Rosenborg-supporter ønsket jeg en enklere måte å holde meg oppdatert på alt rundt klubben, uten å måtte innom alle mulige nettsider. Tanken var å lage en tjeneste som hentet overskrifter og lenker automatisk og enkelt kunne ta meg videre til kilden hvis jeg ønsket å lese nyheten.
Prosjektet startet mens jeg bodde på studenthybel. Jeg hadde nettopp lært meg nok Python til å lage noen enkle ting, og det var mye buzz rundt Django på denne tiden. Det tok derfor ikke så veldig lang tid før jeg klarte å hente nyheter fra Rosenborgs egen daværende RSS-feed og vise dem frem på min egen nettside laget med Django.
Hvordan
RBKNytt har gjennomgått flere iterasjoner og teknologiske endringer siden oppstarten. Det begynte helt enkelt med et lite Python-program som leste RSS-feeden til rbk.no og listet ut lenkene. En nettside ble raskt satt opp med Django kjørende på en Raspberry Pi, og etter hvert begynte jeg å hente nyheter fra nettsider uten RSS-feed ved hjelp av Python-biblioteket BeautifulSoup. Jeg ønsket også å kunne finne siste nytt når jeg ikke var hjemme, så jeg satte opp en Raspberry Pi til å kjøre nettsiden min. Med litt god, gammeldags port forwarding og en relativt stabil IP-adresse klarte jeg stort sett å finne RBK-nyheter selv når jeg ikke var hjemme. 🚀
Domenet rbknytt.no ble kjøpt i mai 2016, og nettsiden levde lenge inne i en Ubuntu-Droplet hos DigitalOcean, som jeg trodde var en enkel og rimelig måte å kjøre nettsiden på. Etter hvert ble det imidlertid tungvint å styre ting som backups og HTTPS/SSL manuelt. I tillegg var deploy-prosessen å SSH-e inn på Dropleten og copy/paste de nye Python-filene på riktig plass. Joda, det fantes sikkert bedre måter å gjøre dette på, men det fikk jobben gjort.
Etter å ha vært eneste bruker av RBKNytt i noen måneder tenkte jeg at kanskje det fantes andre likesinnede som også var interessert i RBK-nyheter. I august 2016 la jeg derfor ut en post på Rosenborg-supporterforumet rbkweb.com, og responsen var overveldende positiv. Det ga meg en voldsom motivasjon til å fortsette med prosjektet.
Men med faktiske brukere kom også nye behov og bekymringer. Plutselig føltes det risikabelt å gjøre endringer, spesielt når deploy innebar å dumpe nye filer direkte på serveren.For eksempel, når kildene jeg hentet fra endret seg, kunne det også oppstå morsomme situasjoner, som i eksempelet nedenfor.
Heldigvis har jeg verdens hyggeligste brukere. I stedet for sinne og frustrasjon har de alltid vært hjelpsomme og hyggelige når de informerer om ting som ikke fungerer, eller når hele siden har vært utilgjengelig av diverse årsaker.
Over tid oppsto det også en divergens mellom mitt lokale miljø og produksjonsmiljøet. Dette førte til at jeg til slutt ikke turte å gjøre større endringer. I 2020 bestemte jeg meg for å starte helt på nytt.
Python-kunnskapene fra studiet var ikke vedlikeholdt og var gradvis blitt erstattet med JavaScript og TypeScript. Det ble derfor et naturlig valg å lage en fullstack TypeScript-applikasjon, denne gangen kjørende hos Firebase. Her har jeg hosting, lagring av data i Firestore og henting av nye saker via Cloud Functions. Web scraping gjøres ved hjelp av Puppeteer, en headless nettleser som er lett å kontrollere med JavaScript. Firebase tilbyr gode løsninger for å sette opp et lokalt miljø som ligner produksjon, noe som gir trygghet for at ting oppfører seg som de skal.
Appen ble satt opp med Create React App, som var populært på den tiden. Nå nærmer det seg imidlertid neste store iterasjon for RBKNytt. Jeg kommer nok til å beholde TypeScript, men det hadde vært gøy å gå bort fra Create React App og prøve noe nytt igjen.