Salatut SQLite-postilaatikot yksityisyyttäsi varten
Toisin kuin muut sähköpostipalvelut , varmistamme, että vain sinulla on aina pääsy postilaatikkoosi .
- Hakusivu
- Sisällysluettelo
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
-
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.
- Käyttäjänimesi on täydellinen aliaksesi verkkotunnuksesi kanssa, kuten
-
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).
-
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.
-
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!
-
-
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:
Tietokanta | Salaus levossa | Hiekkalaatikko Postilaatikot | Lisenssi | Käytetty kaikkialla |
---|---|---|---|---|
SQLite ⭐ | ✅ Kyllä SQLite3MultipleCiphers | ✅ | ✅ Julkinen verkkotunnus | ✅ |
MongoDB | ❌ "Saatavilla vain MongoDB Enterprisessa" | ❌ Relaatiotietokanta | ❌ AGPL ja SSPL-1.0 | ❌ |
rqlite | ❌ Vain verkko | ❌ Relaatiotietokanta | ✅ MIT | ❌ |
dqlite | ❌ Testaamaton eikä vielä tuettu? | ❌ Testaamaton eikä vielä tuettu? | ✅ LGPL-3.0-only | ❌ |
PostgreSQL | ✅ Joo | ❌ Relaatiotietokanta | ✅ PostgreSQL (samanlainen kuin BSD tai MIT ) | ❌ |
MariaDB | ✅ Vain InnoDB:lle | ❌ Relaatiotietokanta | ✅ GPLv2 ja BUSL-1.1 | ❌ |
CockroachDB | ❌ Vain yrityskäyttöön tarkoitettu ominaisuus | ❌ Relaatiotietokanta | ❌ BUSL-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:
PRAGMA | Tarkoitus |
---|---|
cipher=chacha20 | ChaCha20-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=WAL | Kirjoita eteenpäin-loki ("WAL") joka parantaa suorituskykyä ja mahdollistaa samanaikaisen lukuoikeuden. |
busy_timeout=5000 | Estää kirjoituslukkovirheet kun muita kirjoituksia tapahtuu. |
synchronous=NORMAL | Lisää liiketoimien kestävyyttä ilman tietojen korruptioriskiä. |
foreign_keys=ON | Pakottaa, 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
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ä tehdään WebSocketsin kautta.
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:
- Muodosta yhteys salattuun postilaatikkoosi.
- Hanki kirjoituslukko.
- Suorita WAL-tarkastuspiste kautta
wal_checkpoint(PASSIVE)
. - Suorita
VACUUM INTO
SQLite-komento. - Varmista, että kopioitu tiedosto voidaan avata salatulla salasanalla (suojaus/tyhjennys).
- 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").
Hae
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ä):
Projekti | Tarkoitus |
---|---|
Mahdollinen | DevOps-automaatioalusta koko palvelinkannan ylläpitoon, skaalaukseen ja hallintaan helposti. |
Bree | Työn ajoitus Node.js:lle ja JavaScriptille, jossa on cron-, päivämäärä-, ms-, uudemmat ja ihmisystävälliset tuet. |
Mökki | Kehittäjäystävällinen JavaScript- ja Node.js-lokikirjasto turvallisuutta ja yksityisyyttä ajatellen. |
Poika | Node.js-kehys, joka tukee koko arkkitehtuuriamme ja suunnitteluamme MVC:n ja muiden kanssa. |
MongoDB | NoSQL-tietokantaratkaisu, jota käytämme kaikkien muiden tietojen tallentamiseen postilaatikoiden ulkopuolelle (esim. tilisi, asetukset, verkkotunnukset ja aliasmääritykset). |
Mungo | MongoDB-objektidokumenttien mallinnus ("ODM"), jota käytämme koko pinossamme. Kirjoitimme erityisiä apuvälineitä, joiden avulla voimme yksinkertaisesti jatkaa käyttöä Mongoose SQLiten kanssa 🎉 |
Node.js | Node.js on avoimen lähdekoodin monikäyttöinen JavaScript-ajoympäristö, joka suorittaa kaikkia palvelinprosessejamme. |
Muistipostittaja | 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, kanavien julkaisemiseen/tilaamiseen ja DNS:n HTTPS-pyyntöjen kautta. |
SQLite3MultipleCiphers | SQLiten salauslaajennus mahdollistaa kokonaisten tietokantatiedostojen salaamisen (mukaan lukien eteenpäinkirjoitusloki ("WAL"), päiväkirja, palautus...). |
SQLiteStudio | Visuaalinen SQLite-editori (jota voit myös käyttää) kehityspostilaatikoiden testaamiseen, lataamiseen ja katseluun. |
SQLite | Sulautettu tietokantakerros skaalautuvaan, itsenäiseen, nopeaan ja joustavaan IMAP-tallennustilaan. |
Roskapostiskanneri | Node.js roskapostin esto, sähköpostin suodatus ja tietojenkalastelun estotyökalu (vaihtoehtomme Roskapostin salamurhaaja ja rspamd). |
Tangeriini | DNS HTTPS:n kautta Node.js:n avulla ja välimuisti Redisillä – mikä varmistaa maailmanlaajuisen johdonmukaisuuden ja paljon muuta. |
Thunderbird | Kehitystiimimme käyttää tätä (ja suosittelee myös tätä) mm ensisijainen sähköpostiohjelma, jota käytetään edelleen sähköpostin kanssa. |
UTM | Kehitystiimimme käyttää tätä luomalla virtuaalikoneita iOS:lle ja macOS:lle testatakseen erilaisia sähköpostiohjelmia (rinnakkain) IMAP- ja SMTP-palvelimiemme kanssa. |
Ubuntu | Nykyaikainen avoimen lähdekoodin Linux-pohjainen palvelinkäyttöjärjestelmä, joka toimii kaikessa infrastruktuurissamme. |
WildAnkka | IMAP-palvelinkirjasto – katso sen huomautukset liitteen päällekkäisyyden poistaminen ja IMAP-protokollan tuki. |
parempi-sqlite3-multiple-ciphers | Node.js:n nopea ja yksinkertainen API-kirjasto vuorovaikutukseen SQLite3:n kanssa ohjelmallisesti. |
sähköpostimalleja | Kehittäjäystävällinen sähköpostikehys mukautettujen sähköpostien (esim. tili-ilmoitusten ja muiden) luomiseen, esikatseluun ja lähettämiseen. |
json-sql | SQL-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-inspector | SQL-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). |
knex | SQL-kyselyn rakentaja, jota käytämme vain tietokantojen siirtoon ja skeeman validointiin knex-schema-inspector . |
mandariini | Automaattinen i18n lauseen käännös Markdownin tuella Google Cloud Translation API. |
mx-connect | Node.js-paketti ratkaisemaan ja muodostamaan yhteyksiä MX-palvelimiin ja käsittelemään virheitä. |
pm2 | Node.js tuotantoprosessin hallinta sisäänrakennetulla kuormituksen tasapainottimella (hienosäädetty suorituskyvyn vuoksi). |
smtp-palvelin | SMTP-palvelinkirjasto – käytämme tätä sähköpostinvaihtoon ("MX") ja lähteviin SMTP-palvelimiin. |
ImapTest | Hyö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
Palveluntarjoaja | Tarkoitus |
---|---|
Cloudflare | DNS-palveluntarjoaja, kuntotarkastukset, kuormituksen tasapainottimet ja varmuuskopion tallennus Cloudflare R2. |
Digitaalinen valtameri | Oma palvelinisännöinti, SSD-lohkotallennus ja hallitut tietokannat. |
Vultr | Oma palvelinisännöinti ja SSD-lohkotallennus. |
ajatuksia
periaatteet
Välitä sähköposti on suunniteltu seuraavien periaatteiden mukaisesti:
- Ole aina kehittäjäystävällinen, turvallisuuteen ja yksityisyyteen keskittyvä ja läpinäkyvä.
- Noudata MVC, Unix, KISS, DRY, YAGNI, Kaksitoista tekijää, Occamin partaveitsi, ja koiranruokaa
- 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ää SQLitearclone
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 jaENOMEM
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
, jaPOST
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:tINSERT
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.
- Lukeminen ja kirjoittaminen ovat erittäin hidasta, koska S3 API -päätepisteisiin on lyötävä HTTP
- 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 tarvitsemmeALTER TABLE
lausunnot, jotta meidän koukku kanssaknex-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
, jaBuffer
tulee olemaan puhtaampi ja helpompi lähestymistapa (ja on myös helpompi siirtää, koska voisimme tallentaa aBoolean
lippu tai sarake – tai jopa käyttääPRAGMA
user_version=1
puristamiseen taiuser_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.
- Tekijän (tekijöiden) mainitsematta jättäminen – koska rakastamme heidän töitään ja panoksiaan avoimeen lähdekoodiin jo reilun vuosikymmenen ajan – mutta todellisen käytön perusteella näyttää siltä, että voi olla paljon päänsärkyä ja mahdollinen tietojen menetys käytöstä.
- Varmuuskopion palauttamisen on oltava kitkatonta ja triviaalia. Käyttämällä ratkaisua, kuten MongoDB kanssa
mongodump
jamongoexport
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ä.
- Yksinkertaiset Node.js-komennot
- 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! 🚀