6 điểm bởi GN⁺ 2024-01-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • PocketBase gộp cơ sở dữ liệu thời gian thực, xác thực, lưu trữ tệp và bảng điều khiển quản trị vào một tệp duy nhất, giúp nhanh chóng dựng một backend nhỏ
  • Cơ sở dữ liệu tích hợp cung cấp trình xây dựng schema, kiểm tra dữ liệu, đăng ký thời gian thực và REST API, giảm gánh nặng phải tự dựng backend riêng
  • Quản lý người dùng hỗ trợ đăng ký bằng email/mật khẩu và đăng ký OAuth2, có thể dùng Google, Facebook, GitHub, GitLab
  • Tệp có thể được lưu trên máy cục bộ hoặc bộ nhớ S3, đồng thời có thể gắn media vào bản ghi cơ sở dữ liệu hoặc tạo thumbnail ngay lập tức
  • Có thể bắt đầu như một ứng dụng độc lập rồi mở rộng bằng hook Go và JavaScript, giúp dễ dàng tạo backend tùy biến, di động

Các tính năng backend trong một tệp duy nhất

  • PocketBase là backend mã nguồn mở cung cấp cơ sở dữ liệu thời gian thực, xác thực, lưu trữ tệp và bảng điều khiển quản trị trong một tệp duy nhất
  • Cơ sở dữ liệu tích hợp

    • Cơ sở dữ liệu tích hợp nhấn mạnh hiệu năng và bao gồm trình xây dựng schema
    • Cung cấp kiểm tra dữ liệu, đăng ký thời gian thực và REST API dễ sử dụng

Xác thực và đăng ký người dùng

  • Có thể quản lý người dùng ứng dụng và xử lý đăng ký dựa trên email/mật khẩu
  • Cũng hỗ trợ đăng ký OAuth2, bao gồm Google, Facebook, GitHub, GitLab

Lưu trữ tệp và xử lý media

  • Tệp có thể được lưu trên máy cục bộ hoặc bộ nhớ S3
  • Có thể đính kèm media vào bản ghi cơ sở dữ liệu và tạo thumbnail ngay lập tức

Cách sử dụng và mở rộng

  • PocketBase có thể được sử dụng như một ứng dụng độc lập
  • Nếu dùng như một framework thì có thể mở rộng bằng hook Go và JavaScript
  • Theo cách này có thể tạo backend tùy biến, di động

Ví dụ JavaScript SDK

  • JavaScript SDK import PocketBase và tạo client với địa chỉ như http://127.0.0.1:8090
  • Có thể truy vấn và tìm kiếm danh sách bản ghi collection bằng pb.collection('example').getList()
    • Ví dụ sử dụng bộ lọc title != "" && created > "2022-08-01" và sắp xếp -created,title
  • Dùng getOne('RECORD_ID'), delete('RECORD_ID'), create() để truy vấn, xóa và tạo một bản ghi đơn lẻ
  • Dùng subscribe('*', ...) để đăng ký thay đổi bản ghi collection, và unsubscribe() để dừng đăng ký

