Gần đây tôi đã được truyền cảm hứng từ dự án của Nuno Maduro, Pyre. Đây là một ứng dụng web cho phép bạn gửi những tin nhắn bí mật ngắn hạn cho bất kỳ ai bạn muốn. Những tin nhắn này được mã hóa ở trạng thái lưu trữ và chỉ bạn hoặc người mà bạn chia sẻ liên kết giải mã mới có thể đọc chúng.
Tôi muốn xây dựng thứ gì đó tương tự với Upstash Redis nên tôi đã chọn một lĩnh vực thích hợp:chia sẻ các biến môi trường. Tôi cá rằng đến một lúc nào đó, bạn phải chia sẻ bí mật với đồng đội của mình và tự hỏi cách xây dựng một hệ thống cho phép bạn thực hiện việc đó một cách an toàn.
Giới thiệu Envflow, một dự án mẫu Laravel mà tôi đã xây dựng sử dụng Upstash Redis làm cơ sở dữ liệu chính để lưu trữ và chia sẻ dữ liệu được mã hóa.
Tôi sẽ hướng dẫn bạn qua quá trình xây dựng dự án này, từ đầu đến cuối, bỏ qua những chi tiết nhàm chán.
Ngăn xếp
Đầu tiên, tôi chọn sử dụng PHP và xây dựng dự án bằng cách sử dụng ngăn xếp TALL nổi tiếng:
- CSS Tailwind
- Alpine JS
- Laravel
- Dây điện trực tiếp
- Upstash Redis
Cơ sở dữ liệu
Tôi cần một nơi để lưu trữ dữ liệu được mã hóa có thể hết hạn sau một khoảng thời gian nhất định nhưng vẫn nhanh chóng và tiết kiệm chi phí. Như bạn có thể đoán, tôi đã chọn Upstash Redis.
Upstash Redis là cơ sở dữ liệu không có máy chủ, tương thích với Redis nên nó thực sự hoàn hảo cho trường hợp sử dụng này.
Psst… Chúng tôi có hướng dẫn Bắt đầu cho Upstash Redis và Laravel!
Tìm hiểu thêm
Tuyến đường / Điểm cuối
Envflow chạy trên ba tuyến đường chính, cộng với một tuyến phụ giải thích nội dung của dự án. Bạn có thể tìm thấy những tuyến đường đó trên routes/web.php tập tin.
Trang chủ
Tuyến trang chủ không chỉ hoạt động như một trang đích cho dự án mà còn bao gồm Biểu mẫu Livewire cho phép bạn mã hóa các biến môi trường của mình. Trên trang này, bạn có thể đặt số lần các biến môi trường có thể được giải mã và chúng sẽ có hiệu lực trong bao lâu.

Bạn có thể tìm thấy Thành phần trang Livewire trên app/Livewire/EncryptEnvPage.php và mẫu tương ứng trên resources/views/livewire/encrypt-env-page.blade.php .
Trang thành công
Trang thành công là một trang đơn giản hiển thị hai cách để chia sẻ liên kết giải mã:một cách bao gồm khóa giải mã, trong khi cách kia tách khóa giải mã khỏi liên kết.

Bạn có thể tìm thấy Thành phần trang Livewire trên app/Livewire/SuccessPage.php và mẫu tương ứng trên resources/views/livewire/success-page.blade.php .
Trang giải mã
Trang này là nơi xảy ra tất cả những điều kỳ diệu của quá trình giải mã, hãy nhớ rằng chúng tôi không lưu trữ khóa mã hóa trong cơ sở dữ liệu Upstash Redis của mình, chúng tôi chỉ lưu trữ giá trị được mã hóa, vốn là một mớ vô nghĩa. Công việc chính của trang Giải mã là lấy khóa giải mã và cố gắng giải mã các biến môi trường.

Bạn có thể tìm thấy Thành phần trang Livewire trên app/Livewire/DecryptEnvPage.php và mẫu tương ứng trên resources/views/livewire/decrypt-env-page.blade.php .
Hành động
Đối với dự án này, tôi đã sử dụng mẫu Hành động/Thực thi để sắp xếp các thành phần chính của logic nghiệp vụ trong ứng dụng của mình. Điều này cho phép tôi có khả năng sử dụng lại, khả năng kiểm tra và bảo trì trong tương lai khi mã phát triển, nó cũng cho phép tôi chia sẻ những hành vi như vậy giữa các phần khác nhau của ứng dụng của mình, chẳng hạn như một API trong tương lai... Ai biết được?...
Bạn có thể tìm thấy Hành động trên app/Actions nhưng tôi muốn giới thiệu với bạn về Mã hóa và Giải mã vì chúng là thành phần chính xử lý việc mã hóa và giải mã các biến môi trường.
Mã hóa
Tôi khá may mắn khi Laravel có trình trợ giúp Mã hóa tích hợp nhưng tôi cần thứ gì đó hơi khác một chút vì tôi muốn cung cấp khóa mã hóa tùy chỉnh được tạo trong thời gian chạy.
Sau một hồi tìm hiểu, tôi đã tìm ra cách! Chúng ta có thể sử dụng lớp cơ bản Illuminate\Encryption\Encrypter của Laravel .
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); Được rồi... Vậy là chúng ta đã mã hóa được, nếu bạn đang kiểm tra các tệp tôi đang chia sẻ, bạn có thể nhận thấy rằng mã này có thể được tìm thấy trên Hành động mã hóa và giải mã.
Lưu trữ
Chúng tôi đã đề cập đến cách chúng tôi sử dụng Hành động và Encrypter gốc của Laravel class để Mã hóa và Giải mã các giá trị của chúng tôi nhưng chúng tôi chưa trình bày cách lưu trữ chúng trong Upstash Redis.
Mã đó tồn tại trên StoreEnvFile Hành động.
Tôi muốn làm nổi bật một số điều từ tập tin đó, đoạn mã sau.
// ...
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);
});
// ... Ở đoạn mã trên, bạn có thể thấy một đường dẫn Redis đang được sử dụng, điều này sẽ đảm bảo rằng tất cả các lệnh được thực thi trong một giao dịch đơn lẻ. Điều này quan trọng vì chúng ta không muốn lưu trữ giá trị được mã hóa nếu lệnh set không thành công.
Triển khai
Để triển khai, tôi đã sử dụng Đám mây Laravel được phát hành gần đây.
Việc triển khai lên Đám mây Laravel cực kỳ dễ dàng, tôi chỉ mất chưa đầy một phút để chuyển từ kho lưu trữ sang một ứng dụng được triển khai đầy đủ với phiên bản Redis đính kèm và miền được cung cấp. Ngay cả bây giờ, việc triển khai chỉ mất chưa đầy 30 giây. 🚀

Bạn có thể truy cập môi trường sản xuất đã triển khai tại https://envflow.laravel.cloud.
Kết luận
Tôi hy vọng bạn thích bài đăng này và nó đã giúp bạn hiểu cách tôi xây dựng Envflow.
Tôi nghĩ rằng có rất nhiều ứng dụng có thể sử dụng Upstash Redis làm cơ sở dữ liệu chính, ngay cả khi Redis ở đây được sử dụng làm kho lưu trữ KV, nó có thể làm được nhiều điều hơn thế và tôi sẽ đảm bảo rằng tôi sẽ đề cập đến nó trong các bài viết trong tương lai bằng một dự án khác mà tôi sẽ thực hiện.
Mã nguồn của dự án này có sẵn trên GitHub, vui lòng xem qua và đóng góp nếu bạn có bất kỳ ý tưởng hoặc đề xuất nào (hoặc tìm thấy bất kỳ lỗi nào).