Kvantesikker e-post: Hvordan vi bruker krypterte SQLite-postbokser for Ă„ holde e-posten din trygg

Quantum-safe encrypted email service illustration

Forord

Important

VÄr e-posttjeneste er 100 % Äpen kildekode og personvernfokusert gjennom sikre og krypterte SQLite-postbokser.

Frem til vi lanserte IMAP-stÞtte, brukte vi MongoDB for vÄre behov for vedvarende datalagring.

Denne teknologien er fantastisk, og vi bruker den fortsatt i dag – men for Ă„ ha kryptering i ro med MongoDB mĂ„ du bruke en leverandĂžr som tilbyr MongoDB Enterprise, som Digital Ocean eller Mongo Atlas – eller betale for en enterprise-lisens (og deretter mĂ„tte forholde deg til salgsavdelingens responstid).

VĂ„rt team hos Forward Email trengte en utviklervennlig, skalerbar, pĂ„litelig og kryptert lagringslĂžsning for IMAP-postbokser. Som utviklere av Ă„pen kildekode var det i strid med vĂ„re prinsipper Ă„ bruke en teknologi som krever lisensavgift for Ă„ fĂ„ kryptering i ro – derfor eksperimenterte, forsket og utviklet vi en ny lĂžsning fra bunnen av for Ă„ dekke disse behovene.

I stedet for Ä bruke en delt database for Ä lagre postboksene dine, lagrer og krypterer vi hver enkelt postboks med ditt passord (som kun du har). VÄr e-posttjeneste er sÄ sikker at hvis du glemmer passordet ditt, mister du postboksen din (og mÄ gjenopprette med offline sikkerhetskopier eller starte pÄ nytt).

Fortsett Ä lese mens vi gÄr i dybden med en sammenligning av e-postleverandÞrer, hvordan tjenesten vÄr fungerer, vÄr teknologistabel og mer.

Sammenligning av e-postleverandĂžrer

Vi er den eneste 100 % Äpen kildekode og personvernfokuserte e-postleverandÞren som lagrer individuelt krypterte SQLite-postbokser, tilbyr ubegrensede domener, aliaser og brukere, og har stÞtte for utgÄende SMTP, IMAP og POP3:

I motsetning til andre e-postleverandĂžrer trenger du ikke betale for lagring per domene eller alias med Forward Email. Lagringen deles pĂ„ tvers av hele kontoen din – sĂ„ hvis du har flere egendefinerte domenenavn og flere aliaser pĂ„ hvert, er vi den perfekte lĂžsningen for deg. Merk at du fortsatt kan sette lagringsgrenser om Ăžnskelig per domene eller alias.

Les sammenligning av e-posttjenester

