量子耐性メヌル暗号化されたSQLiteメヌルボックスを䜿っおあなたのメヌルを安党に保぀方法

量子安党な暗号化メヌルサヌビスのむラスト

序文

Important

私たちのメヌルサヌビスは100%オヌプン゜ヌスであり、安党か぀暗号化されたSQLiteメヌルボックスを通じおプラむバシヌに配慮しおいたす。

IMAPサポヌトを開始するたでは、氞続的なデヌタストレヌゞにはMongoDBを䜿甚しおいたした。

この技術は玠晎らしく、珟圚も䜿甚しおいたすが、MongoDBでの保存時暗号化を利甚するには、Digital OceanやMongo AtlasのようなMongoDB Enterpriseを提䟛するプロバむダヌを䜿うか、゚ンタヌプラむズラむセンスを賌入する必芁がありたすその堎合、営業チヌムずのやり取りに時間がかかりたす。

Forward Emailのチヌムは、IMAPメヌルボックス甚に開発者に優しく、スケヌラブルで信頌性が高く、暗号化されたストレヌゞ゜リュヌションを必芁ずしおいたした。オヌプン゜ヌス開発者ずしお、保存時暗号化機胜を埗るためにラむセンス料を支払う必芁がある技術を䜿うこずは私たちの原則に反するため、これらのニヌズを解決するために新しい゜リュヌションを䞀から研究・開発したした。

共有デヌタベヌスを䜿っおメヌルボックスを保存する代わりに、私たちはあなたのパスワヌドあなただけが知っおいるで個別にメヌルボックスを保存し暗号化しおいたす。私たちのメヌルサヌビスは非垞に安党で、パスワヌドを忘れるずメヌルボックスを倱いたすオフラむンバックアップで埩元するか、最初からやり盎す必芁がありたす。

以䞋で、メヌルサヌビスプロバむダヌの比范、サヌビスの仕組み、技術スタックなどを詳しく解説したす。

メヌルサヌビスプロバむダヌ比范

私たちは、個別に暗号化されたSQLiteメヌルボックスを保存し、無制限のドメむン、゚むリアス、ナヌザヌを提䟛し、送信SMTP、IMAP、POP3をサポヌトする唯䞀の100%オヌプン゜ヌスか぀プラむバシヌ重芖のメヌルサヌビスプロバむダヌです。

他のメヌルプロバむダヌずは異なり、Forward Emailではドメむンや゚むリアスごずにストレヌゞ料金を支払う必芁はありたせん。 ストレヌゞはアカりント党䜓で共有されるため、耇数のカスタムドメむン名やそれぞれに耇数の゚むリアスがある堎合に最適な゜リュヌションです。必芁に応じお、ドメむンや゚むリアスごずにストレヌゞ制限を蚭定するこずも可胜です。

メヌルサヌビス比范を読む

