Bu makale PostgREST'in gerçekte neleri kapsadığını, size neleri bıraktığını ayrıntılarıyla anlatıyor ve Aurabase'in dahili olarak kapsadığı, varsayılmak yerine kodunda doğrulanan ciddi alternatifleri karşılaştırıyor.
Temeller
- PostgREST, Postgres şemasından bir REST API oluşturur: filtreler, ilişki yerleştirme, RPC çağrıları, JWT odaklı RLS, OpenAPI spesifikasyonu — bir satır arka uç kodu olmadan.
- Yerel olarak yapmadığı şey: JWT'ler yayınlamak, dosyaları depolamak, gerçek zamanlı gönderim yapmak veya entegre rol değiştirme özelliğine sahip bir bağlantı havuzlayıcı sağlamak.
- Aurabase'de bir Postgres motoru projesi, yeniden uygulama değil, gerçek bir adanmış PostgREST v12.2.8 örneği üzerinde çalışır. Bir MongoDB motoru projesi, aynı geleneklerden ilham alan ancak farklı sınırlara sahip, Aurabase'e özel bir REST katmanından geçer.
- Alternatifler, Hasura veya PostGraphile gibi GraphQL API'leri aracılığıyla, kendi kendine barındırılan PostgREST'ten (etrafına monte edilecek her şey) eksiksiz bir arka uca (Supabase, Aurabase) kadar uzanır.
PostgREST tam olarak nedir?
PostgREST, mevcut bir PostgreSQL veritabanını doğrudan şemasından bir REST API'ye dönüştüren özerk bir web sunucusudur. Yazılacak uygulama katmanı yok: tablolar, görünümler ve işlevler rota haline gelir ve SQL izinleri (roller, RLS politikaları) yetkilendirme katmanı haline gelir.
Somut olarak PostgREST neredeyse tüm değerlendirmelerde ortaya çıkan beş yeteneği kapsar:
- Yatay filtreleme — yaklaşık otuz operatör (
eq,gt,like,ilike,in,is,cs,ov,fts...) doğrudan sorgu dizesinde. - Dikey filtreleme ve yerleştirme —
?select=yabancı anahtar yoluyla sütunları yansıtır ve ilişkileri katıştırır, örneğincustomer:customers(email). - RPC — bir
POST /rpc/{fonction}doğrudan uç nokta haline gelen bir SQL işlevini çağırır. - JWT tarafından yönlendirilen RLS — PostgREST, etkin Postgres rolünü alınan belirtece (
SET LOCAL ROLE) göre değiştirir, böylece ilkeleriniz uygulama tarafında yinelenen yetkilendirme mantığı olmadan olduğu gibi uygulanır. - Kendi kendine oluşturulan OpenAPI — spesifikasyon, elle bakımı yapılacak bir dosya olmadan, açığa çıkan şemadan çıkarılır.
Tek bir HTTP isteği, ödenen siparişleri filtreler, müşterinin e-postasını yabancı anahtar aracılığıyla yerleştirir ve tek bir rotanın elle yazılmasına gerek kalmadan tarihe göre sıralar.
RPC de aynı mantığı izler: Zaten veritabanınızda yazılmış bir SQL işlevi, bağımsız değişkenleri JSON'da iletilen bir POST uç noktası haline gelir.
Bu prensip (Postgres şeması, API'nin tek gerçek kaynağıdır) PostgREST'i öngörülebilir kılan şeydir: her davranış değişikliği bir SQL geçişinden geçer, asla gerçek şemadan türetilebilecek ayrı bir uygulama katmanından geçmez. Proje açık kaynak olup, herhangi bir BaaS sağlayıcısından bağımsız olarak GitHubüzerinde geliştirilmiştir.
PostgREST ne yapmaz
PostgREST CRUD katmanını çözer. Bir uygulamanın arka ucunun geri kalanını çözmez. Bunu tek başına benimseyen ekipler arasında sistematik olarak dört eksiklik ortaya çıkıyor.
- Kimlik Doğrulaması — JWT düzenlemesi veya entegre kullanıcı yönetimi yok. Bunu SQL'de oluşturmanız veya harici bir hizmete devretmeniz gerekir.
- Dosya depolama — yok. Ayrı olarak bağlanmak için bir S3 kovası veya eşdeğeri kalır.
- Gerçek zamanlı — PostgREST tek seferlik HTTP isteklerine yanıt verir, herhangi bir olayı iletmez.
- Bağlantı Havuzlayıcısı — PostgREST'in kendisi Postgres'e bağlanır, ancak herhangi bir gelişmiş havuz oluşturucuyu entegre etmez. Büyük ölçekte, bunu yönetmek başlı başına bir işletim kararı haline gelir: klasik işlem modundaki bir havuzlayıcı, PostgREST şema yeniden yükleme mekanizmasıyla çelişir (Aurabase'in bu uzlaşmayı nasıl çözdüğüne aşağıda bakın).
Bu eksikliklerin hiçbiri bir tasarım hatası değildir: PostgREST belirli bir işi (şema → REST API) gönüllü olarak yapar. Davranışını öngörülebilir kılan da bu dar çevredir.
Pratik bir sonucun açıkça belirtilmesi gerekir: Kimlik doğrulama olmadan RLS politikalarınız, anonim bir müşteri ile verileriniz arasındaki tek güvenlik sınırı haline gelir. anon rolüne ilişkin kötü yazılmış bir politika, ek bir uygulama katmanı tarafından üstlenilmez; yoktur.
Aurabase'de PostgREST: gerçekte ne anlatılıyor
Bir Aurabase Postgres motor projesinde (varsayılan motor) ağ geçidi, her CRUD isteğini doğrudan bu projeye ayrılmış bir PostgREST v12.2.8 örneğine, kiracının Postgres kümesiyle aynı konumda bulunan iki kopyaya yönlendirir. Bu yaklaşık bir uyumluluk değildir: aynı operatörlere, aynı yerleştirmeye, aynı RPC'ye, JWT tarafından sürülen aynı RLS'ye sahip PostgREST yukarı akış ikili dosyasının kendisidir.
MongoDB motoru projesinde hikaye farklıdır. MongoDB'nin PostgREST'e eşdeğeri yoktur: bu istekler aynı kuralların bir alt kümesini yeniden uygulayan dahili bir Aurabase hizmetine yönlendirilir (aynı operatör adları, gömmeli ?select= sözdizimi, Prefer ve Content-Range başlıkları) ancak ilişkisel bir motor değil bir belge motoru üzerinde. Bu katmanın kendi sınırlamaları vardır: bir mutasyon tarafından döndürülen gösterimde talep edilen bir yerleştirme sessizce göz ardı edilmek yerine açıkça reddedilir ve SQL işlevlerine eşdeğer bir RPC yolu yoktur.
Tam PostgREST uyumluluğu - RPC ve RLS dahil - motorlar arası bir garanti değil, Postgres motorunun bir gerçeğidir. Projeniz RPC'de kullanıma sunulan SQL işlevlerine bağlıysa Postgres motoru bugün itibariyle tek seçenektir.
Teknik bir ayrıntı, sezgiyle çelişiyor: her tahsis edilmiş PostgREST örneği, bu kiracı için dağıtılan PgBouncer havuzlayıcısından geçmeden doğrudan birincil Postgres'e bağlı kalır. Varsayılan neden: işlem havuzu modu, her işlem için bağlantıyı geri dönüştüren bir havuzla uyumlu olmayan kalıcı bir bağlantı olan LISTEN/NOTIFY'ye dayanan PostgREST şemasının yeniden yüklenmesini bozacaktır.
Üretimdeki bir başka yararlı ayrıntı: Etkin olmayan bir proje, kaynaklardan tasarruf etmek için duraklatılabilir. Uyuyan bir projedeki ilk istek, projenin uyanmasını tetikler ve yeniden deneme gecikmesiyle bir 503 alır; bu, özel PostgREST örneğinin geri gelme zamanıdır; bu, gizli bir olay değil, maliyet ile soğuk gecikme süresi arasında varsayılan bir uzlaşmadır.
PostgREST'e hangi alternatifler mevcut?
PostgREST'in net bir kullanımı var: Postgres şeması gerçeğin kaynağıdır ve ekip, CRUD katmanını elle yazmaktan kaçınmak istiyor. Bu özel durumun dışında, ne eklemek istediğinize bağlı olarak, hiçbir şeyden (kendi kendine barındırılan) tamamen kullanıma hazır bir arka uca kadar çeşitli alternatif ailesi mevcuttur.
Aşağıdaki tablo, her bir proje tarafından seçilen mimariye ilişkin değer yargısı olmaksızın, her seçeneğin doğal olarak neyi kapsadığını ve açıkça size neyi bıraktığını karşılaştırmaktadır.
| Kendi kendine barındırılan PostgREST | Kendi kendine oluşturulan REST API (filtreler, yerleştirme, RPC, RLS). | Kimlik doğrulama, depolama, gerçek zamanlı, yönetici kullanıcı arayüzü — her şeyin bir araya getirilmesi gerekiyor. |
|---|---|---|
| Supabaz | Entegre PostgREST + kimlik doğrulama (GoTrue), depolama, gerçek zamanlı, uç işlevler. | Heterojen yığın (Elixir/Go/TS/Node) hizmete göre birleştirilmiş hizmet. |
| Hasura / PostGraphile | Postgres'ten otomatik olarak oluşturulan GraphQL API'si. | REST değil GraphQL yaklaşımı - aşağıdaki karşılaştırmaya özel. |
| Direktör | Yönetici kullanıcı arayüzü + genel REST/GraphQL API, çoklu DBMS. | Tam bir uygulama arka ucu değil, veri yönetimi/CMS için tasarlanmıştır. |
| El yapımı çerçeve (Express, FastAPI, Rails…) | Her yolda tam kontrol. | CRUD, doğrulama, kimlik doğrulama, havuzlama — hepsi el yazısıyla yazılmıştır. |
| Aurabase | Postgres projesine özel gerçek PostgREST + kimlik doğrulama, depolama, gerçek zamanlı, uç işlevler ve yapay zeka zaten entegre edilmiştir. | MongoDB motorunda, PostgREST'in kendisi değil, Aurabase tarafından yeniden oluşturulan REST katmanı. |
"Kendi kendine barındırılan" seçeneğini seçerken sıklıkla göz ardı edilen bir nokta: PostgREST'in çalıştırılması hafif kalır, ancak üretim operasyonu (sürüm güncellemesi, yüksek kullanılabilirlik, bir havuz oluşturucuyla ilişkilendirme, izleme) tamamen sizin sorumluluğunuzda kalır - yönetilen platformların özümsediği şey yazılım değil, bu operasyon çalışmasıdır.
GraphQL yaklaşımları (pg_graphql, Hasura ve PostGraphile) arasında ayrıntılı bir karşılaştırma için Postgres'teki GraphQL API'sine adanmış makalemize bakın.
Nasıl seçilir
En sık dört durum ortaya çıkar. Doğru seçim esas olarak neyi bir araya getirmek ve kendiniz korumak istediğinize bağlıdır.
- Sadece mevcut bir Postgres şeması üzerinde bir REST API istiyorsunuz, başka bir şey değil. Kendi kendine barındırılan PostgREST yeterlidir: tam olarak ne yapıyorsa onu yapar ve başka hiçbir şeyin kurulmasına gerek yoktur.
- Ek yetkilendirmeye, depolamaya ve gerçek zamanlıya ihtiyacınız var ve çeşitli hizmetleri birleştirmeye hazırsınız. Supabase veya PostgREST, kendi uygulama yığınınızla birlikte bu ihtiyacı karşılar.
- GraphQL'i REST'e tercih edersiniz. Hasura veya PostGraphile bu zemini kapsıyor — farklı bir mimari seçim, PostgREST'in doğrudan yerine geçmiyor.
- Birden fazla ayrı hizmeti bir araya getirmeden eksiksiz bir Postgres arka ucu istiyorsunuz. Bu, birleştirilmiş Rust mimarimizin belgelediği açıdır: doğal olarak kimlik doğrulama, depolama, gerçek zamanlı ve uç işlevlerle çevrelenmiş CRUD katmanı için gerçek PostgREST.