Hvordan fungerer det

  1. Ved Ă„ bruke e-postklienten din som Apple Mail, Thunderbird, Gmail eller Outlook – kobler du til vĂ„re sikre IMAP-servere med brukernavn og passord:

    • Brukernavnet ditt er ditt fulle alias med domenet ditt, for eksempel hello@example.com.
    • Passordet ditt genereres tilfeldig og vises kun i 30 sekunder nĂ„r du klikker Generer passord fra Min konto Domener Aliaser.
  2. NÄr du er tilkoblet, vil e-postklienten din sende IMAP-protokollkommandoer til vÄr IMAP-server for Ä holde postboksen din synkronisert. Dette inkluderer Ä skrive og lagre utkast til e-poster og andre handlinger du mÄtte gjÞre (f.eks. merke en e-post som Viktig eller flagge en e-post som SÞppelpost/Spam).

  3. E-postutvekslingsservere (ofte kalt "MX"-servere) mottar ny innkommende e-post og lagrer den i postboksen din. NÄr dette skjer, vil e-postklienten din bli varslet og synkronisere postboksen din. VÄre e-postutvekslingsservere kan videresende e-posten din til en eller flere mottakere (inkludert webhooks), lagre e-posten din for deg i din krypterte IMAP-lagring hos oss, eller begge deler!

  4. Bak kulissene fungerer vÄr sikre e-postlagringsdesign pÄ to mÄter for Ä holde postboksene dine krypterte og kun tilgjengelige for deg:

    • NĂ„r ny e-post mottas for deg fra en avsender, skriver vĂ„re e-postutvekslingsservere til en individuell, midlertidig og kryptert postboks for deg.

    • NĂ„r du kobler til vĂ„r IMAP-server med e-postklienten din, blir passordet ditt kryptert i minnet og brukt til Ă„ lese og skrive til postboksen din. Postboksen din kan kun leses fra og skrives til med dette passordet. Husk at siden du er den eneste med dette passordet, kan kun du lese og skrive til postboksen nĂ„r du fĂ„r tilgang til den. Neste gang e-postklienten din prĂžver Ă„ hente e-post eller synkroniserer, vil de nye meldingene dine bli overfĂžrt fra denne midlertidige postboksen og lagret i din faktiske postboksfil ved bruk av det oppgitte passordet. Merk at denne midlertidige postboksen blir tĂžmt og slettet etterpĂ„ slik at kun din passordbeskyttede postboks har meldingene.

    • Hvis du er tilkoblet IMAP (f.eks. ved bruk av en e-postklient som Apple Mail eller Thunderbird), trenger vi ikke Ă„ skrive til midlertidig disklagring. Ditt krypterte IMAP-passord i minnet hentes og brukes i stedet. I sanntid, nĂ„r en melding forsĂžker Ă„ leveres til deg, sender vi en WebSocket-forespĂžrsel til alle IMAP-servere for Ă„ spĂžrre om de har en aktiv Ăžkt for deg (dette er hentingen), og deretter vil vi videreformidle det krypterte passordet i minnet – slik at vi ikke trenger Ă„ skrive til en midlertidig postboks, vi kan skrive til din faktiske krypterte postboks ved bruk av ditt krypterte passord.

  5. Sikkerhetskopier av dine krypterte postbokser tas daglig. Du kan ogsÄ nÄr som helst be om en ny sikkerhetskopi eller laste ned den nyeste sikkerhetskopien fra Min konto Domener Alias. Hvis du bestemmer deg for Ä bytte til en annen e-posttjeneste, kan du enkelt migrere, laste ned, eksportere og slette postboksene og sikkerhetskopiene dine nÄr som helst.

Teknologier

Databaser

Vi utforsket andre mulige lagringslag for databaser, men ingen tilfredsstilte kravene vÄre like godt som SQLite gjorde:

Database Kryptering i ro Sandboxed postbokser Lisens Brukt overalt
SQLite ⭐ ✅ Ja med SQLite3MultipleCiphers ✅ ✅ Public Domain ✅
MongoDB ❌ "Tilgjengelig kun i MongoDB Enterprise" ❌ Relasjonsdatabase ❌ AGPL og SSPL-1.0 ❌
rqlite ❌ Kun nettverk ❌ Relasjonsdatabase ✅ MIT ❌
dqlite ❌ Utestet og ikke stĂžttet ennĂ„? ❌ Utestet og ikke stĂžttet ennĂ„? ✅ LGPL-3.0-only ❌
PostgreSQL ✅ Ja ❌ Relasjonsdatabase ✅ PostgreSQL (lik BSD eller MIT) ❌
MariaDB ✅ Kun for InnoDB ❌ Relasjonsdatabase ✅ GPLv2 og BUSL-1.1 ❌
CockroachDB ❌ Kun Enterprise-funksjon ❌ Relasjonsdatabase ❌ BUSL-1.1 og andre ❌

Her er et blogginnlegg som sammenligner flere SQLite-database lagringsalternativer i tabellen over.

Sikkerhet

Til enhver tid bruker vi kryptering i ro (AES-256), kryptering under overfĂžring (TLS), DNS over HTTPS ("DoH") ved bruk av 🍊 Tangerine, og sqleet (ChaCha20-Poly1305) kryptering pĂ„ postbokser. I tillegg bruker vi token-basert tofaktorautentisering (i motsetning til SMS som er utsatt for man-in-the-middle-angrep), roterte SSH-nĂžkler med deaktivert root-tilgang, eksklusiv tilgang til servere gjennom begrensede IP-adresser, og mer. I tilfelle et evil maid-angrep eller en illojal ansatt fra en tredjepartsleverandĂžr, kan postboksen din fortsatt kun Ă„pnes med ditt genererte passord. VĂŠr trygg pĂ„ at vi ikke er avhengige av noen tredjepartsleverandĂžrer annet enn vĂ„re SOC Type 2-kompatible serverleverandĂžrer Cloudflare, DataPacket, Digital Ocean, GitHub og Vultr.