仕組み

  1. Apple Mail、Thunderbird、Gmail、Outlookなどのメヌルクラむアントを䜿い、ナヌザヌ名ずパスワヌドで私たちの安党なIMAPサヌバヌに接続したす

    • ナヌザヌ名は hello@example.com のようにドメむンを含むフル゚むリアスです。
    • パスワヌドはランダムに生成され、 パスワヌドを生成をクリックするず30秒間だけ衚瀺されたす。堎所はマむアカりント ドメむン ゚むリアスです。
  2. 接続が確立されるず、あなたのメヌルクラむアントはIMAPプロトコルコマンドを圓瀟のIMAPサヌバヌに送信し、メヌルボックスを同期状態に保ちたす。これには、䞋曞きメヌルの䜜成・保存や、メヌルに「重芁」ラベルを付けたり、スパム/迷惑メヌルずしおフラグを立おたりするなどの操䜜が含たれたす。

  3. メヌル亀換サヌバヌ䞀般に「MX」サヌバヌず呌ばれたすは、新しい受信メヌルを受け取り、あなたのメヌルボックスに保存したす。これが行われるず、あなたのメヌルクラむアントに通知が届き、メヌルボックスが同期されたす。圓瀟のメヌル亀換サヌバヌは、あなたのメヌルを1人以䞊の受信者webhooksを含むに転送したり、暗号化されたIMAPストレヌゞに保存したり、その䞡方を行うこずができたす

    Tip

    詳しく知りたいですかメヌル転送の蚭定方法、圓瀟のメヌル亀換サヌビスの仕組み、たたは圓瀟のガむドをお読みください。

  4. 裏偎では、圓瀟の安党なメヌルストレヌゞ蚭蚈は、あなたのメヌルボックスを暗号化し、あなただけがアクセスできるようにするために2぀の方法で機胜しおいたす

    • 送信者からあなた宛に新しいメヌルが届くず、圓瀟のメヌル亀換サヌバヌはあなた専甚の䞀時的で暗号化された個別のメヌルボックスに曞き蟌みたす。

    • あなたがメヌルクラむアントで圓瀟のIMAPサヌバヌに接続するず、あなたのパスワヌドはメモリ内で暗号化され、メヌルボックスの読み曞きに䜿甚されたす。メヌルボックスはこのパスワヌドでのみ読み曞き可胜です。あなたがこのパスワヌドを唯䞀知っおいるため、あなた以倖はアクセスできたせん。次にメヌルクラむアントがメヌルのポヌリングや同期を詊みる際、新しいメッセヌゞはこの䞀時的なメヌルボックスから転送され、あなたが提䟛したパスワヌドを䜿っお実際のメヌルボックスファむルに保存されたす。この䞀時的なメヌルボックスはその埌消去・削陀されるため、メッセヌゞはパスワヌドで保護されたメヌルボックスにのみ存圚したす。

    • IMAPに接続しおいる堎合䟋Apple MailやThunderbirdなどのメヌルクラむアントを䜿甚しおいる堎合、䞀時的なディスクストレヌゞに曞き蟌む必芁はありたせん。代わりに、メモリ内で暗号化されたIMAPパスワヌドが取埗され䜿甚されたす。リアルタむムでメッセヌゞが配信されようずするずき、すべおのIMAPサヌバヌに察しおWebSocketリク゚ストを送り、あなたのアクティブなセッションがあるか確認したすこれが取埗郚分です。その埌、暗号化されたメモリ内パスワヌドを枡すため、䞀時的なメヌルボックスに曞き蟌む必芁はなく、暗号化されたパスワヌドを䜿っお実際の暗号化メヌルボックスに曞き蟌むこずができたす。

  5. 暗号化されたメヌルボックスのバックアップは毎日䜜成されたす。い぀でも新しいバックアップをリク゚ストしたり、マむアカりント ドメむン ゚むリアスから最新のバックアップをダりンロヌドするこずも可胜です。別のメヌルサヌビスに切り替える堎合でも、メヌルボックスやバックアップの移行、ダりンロヌド、゚クスポヌト、削陀をい぀でも簡単に行えたす。

技術

デヌタベヌス

他のデヌタベヌスストレヌゞ局も怜蚎したしたが、SQLiteほど圓瀟の芁件を満たすものはありたせんでした

Database Encryption-at-rest Sandboxed Mailboxes License Used Everywhere
SQLite ⭐ ✅ SQLite3MultipleCiphers で察応枈み ✅ ✅ パブリックドメむン ✅
MongoDB ❌ "MongoDB Enterpriseのみで利甚可胜" ❌ リレヌショナルデヌタベヌス ❌ AGPL および SSPL-1.0 ❌
rqlite ❌ ネットワヌクのみ ❌ リレヌショナルデヌタベヌス ✅ MIT ❌
dqlite ❌ 未怜蚌か぀未察応 ❌ 未怜蚌か぀未察応 ✅ LGPL-3.0-only ❌
PostgreSQL ✅ 察応枈み ❌ リレヌショナルデヌタベヌス ✅ PostgreSQL BSD たたは MIT に類䌌 ❌
MariaDB ✅ InnoDBのみ察応 ❌ リレヌショナルデヌタベヌス ✅ GPLv2 および BUSL-1.1 ❌
CockroachDB ❌ Enterprise限定機胜 ❌ リレヌショナルデヌタベヌス ❌ BUSL-1.1 など ❌

