Deep dive: Kuinka käytämme kvanttiturvallisia salattuja SQLite-postilaatikoita yksityisyyteen keskittyvässä ja suojatussa sähköpostipalvelussamme

Toisin kuin muut sähköpostipalvelut , varmistamme, että vain sinulla on aina pääsy postilaatikkoosi .

Esipuhe

tldr; Sähköpostipalvelumme on 100% avoimen lähdekoodin ja yksityisyyteen keskittyvä suojattujen ja salattujen SQLite-postilaatikoiden kautta.

Kunnes aloitimme IMAP-tuki, käytimme MongoDB:tä pysyviin tiedontallennustarpeihimme.

Tämä tekniikka on hämmästyttävä, ja käytämme sitä edelleenkin – mutta saadaksesi salauksen lepotilassa MongoDB:n kanssa sinun on käytettävä MongoDB Enterprisea tarjoavaa palveluntarjoajaa, kuten Digital Ocean tai Mongo Atlas – tai maksettava yrityslisenssi (ja sen jälkeen on työskenneltävä myyntitiimin latenssin kanssa).

Tiimimme klo Lähetä sähköposti edelleen tarvitsi kehittäjäystävällisen, skaalautuvan, luotettavan ja salatun tallennusratkaisun IMAP-postilaatikoille. Avoimen lähdekoodin kehittäjinä teknologian käyttäminen, jonka joudut maksamaan lisenssimaksun saadaksesi salauksen lepotilassa, oli kiellettyä. periaatteitamme – ja niin me kokeilimme, tutkimme ja kehitimme uuden ratkaisun alusta alkaen näiden tarpeiden ratkaisemiseksi.

Sen sijaan, että käyttäisimme jaettua tietokantaa postilaatikkojesi tallentamiseen, tallennamme ja salaamme postilaatikosi yksilöllisesti salasanallasi (joka vain sinulla on). Sähköpostipalvelumme on niin turvallinen, että jos unohdat salasanasi, menetät postilaatikkosi (ja täytyy palauttaa offline-varmuuskopioilla tai aloittaa alusta).

Jatka lukemista, kun sukeltamme syvälle alla a sähköpostipalveluntarjoajien vertailu, miten palvelumme toimii, teknologiapinoamme, ja enemmän.

Sähköpostipalveluntarjoajan vertailu

Olemme ainoa 100-prosenttisesti avoimen lähdekoodin ja yksityisyyteen keskittyvä sähköpostipalveluntarjoaja, joka tallentaa yksilöllisesti salattuja SQLite-postilaatikoita, tarjoaa rajattomasti verkkotunnuksia, aliaksia ja käyttäjiä sekä lähtevän SMTP-, IMAP- ja POP3-tuen:

Toisin kuin muut sähköpostipalveluntarjoajat, sinun ei tarvitse maksaa tallennustilasta verkkotunnus- tai aliaskohtaisesti edelleenlähetyssähköpostin avulla. Tallennustila on jaettu koko tilillesi – joten jos sinulla on useita mukautettuja verkkotunnuksia ja useita aliaksia kussakin, olemme täydellinen ratkaisu sinulle. Huomaa, että voit silti pakottaa tallennusrajoituksia, jos haluat, verkkotunnus- tai aliaskohtaisesti.

Lue sähköpostipalveluiden vertailu