MÄlet vÄrt er Ä ha sÄ fÄ single point of failures som mulig.

Postbokser

tldr; VÄre IMAP-servere bruker individuelt krypterte SQLite-databaser for hver av postboksene dine.

SQLite er en ekstremt populĂŠr innebygd database – den kjĂžrer for Ăžyeblikket pĂ„ telefonen og datamaskinen din – og brukes av nesten alle store teknologier.

For eksempel, pĂ„ vĂ„re krypterte servere finnes det en SQLite-databasepostboks for linux@example.com, info@example.com, hello@example.com og sĂ„ videre – Ă©n for hver som en .sqlite databasefil. Vi navngir heller ikke databasefilene med e-postadressen – i stedet bruker vi BSON ObjectID og unike UUID-er som genereres, som ikke avslĂžrer hvem postboksen tilhĂžrer eller hvilken e-postadresse den er knyttet til (f.eks. 353a03f21e534321f5d6e267.sqlite).

Hver av disse databasene er kryptert med ditt passord (som kun du har) ved hjelp av sqleet (ChaCha20-Poly1305). Dette betyr at postboksene dine er individuelt krypterte, selvstendige, sandboxed og portable.

Vi har finjustert SQLite med fĂžlgende PRAGMA:

PRAGMA FormÄl
cipher=chacha20 ChaCha20-Poly1305 SQLite databasekryptering. Se better-sqlite3-multiple-ciphers under Projects for mer innsikt.
key="****************" Dette er ditt dekrypterte passord kun i minnet som sendes gjennom e-postklientens IMAP-tilkobling til vÄr server. Nye databaseinstanser opprettes og lukkes for hver lese- og skrivesesjon (for Ä sikre sandboxing og isolasjon).
journal_model=WAL Write-ahead-log ("WAL") som Ăžker ytelsen og tillater samtidig lese-tilgang.
busy_timeout=5000 Forhindrer skrive-lÄsefeil mens andre skriver operasjoner pÄgÄr.
synchronous=NORMAL Øker holdbarheten til transaksjoner uten risiko for datakorrupsjon.
foreign_keys=ON SÞrger for at fremmednÞkler (f.eks. en relasjon fra en tabell til en annen) hÄndheves. Dette er som standard ikke aktivert i SQLite, men for validering og dataintegritet bÞr det vÊre aktivert.
encoding='UTF-8' Standard koding som brukes for Ă„ sikre utviklerfornuft.

Alle andre standardinnstillinger er fra SQLite som spesifisert i den offisielle PRAGMA-dokumentasjonen.

Samtidighet

kort oppsummert; Vi bruker WebSocket for samtidige lesinger og skrivinger til dine krypterte SQLite-postbokser.

Lesinger

E-postklienten din pĂ„ telefonen kan lĂžse imap.forwardemail.net til en av vĂ„re Digital Ocean IP-adresser – og skrivebords-klienten din kan lĂžse en annen IP fra en annen leverandĂžr helt separat.

Uansett hvilken IMAP-server e-postklienten din kobler til, Ăžnsker vi at tilkoblingen skal lese fra databasen din i sanntid med 100 % nĂžyaktighet. Dette gjĂžres gjennom WebSockets.

Skrivinger

Skriving til databasen din er litt annerledes – siden SQLite er en innebygd database og postboksen din som standard ligger i Ă©n enkelt fil.

Vi hadde utforsket alternativer som litestream, rqlite og dqlite nedenfor – men ingen av disse tilfredsstilte vĂ„re krav.

For Ă„ utfĂžre skrivinger med write-ahead-logging ("WAL") aktivert – mĂ„ vi sikre at kun Ă©n server ("PrimĂŠr") er ansvarlig for dette. WAL Ăžker samtidig tilgang betydelig og tillater Ă©n skriver og flere lesere.

PrimÊrserveren kjÞrer pÄ dataserverne med monterte volumer som inneholder de krypterte postboksene. Fra et distribusjonsperspektiv kan du betrakte alle de individuelle IMAP-serverne bak imap.forwardemail.net som sekundÊre servere ("SekundÊr").