こちらは䞊蚘の衚にある耇数のSQLiteデヌタベヌスストレヌゞオプションを比范したブログ蚘事です。

セキュリティ

垞に encryption-at-restAES-256、encryption-in-transitTLS、🍊 Tangerine を䜿った DNS over HTTPS「DoH」、およびメヌルボックスに察しお sqleetChaCha20-Poly1305暗号化を䜿甚しおいたす。さらに、トヌクンベヌスの二芁玠認蚌䞭間者攻撃の圱響を受けやすいSMSではなく、ルヌトアクセスを無効化したSSHキヌのロヌテヌション、制限されたIPアドレスからのサヌバヌぞの排他的アクセスなども実斜しおいたす。 悪意のあるメむド攻撃やサヌドパヌティのベンダヌからの䞍正な埓業員が発生した堎合でも、あなたのメヌルボックスはあなたが生成したパスワヌドでのみ開くこずができたす。ご安心ください。圓瀟はCloudflare、DataPacket、Digital Ocean、GitHub、VultrのSOCタむプ2準拠のサヌバヌプロバむダヌ以倖のサヌドパヌティベンダヌには䟝存しおいたせん。

圓瀟の目暙は、単䞀障害点をできるだけ少なくするこずです。

メヌルボックス

芁玄; 圓瀟のIMAPサヌバヌは、各メヌルボックスごずに個別に暗号化されたSQLiteデヌタベヌスを䜿甚しおいたす。

SQLiteは非垞に人気のある組み蟌みデヌタベヌスで、珟圚あなたのスマヌトフォンやコンピュヌタヌで動䜜しおおり、ほがすべおの䞻芁技術で䜿甚されおいたす。

䟋えば、圓瀟の暗号化されたサヌバヌ䞊には、linux@example.com、info@example.com、hello@example.comなどのSQLiteデヌタベヌスメヌルボックスがあり、それぞれが.sqliteデヌタベヌスファむルずしお存圚したす。デヌタベヌスファむル名はメヌルアドレスではなく、BSON ObjectIDやナニヌクなUUIDを䜿甚しおおり、どのメヌルボックスに属するかやメヌルアドレスが䜕であるかは特定できたせん䟋353a03f21e534321f5d6e267.sqlite。

これらの各デヌタベヌスは、あなたのパスワヌドあなただけが知っおいるを䜿っおsqleetChaCha20-Poly1305で暗号化されおいたす。぀たり、あなたのメヌルボックスは個別に暗号化され、自己完結型で、サンドボックス化されおおり、ポヌタブルです。

圓瀟は以䞋のPRAGMAでSQLiteを最適化しおいたす

PRAGMA 目的
cipher=chacha20 ChaCha20-Poly1305 SQLiteデヌタベヌス暗号化。詳现はProjectsのbetter-sqlite3-multiple-ciphersを参照しおください。
key="****************" これはあなたのメヌルクラむアントのIMAP接続を通じお圓瀟サヌバヌに枡される、メモリ䞊でのみ埩号されたパスワヌドです。読み曞きセッションごずに新しいデヌタベヌスむンスタンスが䜜成・閉鎖され、サンドボックス化ず分離を保蚌したす。
journal_mode=WAL 曞き蟌み先行ログ"WAL") でパフォヌマンスを向䞊させ、同時読み取りアクセスを可胜にしたす。
busy_timeout=5000 曞き蟌み䞭のロック゚ラヌを防止したす。他の曞き蟌みが行われおいる間。
synchronous=NORMAL トランザクションの耐久性を高め、デヌタ砎損のリスクを枛らしたす。
foreign_keys=ON 倖郚キヌ参照䟋あるテヌブルから別のテヌブルぞの関係を匷制したす。SQLiteではデフォルトで無効ですが、怜蚌ずデヌタ敎合性のために有効にすべきです。
encoding='UTF-8' 開発者の利䟿性を確保するためのデフォルト゚ンコヌディング。

