Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

LiteStack cho Ruby on Rails:Giải pháp quản lý dữ liệu một cửa

Trong loạt bài đăng này, chúng ta sẽ xem xét LiteStack , giải pháp toàn diện lưu trữ và xử lý tất cả dữ liệu sản xuất của bạn trên một máy duy nhất. LiteStack (như tên gợi ý) sử dụng SQLite để cung cấp:

  • cơ sở dữ liệu sử dụng LiteDB bộ chuyển đổi
  • một chương trình phụ trợ ActiveJob (LiteJob )
  • một chương trình phụ trợ ActionCable (LiteCable )
  • một ActiveSupport::Cache store (LiteCache )

Trong bài đăng đầu tiên này, chúng tôi sẽ giới thiệu những kiến thức cơ bản về LiteStack và thiết lập một ứng dụng Rails mẫu.

Hãy bắt đầu!

Giới thiệu về SQLite

Bản thân SQLite đã là cơ sở dữ liệu nhúng được sử dụng trong nhiều ngành trong nhiều thập kỷ. Ví dụ:nó được sử dụng rộng rãi trong phát triển ứng dụng gốc, môi trường thử nghiệm, bộ nhớ đệm và các môi trường khác.

Tuy nhiên, gần đây nó đã thu hút rất nhiều thử nghiệm và mở rộng. Một trong những tiện ích mở rộng phổ biến nhất là Litestream, có thể khôi phục các thay đổi của luồng vào bộ chứa tương thích với S3. Điều này có nghĩa là bạn có được bản sao cơ sở dữ liệu sản xuất của mình với mức giá rất rẻ và có thể phục hồi sau sự cố bất cứ lúc nào.

Ngẫu nhiên, điều này đã khiến việc sử dụng SQLite làm cơ sở dữ liệu sản xuất cho ứng dụng Rails của bạn trở thành một lựa chọn khả thi. Kết hợp với hệ thống phát triển hoàn chỉnh như LiteStack, nó hứa hẹn sẽ biến các ứng dụng được lưu trữ trên một máy trở thành hiện thực. Chúng tôi ở đây để kiểm tra giả thuyết này và chỉ ra mọi trở ngại trên đường đi.

Để làm được điều này, chúng ta cần một ứng dụng mẫu đủ phức tạp để giải quyết những khó khăn tiềm ẩn nhưng cũng đủ đơn giản để phù hợp với loạt bài này.

Ứng dụng Rails mẫu của chúng tôi

Chúng tôi sẽ viết một ứng dụng có thể biến đổi các bức vẽ của trẻ em bằng StableDiffusion trên replica.com.

Ví dụ:đây là một chú gấu bông dễ thương do con gái tôi vẽ, với một số cách diễn giải StableDiffusion:

LiteStack cho Ruby on Rails:Giải pháp quản lý dữ liệu một cửa

Là một bản phác thảo thô, ứng dụng của chúng tôi sẽ bao gồm các bước sau:

  1. Người dùng tải lên hình ảnh có lời nhắc bằng văn bản (chúng tôi sẽ hiển thị một số kỹ thuật SQLite nâng cao tại đây).
  2. Người dùng chọn kiểu hình ảnh (ví dụ:"hoạt hình", "tranh sơn dầu", "ảnh thực", "kết xuất 3D").
  3. Quá trình xử lý diễn ra ở chế độ nền (điều này bắt đầu LiteJob -công việc được hỗ trợ).
  4. Trong khi quá trình xử lý đang diễn ra, chúng tôi hiển thị hình ảnh giữ chỗ và cập nhật nhật ký được máy chủ gửi qua. Sau khi hoàn thành, chúng tôi cập nhật nó để hiển thị hình ảnh thực tế. Điều này cho phép chúng tôi khám phá LiteCable khi chúng tôi thay thế hình ảnh thông qua Turbo Streams.
  5. Chúng tôi lưu trữ dự đoán hình ảnh.
  6. Chúng tôi sử dụng LiteCache để bao bọc các chế độ xem tốn kém về mặt tính toán.