Vi oppnÄr toveis kommunikasjon med WebSockets:

  • PrimĂŠrservere bruker en instans av ws's WebSocketServer-server.
  • SekundĂŠrservere bruker en instans av ws's WebSocket-klient som er pakket inn med websocket-as-promised og reconnecting-websocket. Disse to wrapperne sikrer at WebSocket kobler til pĂ„ nytt og kan sende og motta data for spesifikke database-skrivinger.

Sikkerhetskopier

kort oppsummert; Sikkerhetskopier av dine krypterte postbokser tas daglig. Du kan ogsÄ umiddelbart be om en ny sikkerhetskopi eller laste ned den nyeste sikkerhetskopien nÄr som helst fra Min konto Domener Alias.

For sikkerhetskopier kjÞrer vi ganske enkelt SQLite-kommandoen VACUUM INTO hver dag under IMAP-kommando-behandling, som benytter ditt krypterte passord fra en IMAP-tilkobling i minnet. Sikkerhetskopier lagres hvis ingen eksisterende sikkerhetskopi oppdages eller hvis SHA-256-hashen har endret seg pÄ filen sammenlignet med den nyeste sikkerhetskopien.

Merk at vi bruker VACUUM INTO-kommandoen i stedet for den innebygde backup-kommandoen fordi hvis en side endres under en backup-operasjon, mÄ den starte pÄ nytt. VACUUM INTO-kommandoen tar et Þyeblikksbilde. Se disse kommentarene pÄ GitHub og Hacker News for mer innsikt.

I tillegg bruker vi VACUUM INTO i stedet for backup, fordi backup-kommandoen ville etterlate databasen ukryptert i en kort periode inntil rekey blir kalt (se denne GitHub-kommentaren for innsikt).

SekundĂŠrserveren vil instruere PrimĂŠrserveren over WebSocket-tilkoblingen til Ă„ utfĂžre sikkerhetskopien – og PrimĂŠrserveren vil deretter motta kommandoen og deretter:

  1. Koble til din krypterte postboks.
  2. Skaffe en skrive-lÄs.
  3. KjĂžre en WAL-sjekkpunkt via wal_checkpoint(PASSIVE).
  4. KjĂžre SQLite-kommandoen VACUUM INTO.
  5. Sikre at den kopierte filen kan Äpnes med det krypterte passordet (sikkerhetsmekanisme).
  6. Laste den opp til Cloudflare R2 for lagring (eller din egen leverandĂžr hvis spesifisert).

Husk at postkassene dine er kryptert – og selv om vi har IP-begrensninger og andre autentiseringstiltak pĂ„ plass for WebSocket-kommunikasjon – i tilfelle en ondsinnet aktĂžr, kan du vĂŠre trygg pĂ„ at med mindre WebSocket-payloaden har ditt IMAP-passord, kan den ikke Ă„pne databasen din.

Det lagres kun én sikkerhetskopi per postkasse for Þyeblikket, men i fremtiden kan vi tilby punkt-i-tid-gjenoppretting ("PITR").

VÄre IMAP-servere stÞtter SEARCH-kommandoen med komplekse spÞrringer, regulÊre uttrykk og mer.

Rask sĂžkeytelse skyldes FTS5 og sqlite-regex.

Vi lagrer Date-verdier i SQLite-postkassene som ISO 8601-strenger via Date.prototype.toISOString (med UTC tidssone for at likhets-sammenligninger skal fungere riktig).

Indekser lagres ogsÄ for alle egenskaper som er i sÞkespÞrringer.

Prosjekter

Her er en tabell som skisserer prosjekter vi bruker i vÄr kildekode og utviklingsprosess (sortert alfabetisk):