Kuinka se toimii

  1. Käyttämällä sähköpostiohjelmaasi, kuten Apple Mail, Thunderbird, Gmail tai Outlook – muodostat yhteyden suojattuun palveluumme IMAP palvelimet, jotka käyttävät käyttäjätunnustasi ja salasanaasi:

    • Käyttäjänimesi on täydellinen aliaksesi verkkotunnuksesi kanssa, kuten hello@example.com.
    • Salasanasi luodaan satunnaisesti ja näytetään sinulle vain 30 sekunnin ajan, kun napsautat Luo salasana alkaen Tilini Verkkotunnukset Aliakset.
  2. Kun yhteys on muodostettu, sähköpostiohjelmasi lähettää IMAP-protokollan komennot IMAP-palvelimellemme pitääksesi postilaatikkosi synkronoituna. Tämä sisältää sähköpostiluonnosten kirjoittamisen ja tallentamisen ja muut toiminnot, joita voit tehdä (esim. merkitse sähköpostin merkitseminen tärkeäksi tai merkitse sähköposti roskapostiksi/roskapostiksi).

  3. Sähköpostinvaihtopalvelimet (tunnetaan yleisesti nimellä "MX"-palvelimet) vastaanottavat uusia saapuvia sähköpostiviestejä ja tallentavat sen postilaatikkoosi. Kun tämä tapahtuu, sähköpostiohjelmasi saa ilmoituksen ja synkronoi postilaatikkosi. Sähköpostinvaihtopalvelimemme voivat välittää sähköpostisi yhdelle tai useammalle vastaanottajalle (mukaan lukien webhookeja), tallenna sähköpostisi salattuun IMAP-tallennustilaan kanssamme, tai molemmat!

    Oletko kiinnostunut oppimaan lisää? Lukea kuinka sähköpostin edelleenlähetys asetetaan, miten sähköpostinvaihtopalvelumme toimii, tai katso oppaamme.

  4. Kulissien takana suojattu sähköpostin tallennusratkaisumme toimii kahdella tavalla pitääkseen postilaatikosi salattuina ja vain sinun käytettävissäsi:

    • Kun sinulle saapuu uutta postia lähettäjältä, sähköpostinvaihtopalvelimemme kirjoittavat puolestasi yksittäiseen, väliaikaiseen ja salattuun postilaatikkoon.

      sequenceDiagram
          autonumber
          actor Sender
          Sender->>MX: Inbound message received for your alias (e.g. you@yourdomain.com).
          MX->>SQLite: Message is stored in a temporary mailbox.
          Note over MX,SQLite: Forwards to other recipients and webhooks configured.
          MX->>Sender: Success!
      
    • Kun muodostat yhteyden IMAP-palvelimeemme sähköpostiohjelmallasi, salasanasi salataan sitten muistissa ja sitä käytetään sähköpostilaatikon lukemiseen ja siihen kirjoittamiseen. Postilaatikkoasi voi lukea ja siihen voi kirjoittaa vain tällä salasanalla. Muista, että koska olet ainoa, jolla on tämä salasana, vain sinä voi lukea postilaatikkoasi ja kirjoittaa siihen, kun käytät sitä. Kun sähköpostiohjelmasi yrittää seuraavan kerran pollata postia tai synkronoida, uudet viestisi siirretään tästä väliaikaisesta postilaatikosta ja tallennetaan todelliseen postilaatikkotiedostoosi antamaasi salasanalla. Huomaa, että tämä väliaikainen postilaatikko tyhjennetään ja poistetaan jälkeenpäin, joten vain salasanalla suojatussa postilaatikossasi on viestit.

    • Jos olet yhteydessä IMAP-verkkoon (esim. käyttämällä sähköpostiohjelmaa, kuten Apple Mail tai Thunderbird), meidän ei tarvitse kirjoittaa väliaikaiseen levytallennustilaan. Sen sijaan muistissa oleva salattu IMAP-salasanasi noudetaan ja sitä käytetään. Kun viestiä yritetään toimittaa sinulle reaaliajassa, lähetämme WebSocket-pyynnön kaikille IMAP-palvelimille ja kysymme heiltä, onko heillä aktiivinen istunto sinulle (tämä on nouto-osio), jonka jälkeen lähetämme sen eteenpäin. salattu muistissa oleva salasana – joten meidän ei tarvitse kirjoittaa väliaikaiseen postilaatikkoon, voimme kirjoittaa varsinaiseen salattuun postilaatikkoosi käyttämällä salattua salasanaasi.

      sequenceDiagram
          autonumber
          actor You
          You->>IMAP: You connect to IMAP server using an email client.
          IMAP->>SQLite: Transfer message from temporary mailbox to your alias' mailbox.
          Note over IMAP,SQLite: Your alias' mailbox is only available in-memory using IMAP password.
          SQLite->>IMAP: Retrieves messages as requested by email client.
          IMAP->>You: Success!
      
  5. Varmuuskopiot salatuista postilaatikoistasi tehdään päivittäin. Voit myös pyytää uutta varmuuskopiota milloin tahansa tai ladata uusimman varmuuskopion osoitteesta Tilini Verkkotunnukset Aliakset. Jos päätät vaihtaa toiseen sähköpostipalveluun, voit helposti siirtää, ladata, viedä ja tyhjentää postilaatikot ja varmuuskopiot milloin tahansa.

Teknologiat

Tietokannat

Tutkimme muita mahdollisia tietokannan tallennuskerroksia, mutta yksikään ei täyttänyt vaatimuksiamme yhtä paljon kuin SQLite:

TietokantaSalaus levossaHiekkalaatikko PostilaatikotLisenssiKäytetty kaikkialla
SQLite✅ Kyllä SQLite3MultipleCiphers✅ Julkinen verkkotunnus
MongoDB"Saatavilla vain MongoDB Enterprisessa"❌ Relaatiotietokanta❌ AGPL ja SSPL-1.0
rqliteVain verkko❌ RelaatiotietokantaMIT
dqliteTestaamaton eikä vielä tuettu?Testaamaton eikä vielä tuettu?LGPL-3.0-only
PostgreSQLJoo❌ RelaatiotietokantaPostgreSQL (samanlainen kuin BSD tai MIT)
MariaDBVain InnoDB:lle❌ RelaatiotietokantaGPLv2 ja BUSL-1.1
CockroachDBVain yrityskäyttöön tarkoitettu ominaisuus❌ RelaatiotietokantaBUSL-1.1 ja muut

Tässä on blogiteksti, jossa verrataan useita SQLite-tietokannan tallennusvaihtoehtoja yllä olevassa taulukossa.

Turvallisuus

Käytämme aina levossa oleva salaus (AES-256), salaus siirrossa (TLS), DNS HTTPS:n kautta ("DoH") käyttämällä 🍊 Tangeriini, ja sqleet (ChaCha20-Poly1305) salaus postilaatikoissa. Lisäksi käytämme token-pohjaista kaksivaiheista todennusta (toisin kuin SMS, joka on epäilty mies-keskellä-hyökkäykset), pyöritetyt SSH-avaimet, joissa pääkäyttäjän oikeudet on poistettu käytöstä, yksinoikeus palvelimiin rajoitettujen IP-osoitteiden kautta ja paljon muuta.

Tapauksessa an paha piikahyökkäys tai roistotyöntekijä kolmannelta osapuolelta, postilaatikkosi voidaan edelleen avata vain luomallasi salasanalla. Voit olla varma, että emme luota muihin kolmansien osapuolien toimittajiin kuin Cloudflaren, Digital Oceanin ja Vultrin SOC Type 2 -valituspalvelintarjoajiimme.

Tavoitteemme on saada mahdollisimman vähän yksittäinen epäonnistumispiste mahdollisimman.

Postilaatikot

tldr; IMAP-palvelimemme käyttävät yksilöllisesti salattuja SQLite-tietokantoja jokaiselle postilaatikollesi.

SQLite on erittäin suosittu sulautettu tietokanta – se on tällä hetkellä käynnissä puhelimessasi ja tietokoneessasi – ja sitä käyttävät lähes kaikki tärkeimmät tekniikat.

Esimerkiksi salatuilla palvelimillamme on SQLite-tietokantapostilaatikko linux@example.com, info@example.com, hello@example.com ja niin edelleen – yksi kullekin a .sqlite tietokantatiedosto. Emme myöskään nimeä tietokantatiedostoja sähköpostiosoitteella – sen sijaan käytämme BSON ObjectID:tä ja luotuja yksilöllisiä UUID:itä, jotka eivät kerro kenelle postilaatikko kuuluu tai millä sähköpostiosoitteella se on (esim. 353a03f21e534321f5d6e267.sqlite).

Jokainen näistä tietokannoista on salattu itse käyttämällä salasanaasi (joka vain sinulla on) käyttämällä sqleet (ChaCha20-Poly1305). Tämä tarkoittaa, että postilaatikosi ovat yksilöllisesti salattuja, itsenäisiä, hiekkalaatikolla, ja kannettava.

Olemme hienosäätäneet SQLitea seuraavilla tavoilla PRAGMA:

PRAGMATarkoitus
cipher=chacha20ChaCha20-Poly1305 SQLite-tietokannan salaus. Viite better-sqlite3-multiple-ciphers alla Projektit saadaksesi lisätietoa.
key="****************"Tämä on vain salattu muistissa oleva salasanasi, joka välitetään sähköpostiohjelmasi IMAP-yhteyden kautta palvelimellemme. Uudet tietokantaesiintymät luodaan ja suljetaan jokaista luku- ja kirjoitusistuntoa varten (hiekkalaatikkokäytön ja eristyksen varmistamiseksi).
journal_model=WALKirjoita eteenpäin-loki ("WAL") joka parantaa suorituskykyä ja mahdollistaa samanaikaisen lukuoikeuden.
busy_timeout=5000Estää kirjoituslukkovirheet kun muita kirjoituksia tapahtuu.
synchronous=NORMALLisää liiketoimien kestävyyttä ilman tietojen korruptioriskiä.
foreign_keys=ONPakottaa, että vieraiden avainten viittaukset (esim. suhde taulukosta toiseen) pakotetaan. Oletuksena tämä ei ole käytössä SQLitessa, mutta validoinnin ja tietojen eheyden vuoksi sen tulee olla käytössä.
encoding='UTF-8'Oletuskoodaus käyttää kehittäjän mielenterveyden varmistamiseksi.

