ผมได้รับแรงบันดาลใจจากโครงการ Pyre ของ Nuno Maduro ซึ่งเป็นเว็บแอปที่อนุญาตให้คุณส่งข้อความลับที่มีอายุสั้นไปยังทุกคน ข้อความเหล่านี้ถูกเข้ารหัสขณะจัดเก็บ และมีเพียงคุณหรือผู้ที่ได้รับลิงก์ถอดรหัสเท่านั้นที่อ่านได้
ผมอยากสร้างสิ่งคล้ายกันด้วย Upstash Redis จึงเลือกช่องทางเฉพาะ: การแชร์ environment variables ผมเดิมพันว่าคุณเคยต้องแชร์ secrets กับทีมเมตและสงสัยว่าจะสร้างระบบที่ทำได้อย่างปลอดภัยอย่างไร
แนะนำ Envflow โปรเจกต์ตัวอย่าง Laravel ที่ผมสร้าง ซึ่งใช้ Upstash Redis เป็นฐานข้อมูลหลักสำหรับจัดเก็บและแชร์ข้อมูลที่เข้ารหัส
ผมจะพาคุณผ่านกระบวนการสร้างโปรเจกต์นี้ ตั้งแต่ต้นจนจบ โดยข้ามรายละเอียดที่น่าเบื่อไป
Tech Stack
ก่อนอื่น ผมเลือกที่จะใช้ PHP และสร้างโปรเจกต์ด้วย TALL Stack ที่มีชื่อเสียง:
- Tailwind CSS
- Alpine JS
- Laravel
- Livewire
- Upstash Redis
ฐานข้อมูล
ผมต้องการที่จัดเก็บข้อมูลที่เข้ารหัสซึ่งสามารถหมดอายุได้หลังจากเวลาที่กำหนด ขณะที่รวดเร็วและคุ้มค่า คุณคาดเดาได้แล้ว ผมเลือก Upstash Redis
Upstash Redis เป็นฐานข้อมูล Redis-compatible แบบ serverless จึงเหมาะอย่างยิ่งสำหรับกรณีการใช้งานนี้
Psst… เรามีคู่มือเริ่มต้นใช้งาน Upstash Redis และ Laravel!
ดูเพิ่มเติม
Routes / Endpoints
Envflow ทำงานบน 3 routes หลัก บวกกับ route เสริมที่อธิบายเกี่ยวกับโปรเจกต์ Routes เหล่านี้อยู่ในไฟล์ routes/web.php
หน้าแรก (Homepage)
Route หน้าแรกไม่ได้ทำหน้าที่เป็น landing page อย่างเดียว แต่ยังรวม Livewire Form ที่อนุญาตให้คุณเข้ารหัส environment variables ของคุณ ในหน้านี้คุณสามารถตั้งจำนวนครั้งที่ environment variables สามารถถอดรหัสได้ และระยะเวลาที่จะมี效力

คุณสามารถหา Livewire Page Component ได้ที่ app/Livewire/EncryptEnvPage.php และเทมเพลตที่ resources/views/livewire/encrypt-env-page.blade.php
หน้าสำเร็จ (Success Page)
หน้าสำเร็จเป็นหน้าสimple ที่แสดง 2 วิธีในการแชร์ลิงก์ถอดรหัส: หนึ่งรวมคีย์ถอดรหัส อีกแยกคีย์ถอดรหัสจากลิงก์

คุณสามารถหา Livewire Page Component ได้ที่ app/Livewire/SuccessPage.php และเทมเพลตที่ resources/views/livewire/success-page.blade.php
หน้าถอดรหัส (Decryption Page)
หน้านี้คือที่ที่เวทมนตร์การถอดรหัสเกิดขึ้น จำได้ไหมว่าเราไม่ได้เก็บคีย์เข้ารหัสในฐานข้อมูล Upstash Redis เราเก็บแค่ค่าที่เข้ารหัสซึ่งเป็นชุดตัวอักษรไร้ความหมาย หน้าที่หลักของหน้าถอดรหัสคือรับคีย์ถอดรหัสและพยายามถอดรหัส environment variables

