Kvanttisuojattu sähköposti: Kuinka käytämme salattuja SQLite-postilaatikoita sähköpostisi turvaamiseen

Esipuhe
Important
Sähköpostipalvelumme on 100 % avoimen lähdekoodin ja yksityisyyteen keskittyvä suojattujen ja salattujen SQLite-postilaatikoiden kautta.
Ennen IMAP-tuki:n julkaisua käytimme MongoDB:tä pysyvien tietojen tallennustarpeisiimme.
Tämä teknologia on hämmästyttävä ja käytämme sitä edelleen – mutta jotta MongoDB:n salaus olisi levossa, sinun on käytettävä MongoDB Enterprisea tarjoavaa toimittajaa, kuten Digital Oceania tai Mongo Atlasia – tai maksettava yrityslisenssistä (ja sen seurauksena joudut työskentelemään myyntitiimin viiveen kanssa).
Lähetä sähköpostia eteenpäin-tiimimme tarvitsi kehittäjäystävällisen, skaalautuvan, luotettavan ja salatun tallennusratkaisun IMAP-postilaatikoille. Avoimen lähdekoodin kehittäjinä teknologian käyttö, jonka salaustoiminnon saamiseksi vaaditaan lisenssimaksu, oli periaatteemme:n vastaista – siksi kokeilimme, tutkimme ja kehitimme uuden ratkaisun tyhjästä näiden tarpeiden ratkaisemiseksi.
Sen sijaan, että käyttäisimme jaettua tietokantaa postilaatikoiden tallentamiseen, tallennamme ja salaamme postilaatikot erikseen salasanallasi (joka on vain sinulla). Sähköpostipalvelumme on niin turvallinen, että jos unohdat salasanasi, menetät postilaatikkosi (ja sinun on palautettava se offline-varmuuskopioilla tai aloitettava alusta).
Jatka lukemista, sillä alla syvennymme tarkemmin muun muassa sähköpostipalveluntarjoajien vertailu-, miten palvelumme toimii- ja teknologiapinomme-tekijöihin.
Sähköpostipalveluntarjoajien vertailu
Olemme ainoa 100 % avoimen lähdekoodin ja yksityisyyteen keskittyvä sähköpostipalveluntarjoaja, joka tallentaa erikseen salattuja SQLite-postilaatikoita, tarjoaa rajattomasti verkkotunnuksia, aliaksia ja käyttäjiä sekä tukee lähtevää SMTP-, IMAP- ja POP3-postia:
Toisin kuin muilla sähköpostipalveluntarjoajilla, sinun ei tarvitse maksaa tallennustilasta verkkotunnus- tai aliaskohtaisesti Forward Email -palvelun kanssa. Tallennustila jaetaan koko tilisi kesken – joten jos sinulla on useita mukautettuja verkkotunnuksia ja useita aliaksia jokaisella, olemme täydellinen ratkaisu sinulle. Huomaa, että voit silti halutessasi asettaa tallennusrajoituksia verkkotunnus- tai aliaskohtaisesti.
Lue sähköpostipalveluiden vertailu
Miten se toimii
- Käyttämällä sähköpostiohjelmaasi, kuten Apple Mailia, Thunderbirdiä, Gmailia tai Outlookia, muodostat yhteyden suojattuihin IMAP-palvelimiimme käyttäjätunnuksellasi ja salasanallasi:
- Käyttäjätunnuksesi on verkkotunnuksesi koko aliaksesi, kuten
hello@example.com
. - Salasanasi luodaan satunnaisesti ja näytetään sinulle vain 30 sekunnin ajan, kun napsautat Luo salasana -painiketta kohdassa Oma tili Verkkotunnukset Aliakset.
-
Kun yhteys on muodostettu, sähköpostiohjelmasi lähettää IMAP-protokollan komennot-viestin IMAP-palvelimellemme sähköpostilaatikon synkronoimiseksi. Tämä sisältää luonnosviestien kirjoittamisen ja tallentamisen sekä muut mahdolliset toiminnot (esim. sähköpostin merkitsemisen tärkeäksi tai roskapostiksi).
-
Sähköpostinvaihtopalvelimet (yleisesti tunnettu nimellä "MX"-palvelimet) vastaanottavat uudet saapuvat sähköpostit ja tallentavat ne postilaatikkoosi. Kun näin tapahtuu, sähköpostiohjelmasi saa ilmoituksen ja synkronoi postilaatikkosi. Sähköpostinvaihtopalvelimemme voivat välittää sähköpostisi yhdelle tai useammalle vastaanottajalle (mukaan lukien webhookit), tallentaa sähköpostisi puolestasi salattuun IMAP-tallennustilaan meillä, tai molemmat!
[!VINKKI] Kiinnostaako sinua oppia lisää? Lue sähköpostin edelleenlähetyksen määrittäminen, miten postinvaihtopalvelumme toimii tai katso oppaamme.
- Kulissien takana turvallinen sähköpostin tallennusratkaisumme toimii kahdella tavalla pitääkseen postilaatikkosi salattuina ja vain sinä voit käyttää niitä:
-
Kun vastaanotamme sinulle uutta postia lähettäjältä, sähköpostinvaihtopalvelimemme kirjoittavat sen sinulle tarkoitettuun henkilökohtaiseen, väliaikaiseen ja salattuun postilaatikkoon.
-
Kun muodostat yhteyden IMAP-palvelimeemme sähköpostiohjelmallasi, salasanasi salataan muistiin ja sitä käytetään postilaatikkosi lukemiseen ja kirjoittamiseen. Postilaatikkoasi voi lukea ja siihen voi kirjoittaa vain tällä salasanalla. Muista, että koska olet ainoa, jolla on tämä salasana, vain sinä voit lukea ja kirjoittaa postilaatikkoosi, kun käytät sitä. Kun sähköpostiohjelmasi seuraavan kerran yrittää kysellä postia tai synkronoida, uudet viestisi siirretään tästä väliaikaisesta postilaatikosta ja tallennetaan varsinaiseen postilaatikkotiedostoosi antamallasi salasanalla. Huomaa, että tämä väliaikainen postilaatikko tyhjennetään ja poistetaan myöhemmin, jotta viestit ovat vain salasanalla suojatussa postilaatikossasi.
-
Jos olet yhteydessä IMAP-protokollaan (esim. käyttämällä sähköpostiohjelmaa, kuten Apple Mailia tai Thunderbirdiä), meidän ei tarvitse kirjoittaa väliaikaiseen levytallennustilaan. Sen sijaan noudetaan ja käytetään muistissa olevaa salattua IMAP-salasanasi. Kun viestiä yritetään toimittaa sinulle reaaliajassa, lähetämme WebSocket-pyynnön kaikille IMAP-palvelimille kysyäksemme, onko heillä aktiivinen istunto sinulle (tämä on noutovaihe), ja välitämme sitten tämän salatun muistissa olevan salasanan eteenpäin – joten meidän ei tarvitse kirjoittaa väliaikaiseen postilaatikkoon, vaan voimme kirjoittaa varsinaiseen salattuun postilaatikkoosi salatulla salasanallasi.
- Salattujen postilaatikoiden varmuuskopiot luodaan päivittäin. Voit myös pyytää uuden varmuuskopion milloin tahansa tai ladata uusimman varmuuskopion osoitteesta Oma tili 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 mikään ei täyttänyt vaatimuksiamme yhtä hyvin kuin SQLite:
Tietokanta | Salaus levossa | Sandboxed Postilaatikot | Lisenssi | Used Everywhere |
---|---|---|---|---|
SQLite :tähti: | ✅ Kyllä, SQLite3MultipleCiphers | :valkoinen_tarkistusmerkki: | ✅ Julkinen omaisuus | :valkoinen_tarkistusmerkki: |
MongoDB | ❌ "Available in MongoDB Enterprise only" | ❌ Relaatiotietokanta | ❌ AGPL ja SSPL-1.0 |
❌ |
rqlite | ❌ Network only | ❌ Relaatiotietokanta | ✅ SOLU_KOODI_0 | ❌ |
dqlite | ❌ Untested and not yet supported? | ❌ Untested and not yet supported? | ✅ SOLU_KOODI_0 | ❌ |
PostgreSQL | ✅ Yes | ❌ Relaatiotietokanta | ✅ PostgreSQL (samanlainen kuin BSD tai MIT ) |
❌ |
MariaDB | ✅ For InnoDB only | ❌ Relaatiotietokanta | ✅ GPLv2 ja BUSL-1.1 |
❌ |
CockroachDB | ❌ Enterprise-only feature | ❌ Relaatiotietokanta | ❌ BUSL-1.1 ja muut |
❌ |
Yllä olevassa taulukossa on blogikirjoitus, jossa vertaillaan useita SQLite-tietokannan tallennusvaihtoehtoja.
Tietoturva
Käytämme aina salaus levossa (AES-256), salaus siirron aikana (TLS), DNS HTTPS:n kautta ("DoH") -salausta käyttäen 🍊 Mandariini ja sqleet (ChaCha20-Poly1305). Lisäksi käytämme token-pohjaista kaksivaiheista todennusta (toisin kuin tekstiviestitse, joka on välikäsihyökkäykset:lle altis), kierrätettyjä SSH-avaimia, joissa pääkäyttäjän oikeudet on poistettu käytöstä, yksinoikeudella pääsyä palvelimille rajoitettujen IP-osoitteiden kautta ja paljon muuta.
Jos kyseessä on pahan piian hyökkäys-käyttäjä tai kolmannen osapuolen toimittajan luvaton työntekijä, postilaatikkosi voidaan edelleen avata vain luomallasi salasanalla. Voit olla varma, ettemme ole riippuvaisia muista kolmannen osapuolen toimittajista kuin SOC Type 2 -valituspalvelinpalveluntarjoajistamme, kuten Cloudflaresta, DataPacketista, Digital Oceanista ja Vultrista.
Tavoitteenamme on, että yksittäinen vikapiste-kohteita on mahdollisimman vähän.
Postilaatikot
tldr; IMAP-palvelimemme käyttävät erikseen salattuja SQLite-tietokantoja jokaiselle postilaatikollesi.
SQLite on erittäin suosittu upotettu tietokanta – se on tällä hetkellä käynnissä puhelimessasi ja tietokoneessasi – ja sitä käyttävät lähes kaikki tärkeimmät teknologiat.
Esimerkiksi salatuilla palvelimillamme on SQLite-tietokannan postilaatikko linux@example.com
:lle, info@example.com
:lle, hello@example.com
:lle ja niin edelleen – yksi kullekin .sqlite
-tietokantatiedostona. Emme myöskään nimeä tietokantatiedostoja sähköpostiosoitteella – sen sijaan käytämme BSON ObjectID:tä ja luotuja yksilöllisiä UUID-tunnuksia, jotka eivät jaa postilaatikon haltijaa tai sähköpostiosoitetta (esim. 353a03f21e534321f5d6e267.sqlite
).
Jokainen näistä tietokannoista on salattu salasanallasi (joka on vain sinulla) käyttäen sqleet (ChaCha20-Poly1305). Tämä tarkoittaa, että postilaatikosi ovat erikseen salattuja, itsenäisiä (hiekkalaatikko ja siirrettäviä.
Olemme hienosäätäneet SQLiteä seuraavalla PRAGMA-muuttujalla:
PRAGMA |
Tarkoitus |
---|---|
cipher=chacha20 |
ChaCha20-Poly1305 SQLite database encryption. Lisätietoja on kohdassa better-sqlite3-multiple-ciphers kohdassa Projects. |
key="****************" |
Tämä on purettu, muistissa oleva salasanasi, joka välitetään sähköpostiohjelmasi IMAP-yhteyden kautta palvelimellemme. Uudet tietokantainstanssit luodaan ja suljetaan jokaista luku- ja kirjoitusistuntoa varten (hiekkalaatikon ja eristämisen varmistamiseksi). |
journal_model=WAL |
Kirjoita etukäteen lokitiedosto ("WAL") which boosts performance and allows concurrent read access. |
busy_timeout=5000 |
Estää kirjoituslukitusvirheet while other writes are taking place. |
synchronous=NORMAL |
Parantaa tapahtumien kestävyyttä without data corruption risk. |
foreign_keys=ON |
Pakottaa, että viiteavainten viittaukset (esim. relaatio taulukon ja toisen taulukon välillä) pakotetaan. By default this is not turned on in SQLite, mutta validoinnin ja tietojen eheyden vuoksi sen tulisi olla käytössä. |
encoding='UTF-8' |
Default encoding käytettäväksi kehittäjän mielenterveyden varmistamiseksi. |
Kaikki muut oletusarvot ovat SQLitestä, kuten virallinen PRAGMA-dokumentaatio:ssa on määritetty.
Samanaikaisuus
tldr; Käytämme
WebSocket
-muistipaikkaa salattujen SQLite-postilaatikoiden samanaikaiseen lukemiseen ja kirjoittamiseen.
Lukee
Puhelimesi sähköpostiohjelma saattaa selvittää imap.forwardemail.net
-osoitteen yhdeksi Digital Oceanin IP-osoitteistamme – ja työpöytäsovelluksesi saattaa selvittää erillisen IP-osoitteen kokonaan toisesta palveluntarjoaja-osoitteesta.
Riippumatta siitä, mihin IMAP-palvelimeen sähköpostiohjelmasi muodostaa yhteyden, haluamme yhteyden lukevan tietokannastasi reaaliajassa 100 %:n tarkkuudella. Tämä tehdään WebSocketsin kautta.
Kirjoittaa
Tietokantaan kirjoittaminen on hieman erilaista – koska SQLite on upotettu tietokanta ja postilaatikkosi sijaitsee oletusarvoisesti yhdessä tiedostossa.
Olimme tutkineet alla olevia vaihtoehtoja, kuten litestream
, rqlite
ja dqlite
, mutta mikään näistä ei täyttänyt vaatimuksiamme.
Jotta kirjoitukset voidaan suorittaa etukäteen kirjoitettavan lokikirjauksen ("WAL") ollessa käytössä, meidän on varmistettava, että vain yksi palvelin ("Primary") on vastuussa siitä. WAL nopeuttaa huomattavasti samanaikaisuutta ja sallii yhden kirjoittajan ja useita lukijoita.
Ensisijainen palvelimia käytetään datapalvelimilla, joiden liitetyillä levyillä on salatut postilaatikot. Jakelun näkökulmasta kaikkia imap.forwardemail.net
-palvelimen takana olevia yksittäisiä IMAP-palvelimia voidaan pitää toissijaisina palvelimina ("Secondary").
Toteutamme kaksisuuntaisen viestinnän WebSockets:n kanssa:
-
Ensisijaiset palvelimet käyttävät ws:n
WebSocketServer
-palvelimen instanssia. -
Toissijaiset palvelimet käyttävät ws:n
WebSocket
-asiakasohjelman instanssia, joka on kääritty websocket-as-promised:n ja websocketin uudelleenkytkeminen:n kanssa. Nämä kaksi käärintäohjelmaa varmistavat, ettäWebSocket
muodostaa uudelleen yhteyden ja voi lähettää ja vastaanottaa tietoja tiettyjä tietokannan kirjoituksia varten.
Varmuuskopiot
tldr; Salattujen postilaatikoiden varmuuskopiot otetaan päivittäin. Voit myös pyytää uuden varmuuskopion välittömästi tai ladata uusimman varmuuskopion milloin tahansa kohdasta Oma tili Verkkotunnukset Aliakset.
Varmuuskopioita varten suoritamme SQLite VACUUM INTO
-komennon joka päivä IMAP-komennon käsittelyn aikana. Tämä hyödyntää salattua salasanaasi muistissa olevasta IMAP-yhteydestä. Varmuuskopiot tallennetaan, jos olemassa olevaa varmuuskopiota ei havaita tai jos tiedoston SHA-256-hajautusarvo on muuttunut viimeisimpään varmuuskopioon verrattuna.
Huomaa, että käytämme VACUUM INTO
-komentoa sisäänrakennetun backup
-komennon sijaan, koska jos sivua muokataan backup
-komennon aikana, se on aloitettava alusta. VACUUM INTO
-komento ottaa tilannevedoksen. Katso lisätietoja näistä GitHub- ja Hakkereiden uutiset-komentoja koskevista kommenteista.
Lisäksi käytämme VACUUM INTO
-komentoa backup
-komennon sijaan, koska backup
-komento jättäisi tietokannan salaamattomaksi lyhyeksi ajaksi, kunnes rekey
-komentoa kutsutaan (katso lisätietoja tästä GitHubin kommentti-tiedostosta).
Toissijainen yksikkö käskee ensisijaista yksikköä suorittamaan varmuuskopioinnin WebSocket
-yhteyden kautta – ja ensisijainen yksikkö vastaanottaa sitten komennon tehdä niin ja tekee sen jälkeen seuraavat toimenpiteet:
-
Yhdistä salattuun postilaatikkoosi.
-
Hanki kirjoituslukko.
-
Suorita WAL-tarkistuspiste
wal_checkpoint(PASSIVE)
:n kautta. -
Suorita
VACUUM INTO
SQLite -komento. -
Varmista, että kopioitu tiedosto voidaan avata salatulla salasanalla (suojaus/valesuojaus).
-
Lataa se Cloudflare R2:een tallennusta varten (tai omaan palveluntarjoajaasi, jos se on määritetty).
Muista, että postilaatikkosi ovat salattuja – ja vaikka meillä on IP-rajoituksia ja muita todennusmenetelmiä WebSocket-tiedonsiirtoa varten – voit olla varma, että jos WebSocket-hyötykuorma ei tiedä IMAP-salasanaasi, se ei voi avata tietokantaasi, jos se on haitallisen tahon alainen.
Tällä hetkellä postilaatikkoa kohden tallennetaan vain yksi varmuuskopio, mutta tulevaisuudessa saatamme tarjota palautusta tietyn ajankohdan mukaan ("PITR").
Hae
IMAP-palvelimemme tukevat SEARCH
-komentoa monimutkaisten kyselyiden, säännöllisten lausekkeiden ja muiden toimintojen kanssa.
Nopea hakutoiminto on FTS5:n ja sqlite-regex:n ansiota.
Tallennamme Date
-arvot SQLite-postilaatikoihin ISO 8601-merkkijonoina Date.prototype.toISOString-metodin kautta (UTC-aikavyöhykkeellä, jotta yhtäläisyysvertailut toimivat oikein).
Indeksit tallennetaan myös kaikille hakukyselyissä oleville ominaisuuksille.
Projektit
Tässä on taulukko, jossa esitetään lähdekoodissamme ja kehitysprosessissamme käyttämämme projektit (aakkosjärjestyksessä):
Projekti | Tarkoitus |
---|---|
Ansible | DevOps-automaatioalusta koko palvelinkalustomme helppoon ylläpitoon, skaalaukseen ja hallintaan. |
Bree | Töiden ajoitus Node.js:lle ja JavaScriptille, jossa on cron, dates, ms, later ja käyttäjäystävällinen tuki. |
Cabin | Kehittäjäystävällinen JavaScript- ja Node.js-lokikirjasto, joka on suunniteltu tietoturvaa ja yksityisyyttä ajatellen. |
Lad | Node.js-kehys, joka tukee koko arkkitehtuuriamme ja suunnitteluamme MVC:n ja muiden elementtien avulla. |
MongoDB | NoSQL-tietokantaratkaisu, jota käytämme kaikkien muiden postilaatikoiden ulkopuolisten tietojen (esim. tilisi, asetuksesi, verkkotunnuksesi ja alias-määritykset) tallentamiseen. |
Mongoose | MongoDB-objektidokumenttimallinnus ("ODM"), jota käytämme koko DB-pinossamme. Kirjoitimme erityisiä apuohjelmia, joiden avulla voimme yksinkertaisesti jatkaa Mongoosen käyttöä SQLite:n kanssa 🎉 |
Node.js | Node.js on avoimen lähdekoodin, monialustainen JavaScript-suoritusympäristö, joka suorittaa kaikki palvelinprosessimme. |
Nodemailer | Node.js-paketti sähköpostien lähettämiseen, yhteyksien luomiseen ja muuhun. Olemme tämän projektin virallinen sponsori. |
Redis | Muistissa oleva tietokanta välimuistiin tallentamiseen, julkaisu-/tilauskanaviin ja DNS:ään HTTPS-pyyntöjen kautta. |
SQLite3MultipleCiphers | SQLiten salauslaajennus, jonka avulla koko tietokantatiedostot voidaan salata (mukaan lukien etukäteen kirjoitettava loki ("WAL"), lokitiedosto, palautus jne.). |
SQLiteStudio | Visual SQLite -editori (jota voit myös käyttää) kehityspostilaatikoiden testaamiseen, lataamiseen ja tarkastelemiseen. |
SQLite | Upotettu tietokantakerros skaalautuvaa, itsenäistä, nopeaa ja vikasietoista IMAP-tallennusta varten. |
Spam Scanner | Node.js-roskapostin, sähköpostin suodatuksen ja tietojenkalastelunestotyökalu (vaihtoehtomme Spam Assassin- ja rspamd-työkaluille). |
Tangerine | DNS HTTPS-pyyntöjen kautta Node.js:n avulla ja välimuisti Redisin avulla – mikä varmistaa globaalin yhdenmukaisuuden ja paljon muuta. |
Thunderbird | Kehitystiimimme käyttää tätä (ja suosittelee myös) suositeltuna sähköpostiohjelmana sähköpostin edelleenlähetyksen kanssa. |
UTM | Kehitystiimimme käyttää tätä virtuaalikoneiden luomiseen iOS:lle ja macOS:lle testatakseen erilaisia sähköpostiohjelmia (rinnakkain) IMAP- ja SMTP-palvelimiemme kanssa. |
Ubuntu | Moderni avoimen lähdekoodin Linux-pohjainen palvelinkäyttöjärjestelmä, joka pyörittää kaikkea infrastruktuuriamme. |
WildDuck | IMAP-palvelinkirjasto – katso sen huomautukset attachment de-duplication ja IMAP protocol support -kirjastoista. |
better-sqlite3-multiple-ciphers | Nopea ja yksinkertainen API-kirjasto Node.js:n ohjelmalliseen vuorovaikutukseen SQLite3:n kanssa. |
email-templates | Kehittäjäystävällinen sähköpostijärjestelmä mukautettujen sähköpostien (esim. tili-ilmoitusten ja muiden) luomiseen, esikatseluun ja lähettämiseen. |
json-sql-enhanced | SQL-kyselyiden rakentaja Mongo-tyylistä syntaksia käyttäen. Tämä säästää kehitystiimimme aikaa, koska voimme jatkaa kirjoittamista Mongo-tyyliin koko pinon läpi tietokannasta riippumattomalla lähestymistavalla. Se auttaa myös välttämään SQL-injektiohyökkäyksiä käyttämällä kyselyparametreja. |
knex-schema-inspector | SQL-apuohjelma olemassa olevan tietokantakaavan tietojen poimimiseen. Tämän avulla voimme helposti varmistaa, että kaikki indeksit, taulukot, sarakkeet, rajoitteet ja muut ovat kelvollisia ja että ne ovat 1:1 oikeassa muodossa. Olemme jopa kirjoittaneet automaattisia apuohjelmia uusien sarakkeiden ja indeksien lisäämiseksi, jos tietokantakaavoihin tehdään muutoksia (ja niissä on myös erittäin yksityiskohtainen virheilmoitus). |
knex | SQL-kyselyiden rakentaja, jota käytämme vain tietokantojen migraatioihin ja skeeman validointiin knex-schema-inspector :n kautta. |
mandarin | Automaattinen i18n -lausekekäännös Markdown-tuella käyttäen Google Cloud Translation API. |
mx-connect | Node.js-paketti MX-palvelimiin liittyvien yhteyksien ratkaisemiseen ja muodostamiseen sekä virheiden käsittelyyn. |
pm2 | Node.js-tuotantoprosessien hallintaohjelma sisäänrakennetulla kuormituksen tasaajalla (fine-tuned suorituskyvyn parantamiseksi). |
smtp-server | SMTP-palvelinkirjasto – käytämme tätä sähköpostinvaihtoon ("MX") ja lähtevän postin SMTP-palvelimillemme. |
ImapTest | Hyödyllinen työkalu IMAP-palvelimien testaamiseen vertailuarvoja ja RFC-spesifikaation mukaista IMAP-protokollan yhteensopivuutta vasten. Tämän projektin loi Dovecot -tiimi (aktiivinen avoimen lähdekoodin IMAP- ja POP3-palvelin heinäkuusta 2002 lähtien). Testasimme IMAP-palvelintamme laajasti tällä työkalulla. |
Löydät muita käyttämiämme projekteja lähdekoodimme GitHubissa-kohdasta.
Palveluntarjoajat
Palveluntarjoaja | Tarkoitus |
---|---|
Cloudflare | DNS-palveluntarjoaja, terveystarkastukset, kuormituksen tasaajat ja varmuuskopiointi Cloudflare R2 -palvelun avulla. |
Digital Ocean | Dedikoitu palvelinhosting ja hallinnoidut tietokannat. |
Vultr | Dedikoitu palvelinhosting. |
DataPacket | Dedikoitu palvelinhosting. |
Ajatuksia
Periaatteet
Sähköpostin edelleenlähetys on suunniteltu seuraavien periaatteiden mukaisesti:
-
Ole aina kehittäjäystävällinen, tietoturva- ja yksityisyyskeskeinen sekä läpinäkyvä.
-
Noudata MVC-, Unix-, KISS-, DRY-, YAGNI-, Kaksitoista tekijää-, Occamin partakone- ja koiranruokailu-ohjeita.
-
Kohdista toimintasi irstailevaan, itseohjautuvaan ja ramen-kannattava-kehittäjään.
Kokeet
tldr; S3-yhteensopivan objektitallennuksen ja/tai virtuaalitaulujen käyttö ei ole teknisesti mahdollista suorituskykyyn liittyvistä syistä ja on altis virheille muistirajoitusten vuoksi.
Olemme tehneet muutamia kokeiluja ennen kuin päädyimme lopulliseen SQLite-ratkaisuumme, kuten edellä on käsitelty.
Yksi näistä oli kokeilla rclone:n ja SQLiten käyttöä yhdessä S3-yhteensopivan tallennuskerroksen kanssa.
Tuo kokeilu johti meidät ymmärtämään ja löytämään reunatapauksia, jotka liittyvät rclonen, SQLiten ja VFS:n käyttöön:
- Jos otat
--vfs-cache-mode writes
-lipun käyttöön rclonella, lukeminen onnistuu, mutta kirjoitukset tallennetaan välimuistiin. - Jos sinulla on useita IMAP-palvelimia maailmanlaajuisesti hajautettuna, välimuisti on pois päältä niiden välillä, ellet käytä yhtä kirjoittajaa ja useita kuuntelijoita (esim. pub/sub-lähestymistapa).
- Tämä on uskomattoman monimutkaista, ja tämänkaltainen monimutkaisuus johtaa useampiin yksittäisiin vikaantumiskohtiin.
- S3-yhteensopivat tallennuspalveluntarjoajat eivät tue osittaisia tiedostomuutoksia – mikä tarkoittaa, että
.sqlite
-tiedoston muutos johtaa täydelliseen muutokseen ja tietokannan uudelleenlataukseen. - Muita ratkaisuja, kuten
rsync
, on olemassa, mutta ne eivät keskity etukäteen kirjoitettavan lokin ("WAL") tukeen – joten päädyimme tarkastelemaan Litestreamia. Onneksi salauskäyttömme salaa jo WAL-tiedostot puolestamme, joten meidän ei tarvitse luottaa Litestreamiin tässä asiassa. Emme kuitenkaan olleet vielä varmoja Litestreamin käytöstä tuotantokäytössä, ja meillä on siitä muutamia huomioita alla. - Tämän
--vfs-cache-mode writes
-vaihtoehdon käyttäminen (ainoa tapa käyttää SQLiteärclone
:n sijaan kirjoituksiin) yrittää kopioida koko tietokannan tyhjästä muistista – yhden 10 Gt:n postilaatikon käsittely on OK, mutta useiden postilaatikoiden käsittely erittäin suurella tallennustilalla aiheuttaa IMAP-palvelimille muistirajoituksia jaENOMEM
-virheitä, segmentointivirheitä ja tietojen vioittumista. - Jos yrität käyttää SQLite Virtuaalipöydät:aa (esim. käyttämällä s3db:ää) saadaksesi tiedot S3-yhteensopivalle tallennustasolle, kohtaat useita muita ongelmia:
- Lukeminen ja kirjoittaminen on erittäin hidasta, koska S3 API -päätepisteisiin on tartuttava HTTP
.sqlite
0-,.sqlite
1-,.sqlite
2- ja.sqlite
3-metodeilla. * Kehitystestit osoittivat, että yli 500 000–1 000 000 tietueen ylittäminen kuituinternetissä on edelleen rajoitettua S3-yhteensopivien palveluntarjoajien kirjoittamisen ja lukemisen suorituskyvyllä. Esimerkiksi kehittäjämme suorittivat.sqlite
4-silmukoita sekä peräkkäisten SQL.sqlite
5 -lausekkeiden että suurten tietomäärien joukkokirjoittamiseen tarkoitettujen lausekkeiden tekemiseen. Molemmissa tapauksissa suorituskyky oli hämmästyttävän hidas. - Virtuaalitaulukoilla ei voi olla indeksejä,
.sqlite
6-lausekkeita eikä.sqlite
7.sqlite
8 -lausekkeita – mikä johtaa jopa 1–2 minuutin tai pidempiin viiveisiin tietomäärästä riippuen. - Objektit tallennettiin salaamattomina, eikä natiivia salaustukea ole saatavilla.
- Tutkimme myös
.sqlite
9:n käyttöä, joka on käsitteellisesti ja teknisesti samanlainen kuin edellinen luettelokohta (joten siinä on samat ongelmat). Yksi mahdollisuus olisi käyttää mukautettuarsync
0-rakennetta, joka on kääritty salauksella, kutenrsync
1 (jota käytämme tällä hetkellä yllä olevassa ratkaisussamme)rsync
2:n kautta. - Toinen mahdollinen lähestymistapa olisi käyttää
rsync
3:a, mutta tällä on 32 Gt:n rajoitus ja se vaatisi monimutkaisia rakennus- ja kehitysongelmia. rsync
4-lausekkeet ovat pakollisia (joten tämä sulkee täysin pois virtuaalitaulukoiden käytön). Tarvitsemmersync
5-lausekkeita, jottarsync
6-koukkumme toimisi oikein – mikä varmistaa, että tiedot eivät vioitu ja noudetut rivit voidaan muuntaa kelvollisiksi dokumenteiksirsync
7-skeemamääritysten mukaisesti (jotka sisältävät rajoitteen, muuttujatyypin ja mielivaltaisen datan validoinnin).- Lähes kaikki avoimen lähdekoodin yhteisön SQLiteen liittyvät S3-yhteensopivat projektit ovat Pythonissa (eikä JavaScriptissä, jota käytämme 100 %:sti pinostamme).
- Pakkauskirjastot, kuten
rsync
8 (katsorsync
9), näyttävät lupaavilta, mutta __PROTECTED_LINK_189__0. Sen sijaan sovelluspuolen pakkaus tietotyypeille, kuten __PROTECTED_LINK_189__1, __PROTECTED_LINK_189__2, __PROTECTED_LINK_189__3, __PROTECTED_LINK_189__4, __PROTECTED_LINK_189__5 ja __PROTECTED_LINK_189__6, on puhtaampi ja helpompi lähestymistapa (ja se on myös helpompi siirtää, koska voisimme tallentaa __PROTECTED_LINK_189__7-lipun tai -sarakkeen – tai jopa käyttää __PROTECTED_LINK_189__8 __PROTECTED_LINK_189__9 pakkaamiseen tai __PROTECTED_LINK_190__0 pakkaamattomuuteen tietokannan metatietoina). - Onneksi meillä on jo käytössä liitteiden deduplikaatio IMAP-palvelimemme tallennustilassa – siksi jokainen saman liitteen sisältävä viesti ei säilytä kopiota liitteestä – sen sijaan yksi liite tallennetaan useille viesteille ja ketjuille postilaatikossa (ja käytetään myöhemmin ulkoista viittausta).
- Litestream-projekti, joka on SQLite-replikointi- ja varmuuskopiointiratkaisu, on erittäin lupaava, ja tulemme todennäköisesti käyttämään sitä tulevaisuudessa.
- En halua vähätellä tekijän/tekijöiden uskottavuutta – koska olemme rakastaneet heidän työtään ja panostaan avoimeen lähdekoodiin jo yli vuosikymmenen ajan – mutta käytännön käytöstä näyttää siltä, että __PROTECTED_LINK_190__1 ja __PROTECTED_LINK_190__2 ovat olemassa.
- Varmuuskopioiden palauttamisen on oltava kitkatonta ja yksinkertaista. MongoDB:n kaltaisen ratkaisun käyttö __PROTECTED_LINK_190__3:n ja __PROTECTED_LINK_190__4:n kanssa ei ole vain työlästä, vaan myös aikaa vievää ja konfigurointi on monimutkaista.
- SQLite-tietokannat tekevät siitä yksinkertaista (se on yksi tiedosto).
- Halusimme suunnitella ratkaisun, jossa käyttäjät voivat ottaa postilaatikkonsa ja poistua milloin tahansa.
- Yksinkertaiset Node.js-komennot __PROTECTED_LINK_190__5:lle, ja se poistetaan pysyvästi levytilasta. * Voimme samalla tavalla käyttää S3-yhteensopivaa API:a HTTP __PROTECTED_LINK_190__6:n kanssa poistaaksemme helposti käyttäjien tilannevedokset ja varmuuskopiot.
- 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 palveluita.
Mielestämme tämä saattaa johtua siitä, että olemassa olevissa sähköpostipalveluissa on käytössä vanhaa teknologiaa spagettikoodi 🍝:n kanssa.
Useimmat, elleivät kaikki, nykyiset sähköpostipalveluntarjoajat ovat joko suljetun lähdekoodin ohjelmia tai mainostavat itseään avoimen lähdekoodin ohjelmina, mutta todellisuudessa vain niiden käyttöliittymä on avoimen lähdekoodin ohjelmia.
Sähköpostin arkaluontoisin osa (varsinainen tallennus/IMAP/SMTP-vuorovaikutus)** tapahtuu kaikki taustalla (palvelimella), ei käyttöliittymässä (asiakasohjelmassa)**.
Kokeile sähköpostin edelleenlähetystä
Rekisteröidy tänään osoitteessa https://forwardemail.net! 🚀