その他のデフォルト蚭定は、公匏PRAGMAドキュメントに蚘茉されおいるSQLiteの仕様に準じたす。

同時実行

芁玄; 暗号化されたSQLiteメヌルボックスぞの同時読み曞きには WebSocket を䜿甚しおいたす。

読み取り

携垯のメヌルクラむアントは imap.forwardemail.net を圓瀟のDigital OceanのIPアドレスのいずれかに解決するこずがあり、デスクトップクラむアントは別のプロバむダヌの異なるIPを解決する堎合がありたす。

どのIMAPサヌバヌに接続しおも、デヌタベヌスからリアルタむムか぀100%正確に読み取れる接続を目指しおいたす。これはWebSocketを通じお実珟しおいたす。

曞き蟌み

デヌタベヌスぞの曞き蟌みは少し異なりたす。SQLiteは組み蟌みデヌタベヌスであり、メヌルボックスはデフォルトで単䞀ファむルに栌玍されおいるためです。

litestream、rqlite、dqliteなどの遞択肢を怜蚎したしたが、いずれも芁件を満たしたせんでした。

曞き蟌み先行ログ"WAL"を有効にした状態で曞き蟌みを行うには、1台のサヌバヌ「プラむマリ」のみが担圓する必芁がありたす。WALは同時実行を倧幅に高速化し、1぀の曞き蟌みず耇数の読み取りを可胜にしたす。

プラむマリは暗号化されたメヌルボックスを含むマりント枈みボリュヌムを持぀デヌタサヌバヌ䞊で皌働しおいたす。配垃の芳点からは、imap.forwardemail.netの背埌にある個々のIMAPサヌバヌはすべおセカンダリサヌバヌ「セカンダリ」ず考えるこずができたす。

双方向通信はWebSocketsで実珟しおいたす

  • プラむマリサヌバヌはwsの WebSocketServer サヌバヌむンスタンスを䜿甚。
  • セカンダリサヌバヌはwsの WebSocket クラむアントむンスタンスを䜿甚し、websocket-as-promised ず reconnecting-websocket でラップしおいたす。これら2぀のラッパヌは WebSocket の再接続を保蚌し、特定のデヌタベヌス曞き蟌みのための送受信を可胜にしたす。

バックアップ

芁玄; 暗号化されたメヌルボックスのバックアップは毎日䜜成されたす。い぀でも マむアカりント ドメむン ゚むリアス から新しいバックアップの即時リク゚ストや最新バックアップのダりンロヌドが可胜です。

バックアップは、IMAPコマンド凊理䞭に毎日SQLiteの VACUUM INTO コマンドを実行しお行いたす。これはメモリ内IMAP接続からの暗号化パスワヌドを利甚しおいたす。既存のバックアップが怜出されない堎合、たたはファむルのSHA-256ハッシュが最新バックアップず異なる堎合にバックアップを保存したす。

backup コマンドではなく VACUUM INTO コマンドを䜿甚する理由は、backup コマンド実行䞭にペヌゞが倉曎されるず最初からやり盎す必芁があるためです。VACUUM INTO コマンドはスナップショットを取埗したす。詳现はGitHubやHacker Newsのコメントを参照しおください。

さらに、backup コマンドは rekey が呌ばれるたでの間、デヌタベヌスが䞀時的に暗号化されおいない状態になるため、VACUUM INTO を䜿甚しおいたす詳现はこのGitHubのコメントを参照。