Kaikki muut oletusasetukset ovat peräisin SQLitesta, kuten on määritetty virallinen PRAGMA-dokumentaatio.

Samanaikaisuus

tldr; Käytämme rclone ja WebSocket samanaikaista lukemista ja kirjoittamista varten salattuihin SQLite-postilaatikoihisi.

Lukee

Puhelimesi sähköpostiohjelma saattaa ratkaista imap.forwardemail.net johonkin Digital Ocean IP-osoitteistamme – ja pöytätietokoneesi voi ratkaista erillisen IP-osoitteen toisesta tarjoaja yhteensä.

Riippumatta siitä, mihin IMAP-palvelimeen sähköpostiohjelmasi muodostaa yhteyden, haluamme yhteyden lukevan tietokannastasi reaaliajassa 100 %:n tarkkuudella:

  • Tämä saadaan aikaan käyttämällä rclone kanssa --vfs-cache-mode off (oletusarvo).

  • Paikallisen levyvälimuistin sijaan välimuisti luetaan suoraan etäliitännästä (tietokannastasi) reaaliajassa.

  • Jos paikallista tiedostoa ei löydy, tämä osoittaa sen rclone asennus epäonnistui tai siinä on ongelma. Tässä tapauksessa käytämme a WebSocket varaluku lukuihin (joka heikentää hieman suorituskykyä, mutta säilyttää silti palvelun eheyden).

  • Jokainen palvelimemme on määritetty asennettavaksi johdonmukaisesti ja varoittaa meille reaaliajassa kaikista virheistä.

Kirjoittaa

Tietokantaan kirjoittaminen on hieman erilaista – koska SQLite on sulautettu tietokanta ja postilaatikkosi on oletuksena yhdessä tiedostossa.

Pohdimme vaihtoehtoja mm litestream, rqlite, ja dqlite alla – mikään näistä ei kuitenkaan täyttänyt vaatimuksiamme.

Kirjoitusten suorittaminen eteenpäinkirjoituslokin avulla ("WAL") käytössä – meidän on varmistettava, että vain yksi palvelin ("Ensisijainen") on vastuussa siitä. WAL nopeuttaa dramaattisesti samanaikaisuutta ja sallii yhden kirjoittajan ja useita lukijoita.

Ensisijainen on käynnissä tietopalvelimissa, joissa on liitetyt taltiot, jotka sisältävät salatut postilaatikot. Jakelun näkökulmasta voit tarkastella kaikkia takana olevia yksittäisiä IMAP-palvelimia imap.forwardemail.net olla toissijaisia palvelimia ("Toissijainen").

Toteutamme kaksisuuntaisen viestinnän WebSockets:

  • Ensisijaiset palvelimet käyttävät esiintymää ws's WebSocketServer palvelin.
  • Toissijaiset palvelimet käyttävät esiintymää ws's WebSocket asiakas, joka on kääritty websocket - kuten luvattiin ja uudelleenkytkentä-websocket. Nämä kaksi käärettä varmistavat, että WebSocket muodostaa yhteyden uudelleen ja voi lähettää ja vastaanottaa tietoja tiettyjä tietokantakirjoituksia varten.

Varmuuskopiot

tldr; Varmuuskopiot salatuista postilaatikoistasi tehdään päivittäin. Voit myös pyytää välittömästi uuden varmuuskopion tai ladata uusimman varmuuskopion milloin tahansa osoitteesta Tilini Verkkotunnukset Aliakset.

Varmuuskopioita varten suoritamme SQLite-ohjelman VACUUM INTO komento joka päivä IMAP-komentokäsittelyn aikana, mikä hyödyntää salattua salasanaasi muistissa olevasta IMAP-yhteydestä. Varmuuskopiot tallennetaan, jos olemassa olevaa varmuuskopiota ei havaita tai jos SHA-256 hash on muuttunut tiedostossa viimeisimpään varmuuskopioon verrattuna.

Huomaa, että käytämme VACUUM INTO komento, toisin kuin sisäänrakennettu backup komennon, koska jos sivua muutetaan a backup komento, sen on aloitettava alusta. The VACUUM INTO komento ottaa tilannekuvan. Katso nämä kommentit GitHub ja Hakkeri uutiset saadaksesi lisätietoa.