Prosjekt FormÄl
Ansible DevOps-automatiseringsplattform for Ä vedlikeholde, skalere og administrere hele serverflÄten vÄr med letthet.
Bree Jobbplanlegger for Node.js og JavaScript med cron, datoer, ms, later og brukervennlig stĂžtte.
Cabin Utviklervennlig JavaScript- og Node.js-loggerbibliotek med sikkerhet og personvern i tankene.
Lad Node.js-rammeverk som driver hele vÄr arkitektur og ingeniÞrdesign med MVC og mer.
MongoDB NoSQL-databaselĂžsning som vi bruker for Ă„ lagre all annen data utenfor postkasser (f.eks. din konto, innstillinger, domener og alias-konfigurasjoner).
Mongoose MongoDB objekt-dokumentmodellering ("ODM") som vi bruker pĂ„ tvers av hele stacken vĂ„r. Vi har skrevet spesielle hjelpere som lar oss enkelt fortsette Ă„ bruke Mongoose med SQLite 🎉
Node.js Node.js er det Äpen kildekode, plattformuavhengige JavaScript-runtime-miljÞet som kjÞrer alle vÄre serverprosesser.
Nodemailer Node.js-pakke for Ă„ sende e-poster, opprette tilkoblinger og mer. Vi er en offisiell sponsor av dette prosjektet.
Redis In-memory database for caching, publish/subscribe-kanaler og DNS over HTTPS-forespĂžrsler.
SQLite3MultipleCiphers Krypteringstillegg for SQLite som tillater at hele databasefiler krypteres (inkludert write-ahead-log ("WAL"), journal, rollback, 
).
SQLiteStudio Visuell SQLite-editor (som du ogsÄ kan bruke) for Ä teste, laste ned og vise utviklingspostkasser.
SQLite Innebygd databasenivÄ for skalerbar, selvstendig, rask og robust IMAP-lagring.
Spam Scanner Node.js anti-spam, e-postfiltrering og phishing-forebyggingsverktÞy (vÄrt alternativ til Spam Assassin og rspamd).
Tangerine DNS over HTTPS-forespþrsler med Node.js og caching ved bruk av Redis – som sikrer global konsistens og mye mer.
Thunderbird VÄrt utviklingsteam bruker dette (og anbefaler det ogsÄ) som den foretrukne e-postklienten Ä bruke med Forward Email.
UTM VÄrt utviklingsteam bruker dette for Ä lage virtuelle maskiner for iOS og macOS for Ä teste forskjellige e-postklienter (parallelt) med vÄre IMAP- og SMTP-servere.
Ubuntu Moderne Äpen kildekode Linux-basert serveroperativsystem som driver all vÄr infrastruktur.
WildDuck IMAP-serverbibliotek – se notatene om vedleggsduplisering og IMAP-protokollstþtte.
better-sqlite3-multiple-ciphers Raskt og enkelt API-bibliotek for Node.js for Ă„ samhandle med SQLite3 programmessig.
email-templates Utviklervennlig e-postrammeverk for Ä lage, forhÄndsvise og sende tilpassede e-poster (f.eks. kontovarsler og mer).
json-sql-enhanced SQL-spÞrringsbygger med Mongo-stil syntaks. Dette sparer utviklingsteamet vÄrt tid siden vi kan fortsette Ä skrive i Mongo-stil pÄ tvers av hele stacken med en database-agnostisk tilnÊrming. Det hjelper ogsÄ med Ä unngÄ SQL-injeksjonsangrep ved Ä bruke spÞrringsparametere.
knex-schema-inspector SQL-verktÞy for Ä hente informasjon om eksisterende databaseskjema. Dette lar oss enkelt validere at alle indekser, tabeller, kolonner, begrensninger og mer er gyldige og er 1:1 med hvordan de skal vÊre. Vi har til og med skrevet automatiserte hjelpere for Ä legge til nye kolonner og indekser hvis det gjÞres endringer i databaseskjemaer (med svÊrt detaljert feilmelding ogsÄ).
knex SQL-spĂžrringsbygger som vi kun bruker for databasemigrasjoner og skjema-validering gjennom knex-schema-inspector.
mandarin Automatisk i18n fraseoversettelse med stĂžtte for Markdown ved bruk av Google Cloud Translation API.
mx-connect Node.js-pakke for Ä lÞse og etablere tilkoblinger med MX-servere og hÄndtere feil.
pm2 Node.js produksjonsprosessbehandler med innebygd lastbalanserer (finjustert for ytelse).
smtp-server SMTP-serverbibliotek – vi bruker dette for vĂ„re mail exchange ("MX") og utgĂ„ende SMTP-servere.
ImapTest Nyttig verktÞy for Ä teste IMAP-servere mot benchmarks og RFC-spesifikasjon for IMAP-protokollkompatibilitet. Dette prosjektet ble opprettet av Dovecot-teamet (en aktiv Äpen kildekode IMAP- og POP3-server fra juli 2002). Vi testet vÄr IMAP-server grundig med dette verktÞyet.

Du kan finne andre prosjekter vi bruker i vÄr kildekode pÄ GitHub.

LeverandĂžrer