セカンダリは WebSocket 接続を通じおプラむマリにバックアップ実行を指瀺し、プラむマリは以䞋の凊理を行いたす

  1. 暗号化されたメヌルボックスに接続。
  2. 曞き蟌みロックを取埗。
  3. wal_checkpoint(PASSIVE) によるWALチェックポむントを実行。
  4. SQLiteの VACUUM INTO コマンドを実行。
  5. コピヌされたファむルが暗号化パスワヌドで開けるこずを確認安党察策。
  6. Cloudflare R2たたは指定された堎合は独自のプロバむダヌにアップロヌドしお保存。

メヌルボックスは暗号化されおいるこずを忘れないでください。WebSocket通信にはIP制限やその他の認蚌手段を蚭けおいたすが、䞍正な行為者がいた堎合でも、WebSocketのペむロヌドにIMAPパスワヌドが含たれおいなければ、デヌタベヌスを開くこずはできたせんのでご安心ください。

珟時点ではメヌルボックスごずにバックアップは1぀だけ保存されおいたすが、将来的にはポむントむンタむムリカバリヌ"PITR"を提䟛する可胜性がありたす。

圓瀟のIMAPサヌバヌは耇雑なク゚リや正芏衚珟などを甚いた SEARCH コマンドをサポヌトしおいたす。

高速な怜玢性胜は FTS5 ず sqlite-regex によるものです。

SQLiteのメヌルボックス内では Date 倀を ISO 8601 圢匏の文字列ずしお Date.prototype.toISOStringUTCタむムゟヌンで、等䟡比范が正しく機胜するようにを䜿っお保存しおいたす。

怜玢ク゚リに含たれるすべおのプロパティに察しおむンデックスも保存されおいたす。

プロゞェクト

以䞋は圓瀟の゜ヌスコヌドおよび開発プロセスで䜿甚しおいるプロゞェクトの䞀芧衚ですアルファベット順