1 bình luận

 
GN⁺ 2024-01-08
Ý kiến trên Hacker News
  • Mình đã dùng PocketBase làm backend/cơ sở dữ liệu cho ứng dụng và thấy rất tuyệt; frontend đang dùng React và Vite
    Chủ yếu dùng cho xác thực và theo dõi tài khoản trả phí/miễn phí. Việc hosting cực kỳ dễ, ít gánh nặng hơn so với tự host Appwrite hay Supabase. Đặc biệt Supabase khá khó nhằn, còn Appwrite thì có thể dựng nhanh bằng CapRover nhưng lại quá mức so với nhu cầu
    Với view collection, rất dễ chỉ trả về một phần dữ liệu cần thiết; mình đang dùng kiểu join collection người dùng với người dùng trả phí để chỉ trả về thời hạn trả phí: https://pocketbase.io/docs/collections/#view-collection
    Có thể mở rộng bằng Go hoặc JS, nên nếu yêu cầu không phức tạp thì có vẻ có thể bỏ hẳn backend: https://pocketbase.io/docs/use-as-framework/

    • Điểm hosting cực kỳ dễ cần được nhấn mạnh hơn nữa. Chỉ cần đưa một binary duy nhất lên server là có thể bắt đầu ngay; ước gì nhiều công cụ khác cũng đơn giản như vậy
  • Mình đang phát triển với PocketBase được 2 tháng và dự kiến sẽ đưa vào production trong 1–2 tháng tới
    Khi làm một web app cho công ty của bạn, mình muốn một hệ thống đơn giản, dễ bàn giao, và toàn bộ chạy bằng một PocketBase binary duy nhất. Web server, JavaScript phía server (TypeScript đã biên dịch) và cơ sở dữ liệu SQLite đều nằm trong một process, đang host trên Vultr với 12 USD/tháng. Frontend được viết bằng SvelteKit static adapter + Svelte + TypeScript
    PocketBase được làm rất tốt, tác giả trả lời câu hỏi rất nhanh và rõ ràng. Tuy vậy tài liệu vẫn còn vài khoảng trống, mình phải tự viết CSV loader, và nếu ghi nhiều object qua giao diện CRUD thì sẽ chậm. Có thể ghi nhanh hơn bằng code phía server. Unit test cho JavaScript phía server cũng phải nhét vào hơi gượng ép, và mình cũng tiếc là Copilot/ChatGPT chưa trả lời các câu hỏi tốt hơn
    Cũng có vài điểm lạ như không có cách cấu hình trang 404 của web server, và vị trí filesystem của binary lại quan trọng. Vì đây là những phần được thiết kế theo nhu cầu của chính tác giả, nên phải chấp nhận các lựa chọn đó
    Dù vậy, nó khớp chính xác với yêu cầu. Đơn giản và có thể viết toàn bộ code bằng một ngôn ngữ là TypeScript. Hiệu năng không cao, nhưng mình không cần; khi xong việc này, mình cũng định làm một side project bằng PocketBase. Nó dễ đến mức đó. Trong hợp đồng, công ty của bạn mình cũng đã đồng ý quyên góp cho PocketBase

  • Mình đã dùng PocketBase trong môi trường production vài tháng, frontend dùng alpinejs
    Triết lý phát triển của nó đúng chính xác với nhu cầu. Đây là phần mềm thú vị, thực dụng, làm tốt mục đích thực tế, và được cải thiện hằng tuần mà không bị phình tính năng
    Tuy nhiên, khi nó ngày càng phổ biến, các cuộc thảo luận và issue có vẻ ngày càng mệt mỏi hơn, nên mình lo tác giả có thể burnout khi tiếp tục gánh mức hỗ trợ như từ trước đến nay
    Nếu bạn đang kiếm tiền nhờ nó, mình rất khuyến nghị hãy tài trợ dự án trên Open Collective

    • Mình tò mò trong stack bạn còn dùng công nghệ nào khác
  • Mình đã theo dõi PocketBase từ những ngày đầu, và điểm hay nhất của dự án này là nó chủ động tránh sự phức tạp và tập trung vào cách tiếp cận đơn giản, tối giản
    Sự dễ dàng khi deploy chỉ bằng cách đưa một binary duy nhất lên server cũng rất hấp dẫn. Từ khi backend có hỗ trợ JavaScript, mình cảm thấy nó đã trở thành một ứng viên nghiêm túc, đủ để thử thay cho các framework như Remix, Next.js. Rất mong chờ v1

    • Giờ mình dùng PocketBase gần như ở mọi nơi cần backend. Có lần mình phải tự viết SQL join, và quá trình đưa tham số URL vào rồi viết query chỉ chọn theo người dùng đã xác thực dễ đến ngạc nhiên
      Thực ra có thể lấy hết dữ liệu rồi xử lý trong Node, nhưng giải quyết ngay trong PocketBase đã đủ đơn giản. Khó mà gọi nó là thay thế Next hay Remix, nhưng mình rất khuyến nghị thêm nó vào stack để đơn giản hóa
  • Mình đang tìm một frontend có thể dùng trực tiếp trên cơ sở dữ liệu SQLite. Mình đã xóa Vivino vì có hơn 800 đối tác đang chia sẻ dữ liệu của mình
    Vì mục đích là thiết kế và lưu trữ bộ sưu tập rượu vang, tổ hợp một file thực thi duy nhất, giao diện admin và cơ sở dữ liệu có thể để trên laptop và đưa vào backup trông đúng như thứ mình muốn. Đó là lý do mình luôn quay lại HN

  • Thật vui khi thấy ngày càng có nhiều dự án mã nguồn mở tốt trong mảng này. Grist và NocoDB cũng đáng được nhắc đến; hai dự án này tập trung hơn vào quản lý cơ sở dữ liệu
    Cũng ấn tượng ở chỗ cách bắt đầu được cung cấp rất đơn giản, dưới dạng một file duy nhất hoặc Electron
    https://github.com/gristlabs
    https://nocodb.com/

    • Mình chưa biết cả hai. Với các dự án nhỏ mình vẫn dùng Baserow, nhưng trong những trường hợp đó PocketBase có vẻ phù hợp hơn nhiều
  • Mình lướt qua tài liệu nhưng vẫn chưa rõ nó xử lý một số việc như thế nào
    Ví dụ như kiểm soát truy cập cấp hàng để người dùng chỉ truy cập dữ liệu của chính họ, tích hợp bên ngoài như gửi email hay trigger, xuất/nhập CSV, và quốc tế hóa. Mình muốn biết tất cả những thứ này có khả thi và trực quan không, hay đều cần mở rộng bằng Go hoặc JS. Bản thân công cụ thì trông có vẻ tốt

    • Mình đang phát triển với PocketBase được 2 tháng
      Như người khác đã nói, có thể kiểm soát truy cập theo hàng bằng API rules. Gửi email, đặt timer, gửi request tới web server khác cũng làm được. Mình chưa tự dùng, nhưng có tài liệu: https://pocketbase.io/docs/js-sending-emails/
      Nhập CSV thì mình phải tự viết, và đang nghĩ đến việc công bố mã nguồn mở. Quốc tế hóa tùy vào chức năng bạn muốn, nhưng nhìn chung có vẻ gần với phần frontend hơn
    • Hãy xem API rules và hook
      API Rules: https://pocketbase.io/docs/api-rules-and-filters/#api-rules
      Hooks: https://pocketbase.io/docs/js-overview/
      Panel admin có sao lưu dữ liệu và nhập/xuất schema collection
    • Mục đầu tiên, xác thực/kiểm soát truy cập, được xử lý bằng filter rules ngay trong framework mặc định không cần mở rộng
      Các phần còn lại, trừ email xác thực, nhìn chung cần mở rộng; nhưng dạng mở rộng đơn giản nhất chỉ là thêm các hàm JavaScript thông thường vào sự kiện vòng đời record. Thường chạy trước/sau khi insert/update/delete. Nhiều Go API cho tác vụ filesystem, mã hóa, HTTP và email được expose vào runtime JavaScript
      Quốc tế hóa có thể xử lý bằng template và cơ sở dữ liệu
  • Trong tất cả các PaaS mình từng dùng, bao gồm Supabase và Appwrite, PocketBase là tốt nhất. Hiệu năng tốt, tính năng trực quan, thực sự có thể tự host và deploy rất dễ chịu

  • Mình đã dùng PocketBase trong môi trường production cho app di động vài tháng và đến giờ rất thoải mái
    Khi dùng cùng JS SDK, giờ mình chọn nó làm backend framework mặc định cho mọi trường hợp không cần thư viện đặc thù như machine learning

  • PocketBase tuyệt quá nên mình đã làm thử một starter Nuxt 3 nhỏ: https://github.com/fayazara/pocketbase-nuxt
    Ví dụ có xác thực, route rules, thao tác CRUD, realtime events và store. Cần refactor lại, nhưng làm rất vui, và mình muốn thêm đăng ký Stripe vào đây để thử đẩy route rules đến giới hạn. Chưa biết cách làm, nhưng sẽ tìm hiểu