Envflow の構築:Laravel および Upstash Redis と環境変数を安全に共有する
私は最近、Nuno Maduro のプロジェクト Pyre にインスピレーションを受けています。これは、必要な人に短期間の秘密メッセージを送信できる Web アプリです。これらのメッセージは保存時に暗号化されており、あなたまたは復号化リンクを共有した人だけがメッセージを読むことができます。
私は Upstash Redis で同様のものを構築したかったので、環境変数の共有というニッチな分野を選択しました。きっと、ある時点でチームメイトと秘密を共有する必要があり、それを安全に行うことができるシステムを構築する方法を疑問に思ったことがあると思います。
Envflow を紹介します。これは私が構築した Laravel サンプル プロジェクトで、暗号化されたデータを保存および共有するためのプライマリ データベースとして Upstash Redis を使用します。
退屈な詳細は省略して、このプロジェクトを構築するプロセスを最初から最後まで説明します。
スタック
まず、PHP を採用し、有名な TALL スタックを使用してプロジェクトを構築することにしました。
- Tailwind CSS
- アルパイン JS
- ララベル
- ライブワイヤー
- Redis をアップスタッシュ
データベース
一定の時間が経過すると期限切れになる暗号化データを高速かつコスト効率よく保存する場所が必要でした。ご想像のとおり、私は Upstash Redis を選択しました。
Upstash Redis はサーバーレスで Redis と互換性のあるデータベースであるため、このユースケースには実際に最適でした。
追記… Upstash Redis と Laravel の入門ガイドがあります!
さらに詳しく
ルート/エンドポイント
Envflow は 3 つのメイン ルートと、プロジェクトの内容を説明する補助ルートで実行されます。これらのルートは routes/web.php で見つけることができます。 ファイル。
ホームページ
ホームページ ルートはプロジェクトのランディング ページとして機能するだけでなく、環境変数を暗号化できる Livewire フォームも含まれています。このページでは、環境変数を復号化できる回数と、環境変数の有効期間を設定できます。

Livewire ページ コンポーネントは app/Livewire/EncryptEnvPage.php にあります。 resources/views/livewire/encrypt-env-page.blade.php の対応するテンプレート .
成功ページ
成功ページは、復号化リンクを共有する 2 つの方法を表示するシンプルなページです。1 つは復号化キーを含み、もう 1 つはリンクから復号化キーを分離します。

Livewire ページ コンポーネントは app/Livewire/SuccessPage.php にあります。 resources/views/livewire/success-page.blade.php の対応するテンプレート .
復号化ページ
このページでは、復号化のすべての魔法が行われます。暗号化キーは Upstash Redis データベースに保存されず、意味不明な暗号化された値のみが保存されることに注意してください。復号化ページの主な仕事は、復号化キーを取得し、環境変数の復号化を試みることです。

Livewire ページ コンポーネントは app/Livewire/DecryptEnvPage.php にあります。 resources/views/livewire/decrypt-env-page.blade.php の対応するテンプレート .
アクション
このプロジェクトでは、アクション/エグゼキューター パターンを使用して、アプリケーション内のビジネス ロジックの主要コンポーネントを整理しました。これにより、コードが大きくなった場合でも、将来の再利用性、テスト性、保守性が向上します。また、アプリケーションのさまざまな部分、たとえば将来の API 間でそのような動作を共有することもできます...誰にも分かりません...
アクションは app/Actions にあります。 しかし、暗号化アクションと復号化アクションは環境変数の暗号化と復号化を処理する主要なコンポーネントであるため、これらのアクションを使用したいと思います。
暗号化
Laravel には暗号化ヘルパーが組み込まれているのは非常に幸運でしたが、実行時に生成されるカスタム暗号化キーを提供したかったので、少し異なるものが必要でした。
いろいろ調べてみたところ、方法を発見しました! Laravel の基底クラス Illuminate\Encryption\Encrypter を使用できます。 .
use Illuminate\Encryption\Encrypter;
$encrypter = new Encrypter(
'custom-encryption-key', // this is the one we would want to generate
config('app.cipher'), // we'll use Laravel default cipher
);
// Hooray! We can now encrypt our value
$encryptedValue = $encrypter->encryptString($value); さて...暗号化が機能しました。私が共有しているファイルをチェックしている方なら、このコードが暗号化アクションと復号化アクションにあることに気づいたかもしれません。
ストレージ
アクションとLaravelのネイティブ Encrypter の使用方法について説明しました。 クラスを使用して値を暗号化および復号化しますが、値を Upstash Redis に保存する方法についてはまだ説明していません。
そのコードは StoreEnvFile にあります。 アクション。
このファイルのいくつかの点、次のコードを強調したいと思います。
// ...
RedisFacade::pipeline(function (Redis $pipe) use (...) {
$options = ['EX' => $ttl]; // here is where we set the expiration time
$pipe->set("envfile:$id", $encrypted->value, $options);
$pipe->set("envfile:$id:shareLimit", $shareLimit, $options);
});
// ... 上記のコードでは、すべてのコマンドが 1 つのトランザクションで確実に実行されるようにする Redis パイプラインが使用されていることがわかります。 set コマンドが失敗した場合に暗号化された値を保存したくないため、これは重要です。
展開
デプロイメントには、最近リリースされた Laravel Cloud を使用しました。
Laravel Cloud へのデプロイは信じられないほど簡単で、リポジトリから Redis インスタンスとプロビジョニングされたドメインが接続された完全にデプロイされたアプリに移行するまでに 1 分もかかりませんでした。現在でも、デプロイには 30 秒もかかりません。 🚀

デプロイされた実稼働環境には https://envflow.laravel.cloud でアクセスできます。
結論
この投稿が気に入っていただけて、私が Envflow を構築した方法を理解するのに役立ったことがあれば幸いです。
Upstash Redis をプライマリ データベースとして使用できるアプリケーションはたくさんあると思います。ここでの Redis は KV ストアとして使用されていますが、それ以上のことができるので、今後取り組む別のプロジェクトの記事で必ず取り上げる予定です。
このプロジェクトのソース コードは GitHub で入手できます。お気軽にチェックして、アイデアや提案がある場合 (またはバグを見つけた場合) に貢献してください。
-
Redis UNSUBSCRIBE – redis pub/subの複数のチャネルから退会する方法
このチュートリアルでは、redis-cliを使用してredisメッセージブローカーシステムの複数のチャネルから退会する方法について学習します。 UNSUBSCRIBEコマンド UNSUBSCRIBEコマンドは、redisメッセージブローカーシステムで指定された1つ以上のチャネルからクライアントのサブスクライブを解除するために使用されます。チャネルが指定されていない場合、クライアントはすべてのサブスクライブされたチャネルからサブスクライブ解除されます。購読していないチャンネルごとにメッセージを返します。 redis UNSUBSCRIBEコマンドの構文は次のとおりです:- 構文:- r
-
Blitz.jsとRedisを使用してToDoリストを作成する
Blitz.jsは、もともとNext.jsからフォークされたReactフレームワークです。今日は、Upstashにタスクを保存するBlitz.jsTo-Doアプリケーションを作成します。面倒なことはせずに、始めましょう! セットアップ 開始するには、コンピューターにBlitz.jsをインストールする必要があります。 NPM: npm install -g blitz --legacy-peer-deps 糸: yarn global add blitz 新しいBlitz.jsアプリを作成するには、 blitz newを使用します ディレクトリに挿入します。 blitz new bl