LeverandÞr FormÄl
Cloudflare DNS-leverandĂžr, helsesjekker, lastbalanserere og backup-lagring ved bruk av Cloudflare R2.
GitHub Vert for kildekode, CI/CD og prosjektstyring.
Digital Ocean Dedikert serverhosting og administrerte databaser.
Vultr Dedikert serverhosting.
DataPacket Dedikert serverhosting.

Tanker

Prinsipper

Forward Email er designet i henhold til disse prinsippene:

  1. Alltid vĂŠre utviklervennlig, sikkerhets- og personvernfokusert, og transparent.
  2. FĂžlge MVC, Unix, KISS, DRY, YAGNI, Twelve Factor, Occam's razor, og dogfooding
  3. MÄlrette den ressurssterke, selvfinansierte og ramen-profitable utvikleren

Eksperimenter

tldr; Til syvende og sist er bruk av S3-kompatibel objektlagring og/eller Virtuelle Tabeller ikke teknisk gjennomfÞrbart av ytelsesÄrsaker og utsatt for feil pÄ grunn av minnebegrensninger.

Vi har gjort noen eksperimenter som ledet frem til vÄr endelige SQLite-lÞsning som diskutert ovenfor.

Et av disse var Ă„ prĂžve Ă„ bruke rclone og SQLite sammen med et S3-kompatibelt lagringslag.

