プライバシー保護のための暗号化されたSQLiteメールボックス
他の電子メール サービスとは異なり、常にお客様だけがメールボックスにアクセスできるようにします。
- 検索ページ
- 目次
序文
tldr; 弊社のメールサービスは、 100% オープンソース 安全で暗号化された SQLite メールボックスを通じてプライバシーを重視します。
立ち上げるまで IMAPのサポートでは、永続的なデータ ストレージのニーズに応じて MongoDB を使用しました。
このテクノロジーは素晴らしいものであり、私たちは今日でも使用しています – しかし、MongoDB で保存時の暗号化を行うには、Digital Ocean や Mongo Atlas などの MongoDB Enterprise を提供するプロバイダーを使用するか、エンタープライズ ライセンス (およびその後、営業チームの待ち時間に対処する必要があります)。
私たちのチームは 前方のメール 開発者にとって使いやすく、スケーラブルで信頼性が高く、IMAP メールボックス用の暗号化されたストレージ ソリューションが必要でした。オープンソース開発者として、保存時の暗号化機能を取得するためにライセンス料を支払う必要があるテクノロジーを使用することは反対でした。 私たちの原則 – そこで私たちは、これらのニーズを解決するために新しいソリューションを実験、研究し、ゼロから開発しました。
共有データベースを使用してメールボックスを保存する代わりに、ユーザーのパスワード (ユーザーだけが持つ) を使用してメールボックスを個別に保存し、暗号化します。 当社の電子メール サービスは非常に安全なので、パスワードを忘れるとメールボックスが失われます。 (オフライン バックアップで回復するか、最初からやり直す必要があります)。
以下で詳しく説明しますので、読み続けてください。 メールサービスプロバイダーの比較, 私たちのサービスの仕組み, 私たちのテクノロジースタック、 もっと。
メールサービスプロバイダーの比較
当社は、個別に暗号化された SQLite メールボックスを保存し、無制限のドメイン、エイリアス、ユーザーを提供し、送信 SMTP、IMAP、POP3 をサポートする、100% オープンソースでプライバシーを重視した唯一の電子メール サービス プロバイダーです。
他の電子メール プロバイダーとは異なり、Forward Email ではドメインまたはエイリアスごとにストレージの料金を支払う必要はありません。 ストレージはアカウント全体で共有されるため、それぞれに複数のカスタム ドメイン名と複数のエイリアスがある場合、当社が最適なソリューションです。必要に応じて、ドメインまたはエイリアスごとにストレージ制限を強制できることに注意してください。
どのように機能するのか
-
Apple Mail、Thunderbird、Gmail、Outlook などの電子メール クライアントを使用して、安全なネットワークに接続します。 IMAP ユーザー名とパスワードを使用するサーバー:
- ユーザー名は、ドメインの完全なエイリアスです。
hello@example.com
. - パスワードはランダムに生成され、クリックしたときに 30 秒間のみ表示されます。 パスワードの生成 から マイアカウント ドメイン 別名。
- ユーザー名は、ドメインの完全なエイリアスです。
-
接続すると、電子メールクライアントが送信します IMAPプロトコルコマンド IMAP サーバーに送信してメールボックスの同期を保ちます。これには、下書きメールの作成と保存、およびその他のアクション (メールに重要というラベルを付ける、またはメールにスパム/迷惑メールとしてフラグを付けるなど) が含まれます。
-
メール交換サーバー (一般に「MX」サーバーとして知られています) は、新しい受信電子メールを受信し、メールボックスに保存します。これが発生すると、電子メール クライアントに通知が届き、メールボックスが同期されます。当社のメール交換サーバーは、あなたの電子メールを 1 人以上の受信者 (受信者を含む) に転送できます。 Webhook)、あなたの電子メールを当社の暗号化された IMAP ストレージに保存します。 または両方!
さらに詳しく知りたいですか?読む メール転送の設定方法, メール交換サービスの仕組み、またはビュー 私たちのガイド.
-
当社の安全なメール ストレージ設計は、舞台裏で 2 つの方法で機能し、メールボックスを暗号化し、ユーザーのみがアクセスできるようにします。
-
送信者から新しいメールを受信すると、メール交換サーバーが個別の一時的な暗号化メールボックスに書き込みます。
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!
-
電子メール クライアントを使用して IMAP サーバーに接続すると、パスワードがメモリ内で暗号化され、メールボックスの読み書きに使用されます。メールボックスは、このパスワードを使用してのみ読み書きできます。このパスワードを持っているのはあなただけであるため、 あなただけ メールボックスにアクセスすると、メールボックスの読み書きができます。次回、電子メール クライアントがメールまたは同期のポーリングを試行すると、新しいメッセージはこの一時メールボックスから転送され、指定されたパスワードを使用して実際のメールボックス ファイルに保存されます。この一時メールボックスは後でパージおよび削除されるため、パスワードで保護されたメールボックスのみにメッセージが保存されることに注意してください。
-
IMAP に接続している場合 (Apple Mail や Thunderbird などの電子メール クライアントを使用している場合)、一時ディスク ストレージに書き込む必要はありません。代わりに、メモリ内で暗号化された IMAP パスワードが取得されて使用されます。リアルタイムで、メッセージが配信されようとすると、すべての IMAP サーバーに WebSocket リクエストを送信して、アクティブなセッションがあるかどうかを尋ね (これがフェッチ部分です)、その後、そのリクエストが渡されます。暗号化されたメモリ内パスワード – そのため、一時的なメールボックスに書き込む必要はなく、暗号化されたパスワードを使用して実際の暗号化されたメールボックスに書き込むことができます。
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!
-
-
暗号化されたメールボックスのバックアップ 毎日作られています。いつでも新しいバックアップをリクエストしたり、次のサイトから最新のバックアップをダウンロードしたりすることもできます。 マイアカウント ドメイン 別名。別の電子メール サービスに切り替える場合は、メールボックスとバックアップをいつでも簡単に移行、ダウンロード、エクスポート、削除できます。
テクノロジー
データベース
私たちは他のデータベース ストレージ レイヤーの可能性を検討しましたが、SQLite ほど要件を満たしたものはありませんでした。
データベース | 保存時の暗号化 | サンドボックス化 メールボックス | ライセンス | どこでも使用される |
---|---|---|---|---|
の ⭐ | ✅ はい SQLite3複数の暗号 | ✅ | ✅ パブリックドメイン | ✅ |
モンゴDB | ❌ 「MongoDB Enterprise でのみ利用可能」 | ❌ リレーショナルデータベース | ❌AGPLと SSPL-1.0 | ❌ |
rqlite | ❌ ネットワークのみ | ❌ リレーショナルデータベース | ✅ MIT | ❌ |
dqlite | ❌ テストされておらず、まだサポートされていませんか? | ❌ テストされておらず、まだサポートされていませんか? | ✅ LGPL-3.0-only | ❌ |
PostgreSQL | ✅ はい | ❌ リレーショナルデータベース | ✅ PostgreSQL (に似ている BSD または MIT ) | ❌ |
マリアDB | ✅ InnoDB のみ | ❌ リレーショナルデータベース | ✅ GPLv2 と BUSL-1.1 | ❌ |
ゴキブリDB | ❌ エンタープライズ限定機能 | ❌ リレーショナルデータベース | ❌ BUSL-1.1 その他 | ❌ |
がここにあります いくつかの SQLite データベース ストレージ オプションを比較するブログ投稿 上の表では。
セキュリティ
私たちが常に使用しているのは、 保存時の暗号化 (AES-256), 転送中の暗号化 (TLS), HTTPS 経由の DNS (「DoH」) 🍊を使用 タンジェリン、 と しゃれた (ChaCha20-ポリ1305) メールボックスの暗号化。さらに、トークンベースの 2 要素認証を使用します (SMS ではなく、トークンベースの 2 要素認証を使用します)。 中間者攻撃)、ルートアクセスを無効にしたローテーション SSH キー、制限された IP アドレスによるサーバーへの排他的アクセスなど。
万が一の事態が発生した場合、 邪悪なメイドの攻撃 またはサードパーティベンダーの不正な従業員、 メールボックスは生成されたパスワードでのみ開くことができます。当社は、Cloudflare、Digital Ocean、および Vultr の SOC Type 2 苦情サーバープロバイダー以外のサードパーティベンダーには依存していませんので、ご安心ください。
私たちの目標は、その数を最小限にすることです 単一障害点 できるだけ。
メールボックス
tldr; 当社の IMAP サーバーは、メールボックスごとに個別に暗号化された SQLite データベースを使用します。
SQLiteは非常に人気があります 組み込みデータベース - 現在、携帯電話とコンピュータで実行されています - ほぼすべての主要テクノロジーで使用されています.
たとえば、暗号化されたサーバーには、SQLite データベース メールボックスがあります。 linux@example.com
, info@example.com
, hello@example.com
など – それぞれに 1 つずつ .sqlite
データベースファイル。データベース ファイルに電子メール アドレスを使用して名前を付けることもありません。代わりに、BSON ObjectID と生成された一意の UUID を使用します。これらの UUID は、メールボックスが誰に属しているか、どの電子メール アドレスに属しているかを共有しません (例: 353a03f21e534321f5d6e267.sqlite
).
これらのデータベースはそれぞれ、パスワード (あなただけが持っている) を使用して暗号化されます。 しゃれた (ChaCha20-ポリ1305)。これは、メールボックスが個別に暗号化され、自己完結型であることを意味します。 サンドボックス化された、そしてポータブル。
SQLite を次のように微調整しました。 PRAGMA:
PRAGMA | 目的 |
---|---|
cipher=chacha20 | ChaCha20-Poly1305 SQLite データベース暗号化。参照 better-sqlite3-multiple-ciphers 下 プロジェクト より多くの洞察を得るために。 |
key="****************" | これは、電子メール クライアントの IMAP 接続を介してサーバーに渡される、復号化されたメモリ内専用のパスワードです。新しいデータベース インスタンスは、読み取りおよび書き込みセッションごとに作成され、閉じられます (サンドボックス化と分離を確保するため)。 |
journal_model=WAL | 先行書き込みログ ("WAL") これによりパフォーマンスが向上し、同時読み取りアクセスが可能になります。. |
busy_timeout=5000 | 書き込みロックエラーを防止します 他の書き込みが行われている間. |
synchronous=NORMAL | トランザクションの耐久性が向上します データ破損のリスクなし. |
foreign_keys=ON | 外部キー参照 (例: あるテーブルから別のテーブルへのリレーション) が強制的に適用されます。 デフォルトでは、これは SQLite ではオンになっていません。ただし、検証とデータの整合性のために、これを有効にする必要があります。 |
encoding='UTF-8' | デフォルトのエンコーディング 開発者の健全性を確保するために使用します。 |
他のすべてのデフォルトは、 PRAGMA の公式ドキュメント.
同時実行性
tldr; を使用しております
WebSocket
暗号化された SQLite メールボックスへの同時読み取りと書き込み用。
読み取り
携帯電話の電子メール クライアントが解決する可能性があります imap.forwardemail.net
Digital Ocean IP アドレスの 1 つに接続します。デスクトップ クライアントは、別の IP アドレスから別の IP を解決する場合があります。 プロバイダー 全く。
メール クライアントがどの IMAP サーバーに接続するかに関係なく、接続によってデータベースから 100% の精度でリアルタイムに読み取ることができるようにする必要があります。これは WebSocket を通じて行われます。
書き込みます
データベースへの書き込みは少し異なります。SQLite は組み込みデータベースであり、メールボックスはデフォルトで単一のファイル内に存在するためです。
私たちは次のようなオプションを検討しました litestream
, rqlite
、 と dqlite
以下に – ただし、これらはどれも私たちの要件を満たしていませんでした。
先行書き込みログを使用して書き込みを実行するには ("WAL") が有効になっている – 1 つのサーバー (「プライマリ」) だけがこれを行う責任があることを確認する必要があります。 WAL 同時実行速度が大幅に向上し、1 人のライターと複数のリーダーが可能になります。
プライマリは、暗号化されたメールボックスを含むボリュームがマウントされたデータ サーバー上で実行されます。分散の観点からは、背後にあるすべての個別の IMAP サーバーを考慮することができます。 imap.forwardemail.net
セカンダリ サーバー (「セカンダリ」) になります。
私たちは双方向のコミュニケーションを実現します Webソケット:
- プライマリサーバーは次のインスタンスを使用します。 うーんの
WebSocketServer
サーバ。 - セカンダリ サーバーは次のインスタンスを使用します。 うーんの
WebSocket
ラップされているクライアント 約束どおりの WebSocket と 再接続-WebSocket。これら 2 つのラッパーにより、WebSocket
再接続し、特定のデータベース書き込みのデータを送受信できるようになります。
バックアップ
tldr; 暗号化されたメールボックスのバックアップは毎日作成されます。また、いつでも新しいバックアップを即座にリクエストしたり、最新のバックアップをダウンロードしたりできます。 マイアカウント ドメイン 別名。
バックアップの場合は、SQLite を実行するだけです。 VACUUM INTO
IMAP コマンド処理中に毎日コマンドを実行します。これは、メモリ内の IMAP 接続からの暗号化されたパスワードを利用します。バックアップは、既存のバックアップが検出されない場合、または SHA-256 最新のバックアップと比較して、ファイルのハッシュが変更されました。
を使用することに注意してください VACUUM INTO
組み込みではなくコマンド backup
コマンドの実行中にページが変更された場合、 backup
コマンド操作を実行した場合は、最初からやり直す必要があります。の VACUUM INTO
コマンドはスナップショットを取得します。これらのコメントを参照してください GitHub と ハッカーニュース より多くの洞察を得るために。
さらに、私たちは使用します VACUUM INTO
とは対照的に backup
、 なぜなら backup
このコマンドは、データベースを短期間暗号化しないままにしておきます。 rekey
が呼び出されます (この GitHub を参照してください) コメント 洞察力のために)。
セカンダリはプライマリに次のことを指示します。 WebSocket
バックアップを実行するための接続が確立され、プライマリはバックアップを実行するコマンドを受け取り、その後次の処理を実行します。
- 暗号化されたメールボックスに接続します。
- 書き込みロックを取得します。
- WAL チェックポイントを実行するには、
wal_checkpoint(PASSIVE)
. - を実行します。
VACUUM INTO
SQLiteコマンド。 - コピーしたファイルが暗号化されたパスワード (セーフガード/ダミープルーフ) で開けることを確認します。
- それをCloudflare R2にアップロードして保存します(または指定されている場合は独自のプロバイダー)。
メールボックスは暗号化されていることに注意してください。また、WebSocket 通信には IP 制限やその他の認証手段が用意されていますが、悪意のある攻撃者が発生した場合でも、WebSocket ペイロードに IMAP パスワードが含まれていない限り、データベースを開けることはできないので安心してください。 。
現時点ではメールボックスごとに 1 つのバックアップのみが保存されますが、将来的にはポイントインタイム リカバリを提供する可能性があります ("PITR").
検索
当社の IMAP サーバーは、 SEARCH
複雑なクエリ、正規表現などを含むコマンド。
高速検索パフォーマンスのおかげで FTS5 と sqlite-正規表現.
保管しています Date
SQLite メールボックス内の値は次のようになります。 ISO 8601 文字列経由 Date.prototype.toISOString (等値比較が適切に機能するように UTC タイムゾーンを使用します)。
検索クエリ内のすべてのプロパティのインデックスも保存されます。
プロジェクト
以下は、ソース コードと開発プロセスで使用するプロジェクトの概要を示した表です (アルファベット順に並べ替えています)。
プロジェクト | 目的 |
---|---|
アンシブル | サーバー群全体を簡単に保守、拡張、管理するための DevOps 自動化プラットフォーム。 |
ブリー | cron、dates、ms、later、および人に優しいサポートを備えた Node.js および JavaScript 用のジョブ スケジューラ。 |
キャビン | セキュリティとプライバシーを考慮した開発者向けの JavaScript および Node.js ログ ライブラリ。 |
しましょう | MVC などを使用してアーキテクチャ全体とエンジニアリング設計を強化する Node.js フレームワーク。 |
モンゴDB | メールボックスの外にある他のすべてのデータ (アカウント、設定、ドメイン、エイリアス構成など) を保存するために使用する NoSQL データベース ソリューション。 |
マングース | MongoDB オブジェクト ドキュメント モデリング (「ODM」) はスタック全体で使用されます。私たちは、単純に使い続けることができる特別なヘルパーを作成しました。 SQLite を使用したマングース 🎉 |
Node.js | Node.js は、すべてのサーバー プロセスを実行するオープンソースのクロスプラットフォーム JavaScript ランタイム環境です。 |
メモメーラー | 電子メールの送信、接続の作成などを行うための Node.js パッケージ。弊社はこのプロジェクトのオフィシャルスポンサーです。 |
レディス | キャッシュ、チャネルのパブリッシュ/サブスクライブ、HTTPS 経由の DNS リクエスト用のインメモリ データベース。 |
SQLite3複数の暗号 | SQLite の暗号化拡張機能により、データベース ファイル全体 (先行書き込みログを含む) を暗号化できるようになります ("WAL")、ジャーナル、ロールバック、…)。 |
SQLiteスタジオ | 開発メールボックスをテスト、ダウンロード、表示するための Visual SQLite エディター (これも使用できます)。 |
の | スケーラブルで自己完結型、高速かつ復元力のある IMAP ストレージのための組み込みデータベース層。 |
スパムスキャナー | Node.js スパム対策、電子メール フィルタリング、フィッシング防止ツール (代替ツール) スパムアサシン と rspamd). |
タンジェリン | Node.js を使用した DNS over HTTPS リクエストと Redis を使用したキャッシュ – これにより、グローバルな一貫性などが保証されます。 |
サンダーバード | 私たちの開発チームはこれを次のように使用しています (そしてこれも推奨しています)。 電子メール転送で使用する優先電子メール クライアント. |
UTM | 当社の開発チームは、IMAP および SMTP サーバーでさまざまな電子メール クライアントを (並行して) テストするために、これを使用して iOS および macOS 用の仮想マシンを作成します。 |
ウブントゥ | すべてのインフラストラクチャを強化する最新のオープンソース Linux ベースのサーバー オペレーティング システム。 |
ワイルドダック | IMAP サーバー ライブラリ – そのメモを参照してください。 添付ファイルの重複除外 と IMAPプロトコルのサポート. |
より良いSQLite3の複数の暗号 | Node.js がプログラムで SQLite3 と対話するための高速かつシンプルな API ライブラリ。 |
電子メールテンプレート | カスタム電子メール (アカウント通知など) を作成、プレビュー、送信するための開発者向けの電子メール フレームワーク。 |
json-sql | Mongo スタイルの構文を使用する SQL クエリ ビルダー。これにより、データベースに依存しないアプローチでスタック全体にわたって Mongo スタイルで書き続けることができるため、開発チームの時間が節約されます。 また、クエリ パラメーターを使用することで、SQL インジェクション攻撃を回避するのにも役立ちます。 |
knex スキーマインスペクター | 既存のデータベース スキーマに関する情報を抽出する SQL ユーティリティ。これにより、すべてのインデックス、テーブル、列、制約などが有効であり、適切であることを簡単に検証できます。 1:1 彼らがどうあるべきかについて。データベース スキーマに変更が加えられた場合に新しい列とインデックスを追加する自動ヘルパーも作成しました (非常に詳細なエラー アラートも備えています)。 |
ネックス | SQL クエリ ビルダー。データベースの移行とスキーマ検証にのみ使用します。 knex-schema-inspector . |
マンダリン | 自動 国際化 Markdown をサポートするフレーズ翻訳を使用 Googleクラウド翻訳API. |
MX接続 | MX サーバーとの接続を解決して確立し、エラーを処理するための Node.js パッケージ。 |
午後2時 | ロードバランサーを内蔵した Node.js プロダクション プロセス マネージャー (微調整 パフォーマンスのため)。 |
smtpサーバー | SMTP サーバー ライブラリ – これをメール交換 (「MX」) およびアウトバウンド SMTP サーバーに使用します。 |
Imapテスト | IMAP サーバーをベンチマークおよび RFC 仕様の IMAP プロトコル互換性に対してテストするための便利なツール。このプロジェクトを作成したのは、 鳩小屋 チーム (2002 年 7 月からアクティブなオープンソース IMAP および POP3 サーバー)。このツールを使用して IMAP サーバーを徹底的にテストしました。 |
私たちが使用している他のプロジェクトを見つけることができます GitHub 上のソースコード.
プロバイダー
プロバイダー | 目的 |
---|---|
クラウドフレア | DNSプロバイダー、ヘルスチェック、ロードバランサー、バックアップストレージを使用 クラウドフレア R2. |
デジタルオーシャン | 専用サーバー ホスティング、SSD ブロック ストレージ、管理されたデータベース。 |
バルト | 専用サーバーホスティングとSSDブロックストレージ。 |
思い
原則
電子メールの転送は、次の原則に従って設計されています。
- 常に開発者に優しく、セキュリティとプライバシーを重視し、透明性を保ちます。
- 付着する MVC, ユニックス, KISS, DRY, YAGNI, トゥエルブ ファクター, オッカムのかみそり、 と ドッグフーディング
- 不精者、自力でやりくりする人をターゲットにする ラーメン儲かる 開発者
実験
tldr; 最終的には、S3 互換のオブジェクト ストレージや仮想テーブルを使用することは、パフォーマンス上の理由から技術的に実現不可能であり、メモリの制限によりエラーが発生しやすくなります。
上で説明したように、最終的な SQLite ソリューションに至るまでに、いくつかの実験を行ってきました。
そのうちの 1 つは、使用してみることでした rcローン SQLite と S3 互換ストレージ層を組み合わせます。
この実験により、rclone、SQLite、および VFS 使用法:
- 有効にすると
--vfs-cache-mode writes
rclone でフラグを設定すると、読み取りは正常になりますが、書き込みはキャッシュされます。- 複数の IMAP サーバーがグローバルに分散されている場合、単一のライターと複数のリスナー (パブリッシュ/サブスクライブ アプローチなど) がない限り、キャッシュはそれらのサーバー全体でオフになります。
- これは非常に複雑であり、このような複雑さがさらに加わると、単一障害点がさらに多くなります。
- S3 互換のストレージ プロバイダーは、ファイルの部分的な変更をサポートしていません。これは、ファイルのあらゆる変更を意味します。
.sqlite
ファイルを変更すると、データベースが完全に変更され、再アップロードされます。 - 他のソリューションのようなもの
rsync
存在しますが、ログ先行書き込みには重点が置かれていません ("WAL") サポート – そこで、最終的に Litestream をレビューすることになりました。幸いなことに、暗号化の使用により、すでに WAL ファイルを自動的に作成してくれるため、Litestream に依存する必要はありません。ただし、本番環境での Litestream にまだ自信がなかったので、それについて以下にいくつかのメモを記載します。 - このオプションを使用すると、
--vfs-cache-mode writes
( のみ SQLiteを使用する方法rclone
書き込み用) は、データベース全体をメモリ内で最初からコピーしようとします。1 つの 10 GB メールボックスを処理するのは問題ありませんが、非常に大きなストレージを持つ複数のメールボックスを処理すると、IMAP サーバーがメモリ制限に遭遇し、ENOMEM
エラー、セグメンテーション違反、データ破損。
- SQLiteを使用しようとすると 仮想テーブル (例: s3db) S3 互換ストレージ層にデータを保存するには、さらにいくつかの問題が発生します。
- S3 API エンドポイントは HTTP でアクセスする必要があるため、読み取りと書き込みは非常に遅くなります。
GET
,PUT
,HEAD
、 とPOST
方法。 - 開発テストでは、ファイバー インターネット上で 500K ~ 100 万を超えるレコードは、S3 互換プロバイダーへの書き込みおよび読み取りのスループットによって依然として制限されることが示されました。たとえば、開発者は次のように実行しました。
for
両方のシーケンシャル SQL を実行するループINSERT
ステートメントと大量のデータを一括で書き込むステートメント。どちらの場合も、パフォーマンスは驚くほど遅かったです。 - 仮想テーブル インデックスを持つことはできません,
ALTER TABLE
声明、および 他の 制限事項 – これにより、データ量に応じて 1 ~ 2 分以上の遅延が発生します。 - オブジェクトは暗号化されずに保存されており、すぐに利用できるネイティブ暗号化サポートはありません。
- S3 API エンドポイントは HTTP でアクセスする必要があるため、読み取りと書き込みは非常に遅くなります。
- を使用して検討しました sqlite-s3vfs これは概念的にも技術的にも前の箇条書きと似ています (したがって、同じ問題があります)。可能性としては、カスタムを使用することです
sqlite3
暗号化でラップされたビルド wxSQLite3 (上記のソリューションで現在使用しています) セットアップファイルの編集. - もう 1 つの潜在的なアプローチは、 多重内線ただし、これには 32 GB の制限があり、複雑な構築と開発に頭を悩ませる必要があります。
ALTER TABLE
ステートメントは必須です (したがって、仮想テーブルの使用は完全に除外されます)。必要ですALTER TABLE
フックのステートメント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'))
そしてディスクストレージから永久に消去されます。 - 同様に、HTTP で S3 互換 API を使用できます。
DELETE
ユーザーがスナップショットとバックアップを簡単に削除できるようにします。
- 簡単な Node.js コマンド
- SQLite は、最もシンプル、最速、そして最もコスト効率の高いソリューションでした。
代替手段の欠如
私たちの知る限り、他の電子メール サービスはこのように設計されておらず、オープンソースでもありません。
私たちは これが原因かもしれないと思う 本番環境にレガシーテクノロジーを搭載した既存の電子メールサービスに スパゲッティコード 🍝.
既存の電子メール サービス プロバイダーのすべてではないにしても、ほとんどがクローズドソースであるか、オープンソースとして宣伝されています。 しかし実際には、オープンソースなのはフロントエンドだけです。
電子メールの最も機密性の高い部分 (実際のストレージ/IMAP/SMTP インタラクション) すべてバックエンド (サーバー) で行われ、 ない フロントエンド(クライアント)上.
メール転送を試してみる
今すぐサインアップしてください https://forwardemail.net! 🚀