Các bước này cung cấp nền tảng cho loạt bài này. Tuy nhiên, phần còn lại của bài đăng này sẽ đề cập đến việc thiết lập ứng dụng.

Chúng tôi bắt đầu bằng cách tạo một ứng dụng Rails mới có tên skAItch , sử dụng esbuild làm bộ đóng gói JavaScript và SASS làm bộ tiền xử lý CSS:

 

Cài đặt LiteStack

Tiếp theo, chúng tôi cài đặt LiteStack bằng trình tạo được vận chuyển:

 

Sau khi hoàn tất, chúng tôi hoàn tất thiết lập và khởi động máy chủ phát triển:

 

Xác thực và người thuê

Sau đó, chúng tôi cần một cách để xác thực người dùng của mình để liên kết lời nhắc với họ. Thay vì sử dụng một người đương nhiệm như Devise, tôi chọn cách tiếp cận khác. Đá quý xác thực-zero có thể tạo ra một hệ thống xác thực một cách linh hoạt, thay vì đưa nó vào làm công cụ. Thuận tiện, nó đi kèm với các tùy chọn như:

  • xác thực bằng mã thông báo (đối với API)
  • xác thực hai yếu tố
  • đa sở hữu
  • giới hạn tỷ lệ
  • giao diện OmniAuth
  • xác thực không cần mật khẩu

Tôi đã chọn thêm --tenantable tùy chọn này vì bạn nên tự động xác định phạm vi các bản ghi cơ sở dữ liệu của mình cho các tài khoản. Authentication-zero cung cấp điều này với AccountScoped mối quan tâm của người mẫu.

 

Hãy thêm người dùng đầu tiên thông qua hạt giống cơ sở dữ liệu:

 

Giàn giáo nhanh chóng

Bây giờ là lúc bắt đầu viết logic ứng dụng thực tế của chúng ta. Chúng tôi bắt đầu bằng việc xác định mô hình trung tâm của ứng dụng:Prompt .

Chúng tôi muốn lời nhắc của mình có tiêu đề, mô tả và tham chiếu đến tài khoản đã tạo ra nó. Hơn nữa, để kiểm tra khả năng "hệ thống tệp" của SQLite, chúng tôi muốn nó lưu trữ hình ảnh nhắc nhở ở dạng nhị phân:

 

Một prompts mục tài nguyên cũng được thêm vào config/routes.rb . Lưu ý rằng xác thực bằng 0 sẽ thêm before_action xác thực người dùng thành ApplicationController theo mặc định.

 

Hơn nữa, chúng tôi bao gồm AccountScoped mối quan tâm trong mô hình Lời nhắc của chúng tôi, cho phép chúng tôi xác định phạm vi các bản ghi được lưu trữ theo tài khoản đã đăng nhập. Chúng tôi cũng xác nhận rằng có tiêu đề và hình ảnh nhắc nhở.

 

Bước cuối cùng để kích hoạt chế độ nhiều bên thuê, chúng ta phải kết nối lời nhắc với một tài khoản khi tài khoản đó được tạo. Chúng tôi thực hiện việc này trong PromptsController :

 

Kết nối ứng dụng Rails của chúng tôi với Replicate.com

Replicate.com là nền tảng hàng đầu để chạy các dự đoán AI trên card đồ họa hiệu suất cao. Nó có API để tạo dự đoán, đào tạo và lưu trữ mô hình, v.v. Để sử dụng nó, bạn phải lấy mã thông báo API từ https://replicate.com/account/api-tokens.

Lưu ý: Việc chạy dự đoán trên Sao chép sẽ phải trả phí.

Thật may mắn cho chúng tôi, có những ứng dụng khách chính thức và không chính thức có giao diện với API. Một trình bao bọc như vậy là gem replica-rails mà chúng ta sẽ cài đặt ngay bây giờ:

 
 

Để lưu trữ khóa API một cách an toàn, chúng tôi sẽ sử dụng thông tin xác thực Rails:

 
 

Việc chỉnh sửa và lưu tệp này sẽ mã hóa thông tin đăng nhập của bạn và nó chỉ có thể được mở bằng cách cung cấp RAILS_MASTER_KEY chính xác .