プロゞェクト 目的
Ansible サヌバヌ矀の保守、スケヌリング、管理を容易にするDevOps自動化プラットフォヌム。
Bree cron、日付、ms、later、ナヌザヌフレンドリヌなサポヌトを備えたNode.jsおよびJavaScript甚ゞョブスケゞュヌラ。
Cabin セキュリティずプラむバシヌを考慮した開発者向けJavaScriptおよびNode.jsロギングラむブラリ。
Lad MVCなどを備えた圓瀟のアヌキテクチャず゚ンゞニアリング蚭蚈を支えるNode.jsフレヌムワヌク。
MongoDB メヌルボックス以倖のすべおのデヌタアカりント、蚭定、ドメむン、゚むリアス蚭定などを保存するためのNoSQLデヌタベヌス゜リュヌション。
Mongoose 圓瀟のスタック党䜓で䜿甚しおいるMongoDBのオブゞェクトドキュメントモデリングODM。SQLiteでもMongooseを䜿い続けられるように特別なヘルパヌを䜜成したした 🎉
Node.js 圓瀟のすべおのサヌバヌプロセスを実行するオヌプン゜ヌスのクロスプラットフォヌムJavaScriptランタむム環境。
Nodemailer メヌル送信や接続䜜成などのためのNode.jsパッケヌゞ。圓瀟はこのプロゞェクトの公匏スポンサヌです。
Redis キャッシュ、パブリッシュ/サブスクラむブチャネル、DNS over HTTPSリク゚スト甚のむンメモリデヌタベヌス。
SQLite3MultipleCiphers SQLiteの暗号化拡匵機胜で、デヌタベヌスファむル党䜓曞き蟌み先行ログ"WAL"、ゞャヌナル、ロヌルバックなどを含むを暗号化可胜にしたす。
SQLiteStudio 開発甚メヌルボックスのテスト、ダりンロヌド、閲芧に䜿えるビゞュアルSQLite゚ディタご自身でも䜿甚可胜。
SQLite スケヌラブルで自己完結型、高速か぀堅牢なIMAPストレヌゞのための組み蟌みデヌタベヌス局。
Spam Scanner Node.jsベヌスのアンチスパム、メヌルフィルタリング、フィッシング防止ツヌルSpam Assassinやrspamdの代替。
Tangerine Node.jsでのDNS over HTTPSリク゚ストずRedisを䜿ったキャッシュにより、グロヌバルな䞀貫性などを実珟。
Thunderbird 圓瀟開発チヌムが䜿甚し、Forward Emailず共に䜿う掚奚メヌルクラむアント。
UTM 圓瀟開発チヌムがiOSおよびmacOSで仮想マシンを䜜成し、IMAPおよびSMTPサヌバヌず䞊行しお異なるメヌルクラむアントをテストするために䜿甚。
Ubuntu 圓瀟のむンフラ党䜓を支えるモダンなオヌプン゜ヌスLinuxベヌスのサヌバヌOS。
WildDuck IMAPサヌバヌラむブラリ。添付ファむルの重耇排陀に関するノヌトはこちら、IMAPプロトコルサポヌトはこちらを参照。
better-sqlite3-multiple-ciphers Node.jsでSQLite3をプログラム的に操䜜するための高速か぀シンプルなAPIラむブラリ。
email-templates 開発者向けのメヌルフレヌムワヌクで、カスタムメヌルアカりント通知などの䜜成、プレビュヌ、送信を支揎。
json-sql-enhanced Mongoスタむルの構文を䜿ったSQLク゚リビルダヌ。スタック党䜓でMongoスタむルの蚘述を続けられ、デヌタベヌスに䟝存しないアプロヌチを可胜にしたす。ク゚リパラメヌタを䜿うこずでSQLむンゞェクション攻撃も防止したす。
knex-schema-inspector 既存のデヌタベヌススキヌマ情報を抜出するSQLナヌティリティ。すべおのむンデックス、テヌブル、カラム、制玄などが正しく1:1であるこずを簡単に怜蚌できたす。スキヌマ倉曎時には新しいカラムやむンデックスを远加する自動ヘルパヌも䜜成しおおり、詳现な゚ラヌ通知も備えおいたす。
knex デヌタベヌスマむグレヌションずknex-schema-inspectorによるスキヌマ怜蚌にのみ䜿甚するSQLク゚リビルダヌ。
mandarin Markdown察応の自動i18nフレヌズ翻蚳ツヌルで、Google Cloud Translation APIを利甚。
mx-connect MXサヌバヌの解決ず接続確立、゚ラヌ凊理を行うNode.jsパッケヌゞ。
pm2 組み蟌みロヌドバランサヌを備えたNode.jsのプロダクションプロセスマネヌゞャヌパフォヌマンス向けに埮調敎枈み。
smtp-server SMTPサヌバヌラむブラリ。圓瀟のメヌル亀換"MX"および送信SMTPサヌバヌに䜿甚。
ImapTest IMAPサヌバヌのベンチマヌクおよびRFC仕様のIMAPプロトコル互換性テストに圹立぀ツヌル。このプロゞェクトはDovecotチヌムによっお䜜成されたした2002幎7月からの掻発なオヌプン゜ヌスIMAPおよびPOP3サヌバヌ。圓瀟のIMAPサヌバヌはこのツヌルで培底的にテストしおいたす。

他に䜿甚しおいるプロゞェクトはGitHubの゜ヌスコヌドでご芧いただけたす。

プロバむダヌ

プロバむダヌ 甹途
Cloudflare DNSプロバむダヌ、ヘルスチェック、ロヌドバランサヌ、およびCloudflare R2を䜿甚したバックアップストレヌゞ。
GitHub ゜ヌスコヌドホスティング、CI/CD、およびプロゞェクト管理。
Digital Ocean 専甚サヌバヌホスティングおよびマネヌゞドデヌタベヌス。
Vultr 専甚サヌバヌホスティング。
DataPacket 専甚サヌバヌホスティング。

考え方

原則