Lisäksi käytämme VACUUM INTO toisin kuin backup, koska backup komento jättäisi tietokannan salaamatta lyhyeksi ajaksi, kunnes rekey kutsutaan (katso tämä GitHub kommentti näkemyksen vuoksi).

Toissijainen opastaa Alkeisyhdistystä WebSocket yhteys varmuuskopion suorittamiseksi – ja ensisijainen vastaanottaa sitten komennon tehdä niin ja sen jälkeen:

  1. Muodosta yhteys salattuun postilaatikkoosi.
  2. Hanki kirjoituslukko.
  3. Suorita WAL-tarkastuspiste kautta wal_checkpoint(PASSIVE).
  4. Suorita VACUUM INTO SQLite-komento.
  5. Varmista, että kopioitu tiedosto voidaan avata salatulla salasanalla (suojaus/tyhjennys).
  6. Lataa se Cloudflare R2:een tallennusta varten (tai omaan palveluntarjoajaasi, jos määritetty).
  7. Pakkaa tuloksena oleva varmuuskopiotiedosto komennolla gzip.
  8. Lataa se Cloudflare R2:een tallennusta varten (tai omaan palveluntarjoajaasi, jos määritetty).

Muista, että postilaatikosi on salattu – ja vaikka meillä on IP-rajoituksia ja muita todennustoimenpiteitä WebSocket-viestinnässä – jos toimija on huono, voit olla varma, että ellei WebSocket-hyötykuormassa ole IMAP-salasanasi, se ei voi avata tietokantaasi. .

Tällä hetkellä postilaatikkoa kohden on tallennettu vain yksi varmuuskopio, mutta tulevaisuudessa voimme tarjota ajankohtaista palautusta ("PITR").

IMAP-palvelimemme tukevat SEARCH komento monimutkaisilla kyselyillä, säännöllisillä lausekkeilla ja muilla.

Nopea hakutulos on kiitos FTS5 ja sqlite-regex.

Varastoimme Date arvot SQLite-postilaatikoissa as ISO 8601 merkkijonot kautta Date.prototype.toISOString (UTC-aikavyöhykkeellä tasa-arvovertailujen toimimiseksi oikein).

Indeksit tallennetaan myös kaikille hakukyselyissä oleville kiinteistöille.

Projektit

Tässä on taulukko, jossa esitetään lähdekoodissamme ja kehitysprosessissamme käyttämimme projektit (aakkosjärjestyksessä):

