Aina kun näen insinöörien kirjoittavan teknologiastackistaan, olen utelias oppimaan uusia työkaluja. Varsinkin kun pyörittää asioita yksin, etsii aina mahdollisuuksia oppia muiden kokemuksista.
Vuonna 2015 olin turhautunut silloiseen salasanojen hallintatyökalujen tasoon – erityisesti siihen, ettei yksityisiä palvelimia pyörittäville ollut tarjolla kunnollista ratkaisua. Aloin kehittää Psonoa, avointa salasanojen hallintaohjelmaa, jossa on kunnollinen salaus ja turvalliset jakamisominaisuudet. Psonoa ei alun perin ollut tarkoitettu SaaS-palveluksi, muuten olisin todennäköisesti rakentanut tuen useille asiakkaille heti alkuun.
Pienen mittakaavayleiskuvan vuoksi: Psono on tällä hetkellä asennettuna paikallisesti noin 70 maassa, yli 4000 asennuksessa. Pelkkää Psono SaaS:ia käyttää tällä hetkellä yli 15 000 ihmistä, joista suurin osa käyttää meidän ilmaista Psono-yhteisöversiota, joka rakentuu samalle teknologiapohjalle kuin maksullinen Enterprise-tuote.
Tyypillinen Psono-asennus koostuu tietokannasta, palvelimesta, kahdesta verkkokäyttöliittymästä (ylläpitäjille ja käyttäjille), iOS- ja Android-sovelluksista, selaimen lisäosista Chromelle ja Firefoxille. Asiakkaat voivat asentaa lisäksi LDAP-yhdyskäytävän tai tiedostopalvelimen.
Näiden lisäksi infrastruktuuriin kuuluu paljon muutakin. Yrityksen verkkosivustoa ja tuotesivua pyörittävä ratkaisu, lisenssipalvelin Enterprise-tuotteelle, keskitetty ERP-järjestelmä tarjousten ja laskujen hallintaan, kauppa, jossa voi ostaa Psono SaaS:ia ja hallinnoida asennuksia, sekä kirjautumispalvelu OIDC-tuelle.
Artikkelissa tulet huomaamaan, että suosin vanhaa ja "tylsää" tekniikkaa.
Kielet
- Python: Kaikki backend-koodi on kirjoitettu Pythonilla. Pythonin suurin etu on sen kattava ekosysteemi. Tyypityksen puute (moni pitää tätä heikkoutena) mahdollistaa erittäin nopean web-palvelun kehityksen, mikä startupissa on yksi tärkeimmistä kriteereistä.
- Javascript: Voi ei... kuka olisi arvannut! On ollut mahdotonta tehdä modernia verkkosivua ilman Javascriptiä, jo vuodesta 2015 lähtien. ;)
Python on suosikkini web-palveluiden toteuttamiseen. (Jätän tässä kertomatta, miksi muu kieli ei ole mielestäni parempi – siitä riittäisi toiseen blogiartikkeliin.) Yksi iso haaste on kuitenkin, että saat toimitettua koodin kaikkine riippuvuuksineen luotettavasti – tärkeää etenkin, jos ihmiset asentavat ohjelmiston paikallisesti ja pyytävät tukea ongelmatilanteissa. (Nopeus, mistä muiden mielestä voisi mainita, ei tässä kohtaa ole ratkaisevaa. Python on riittävän nopea.)
Frameworkit
- Django: "Se on kuin supervoima yksittäiselle kehittäjälle" (lainatakseni Anthony N. Simonia). Ekosysteemin kanssa se ratkaisee lähes kaikki kohtaamasi ongelmat – autentikaatio, templatet, sähköpostit, tietokantamigraatiot, totp jne.
- Django Rest Framework: Pyörittää kaikkia API-rajapintoja ja tekee hienoa työtä. Eri kerrokset (serialisointi, autentikointi, oikeudet, näkymät) pitävät koodin siistinä ja hallittavana.
- React: Siirsin vasta hiljattain tavanomaisen verkkokäyttöliittymän Reaktiin. Vanha käyttöliittymä (vuodelta 2015) oli tehty AngularJS:llä, ja taaksepäin yhteensopivuuden ylläpito oli melkoinen urakka – esimerkiksi kaikkien käyttäjään viittaavien polkujen tuli säilyä, koska käyttäjät olivat voineet tallentaa kirjanmerkkeihin salaisuuksiaan, käyttää suoralinkkejä, omaa brändäystä jne.
- webpack: Mainitsin tämän, koska se on ainut osa, johon olen tyytymätön. Hidas, hermoja raastava, vaikea oppia... Ainut hyvä puoli on, ettet koskaan jää jumiin – kaikki ongelmat on jo kysytty Stackoverflowssa ja ratkaisut löytyvät.
- Gatsby: Pyörittää yrityksen ja tuotteen staattisia sivuja. Käytin aiemmin Wordpressiä, mutta hallinta ja jatkuva päivitystuska sekä pelko mahdollisesta haavoittuvuuksien hyväksikäytöstä ja negatiivisesta julkisuudesta sai vaihtamaan Gatsbyyn. En ole katunut.
- Vuepress: Paras dokumenttienhallintajärjestelmä, jonka löysin. Kääntää staattisiksi verkkosivuiksi, näyttää modernilta ja pyörittää tällä hetkellä Psonon dokumentaatiota
- Material UI: Tärkein frontend-kirjasto. Ominaisuuksiltaan rikas, yhteensopiva Reactin kanssa ja ulkoasultaan moderni, toisin kuin vanhat Bootstrap-pohjaiset teemat.
Toki muitakin työkaluja voisi mainita tähän, mutta nämä ovat mielestäni tärkeimmät.
Tietokannat
Vaikka Django tukee useita tietokantoja, varhain piti päättää: tuenko kaikkia Djangon tietokantoja vai valitsenko yhden. Syynä oli, että tallensin tietokantaan sisäkkäisiä puumaisia rakenteita – puut usealla juurella ja jaetuilla haaraumilla. Näiden tehokas kysely oli ratkaisevaa, joten kokeiltuani eri vaihtoehdot päädyin Postgreksen ltree-laajennukseen.
Jos aiot kehittää jotain ja pyörittää sitä yksin, sen on toimittava pilvessä luotettavasti pilvipalveluntarjoajan ylläpitämänä. Et myöskään todennäköisesti halua jumittua tiettyyn pilvivendoriin, joten pilviin sitoutumaton ratkaisu rajaa valikoimaa.
Päätökseni:
- Postgres: Kaksi avointa tietokantaa ovat MariaDB ja Postgres. Olin suunnitellut Marialle (lähinnä MariaDB:n Galera-klusterin vuoksi – näitä "nuoren kehittäjän on varauduttava massiiviseen kasvuun" -juttuja ;D), mutta ltree-laajennuksen puute pakotti siirtymään Postgresiin. Nykyään, kun Postgresin skaalausvaihtoehdot ovat kehittyneet, en ole katunut päätöstä.
- Redis: Suunniteltu isompien asennusten välimuistiksi. Redis ja Memcache ovat molemmat hyviä, mutta Redis-protokollasta on tullut de facto -standardi, joten valitsin sen. Ainoa haitta Redisissä on yksisäikeisyys.
Infrastruktuuri
Pikakatsaus Psonon tarvitsemiin palveluihin:
- Gitlab: Gitlab automatisoi kaiken Psonossa. Kaikki on automatisoitu, mikä on olennaista, jotta hallitsen julkaisuita ja ylläpidän koko ekosysteemiä. Vuonna 2015 avoimen lähdekoodin projektit olivat Githubissa, mutta Gitlab oli ja on mielestäni ominaisuuksiltaan omaa luokkaansa (Githubin hakua lukuun ottamatta). Gitlab pyörittää koontia, julkaisuja, haavoittuvuustarkistuksia KAIKILLE ohjelmistoille, joita käytämme.
- Cloudflare: Ehkä innovatiivisin yritys, jonka tunnen – vaikuttanut minuun viimeisen 10 vuoden aikana. Voi rehellisesti sanoa, että Cloudflare tuottaa suuren osan internetistä. Saan sen kautta nimipalvelimet, TLS-sertifikaatit, CDN:n ja edistyneet ominaisuudet, kuten edge workerit. DDoS- ja WAF-suojaus ovat erityisen tärkeitä salasanojen hallintapalvelulle. Haluaisin käyttää heidän SSL-palveluna-toimintoa, jotta SaaS-asiakkaat voisivat konfiguroida omat domaininsa, mutta Cloudflaren Enterprise-tason hinta on liian korkea. Toivon, että tämä julkaistaan joskus itsenäisenä ostopalveluna.
- namecheap: Käytän domainien ja SSL-sertifikaattien hallintaan.
- Google Cloud Run: Kaikki backend-palvelimet pyörivät Google Cloud Runissa, joka on kustannustehokas ja luotettava ratkaisu, jos haluaa ajaa palvelurypästä. Kun stackin saa toimimaan, se tekee hyvin työnsä. Huippuluokan API/cli-yhdistäminen on iso bonus. Haittoja: Googlelta puuttuu tuki ja koskaan ei tiedä, päättääkö Google lopettaa tuotteen kun Cloudin sijaluku #3 ei kiinnosta enää.
- Artifactory: Suojaa build-prosessia npm:n katkoilta ja säilyttää rakennusartefaktit (ei ollut Gitlabissa 2015).
- Docker Hub: Tallentaa kaikki Docker-kontit, tekee turvatarkistuksia ja jakaa kontteja.
- Brevo: Hoitaa kaikki sähköpostit. Toisin kuin monissa muissa sähköpostipalveluissa, Brevolla on hyvät lokit ja analyysit. Tuki on huippua. Ainoa ongelma joskus on viestien päätyminen roskapostiin (vaikka SPF, DMARC jne. ovat kunnossa) – mutta muuten erinomainen.
- Poeditor: Käännöstyökalu. Muiden avustajien on helppo pyytää oikeuksia, mikä on tärkeää ulkopuoliselle avulle. Tuki on erinomaista ja vastaukset tulevat nopeasti.
- Docker: Ehdottomasti parhaita päätöksiä koko projektille. Pythonin riippuvuuksien ja toimivan ympäristön toimitus ilman Dockeria on hankalaa. Jos asiakkaan pitää saada ohjelmisto pyörimään paikallisesti ja päivittää/ylläpitää, Docker mahdollistaa tämän ja antaa täydellisen hallinnan asennetuista paketeista – ratkaisee vähintään 70 % tukiongelmista (vaikka aiheuttaakin 20 % uusia, kun Docker ei ole kaikille tuttu ;D).
Seuranta ja valvonta
Kaikki ei voi sujua aina täydellisesti, joten tarvitset työkalut havaita ja paikantaa virheet:
- Google Cloud logging: Jos olet Google-pilvessä, luonnollinen valinta
- Sentry: Ykköstyökalu virheilmoituksiin. Kun olet kokeillut sitä, et halua siitä luopua. Antaa tarvittavan näkyvyyden kaikkiin virheisiin.
- Uptimerobot: Tarkkailee eri palvelujen tilaa ja ilmoittaa, jos jokin menee nurin. Julkinen status löytyy täältä https://stats.psono.com/, joka kattaa vain osan palveluista – mutta toivottavasti kertoo järjestelmän luotettavuudesta.
Kehitysympäristö
Pieni katsaus siihen, miltä paikallinen kehitysympäristöni näyttää:
- Windows ja WSL: Voin saada tästä kritiikkiä, mutta kyllä – käytän Windowsia. Vuosia sitten minulla oli aina jossain Linux-virtuaalikone, johon yhdistyin kehittäessäni, nykyään käytän WSL:ää. Saan yhdistettyä molempien parhaat puolet.
- Pycharm / Webstorm: Käytän Jetbrainin IDE-työkaluja. Etäkehitysominaisuudet ovat olennaisia työnkulussani ja "kaikki ominaisuudet mukana" -filosofia sopii hyvin. Joskus minulla on 20 projektia auki, joten koneessa pitää olla tarpeeksi muistia. VSCode lienee nykyään hyvä vaihtoehto, mutta olen tottunut Jetbrainsiin eikä uuden oppimiseen nyt riitä paukkuja. Jokainen käyttäköön sitä, johon on tottunut.
Tuki
Tukipalveluiden hallintaan tarvitaan tiettyjä työkaluja:
- Freshdesk: Tyypillinen sähköpostitukiohjelma. Auttaa seuraamaan asiakaspalvelupyyntöjä. Tarjosi aiemmin hyvän ilmaistason, mikä oli alkutaipaleella elintärkeää.
- Discord: Jotkut asiakkaat toivovat reaaliaikaisempaa keskustelua – tähän Discord sopii hyvin.
Muuta
Muita mainitsemisen arvoisia työkaluja – erityisesti pankeille niille, jotka haluavat pyörittää yritystään Saksassa:
- Odoo: Paras ERP-järjestelmä. Avoimen lähdekoodin versio on ilmainen ja sitä on helppo laajentaa pythonilla ja pienellä XML-osaamisella. Räätälöintimahdollisuudet ja rajapinnat omiin API:eihin ovat huippuluokkaa.
- Holvi: Pääpankkimme. Saksassa pitää olla pankki, joka sallii perustajatilin ("Gründerkonto"), eli tili joka liitetään yritykseen, joka ei vielä ole täysin rekisteröity ja johon voi siirtää pääomaan yrityksen rekisteröintiä varten. Vähän kanan ja munan ongelma. Suuret pankit, jotka tämän mahdollistavat, ovat kalliita. Holvin rekisteröinti sujui sujuvasti. Ainoa miinus on kansainvälisten maksujen tuen puute, mutta siihen auttaa seuraava palvelu.
- Wise: Toinen pankkitilimme. Maksut ovat erittäin alhaiset (ei kuukausimaksuja), käyttöönotto toimii moitteetta, ovat hyvin verkottuneita ja mahdollistavat nopeat kansainväliset siirrot – ei tarvitse odotella viikkokausia rahan liikkumista.
Turvallisuus
Tästä voisi kirjoittaa oman blogikirjoituksen – miten käyttäjähallinta, infrastruktuuri, käyttöoikeudet on järjestetty. Koska tämä on yksi Psonon tärkeimmistä turvallisuusasioista, en mene yksityiskohtiin ja pysyn tässä summittaisena: Käytämme sekä Google Cloud- että Azure-palveluja, käyttäjä- ja ryhmärakenne täysin erillään. On erikseen käyttäjät ylläpitotehtäviin ja päivittäisiin tehtäviin. Käytän eri fyysisiä ja virtuaalisia koneita Psonon hallintaan, ylläpitoon ja tukitehtäviin. Ylläpitotyöt tehdään vain erityisellä, kovennetulla fyysisellä laitteella, joka on varattu vain tähän. Jokainen tili on suojattu laitteistotokenilla. Kaikki laitteet ovat keskitetysti hallittuja ja niissä on turvallisuuskäytännöt, jotta laitteet täyttävät pankkitasoiset vaatimukset.
Lähteet
Tämä artikkeli sai paljon inspiraatiota Anthony N. Simonin Panelbear-artikkelista.