Dette eksperimentet fĂžrte til at vi forsto og oppdaget kanttilfeller rundt rclone, SQLite og VFS-bruk:

  • Hvis du aktiverer --vfs-cache-mode writes-flagget med rclone, vil lesing fungere greit, men skrivinger vil bli bufret.
    • Hvis du har flere IMAP-servere distribuert globalt, vil cachen vĂŠre ulik pĂ„ tvers av dem med mindre du har Ă©n skriver og flere lyttere (f.eks. en pub/sub-tilnĂŠrming).
    • Dette er utrolig komplekst, og Ă„ legge til ytterligere kompleksitet som dette vil fĂžre til flere enkeltfeilpunkter.
    • S3-kompatible lagringsleverandĂžrer stĂžtter ikke delvise filendringer – noe som betyr at enhver endring av .sqlite-filen vil resultere i en fullstendig endring og opplasting av databasen.
    • Andre lĂžsninger som rsync finnes, men de er ikke fokusert pĂ„ write-ahead-log ("WAL") stĂžtte – sĂ„ vi endte opp med Ă„ vurdere Litestream. Heldigvis krypterer vĂ„r bruk allerede WAL-filene for oss, sĂ„ vi trenger ikke Ă„ stole pĂ„ Litestream for det. Vi var imidlertid ikke helt sikre pĂ„ Litestream for produksjonsbruk og har noen notater nedenfor om det.
    • Bruk av denne --vfs-cache-mode writes-opsjonen (den eneste mĂ„ten Ă„ bruke SQLite over rclone for skriving) vil forsĂžke Ă„ kopiere hele databasen fra bunnen av i minnet – hĂ„ndtering av Ă©n 10 GB postkasse er OK, men hĂ„ndtering av flere postkasser med svĂŠrt hĂžy lagring vil fĂžre til at IMAP-serverne stĂžter pĂ„ minnebegrensninger og ENOMEM-feil, segmenteringsfeil og datakorrupsjon.
  • Hvis du forsĂžker Ă„ bruke SQLite Virtuelle Tabeller (f.eks. ved bruk av s3db) for Ă„ ha data lagret pĂ„ et S3-kompatibelt lagringslag, vil du stĂžte pĂ„ flere problemer:
    • Lesing og skriving vil vĂŠre ekstremt tregt da S3 API-endepunkter mĂ„ treffes med HTTP GET, PUT, HEAD og POST metoder.
    • Utviklingstester viste at overskridelse av 500K-1M+ poster pĂ„ fiberinternett fortsatt er begrenset av gjennomstrĂžmningen ved skriving og lesing til S3-kompatible leverandĂžrer. For eksempel kjĂžrte vĂ„re utviklere for-lĂžkker for bĂ„de sekvensielle SQL INSERT-setninger og de som skrev store mengder data i bulk. I begge tilfeller var ytelsen sjokkerende treg.
    • Virtuelle tabeller kan ikke ha indekser, ALTER TABLE-setninger, og andre begrensninger – noe som fĂžrer til forsinkelser pĂ„ 1-2 minutter eller mer avhengig av datamengden.
    • Objekter ble lagret ukryptert og ingen innebygd krypteringsstĂžtte er lett tilgjengelig.
  • Vi utforsket ogsĂ„ bruk av sqlite-s3vfs som er konseptuelt og teknisk likt det forrige punktet (sĂ„ det har de samme problemene). En mulighet ville vĂŠre Ă„ bruke en tilpasset sqlite3-bygging pakket med kryptering som wxSQLite3 (som vi for Ăžyeblikket bruker i vĂ„r lĂžsning ovenfor) gjennom redigering av setup-filen.
  • En annen potensiell tilnĂŠrming var Ă„ bruke multiplex-utvidelsen, men denne har en begrensning pĂ„ 32 GB og ville kreve kompleks bygging og utviklingsproblemer.
  • ALTER TABLE-setninger er nĂždvendige (sĂ„ dette utelukker helt bruk av Virtuelle Tabeller). Vi trenger ALTER TABLE-setninger for at vĂ„r hook med knex-schema-inspector skal fungere riktig – noe som sikrer at data ikke blir korrupte og rader hentet kan konverteres til gyldige dokumenter i henhold til vĂ„re mongoose-skjemadefinisjoner (som inkluderer begrensninger, variabeltype og vilkĂ„rlig datavalidering).
  • Nesten alle S3-kompatible prosjekter relatert til SQLite i open-source-miljĂžet er i Python (og ikke JavaScript som vi bruker for 100 % av vĂ„r stack).
  • Komprimeringsbiblioteker som sqlite-zstd (se kommentarer) ser lovende ut, men er kanskje ikke klare for produksjonsbruk ennĂ„. I stedet vil applikasjonsbasert komprimering pĂ„ datatyper som String, Object, Map, Array, Set og Buffer vĂŠre en renere og enklere tilnĂŠrming (og enklere Ă„ migrere ogsĂ„, siden vi kunne lagre et Boolean-flagg eller kolonne – eller til og med bruke PRAGMA user_version=1 for komprimering eller user_version=0 for ingen komprimering som databasemetadata).
    • Heldigvis har vi allerede implementert vedleggsduplisering i vĂ„r IMAP-serverlagring – derfor vil hver melding med samme vedlegg ikke beholde en kopi av vedlegget – i stedet lagres ett enkelt vedlegg for flere meldinger og trĂ„der i en postkasse (og en fremmedreferanse brukes deretter).
  • Prosjektet Litestream, som er en SQLite-replikasjons- og backup-lĂžsning, er veldig lovende og vi vil mest sannsynlig bruke det i fremtiden.
  • Backup-gjenoppretting mĂ„ vĂŠre friksjonsfri og enkel. Å bruke en lĂžsning som MongoDB med mongodump og mongoexport er ikke bare tungvint, men tidkrevende og har konfigurasjonskompleksitet.
    • SQLite-databaser gjĂžr det enkelt (det er en enkelt fil).
    • Vi Ăžnsket Ă„ designe en lĂžsning hvor brukere kunne ta med seg postkassen sin og forlate nĂ„r som helst.
      • Enkle Node.js-kommandoer som fs.unlink('mailbox.sqlite')) og den er permanent slettet fra disklagring.
      • Vi kan pĂ„ samme mĂ„te bruke en S3-kompatibel API med HTTP DELETE for enkelt Ă„ fjerne snapshots og backups for brukere.
    • SQLite var den enkleste, raskeste og mest kostnadseffektive lĂžsningen.

Mangel pÄ alternativer

SÄ vidt vi vet, er ingen andre e-posttjenester designet pÄ denne mÄten, og ingen er open-source.

Vi tror dette kan skyldes at eksisterende e-posttjenester har gammel teknologi i produksjon med spaghettikode 🍝.

De fleste, om ikke alle, eksisterende e-postleverandĂžrer er enten lukket kildekode eller annonserer seg som open-source, men i realiteten er det bare front-end som er open-source.

Den mest sensitive delen av e-post (selve lagringen/IMAP/SMTP-interaksjonen) utfÞres helt pÄ back-end (server), og ikke pÄ front-end (klient).

PrĂžv Forward Email

Registrer deg i dag pĂ„ https://forwardemail.net! 🚀