ProjektiTarkoitus
MahdollinenDevOps-automaatioalusta koko palvelinkannan ylläpitoon, skaalaukseen ja hallintaan helposti.
BreeTyön ajoitus Node.js:lle ja JavaScriptille, jossa on cron-, päivämäärä-, ms-, uudemmat ja ihmisystävälliset tuet.
MökkiKehittäjäystävällinen JavaScript- ja Node.js-lokikirjasto turvallisuutta ja yksityisyyttä ajatellen.
PoikaNode.js-kehys, joka tukee koko arkkitehtuuriamme ja suunnitteluamme MVC:n ja muiden kanssa.
MongoDBNoSQL-tietokantaratkaisu, jota käytämme kaikkien muiden tietojen tallentamiseen postilaatikoiden ulkopuolelle (esim. tilisi, asetukset, verkkotunnukset ja aliasmääritykset).
MungoMongoDB-objektidokumenttien mallinnus ("ODM"), jota käytämme koko pinossamme. Kirjoitimme erityisiä apuvälineitä, joiden avulla voimme yksinkertaisesti jatkaa käyttöä Mongoose SQLiten kanssa 🎉
Node.jsNode.js on avoimen lähdekoodin monikäyttöinen JavaScript-ajoympäristö, joka suorittaa kaikkia palvelinprosessejamme.
MuistipostittajaNode.js-paketti sähköpostien lähettämiseen, yhteyksien luomiseen ja muuhun. Olemme tämän projektin virallinen sponsori.
RedisMuistissa oleva tietokanta välimuistiin tallentamiseen, kanavien julkaisemiseen/tilaamiseen ja DNS:n HTTPS-pyyntöjen kautta.
SQLite3MultipleCiphersSQLiten salauslaajennus mahdollistaa kokonaisten tietokantatiedostojen salaamisen (mukaan lukien eteenpäinkirjoitusloki ("WAL"), päiväkirja, palautus...).
SQLiteStudioVisuaalinen SQLite-editori (jota voit myös käyttää) kehityspostilaatikoiden testaamiseen, lataamiseen ja katseluun.
SQLiteSulautettu tietokantakerros skaalautuvaan, itsenäiseen, nopeaan ja joustavaan IMAP-tallennustilaan.
RoskapostiskanneriNode.js roskapostin esto, sähköpostin suodatus ja tietojenkalastelun estotyökalu (vaihtoehtomme Roskapostin salamurhaaja ja rspamd).
TangeriiniDNS HTTPS:n kautta Node.js:n avulla ja välimuisti Redisillä – mikä varmistaa maailmanlaajuisen johdonmukaisuuden ja paljon muuta.
ThunderbirdKehitystiimimme käyttää tätä (ja suosittelee myös tätä) mm ensisijainen sähköpostiohjelma, jota käytetään edelleen sähköpostin kanssa.
UTMKehitystiimimme käyttää tätä luomalla virtuaalikoneita iOS:lle ja macOS:lle testatakseen erilaisia sähköpostiohjelmia (rinnakkain) IMAP- ja SMTP-palvelimiemme kanssa.
UbuntuNykyaikainen avoimen lähdekoodin Linux-pohjainen palvelinkäyttöjärjestelmä, joka toimii kaikessa infrastruktuurissamme.
WildAnkkaIMAP-palvelinkirjasto – katso sen huomautukset liitteen päällekkäisyyden poistaminen ja IMAP-protokollan tuki.
parempi-sqlite3-multiple-ciphersNode.js:n nopea ja yksinkertainen API-kirjasto vuorovaikutukseen SQLite3:n kanssa ohjelmallisesti.
sähköpostimallejaKehittäjäystävällinen sähköpostikehys mukautettujen sähköpostien (esim. tili-ilmoitusten ja muiden) luomiseen, esikatseluun ja lähettämiseen.
json-sqlSQL-kyselyn rakennusohjelma Mongo-tyylisen syntaksin avulla. Tämä säästää kehitystiimimme aikaa, koska voimme jatkaa mongo-tyylistä kirjoittamista koko pinoon tietokantaagnostisen lähestymistavan avulla. Se auttaa myös välttämään SQL-injektiohyökkäykset käyttämällä kyselyparametreja.
knex-schema-inspectorSQL-apuohjelma tietojen poimimiseen olemassa olevista tietokantaskeemoista. Tämän avulla voimme helposti vahvistaa, että kaikki indeksit, taulukot, sarakkeet, rajoitukset ja muut ovat kelvollisia ja ovat 1:1 miten niiden pitäisi olla. Kirjoitimme jopa automaattisia apuohjelmia uusien sarakkeiden ja indeksien lisäämiseksi, jos tietokantaskeemoihin tehdään muutoksia (myös erittäin yksityiskohtaisella virhevaroituksella).
knexSQL-kyselyn rakentaja, jota käytämme vain tietokantojen siirtoon ja skeeman validointiin knex-schema-inspector.
mandariiniAutomaattinen i18n lauseen käännös Markdownin tuella Google Cloud Translation API.
mx-connectNode.js-paketti ratkaisemaan ja muodostamaan yhteyksiä MX-palvelimiin ja käsittelemään virheitä.
pm2Node.js tuotantoprosessin hallinta sisäänrakennetulla kuormituksen tasapainottimella (hienosäädetty suorituskyvyn vuoksi).
smtp-palvelinSMTP-palvelinkirjasto – käytämme tätä sähköpostinvaihtoon ("MX") ja lähteviin SMTP-palvelimiin.
ImapTestHyödyllinen työkalu IMAP-palvelimien testaamiseen vertailuarvojen ja RFC-määrityksen IMAP-protokollan yhteensopivuuden suhteen. Tämän projektin on luonut Dovecot tiimi (aktiivinen avoimen lähdekoodin IMAP- ja POP3-palvelin heinäkuusta 2002). Testasimme laajasti IMAP-palvelintamme tällä työkalulla.

Löydät muita käyttämiämme projekteja lähdekoodimme GitHubissa.

Palveluntarjoajat

PalveluntarjoajaTarkoitus
CloudflareDNS-palveluntarjoaja, kuntotarkastukset, kuormituksen tasapainottimet ja varmuuskopion tallennus Cloudflare R2.
Digitaalinen valtameriOma palvelinisännöinti, SSD-lohkotallennus ja hallitut tietokannat.
VultrOma palvelinisännöinti ja SSD-lohkotallennus.

ajatuksia

periaatteet