Bây giờ chúng ta phải đưa nó vào sử dụng. Như được đề xuất trong README của bản sao-rails, chúng tôi xác thực dựa trên Bản sao trong trình khởi tạo. Chúng tôi cũng định nghĩa một trình xử lý webhook (trong trường hợp của chúng tôi) chỉ là một lớp được đặt trong cùng một tệp. Lưu ý rằng tôi đã thêm binding.irb điểm dừng ở đây để kiểm tra chức năng đầu tiên của chúng tôi.

 

Replicate-rails cũng cung cấp một bộ điều khiển webhook mặc định, gọi trình xử lý trên. Chúng ta chỉ cần gắn nó vào config/routes.rb của mình :

 

Để kiểm tra webhook cục bộ, bạn phải thiết lập một đường hầm, chẳng hạn như bằng Ngrok. Các bước để thiết lập nó nằm ngoài phạm vi của bài viết này nhưng nó khá đơn giản. Vui lòng tham khảo tài liệu của Ngrok.

Tuy nhiên, bạn phải nói với Rails rằng nó có thể nghe URL đường hầm của bạn. Để kích hoạt tính năng này, hãy thêm nó vào allowed_hostsconfig/application.rb :

 

Chạy dự đoán

Bây giờ chúng ta sẽ thử nghiệm việc tạo dự đoán. Điều còn thiếu duy nhất là nối nó vào PromptsController của chúng tôi . Quy trình làm việc chung như sau:

  1. Chúng tôi truy xuất một mô hình (trong trường hợp của chúng tôi là stable-diffusion-img2img model) từ Sao chép.
  2. Chúng tôi lấy một phiên bản cụ thể (trong trường hợp của chúng tôi là phiên bản mới nhất) để chạy dự đoán.
  3. Chúng tôi chạy dự đoán, chỉ định:
    • Lời nhắc văn bản mô tả hình ảnh (trong trường hợp của chúng tôi là tiêu đề của lời nhắc).
    • Lời nhắc hình ảnh mà chúng tôi phải cung cấp dưới dạng URL dữ liệu được mã hóa Base64.
    • Một webhook để ping khi dự đoán hoàn tất (chúng tôi trỏ nó vào tuyến webhook được cung cấp bởi replica-rails).
 

Nếu bạn truy cập https://YOUR_NGROK_URL/prompts/new và tải lên hình ảnh cùng với tiêu đề, bây giờ bạn sẽ kích hoạt dự đoán. Khi hoàn tất, nó sẽ gọi lại thông qua webhook được cung cấp. Bởi vì chúng tôi đặt binding.irb điểm dừng ở đó, hành động của bộ điều khiển dừng trong REPL và chúng ta có thể xem xét xung quanh:

 

Như chúng ta có thể thấy, lần chạy đầu tiên của chúng tôi về thế hệ hình ảnh trên hình ảnh đã thành công. Mô hình dự đoán trả về một URL cho hình ảnh đã tạo mà chúng tôi sẽ muốn lưu trữ cục bộ (chúng sẽ bị xóa tại Sao chép định kỳ). Chúng tôi sẽ xem xét kỹ hơn vấn đề này vào lần tới.

Tiếp theo:Tìm hiểu sâu về LiteDB

Trong bài mở đầu này, chúng tôi đã giới thiệu môi trường LiteStack như một giải pháp thay thế thú vị để lưu trữ tất cả các thành phần ứng dụng Rails của bạn trên một máy. Ngoài ra, chúng tôi còn thiết lập một ứng dụng mẫu có thể giao tiếp với Replicate.com để tạo hình ảnh bằng AI.

Trong phần tiếp theo của loạt bài này, chúng ta sẽ khám phá thành phần đầu tiên và trung tâm của LiteStack — LiteDB - sâu sắc hơn. Chúng ta sẽ xem xét một số đặc điểm khiến nó trở nên mạnh mẽ độc đáo, những cạm bẫy, hạn chế và sự đánh đổi phổ biến.

Cho đến lúc đó, chúc bạn viết mã vui vẻ!

Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!