คุณสามารถหา Livewire Page Component ได้ที่ app/Livewire/DecryptEnvPage.php และเทมเพลตที่ resources/views/livewire/decrypt-env-page.blade.php
Actions
สำหรับโปรเจกต์นี้ผมใช้รูปแบบ Action/Executor เพื่อจัดระเบียบส่วนประกอบหลักของ business logic ในแอปพลิเคชัน นี่ช่วยให้สามารถนำกลับมาใช้ใหม่ ทดสอบ และบำรุงรักษาได้ง่ายขึ้นเมื่อโค้ดโตขึ้น ยังช่วยให้แชร์พฤติกรรมดังกล่าวระหว่างส่วนต่างๆ ของแอปพลิเคชันได้ เช่น API ในอนาคต... ใครรู้...
คุณสามารถหา Actions ได้ที่ app/Actions แต่ผมอยากเน้น Encrypt และ Decrypt Actions เนื่องจากเป็นส่วนประกอบหลักที่จัดการการเข้ารหัสและถอดรหัส environment variables
การเข้ารหัส (Encryption)
ผมโชคดีที่ Laravel มี Encryption helper ในตัว แต่ผมต้องการอะไรที่แตกต่างออกไปเล็กน้อย เนื่องจากอยากให้มีคีย์เข้ารหัสที่กำหนดเองซึ่งสร้างขึ้นในขณะรันไทม์
หลังจากขุดค้น พบวิธีการ! เราสามารถใช้ class Illuminate\Encryption\Encrypter ที่อยู่เบื้องหลังของ Laravel ได้
use Illuminate\Encryption\Encrypter; $encrypter = new Encrypter( 'custom-encryption-key', // นี่คือสิ่งที่เราต้องการสร้าง config('app.cipher'), // เราจะใช้ cipher เริ่มต้นของ Laravel ); // โย่ว! เราสามารถเข้ารหัสค่าของเราได้แล้ว $encryptedValue = $encrypter->encryptString($value);
โอเค... การเข้ารหัสทำงานได้แล้ว หากคุณตรวจสอบไฟล์ที่ผมแชร์ไป คุณอาจสังเกตเห็นว่าโค้ดนี้อยู่ใน Encrypt และ Decrypt Actions
การจัดเก็บ (Storage)
เราได้ครอบคลุมแล้วว่าวิธีใช้ Actions และ class Encrypter ของ Laravel เข้ารหัสและถอดรหัสค่า แต่ยังไม่ได้ครอบคลุมวิธีจัดเก็บใน Upstash Redis
โค้ดส่วนนี้อยู่ใน Action StoreEnvFile
ผมอยากเน้นจุดสำคัญบางจุดจากไฟล์นั้น โค้ดต่อไปนี้:
// ... RedisFacade::pipeline(function (Redis $pipe) use (...) { $options = ['EX' => $ttl]; // ที่นี่คือการตั้งค่าเวลาหมดอายุ $pipe->set("envfile:$id", $encrypted->value, $options); $pipe->set("envfile:$id:shareLimit", $shareLimit, $options); }); // ...
ในโค้ดด้านบนคุณเห็นการใช้ Redis pipeline ซึ่งจะทำให้คำสั่งทั้งหมดถูกดำเนินการในธุรกรรมเดียว นี่สำคัญเพราะเราไม่ต้องการจัดเก็บค่าที่เข้ารหัสหากคำสั่ง set ล้มเหลว
การปรับใช้ (Deployment)
สำหรับการปรับใช้ ผมใช้ Laravel Cloud ที่เพิ่งเปิดตัว
การปรับใช้ไปที่ Laravel Cloud ง่ายมาก ใช้เวลาน้อยกว่า 1 นาทีในการไปจาก repository สู่แอปที่ปรับใช้สมบูรณ์พร้อม Redis instance ที่ผูกมาด้วยและโดเมนที่จัดเตรียมไว้ แม้ตอนนี้ การปรับใช้ก็ใช้เวลาน้อยกว่า 30 วินาที 🚀

คุณสามารถเยี่ยมชมสภาพแวดล้อม production ที่ https://envflow.laravel.cloud
สรุป
หวังว่าคุณจะเพลิดเพลินกับโพสต์นี้ และช่วยให้คุณเข้าใจว่าผมสร้าง Envflow อย่างไร
ผมคิดว่ามีแอปพลิเคชันมากมายที่สามารถใช้ Upstash Redis เป็นฐานข้อมูลหลักได้ แม้ Redis ในที่นี้จะถูกใช้เป็น KV store แต่ก็สามารถทำได้มากกว่านั้นมาก และผมจะครอบคลุมในบทความอนาคตด้วยโปรเจกต์อื่นที่ผมจะทำงานอยู่
ซอร์สโค้ดของโปรเจกต์นี้พร้อมใช้งานบน GitHub โปรดตรวจสอบและมีส่วนร่วมหากคุณมีไอเดีย ข้อเสนอแนะ (หรือพบบั๊ก)