Välitä sähköposti on suunniteltu seuraavien periaatteiden mukaisesti:

  1. Ole aina kehittäjäystävällinen, turvallisuuteen ja yksityisyyteen keskittyvä ja läpinäkyvä.
  2. Noudata MVC, Unix, KISS, DRY, YAGNI, Kaksitoista tekijää, Occamin partaveitsi, ja koiranruokaa
  3. Kohdista romutettuihin, bootstrapped- ja ramen kannattavaa kehittäjä

Kokeilut

tldr; Loppujen lopuksi S3-yhteensopivan objektitallennustilan ja/tai virtuaalitaulukoiden käyttäminen ei ole teknisesti mahdollista suorituskykysyistä ja alttiita virheille muistirajoitusten vuoksi.

Olemme tehneet muutamia kokeita, jotka johtavat lopulliseen SQLite-ratkaisuamme, kuten yllä on käsitelty.

Yksi näistä oli kokeilla käyttää rclone ja SQLite yhdessä S3-yhteensopivan tallennuskerroksen kanssa.

Tämä kokeilu johti meidät ymmärtämään ja löytämään reunatapauksia, jotka ympäröivät rclonea, SQLitea ja VFS käyttö:

  • Jos otat käyttöön --vfs-cache-mode writes merkitse rclonella, niin luku onnistuu, mutta kirjoitukset tallentuvat välimuistiin.
    • Jos sinulla on useita maailmanlaajuisesti hajautettuja IMAP-palvelimia, välimuisti on pois päältä niiden välillä, ellei sinulla ole yhtä kirjoittajaa ja useita kuuntelijoita (esim. pub/sub-lähestymistapa).
    • Tämä on uskomattoman monimutkaista, ja tällaisen lisämonimutkaisuuden lisääminen johtaa useampaan yksittäiseen vikapisteeseen.
    • S3-yhteensopivat tallennuspalveluntarjoajat eivät tue osittaisia tiedostomuutoksia – mikä tarkoittaa mitä tahansa muutoksia .sqlite tiedosto johtaa täydelliseen muutokseen ja tietokannan uudelleenlataukseen.
    • Muita ratkaisuja esim rsync olemassa, mutta ne eivät ole keskittyneet kirjoitus eteenpäin-lokiin ("WAL") -tuki – joten päädyimme tarkistamaan Litestreamin. Onneksi salauskäyttömme salaa jo WAL tiedostot meille, joten meidän ei tarvitse luottaa Litestreamiin. Emme kuitenkaan olleet vielä varmoja Litestreamista tuotantokäyttöön, ja alla on muutamia huomautuksia siitä.
    • Käyttämällä tätä vaihtoehtoa --vfs-cache-mode writes ( vain tapa käyttää SQLitea rclone kirjoittamista varten) yrittää kopioida koko tietokannan tyhjästä muistiin – yhden 10 Gt:n postilaatikon käsittely on OK, mutta useiden postilaatikoiden käsitteleminen, joissa on erittäin paljon tallennustilaa, aiheuttaa IMAP-palvelimien muistirajoituksia ja ENOMEM virheet, segmentointivirheet ja tietojen korruptio.
  • Jos yrität käyttää SQLitea Virtuaalipöydät (esim s3db), jotta tiedot ovat livenä S3-yhteensopivalla tallennuskerroksella, kohtaat useita muita ongelmia:
    • Lukeminen ja kirjoittaminen ovat erittäin hidasta, koska S3 API -päätepisteisiin on lyötävä HTTP GET, PUT, HEAD, ja POST menetelmiä.
    • Kehitystestit osoittivat, että S3-yhteensopivien palveluntarjoajien kirjoittamisen ja lukemisen suorituskyky rajoittaa edelleen yli 500 000–1 M+ tietueiden määrää kuituinternetissä. Esimerkiksi kehittäjämme juoksivat for silmukat tehdäkseen molemmat peräkkäiset SQL:t INSERT lausunnot ja sellaiset, jotka kirjoittivat suuria määriä dataa. Molemmissa tapauksissa suoritus oli hämmästyttävän hidasta.
    • Virtuaalipöydät indeksejä ei voi olla, ALTER TABLE lausunnot ja muu rajoituksia – mikä johtaa yli 1-2 minuutin viiveisiin tai enemmän tiedon määrästä riippuen.
    • Objektit tallennettiin salaamattomina, eikä alkuperäistä salaustukea ole saatavilla.
  • Tutkimme myös käyttöä sqlite-s3vfs joka on käsitteellisesti ja teknisesti samanlainen kuin edellinen luettelokohta (joten siinä on samat ongelmat). Mahdollisuus olisi käyttää mukautettua sqlite3 rakentaa käärittynä salauksella, kuten wxSQLite3 (jota käytämme tällä hetkellä yllä olevassa ratkaisussamme) läpi asennustiedoston muokkaaminen.
  • Toinen mahdollinen tapa oli käyttää multipleksilaajennusTämän rajoituksena on kuitenkin 32 Gt ja se vaatisi monimutkaista rakennus- ja kehityspäänsärkyä.
  • ALTER TABLE lausekkeet vaaditaan (joten tämä sulkee kokonaan pois virtuaalitaulukoiden käytön). Me tarvitsemme ALTER TABLE lausunnot, jotta meidän koukku kanssa knex-schema-inspector toimimaan oikein – mikä varmistaa, että tiedot eivät ole vioittuneet ja haetut rivit voidaan muuntaa kelvollisiksi asiakirjoiksi meidän ohjeidemme mukaisesti. mongoose skeeman määritelmät (joka sisältää rajoitteen, muuttujan tyypin ja mielivaltaisen tietojen validoinnin).
  • Melkein kaikki avoimen lähdekoodin yhteisön SQLiteen liittyvät S3-yhteensopivat projektit ovat Pythonissa (eikä JavaScriptissä, jota käytämme 100 % pinosta).
  • Pakkauskirjastot, kuten sqlite-zstd (katso kommentteja) näyttää lupaavalta, mutta ei ehkä ole vielä valmis tuotantokäyttöön. Sen sijaan sovelluspuolen pakkaus tietotyypeille, kuten String, Object, Map, Array, Set, ja Buffer tulee olemaan puhtaampi ja helpompi lähestymistapa (ja on myös helpompi siirtää, koska voisimme tallentaa a Boolean lippu tai sarake – tai jopa käyttää PRAGMA user_version=1 puristamiseen tai user_version=0 ilman pakkausta tietokannan metatietoina).
    • Onneksi IMAP-palvelimellamme on jo toteutettu liitetiedostojen päällekkäisyyden poistaminen – siksi jokainen viesti, jossa on sama liite, ei säilytä kopiota liitteestä – sen sijaan yksi liite tallennetaan useille viesteille ja säikeille postilaatikkoon (ja vieraaseen). viittausta käytetään myöhemmin).
  • Projekti Litestream, joka on SQLiten replikointi- ja varmuuskopiointiratkaisu, on erittäin lupaava ja tulemme todennäköisesti käyttämään sitä tulevaisuudessa.
  • Varmuuskopion palauttamisen on oltava kitkatonta ja triviaalia. Käyttämällä ratkaisua, kuten MongoDB kanssa mongodump ja mongoexport ei ole vain tylsää, vaan myös aikaa vievää ja sen konfigurointi on monimutkaista.
    • SQLite-tietokannat tekevät siitä yksinkertaisen (se on yksi tiedosto).
    • Halusimme suunnitella ratkaisun, jossa käyttäjät voivat ottaa postilaatikkonsa ja lähteä milloin tahansa.
      • Yksinkertaiset Node.js-komennot fs.unlink('mailbox.sqlite')) ja se poistetaan pysyvästi levymuistista.
      • Voimme myös käyttää S3-yhteensopivaa API:ta HTTP:n kanssa DELETE poistaa helposti tilannekuvia ja varmuuskopioita käyttäjiltä.
    • SQLite oli yksinkertaisin, nopein ja kustannustehokkain ratkaisu.

Vaihtoehtojen puute

Tietojemme mukaan muita sähköpostipalveluita ei ole suunniteltu tällä tavalla, eivätkä ne ole avoimen lähdekoodin.

Me usko, että tämä voi johtua olemassa oleviin sähköpostipalveluihin, joiden tuotannossa on vanhaa teknologiaa spagettikoodi 🍝.

Useimmat, elleivät kaikki olemassa olevista sähköpostipalveluntarjoajista ovat joko suljettuja lähdekoodia tai mainostavat avoimena lähdekoodina, mutta todellisuudessa vain niiden käyttöliittymä on avoimen lähdekoodin.

Sähköpostin herkin osa (todellinen tallennus/IMAP/SMTP-vuorovaikutus) kaikki tehdään taustalla (palvelimella) ja ei käyttöliittymässä (asiakas).

Kokeile Lähetä edelleen sähköposti

Ilmoittaudu tänään klo https://forwardemail.net! 🚀