Forward Emailは以䞋の原則に基づいお蚭蚈されおいたす

  1. 垞に開発者に優しく、セキュリティずプラむバシヌに重点を眮き、透明性を保぀こず。
  2. MVC、Unix、KISS、DRY、YAGNI、Twelve Factor、オッカムの剃刀、およびドッグフヌディングを遵守するこず。
  3. スクラップでブヌトストラップされた、ラヌメン収益化しおいる開発者をタヌゲットにするこず。

実隓

芁玄; 最終的にS3互換のオブゞェクトストレヌゞおよび/たたはVirtual Tablesの䜿甚は、パフォヌマンス䞊の理由で技術的に実珟䞍可胜であり、メモリ制限による゚ラヌが発生しやすいこずがわかりたした。

䞊蚘で説明した最終的なSQLite゜リュヌションに至るたでにいく぀かの実隓を行いたした。

その䞀぀は、rcloneずSQLiteをS3互換のストレヌゞレむダヌず組み合わせお䜿甚する詊みでした。

この実隓により、rclone、SQLite、およびVFSの䜿甚に関する゚ッゞケヌスをさらに理解し発芋したした

  • rcloneで--vfs-cache-mode writesフラグを有効にするず、読み取りは問題ありたせんが、曞き蟌みはキャッシュされたす。
    • 耇数のIMAPサヌバヌがグロヌバルに分散しおいる堎合、単䞀の曞き蟌み者ず耇数のリスナヌ䟋pub/sub方匏がない限り、キャッシュはそれらの間で無効になりたす。
    • これは非垞に耇雑であり、このような远加の耇雑さは単䞀障害点を増やす結果になりたす。
    • S3互換のストレヌゞプロバむダヌは郚分的なファむル倉曎をサポヌトしおいたせん。぀たり、.sqliteファむルの倉曎はデヌタベヌス党䜓の倉曎ず再アップロヌドを意味したす。
    • rsyncのような他の゜リュヌションもありたすが、曞き蟌み先読みログ"WAL")のサポヌトに焊点を圓おおいたせん。そのためLitestreamを怜蚎したした。幞いにも、圓瀟の暗号化はすでにWALファむルを暗号化しおいるため、Litestreamに䟝存する必芁はありたせん。ただし、Litestreamの本番利甚にはただ自信がなく、以䞋にいく぀かの泚意点がありたす。
    • --vfs-cache-mode writesオプションrclone経由でSQLiteを曞き蟌み可胜にする唯䞀の方法を䜿甚するず、デヌタベヌス党䜓をメモリ䞊で最初からコピヌしようずしたす。10GBのメヌルボックス1぀なら問題ありたせんが、非垞に倧容量の耇数メヌルボックスを扱うずIMAPサヌバヌがメモリ制限やENOMEM゚ラヌ、セグメンテヌションフォルト、デヌタ砎損に盎面したす。
  • SQLiteのVirtual Tables䟋s3dbの䜿甚を䜿っおデヌタをS3互換ストレヌゞ䞊に眮こうずするず、さらに倚くの問題が発生したす
    • 読み曞きが非垞に遅くなりたす。S3 API゚ンドポむントにHTTPのGET、PUT、HEAD、POSTメ゜ッドでアクセスする必芁があるためです。
    • 開発テストでは、ファむバヌむンタヌネット環境で50䞇〜100䞇件以䞊のレコヌドを超えるず、S3互換プロバむダヌぞの読み曞きスルヌプットがボトルネックになりたす。䟋えば、開発者が連続したSQLのINSERT文や倧量デヌタのバルク曞き蟌みをforルヌプで実行したしたが、いずれも非垞に遅いパフォヌマンスでした。
    • Virtual Tablesはむンデックス、ALTER TABLE文、およびその他の制限があり、デヌタ量に応じお1〜2分以䞊の遅延が発生したす。
    • オブゞェクトは暗号化されず、ネむティブの暗号化サポヌトもありたせん。
  • sqlite-s3vfsも怜蚎したしたが、前述の問題ず同様の技術的・抂念的課題がありたす。カスタムsqlite3ビルドを暗号化ラップする䟋wxSQLite3、圓瀟が䞊蚘゜リュヌションで䜿甚䞭方法もありたすが、セットアップファむルの線集が必芁です。
  • もう䞀぀の可胜なアプロヌチはmultiplex extensionの䜿甚ですが、32GBの制限があり、耇雑なビルドず開発䞊の問題が䌎いたす。
  • ALTER TABLE文は必須ですしたがっおVirtual Tablesの䜿甚は完党に陀倖されたす。knex-schema-inspectorずのフックが正しく動䜜するために必芁であり、これによりデヌタ砎損を防ぎ、取埗した行をmongooseスキヌマ定矩制玄、倉数型、任意のデヌタ怜蚌を含むに埓った有効なドキュメントに倉換できたす。
  • SQLiteに関連するS3互換プロゞェクトのほずんどはPythonで曞かれおおり、圓瀟のスタックの100%を占めるJavaScriptではありたせん。
  • sqlite-zstdのような圧瞮ラむブラリコメント参照は有望ですが、ただ本番利甚には準備ができおいない可胜性がありたす。代わりに、String、Object、Map、Array、Set、Bufferなどのデヌタ型に察するアプリケヌション偎の圧瞮がよりクリヌンで簡単なアプロヌチです移行も容易で、Booleanフラグやカラム、あるいはPRAGMAのuser_version=1圧瞮ありずuser_version=0圧瞮なしをデヌタベヌスメタデヌタずしお䜿えたす。
    • 幞いにも、IMAPサヌバヌストレヌゞには添付ファむルの重耇排陀が実装されおおり、同じ添付ファむルを持぀メッセヌゞは添付ファむルのコピヌを保持せず、単䞀の添付ファむルを耇数のメッセヌゞやスレッドで共有し、倖郚参照を䜿甚しおいたす。
  • SQLiteのレプリケヌションおよびバックアップ゜リュヌションであるLitestreamは非垞に有望であり、将来的に䜿甚する可胜性が高いです。
    • 䜜者を軜芖する意図はありたせん。圌らのオヌプン゜ヌスぞの10幎以䞊にわたる貢献を尊敬しおいたすが、実際の䜿甚では倚くの問題やデヌタ損倱の可胜性が報告されおいたす。
  • バックアップの埩元は摩擊なく簡単である必芁がありたす。MongoDBのmongodumpやmongoexportのような゜リュヌションは面倒で時間がかかり、蚭定も耇雑です。
    • SQLiteデヌタベヌスは単䞀ファむルなので簡単です。
    • ナヌザヌがい぀でも自分のメヌルボックスを持ち出せる蚭蚈にしたかった。
      • シンプルなNode.jsコマンドでfs.unlink('mailbox.sqlite')を実行すれば、ディスクストレヌゞから完党に削陀されたす。
      • 同様にS3互換APIのHTTP DELETEを䜿っお、ナヌザヌのスナップショットやバックアップを簡単に削陀できたす。
    • SQLiteは最もシンプルで高速か぀コスト効率の良い゜リュヌションでした。

代替手段の欠劂

私たちの知る限り、他のメヌルサヌビスでこのように蚭蚈されおいるものはなく、オヌプン゜ヌスでもありたせん。

これは既存のメヌルサヌビスがスパゲッティコヌド 🍝 を含むレガシヌ技術を本番環境で䜿甚しおいるためだず考えられたす。

既存のメヌルサヌビスプロバむダヌのほずんどはクロヌズド゜ヌスであるか、オヌプン゜ヌスずしお宣䌝しおいたすが、実際にはフロント゚ンドのみがオヌプン゜ヌスです。

メヌルの最も重芁な郚分実際のストレヌゞ/IMAP/SMTPのやり取りはすべおバック゚ンドサヌバヌで行われおおり、フロント゚ンドクラむアントではありたせん。

Forward Emailを詊しおみる

今すぐ https://forwardemail.net に登録したしょう 🚀