Gizliliğiniz için şifrelenmiş SQLite posta kutuları
Diğer e-posta hizmetlerinin aksine , posta kutunuza her zaman yalnızca sizin erişebilmenizi sağlıyoruz.
- Arama sayfası
- İçindekiler
Önsöz
tldr; E-posta hizmetimiz %100 açık kaynak ve güvenli ve şifreli SQLite posta kutuları aracılığıyla gizlilik odaklı.
Biz lansmana kadar IMAP desteğiKalıcı veri depolama ihtiyaçlarımız için MongoDB'yi kullandık.
Bu teknoloji harika ve bugün hala kullanıyoruz - ancak MongoDB ile kullanımda olmayan şifrelemeye sahip olmak için Digital Ocean veya Mongo Atlas gibi MongoDB Enterprise sunan bir sağlayıcı kullanmanız veya bir kurumsal lisans için ödeme yapmanız gerekir (ve daha sonra satış ekibi gecikmesiyle çalışmak zorunda kalacaksınız).
Ekibimiz E-posta Yönlendir IMAP posta kutuları için geliştirici dostu, ölçeklenebilir, güvenilir ve şifrelenmiş bir depolama çözümüne ihtiyaç duyuyordu. Açık kaynak geliştiricileri olarak, kullanımda olmayan şifreleme özelliğini elde etmek için lisans ücreti ödemeniz gereken bir teknolojiyi kullanmak, karşıydı ilkelerimiz – ve böylece bu ihtiyaçları çözmek için sıfırdan yeni bir çözüm denedik, araştırdık ve geliştirdik.
Posta kutularınızı depolamak için paylaşılan bir veritabanı kullanmak yerine, posta kutularınızı (yalnızca sizin sahip olduğunuz) şifrenizle ayrı ayrı saklıyor ve şifreliyoruz. E-posta hizmetimiz o kadar güvenlidir ki, şifrenizi unutursanız posta kutunuzu kaybedersiniz. (ve çevrimdışı yedeklemelerle kurtarmanız veya baştan başlamanız gerekir).
Aşağıda derin bir dalış yaparken okumaya devam edin. e-posta servis sağlayıcılarının karşılaştırılması, Hizmetimiz nasıl çalışıyor?, teknoloji yığınımız, ve dahası.
E-posta servis sağlayıcı karşılaştırması
Ayrı ayrı şifrelenmiş SQLite posta kutularını saklayan, sınırsız alan adı, takma ad ve kullanıcı sunan ve giden SMTP, IMAP ve POP3 desteğine sahip tek %100 açık kaynaklı ve gizlilik odaklı e-posta hizmet sağlayıcısıyız:
Diğer e-posta sağlayıcılarının aksine, Forward Email ile depolama için alan adı veya takma ad bazında ödeme yapmanız gerekmez. Depolama, hesabınızın tamamında paylaşılır; dolayısıyla, birden fazla özel alan adınız ve her birinde birden fazla takma adınız varsa, o zaman sizin için mükemmel çözümüz. İsterseniz alan adı veya takma ad bazında depolama sınırları uygulayabileceğinizi unutmayın.
E-posta Hizmeti Karşılaştırmasını Okuyun
O nasıl çalışır
-
Apple Mail, Thunderbird, Gmail veya Outlook gibi e-posta istemcinizi kullanarak güvenli bağlantımıza bağlanırsınız IMAP kullanıcı adınızı ve şifrenizi kullanan sunucular:
- Kullanıcı adınız, alan adınızdaki tam takma adınızdır, örneğin
hello@example.com
. - Şifreniz rastgele oluşturulur ve tıkladığınızda yalnızca 30 saniye boyunca size gösterilir. Şifre oluştur itibaren Hesabım Alanlar Takma adlar.
- Kullanıcı adınız, alan adınızdaki tam takma adınızdır, örneğin
-
Bağlandıktan sonra e-posta istemciniz şunları gönderecektir: IMAP protokolü komutları posta kutunuzu senkronize tutmak için IMAP sunucumuza. Bu, taslak e-postaların yazılmasını ve saklanmasını ve yapabileceğiniz diğer eylemleri (örneğin, bir e-postayı Önemli olarak etiketlemek veya bir e-postayı Spam/Önemsiz Posta olarak işaretlemek) içerir.
-
Posta alışverişi sunucuları (genellikle "MX" sunucuları olarak bilinir) yeni gelen e-postaları alır ve posta kutunuza kaydeder. Bu gerçekleştiğinde e-posta istemciniz bilgilendirilecek ve posta kutunuzu senkronize edecektir. Posta değişim sunucularımız, e-postanızı bir veya daha fazla alıcıya (dahil) iletebilir. web kancaları), e-postanızı bizim için şifrelenmiş IMAP depolama alanınızda saklayın, ya da her ikisi de!
Daha fazlasını öğrenmek ister misiniz? Okumak e-posta yönlendirme nasıl kurulur, posta alışverişi hizmetimiz nasıl çalışır?veya görüntüle rehberlerimiz.
-
Perde arkasında, güvenli e-posta depolama tasarımımız, posta kutularınızı şifrelenmiş ve yalnızca sizin tarafınızdan erişilebilir durumda tutmak için iki şekilde çalışır:
-
Bir göndericiden sizin için yeni posta alındığında, posta değişim sunucularımız sizin için bireysel, geçici ve şifreli bir posta kutusuna yazar.
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!
-
E-posta istemcinizle IMAP sunucumuza bağlandığınızda, şifreniz daha sonra bellekte şifrelenir ve posta kutunuzu okumak ve yazmak için kullanılır. Posta kutunuz yalnızca bu şifreyle okunabilir ve yazılabilir. Bu şifreye sahip olan tek kişi olduğunuz için şunu unutmayın: sadece sen eriştiğinizde posta kutunuza okuyabilir ve yazabilirsiniz. E-posta istemcinizin bir daha posta veya senkronizasyon için yoklama girişiminde bulunması durumunda, yeni mesajlarınız bu geçici posta kutusundan aktarılacak ve sağladığınız şifre kullanılarak gerçek posta kutusu dosyanızda saklanacaktır. Bu geçici posta kutusunun daha sonra temizleneceğini ve silineceğini, böylece mesajların yalnızca şifre korumalı posta kutunuzda bulunacağını unutmayın.
-
IMAP'ye bağlıysanız (örneğin, Apple Mail veya Thunderbird gibi bir e-posta istemcisi kullanarak), geçici disk depolama alanına yazmamız gerekmez. Bunun yerine bellek içi şifrelenmiş IMAP şifreniz alınır ve kullanılır. Gerçek zamanlı olarak, size bir mesaj teslim edilmeye çalışıldığında, tüm IMAP sunucularına, sizin için aktif bir oturumları olup olmadığını soran bir WebSocket isteği göndeririz (bu, getirme kısmıdır) ve daha sonra bu mesajı iletiriz. şifrelenmiş bellek içi şifre - böylece geçici bir posta kutusuna yazmamıza gerek kalmaz, şifrelenmiş şifrenizi kullanarak gerçek şifrelenmiş posta kutunuza yazabiliriz.
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!
-
-
Şifrelenmiş posta kutularınızın yedekleri günlük olarak yapılmaktadır. Ayrıca istediğiniz zaman yeni bir yedekleme talep edebilir veya en son yedeği şuradan indirebilirsiniz: Hesabım Alanlar Takma adlar. Başka bir e-posta hizmetine geçmeye karar verirseniz posta kutularınızı ve yedeklerinizi istediğiniz zaman kolayca taşıyabilir, indirebilir, dışa aktarabilir ve temizleyebilirsiniz.
Teknolojiler
Veritabanları
Diğer olası veritabanı depolama katmanlarını araştırdık ancak hiçbiri gereksinimlerimizi SQLite kadar karşılamadı:
Veri tabanı | Kullanılmayan şifreleme | Korumalı alana alınmış Posta kutuları | Lisans | Her Yerde Kullanılır |
---|---|---|---|---|
SQLite ⭐ | ✅ Evet ile SQLite3Çoklu Şifreler | ✅ | ✅ Kamu Alanı | ✅ |
MongoDB | ❌ "Yalnızca MongoDB Enterprise'da mevcuttur" | ❌ İlişkisel veritabanı | ❌AGPL ve SSPL-1.0 | ❌ |
rqlite | ❌ Yalnızca ağ | ❌ İlişkisel veritabanı | ✅ MIT | ❌ |
dqlite | ❌ Test edilmemiş ve henüz desteklenmiyor mu? | ❌ Test edilmemiş ve henüz desteklenmiyor mu? | ✅ LGPL-3.0-only | ❌ |
PostgreSQL | ✅ Evet | ❌ İlişkisel veritabanı | ✅ PostgreSQL (benzer BSD veya MIT ) | ❌ |
MariaDB | ✅ Yalnızca InnoDB için | ❌ İlişkisel veritabanı | ✅ GPLv2 ve BUSL-1.1 | ❌ |
HamamböceğiDB | ❌ Yalnızca kurumsal özellik | ❌ İlişkisel veritabanı | ❌ BUSL-1.1 ve diğerleri | ❌ |
Burada bir Çeşitli SQLite veritabanı depolama seçeneklerini karşılaştıran blog yazısı yukarıdaki tabloda.
Güvenlik
Her zaman kullanıyoruz atıl durumdaki şifreleme (AES-256), geçiş halindeki şifreleme (TLS), HTTPS üzerinden DNS ("DoH") 🍊 kullanarak mandalina, ve dağınık (ChaCha20-Poly1305) posta kutularında şifreleme. Ayrıca belirteç tabanlı iki faktörlü kimlik doğrulama kullanıyoruz (SMS'in ortadaki adam saldırıları), kök erişimi devre dışı bırakılmış döndürülmüş SSH anahtarları, kısıtlanmış IP adresleri aracılığıyla sunuculara özel erişim ve daha fazlası.
Bir durumda kötü hizmetçi saldırısı veya üçüncü taraf bir satıcının hileli çalışanı, posta kutunuz hâlâ yalnızca oluşturduğunuz şifreyle açılabilir. İçiniz rahat olsun; Cloudflare, Digital Ocean ve Vultr SOC Type 2 şikayet sunucusu sağlayıcılarımız dışında herhangi bir üçüncü taraf satıcıya güvenmiyoruz.
Amacımız mümkün olduğu kadar az sayıda tek başarısızlık noktası olabildiğince.
Posta kutuları
tldr; IMAP sunucularımız, posta kutularınızın her biri için ayrı ayrı şifrelenmiş SQLite veritabanlarını kullanır.
SQLite son derece popüler bir gömülü veritabanı – şu anda telefonunuzda ve bilgisayarınızda çalışıyor – ve neredeyse tüm önemli teknolojiler tarafından kullanılıyor.
Örneğin, şifrelenmiş sunucularımızda SQLite veritabanı posta kutusu bulunmaktadır. linux@example.com
, info@example.com
, hello@example.com
vb. – her biri için bir tane .sqlite
veritabanı dosyası. Veritabanı dosyalarını e-posta adresiyle de adlandırmıyoruz; bunun yerine posta kutusunun kime ait olduğunu veya hangi e-posta adresinin altında olduğunu paylaşmayan BSON ObjectID'yi ve oluşturulan benzersiz UUID'leri kullanıyoruz (ör. 353a03f21e534321f5d6e267.sqlite
).
Bu veritabanlarının her biri, (yalnızca sizin sahip olduğunuz) şifreniz kullanılarak şifrelenir. dağınık (ChaCha20-Poly1305). Bu, posta kutularınızın ayrı ayrı şifrelendiği, bağımsız olduğu ve korumalı alana alınmışve taşınabilir.
SQLite'ta aşağıdakilerle ince ayar yaptık PRAGMA:
PRAGMA | Amaç |
---|---|
cipher=chacha20 | ChaCha20-Poly1305 SQLite veritabanı şifrelemesi. Referans better-sqlite3-multiple-ciphers altında Projeler daha fazla bilgi için. |
key="****************" | Bu, e-posta istemcinizin IMAP bağlantısı üzerinden sunucumuza aktarılan, şifresi çözülmüş, yalnızca bellek içi şifrenizdir. Her okuma ve yazma oturumu için yeni veritabanı örnekleri oluşturulur ve kapatılır (korumalı alan oluşturma ve izolasyonu sağlamak için). |
journal_model=WAL | Önceden yazma günlüğü ("WAL") performansı artırır ve eşzamanlı okuma erişimine izin verir. |
busy_timeout=5000 | Yazma kilidi hatalarını önler diğer yazmalar gerçekleşirken. |
synchronous=NORMAL | İşlemlerin dayanıklılığını artırır veri bozulması riski olmadan. |
foreign_keys=ON | Yabancı anahtar referanslarının (örneğin, bir tablodan diğerine ilişki) uygulanmasını zorunlu kılar. Varsayılan olarak bu SQLite'da açık değildirancak doğrulama ve veri bütünlüğü için etkinleştirilmesi gerekir. |
encoding='UTF-8' | Varsayılan kodlama geliştiricinin akıl sağlığını sağlamak için kullanmak. |
Diğer tüm varsayılanlar SQLite'tandır. resmi PRAGMA belgeleri.
Eşzamanlılık
tldr; Kullanırız
WebSocket
şifrelenmiş SQLite posta kutularınıza eşzamanlı okuma ve yazma işlemleri için.
Okur
Telefonunuzdaki e-posta istemciniz sorunu çözebilir imap.forwardemail.net
Digital Ocean IP adreslerimizden birine; masaüstü istemciniz farklı bir IP'den ayrı bir IP'yi çözümleyebilir Sağlayıcı tamamen.
E-posta istemcinizin hangi IMAP sunucusuna bağlandığına bakılmaksızın, bağlantının veritabanınızdan gerçek zamanlı olarak %100 doğrulukla okunmasını istiyoruz. Bu WebSockets aracılığıyla yapılır.
yazar
Veritabanınıza yazmak biraz farklıdır; çünkü SQLite gömülü bir veritabanıdır ve posta kutunuz varsayılan olarak tek bir dosyada bulunur.
gibi seçenekleri araştırdık. litestream
, rqlite
, ve dqlite
aşağıda – ancak bunların hiçbiri gereksinimlerimizi karşılamadı.
Yazma öncesi günlük kaydıyla yazma işlemlerini gerçekleştirmek için ("WAL") etkin - bunu yapmaktan yalnızca bir sunucunun ("Birincil") sorumlu olduğundan emin olmamız gerekir. WAL Eşzamanlılığı büyük ölçüde hızlandırır ve bir yazara ve birden fazla okuyucuya izin verir.
Birincil, şifrelenmiş posta kutularını içeren bağlı birimlerin bulunduğu veri sunucularında çalışıyor. Dağıtım açısından bakıldığında, arkadaki tüm bireysel IMAP sunucularını düşünebilirsiniz. imap.forwardemail.net
ikincil sunucular ("İkincil") olmak.
ile iki yönlü iletişim sağlıyoruz WebSoketleri:
- Birincil sunucular şunun bir örneğini kullanır: ws'S
WebSocketServer
sunucu. - İkincil sunucular aşağıdakilerin bir örneğini kullanır: ws'S
WebSocket
ile sarılmış müşteri söz verildiği gibi websocket ve yeniden bağlanma-websocket. Bu iki sarmalayıcı,WebSocket
yeniden bağlanır ve belirli veritabanı yazma işlemleri için veri gönderip alabilir.
Yedeklemeler
tldr; Şifrelenmiş mail kutularınızın yedekleri günlük olarak yapılmaktadır. Ayrıca anında yeni bir yedekleme talebinde bulunabilir veya istediğiniz zaman en son yedeği indirebilirsiniz. Hesabım Alanlar Takma adlar.
Yedeklemeler için SQLite'ı çalıştırmamız yeterlidir. VACUUM INTO
Bellek içi bir IMAP bağlantısından şifrelenmiş parolanızdan yararlanan IMAP komut işleme sırasında her gün komut verin. Yedeklemeler, mevcut bir yedekleme algılanmazsa veya SHA-256 En son yedeklemeyle karşılaştırıldığında dosyadaki karma değişti.
kullandığımızı unutmayın. VACUUM INTO
yerleşik komutun aksine komut backup
komutu çünkü bir sayfa bir işlem sırasında değiştirilirse backup
komut işlemi, o zaman baştan başlaması gerekir. VACUUM INTO
komut anlık görüntü alacaktır. Şu yorumlara bakın GitHub ve Hacker Haberleri daha fazla bilgi için.
Ek olarak kullanıyoruz VACUUM INTO
aksine backup
, Çünkü backup
komutu veritabanını kısa bir süreliğine şifrelenmemiş olarak bırakacaktır. rekey
çağrılır (bu GitHub'a bakın Yorum içgörü için).
İkincil, Birincil'e talimat verecektir. WebSocket
yedeklemeyi yürütmek için bağlantı - ve Birincil daha sonra bunu yapmak için komutu alacak ve ardından:
- Şifrelenmiş posta kutunuza bağlanın.
- Bir yazma kilidi edinin.
- Bir WAL kontrol noktası çalıştırın
wal_checkpoint(PASSIVE)
. - Çalıştır
VACUUM INTO
SQLite komutu. - Kopyalanan dosyanın şifrelenmiş parolayla (koruma/göstergelik önleme) açılabildiğinden emin olun.
- Depolama için Cloudflare R2'ye (veya belirtilmişse kendi sağlayıcınıza) yükleyin.
Posta kutularınızın şifrelendiğini unutmayın; WebSocket iletişimi için IP kısıtlamalarımız ve diğer kimlik doğrulama önlemlerimiz olsa da, kötü bir aktör olması durumunda, WebSocket yükünün IMAP şifreniz olmadığı sürece veritabanınızı açamayacağından emin olabilirsiniz. .
Şu anda posta kutusu başına yalnızca bir yedek depolanıyor, ancak gelecekte belirli bir noktaya kurtarma sunabiliriz ("PITR").
Aramak
IMAP sunucularımız şunları destekler: SEARCH
karmaşık sorgular, normal ifadeler ve daha fazlasını içeren komut.
Hızlı arama performansı sayesinde FTS5 ve sqlite-regex.
saklıyoruz Date
SQLite posta kutularındaki değerler şu şekildedir: ISO 8601 aracılığıyla dizeler Date.prototype.toISOString (Eşitlik karşılaştırmalarının düzgün çalışması için UTC saat dilimiyle).
Dizinler ayrıca arama sorgularındaki tüm özellikler için de saklanır.
Projeler
Kaynak kodumuz ve geliştirme sürecimizde kullandığımız projeleri özetleyen bir tablo (alfabetik olarak sıralanmıştır):
Proje | Amaç |
---|---|
Yanıtlayıcı | Sunucu filomuzun tamamının kolaylıkla bakımını yapmak, ölçeklendirmek ve yönetmek için DevOps otomasyon platformu. |
Bree | Node.js ve JavaScript için cron, tarihler, ms, daha sonra ve insan dostu destek içeren iş zamanlayıcı. |
Kabin | Güvenlik ve gizlilik göz önünde bulundurularak geliştirici dostu JavaScript ve Node.js günlük kaydı kitaplığı. |
İzin Vermek | Tüm mimarimize ve mühendislik tasarımımıza MVC ve daha fazlasıyla güç veren Node.js çerçevesi. |
MongoDB | Posta kutularının dışındaki tüm verileri (ör. hesabınız, ayarlarınız, alan adlarınız ve takma ad yapılandırmalarınız) depolamak için kullandığımız NoSQL veritabanı çözümü. |
Firavun faresi | Tüm yığınımızda kullandığımız MongoDB nesne belge modellemesi ("ODM"). Kullanmaya devam etmemizi sağlayan özel yardımcılar yazdık SQLite ile Firavun Faresi 🎉 |
node.js | Node.js, tüm sunucu işlemlerimizi çalıştıran açık kaynaklı, platformlar arası JavaScript çalışma zamanı ortamıdır. |
Not postacısı | E-posta göndermek, bağlantı oluşturmak ve daha fazlası için Node.js paketi. Biz bu projenin resmi sponsoruyuz. |
Redis | Önbelleğe alma, kanalları yayınlama/abone olma ve HTTPS istekleri üzerinden DNS için bellek içi veritabanı. |
SQLite3Çoklu Şifreler | Tüm veritabanı dosyalarının şifrelenmesine izin veren SQLite şifreleme uzantısı (önceden yazma günlüğü ("WAL"), günlük, geri alma,…). |
SQLiteStudio | Geliştirme posta kutularını test etmek, indirmek ve görüntülemek için görsel SQLite düzenleyicisi (bunu da kullanabilirsiniz). |
SQLite | Ölçeklenebilir, bağımsız, hızlı ve dayanıklı IMAP depolaması için yerleşik veritabanı katmanı. |
Spam Tarayıcı | Node.js anti-spam, e-posta filtreleme ve kimlik avı önleme aracı (alternatifimiz) Spam Suikastçısı ve RS-spamd). |
mandalina | Node.js ile HTTPS üzerinden DNS istekleri ve Redis kullanılarak önbelleğe alma; bu da küresel tutarlılık ve çok daha fazlasını sağlar. |
yıldırım kuşu | Geliştirme ekibimiz bunu şu şekilde kullanıyor (ve bunu da tavsiye ediyor) E-postayı İlet ile kullanmak için tercih edilen e-posta istemcisi. |
UTM | Geliştirme ekibimiz, IMAP ve SMTP sunucularımızla farklı e-posta istemcilerini (paralel olarak) test etmek için iOS ve macOS için bu sanal makineleri kullanır. |
ubuntu | Tüm altyapımıza güç veren, modern açık kaynaklı Linux tabanlı sunucu işletim sistemi. |
Vahşi ördek | IMAP sunucusu kitaplığı – notlarına bakın eki tekilleştirme ve IMAP protokolü desteği. |
daha iyi-sqlite3-çoklu-şifreler | Node.js'nin SQLite3 ile programlı olarak etkileşime geçmesi için hızlı ve basit API kitaplığı. |
E-posta Şablonları | Özel e-postalar (ör. hesap bildirimleri ve daha fazlası) oluşturmak, önizlemek ve göndermek için geliştirici dostu e-posta çerçevesi. |
json-sql | Mongo tarzı sözdizimini kullanan SQL sorgu oluşturucusu. Veritabanından bağımsız bir yaklaşımla tüm yığında Mongo tarzında yazmaya devam edebildiğimiz için bu, geliştirme ekibimize zaman kazandırıyor. Ayrıca sorgu parametrelerini kullanarak SQL enjeksiyon saldırılarından kaçınmaya da yardımcı olur. |
diz-şema-denetçisi | Mevcut veritabanı şeması hakkında bilgi çıkarmak için SQL yardımcı programı. Bu, tüm endekslerin, tabloların, sütunların, kısıtlamaların ve daha fazlasının geçerli ve geçerli olduğunu kolayca doğrulamamıza olanak tanır. 1:1 nasıl olmaları gerektiği ile. Veritabanı şemalarında değişiklik yapılması durumunda yeni sütunlar ve dizinler eklemek için otomatik yardımcılar bile yazdık (son derece ayrıntılı hata uyarılarıyla birlikte). |
diz çökmek | Yalnızca veritabanı geçişleri ve şema doğrulaması için kullandığımız SQL sorgu oluşturucusu knex-schema-inspector . |
mandalina | Otomatik i18n Markdown desteğiyle cümle çevirisi Google Bulut Çeviri API'si. |
mx bağlantısı | Node.js paketi, MX sunucularıyla bağlantı kurmak ve hataları çözmek için kullanılır. |
pm2 | Yerleşik yük dengeleyiciye sahip Node.js üretim süreci yöneticisi (ince ayarlı performans için). |
SMTP sunucusu | SMTP sunucu kitaplığı – bunu posta alışverişimiz ("MX") ve giden SMTP sunucularımız için kullanırız. |
ImapTest | IMAP sunucularını karşılaştırmalı değerlendirmelere ve RFC belirtimi IMAP protokolü uyumluluğuna göre test etmek için kullanışlı bir araç. Bu proje tarafından oluşturuldu. Güvercinlik ekibi (Temmuz 2002'den itibaren aktif bir açık kaynaklı IMAP ve POP3 sunucusu). Bu araçla IMAP sunucumuzu kapsamlı bir şekilde test ettik. |
Kullandığımız diğer projeleri burada bulabilirsiniz. GitHub'daki kaynak kodumuz.
Sağlayıcılar
Sağlayıcı | Amaç |
---|---|
bulut parlaması | DNS sağlayıcısı, durum denetimleri, yük dengeleyiciler ve yedekleme depolama alanı Cloudflare R2. |
Dijital Okyanus | Özel sunucu barındırma, SSD blok depolama ve yönetilen veritabanları. |
Vultr | Özel sunucu barındırma ve SSD blok depolama. |
Düşünceler
Prensipler
Yönlendirme E-postası şu ilkelere göre tasarlanmıştır:
- Her zaman geliştirici dostu, güvenlik ve gizlilik odaklı ve şeffaf olun.
- Bağlı olmak MVC, Unix, KISS, DRY, YAGNI, Oniki Faktör, Occam'ın usturası, ve test sürümü
- Dağınık, önyüklemeli ve ramen-karlı geliştirici
Deneyler
tldr; Sonuçta S3 uyumlu nesne depolama ve/veya Sanal Tabloların kullanılması, performans nedenleriyle teknik olarak mümkün değildir ve bellek sınırlamaları nedeniyle hataya açıktır.
Yukarıda tartışıldığı gibi nihai SQLite çözümümüze giden birkaç deney yaptık.
Bunlardan biri kullanmayı denemekti rclone ve S3 uyumlu bir depolama katmanıyla birlikte SQLite.
Bu deney bizi rclone, SQLite ve VFS kullanım:
- Etkinleştirirseniz
--vfs-cache-mode writes
rclone ile işaretlerseniz okumalar tamam olur, ancak yazmalar önbelleğe alınır.- Küresel olarak dağıtılmış birden fazla IMAP sunucunuz varsa, tek bir yazıcınız ve birden fazla dinleyiciniz olmadığı sürece (örneğin, pub/sub yaklaşımı) önbellek bunların genelinde kapalı olacaktır.
- Bu inanılmaz derecede karmaşıktır ve buna benzer herhangi bir ek karmaşıklığın eklenmesi, daha fazla tekil hata noktasına yol açacaktır.
- S3 uyumlu depolama sağlayıcıları kısmi dosya değişikliklerini desteklemez; bu, dosyada herhangi bir değişiklik yapılması anlamına gelir.
.sqlite
dosyanın tamamen değiştirilmesine ve veritabanının yeniden yüklenmesine neden olacaktır. - Gibi diğer çözümler
rsync
var, ancak ön-günlüğe yazmaya odaklanmıyorlar ("WAL") desteği – bu yüzden Litestream'i inceledik. Neyse ki şifreleme kullanımımız zaten WAL bizim için dosyalar olduğundan, bunun için Litestream'e güvenmemize gerek yok. Ancak üretimde kullanım açısından Litestream'e henüz güvenmiyorduk ve bu konuda aşağıda birkaç not vereceğiz. - Bu seçeneğin kullanılması
--vfs-cache-mode writes
( sadece SQLite'ı kullanmanın yolurclone
yazmalar için) tüm veri tabanını bellekte sıfırdan kopyalamaya çalışacaktır; 10 GB'lık bir posta kutusunun işlenmesinde sorun yoktur, ancak aşırı yüksek depolama alanına sahip birden fazla posta kutusunun işlenmesi, IMAP sunucularının bellek sınırlamaları yaşamasına veENOMEM
hatalar, bölümleme hataları ve veri bozulması.
- SQLite kullanmaya çalışırsanız Sanal Tablolar (örn. kullanarak s3db) verileri S3 uyumlu bir depolama katmanında canlı tutmak için birkaç sorunla daha karşılaşacaksınız:
- S3 API uç noktalarına HTTP ile ulaşılması gerekeceğinden okuma ve yazma işlemleri son derece yavaş olacaktır.
GET
,PUT
,HEAD
, vePOST
yöntemler. - Geliştirme testleri, fiber internette 500.000-1 milyonun üzerinde kaydın aşılmasının, S3 uyumlu sağlayıcılara yönelik yazma ve okuma verimiyle hâlâ sınırlı olduğunu gösterdi. Örneğin, geliştiricilerimiz çalıştırdı
for
her iki sıralı SQL'i yapmak için döngülerINSERT
ifadeler ve toplu olarak büyük miktarda veri yazan ifadeler. Her iki durumda da performans şaşırtıcı derecede yavaştı. - Sanal tablolar indekslere sahip olamaz,
ALTER TABLE
açıklamalar ve diğer sınırlamalar – bu da veri miktarına bağlı olarak 1-2 dakika veya daha fazla gecikmeye neden olur. - Nesneler şifrelenmeden saklandı ve herhangi bir yerel şifreleme desteği mevcut değil.
- S3 API uç noktalarına HTTP ile ulaşılması gerekeceğinden okuma ve yazma işlemleri son derece yavaş olacaktır.
- kullanarak da araştırdık. sqlite-s3vfs kavramsal ve teknik olarak önceki madde işaretine benzer (bu nedenle aynı sorunlara sahiptir). Bir olasılık özel bir kullanım olabilir
sqlite3
gibi şifrelemeyle sarılmış yapı wxSQLite3 (şu anda yukarıdaki çözümümüzde kullanıyoruz) aracılığıyla kurulum dosyasını düzenleme. - Başka bir potansiyel yaklaşım, multipleks uzatmaancak bunun 32 GB'lik bir sınırlaması vardır ve karmaşık oluşturma ve geliştirme sorunları gerektirir.
ALTER TABLE
ifadeler gereklidir (bu nedenle bu, Sanal Tabloların kullanımını tamamen ortadan kaldırır). İhtiyacımız varALTER TABLE
kancamız için ifadelerknex-schema-inspector
düzgün çalışmasını sağlar – bu, verilerin bozulmamasını ve alınan satırların bizim kurallarımıza göre geçerli belgelere dönüştürülebilmesini sağlar.mongoose
şema tanımları (kısıtlama, değişken türü ve isteğe bağlı veri doğrulamayı içerir).- Açık kaynak topluluğunda SQLite ile ilgili S3 uyumlu projelerin neredeyse tamamı Python'dadır (ve yığınımızın %100'ü için kullandığımız JavaScript değil).
- Sıkıştırma kütüphaneleri gibi sqlite-zstd (Görmek yorumlar) umut verici görünüyor, ancak henüz üretimde kullanıma hazır olmayabilir. Bunun yerine veri türlerinde uygulama tarafında sıkıştırma
String
,Object
,Map
,Array
,Set
, veBuffer
daha temiz ve daha kolay bir yaklaşım olacak (ve bir dosyayı saklayabileceğimiz için taşınması da daha kolay)Boolean
bayrak veya sütun – hatta kullanınPRAGMA
user_version=1
sıkıştırma için veyauser_version=0
veritabanı meta verileri olarak sıkıştırma yapılmaması için).- Neyse ki, IMAP sunucu depolama alanımızda ek tekilleştirme işlemi zaten uygulandı; bu nedenle aynı eke sahip her mesaj, ekin bir kopyasını saklamaz; bunun yerine, birden fazla mesaj ve iş parçacığı için tek bir ek, bir posta kutusunda (ve yabancı bir dosyada) depolanır. referans daha sonra kullanılır).
- SQLite replikasyon ve yedekleme çözümü olan Litestream projesi oldukça umut verici ve büyük olasılıkla gelecekte kullanacağız.
- Yazar(lar)ı itibarsızlaştırmak istemem - çünkü onların çalışmalarını ve açık kaynağa katkılarını on yıldan fazla bir süredir seviyoruz - ancak gerçek dünyadaki kullanımdan öyle görünüyor ki çok fazla baş ağrısı olabilir ve kullanımdan kaynaklanan potansiyel veri kaybı.
- Yedekleme geri yüklemesinin sürtünmesiz ve önemsiz olması gerekir. MongoDB gibi bir çözümün kullanılması
mongodump
vemongoexport
sadece sıkıcı değil, aynı zamanda zaman alıcıdır ve konfigürasyon karmaşıklığına sahiptir.- SQLite veritabanları bunu kolaylaştırır (tek bir dosyadır).
- Kullanıcıların posta kutularını alıp istedikleri an ayrılabilecekleri bir çözüm tasarlamak istedik.
- Basit Node.js komutları
fs.unlink('mailbox.sqlite'))
ve disk depolama alanından kalıcı olarak silinir. - Benzer şekilde HTTP ile S3 uyumlu bir API kullanabiliriz
DELETE
kullanıcılar için anlık görüntüleri ve yedeklemeleri kolayca kaldırmak için.
- Basit Node.js komutları
- SQLite en basit, en hızlı ve en uygun maliyetli çözümdü.
Alternatif eksikliği
Bildiğimiz kadarıyla başka hiçbir e-posta hizmeti bu şekilde tasarlanmamıştır ve açık kaynak değildir.
Biz bunun nedeni olabileceğini düşünüyorum üretimde eski teknolojiye sahip mevcut e-posta hizmetlerine spagetti kodu 🍝.
Mevcut e-posta servis sağlayıcılarının tümü olmasa da çoğu ya kapalı kaynaktır ya da açık kaynak olarak reklam yapar. ancak gerçekte yalnızca ön uçları açık kaynaklıdır.
E-postanın en hassas kısmı (gerçek depolama/IMAP/SMTP etkileşimi) hepsi arka uçta (sunucuda) yapılır ve Olumsuz ön uçta (istemci).
E-postayı İlet'i deneyin
Bugün şu saatte kaydolun: https://forwardemail.net! 🚀