سوپابیس
Supabase
جایگزین open-source Firebase - دیتابیس PostgreSQL، Auth، Storage و Real-time
نمای کلی
نود Supabase چیست؟
نود Supabase امکان اتصال و مدیریت کامل backend اپلیکیشنها را از طریق n8n فراهم میکند. Supabase یک پلتفرم open-source است که اغلب به عنوان "جایگزین Firebase" شناخته میشود.
اجزای Supabase:
- PostgreSQL Database: دیتابیس PostgreSQL واقعی با Row Level Security (RLS)
- Auth: سیستم احراز هویت (Email, OAuth, Magic Link, Phone)
- Storage: ذخیره و مدیریت فایلها با access control
- Realtime: دریافت تغییرات real-time از دیتابیس
- Edge Functions: اجرای کد serverless (Deno)
- Auto API: API خودکار REST و GraphQL از روی schema
قابلیتهای کلیدی در n8n:
- Row Operations: ایجاد، خواندن، ویرایش و حذف ردیفها
- Filtering: فیلتر پیشرفته با عملگرهای PostgreSQL
- RPC Functions: فراخوانی stored functions
- Upsert: ایجاد یا ویرایش خودکار
- Bulk Operations: عملیات انبوه
- Storage: آپلود و مدیریت فایلها
- Realtime Trigger: دریافت eventهای تغییر داده
مقایسه Supabase vs Firebase:
| ویژگی | Supabase | Firebase | |--------|----------|----------| | دیتابیس | PostgreSQL (SQL) | Firestore (NoSQL) | | Open Source | بله | خیر | | Self-hosted | بله | خیر | | دسترسی ایران | بله (self-hosted) | نیاز به VPN | | SQL Support | کامل | محدود | | Pricing | سخاوتمند (رایگان تا ۵۰۰MB) | محدودتر |
محدودیتهای API:
- Free Tier: ۵۰۰MB دیتابیس، ۱GB storage، ۵۰,۰۰۰ monthly active users
- Rate Limit: بستگی به plan دارد
- Self-hosted: بدون محدودیت
احراز هویت
احراز هویت Supabase
دریافت API Keys
- 1به Supabase Dashboard بروید (app.supabase.com)
- 2پروژه خود را انتخاب کنید
- 3به Settings > API بروید
- 4دو کلید مهم:
Project URL:
https://your-project-id.supabase.coAPI Keys:
- anon key (public): برای عملیاتهایی که RLS اعمال میشود
- service_role key (secret): دسترسی کامل، RLS را bypass میکند
⚠️ هشدار امنیتی: هرگز service_role key را در client-side استفاده نکنید.
تنظیم در n8n:
- 1به Credentials بروید
- 2Supabase API را انتخاب کنید
- 3وارد کنید:
- **Host**: URL پروژه (مثلاً
https://abc123.supabase.co) - API Key: service_role key (برای دسترسی کامل در n8n)
روشهای احراز هویت Supabase:
- Email/Password: ثبتنام و ورود با ایمیل
- Magic Link: ورود بدون رمز با لینک ایمیلی
- OAuth: Google, GitHub, Discord, etc.
- Phone/OTP: ورود با شماره موبایل
- Custom JWT: توکن سفارشی
Self-Hosted Supabase:
# Clone Supabase
git clone --depth 1 https://github.com/supabase/supabase
cd supabase/docker
# تنظیم env
cp .env.example .env
# ویرایش .env و تغییر JWT_SECRET, POSTGRES_PASSWORD, etc.
# اجرا
docker compose up -dRow Level Security (RLS):
Supabase از RLS برای امنیت استفاده میکند:
-- فعالسازی RLS
ALTER TABLE my_table ENABLE ROW LEVEL SECURITY;
-- Policy: هر کاربر فقط داده خودش را ببیند
CREATE POLICY "Users see own data" ON my_table
FOR SELECT USING (auth.uid() = user_id);⚠️ در n8n با service_role key، RLS bypass میشود.
عملیاتهای موجود
row-create
ایجاد ردیف جدید در جدول
row-get
دریافت یک ردیف با فیلتر
row-list
دریافت لیست ردیفها با فیلتر و مرتبسازی
row-update
ویرایش ردیفهای موجود
row-delete
حذف ردیفها با فیلتر
row-upsert
ایجاد یا ویرایش ردیف (بر اساس unique constraint)
rpc
اجرای PostgreSQL function از طریق RPC
storage-upload
آپلود فایل به Supabase Storage
storage-download
دانلود فایل از Supabase Storage
storage-list
دریافت لیست فایلهای یک bucket/folder
storage-delete
حذف فایل از Storage
storage-url
دریافت URL عمومی یا signed URL
کاربردهای متداول
کاربردهای رایج
۱. Backend برای فرمهای وب
فرمهای وبسایت را مستقیم به Supabase متصل کنید و پردازش خودکار انجام دهید.
Webhook (فرم) → Supabase (ایجاد ردیف) → Email (تأیید) → Telegram (اطلاع تیم)۲. User Management Automation
خودکارسازی فرآیندهای مربوط به کاربران: خوشآمدگویی، onboarding، و reminder.
Supabase Trigger (کاربر جدید) → Email (خوشآمدگویی) → Wait (3 روز) → Email (آموزش) → Supabase (update onboarded)۳. E-commerce Backend
مدیریت محصولات، سفارشها و موجودی با Supabase به عنوان backend.
Webhook (سفارش جدید) → Supabase (ایجاد order) → Supabase (کاهش stock) → Payment → Supabase (update status) → Email۴. Content Management
مدیریت محتوای سایت (blog, products, FAQ) و انتشار خودکار.
Supabase (مقاله status=published) → Code (generate HTML) → Webflow (انتشار) → Twitter (share)۵. File Processing Pipeline
فایلهای آپلود شده را خودکار پردازش کنید.
Supabase Storage (فایل جدید) → IF (تصویر?) → Code (resize) → Supabase Storage (ذخیره thumbnail) → Supabase (update record)۶. Analytics Dashboard
جمعآوری و تجمیع دادهها برای داشبورد تحلیلی.
Schedule (هر ساعت) → Supabase RPC (aggregate function) → Google Sheets (update dashboard)۷. Notification System
سیستم اعلان بر اساس تغییرات دیتابیس.
Supabase Trigger (سفارش status تغییر کرد) → Switch (status) →
pending: Email (تأیید)
shipped: SMS (اطلاعرسانی)
delivered: Email (نظرسنجی)۸. Data Migration
انتقال داده از سرویسهای دیگر به Supabase.
Airtable/Google Sheets → Code (transform) → Supabase (bulk upsert) → Log۹. Scheduled Reports
گزارشهای دورهای از دادههای Supabase.
Schedule (هفتگی) → Supabase RPC (sales_report) → Code (format) → Email (ارسال PDF)۱۰. API Gateway
Supabase را به عنوان backend برای API عمومی استفاده کنید.
Webhook (GET /api/products) → Supabase (لیست محصولات) → Response (JSON)نکات حرفهای
نکات حرفهای
۱. از service_role Key استفاده کنید
در n8n همیشه از service_role key استفاده کنید. این key دسترسی کامل دارد و RLS را bypass میکند.
۲. Select فقط ستونهای مورد نیاز
بجای *، فقط ستونهای لازم را select کنید. سرعت بالاتر و traffic کمتر.
۳. Upsert بجای Check + Insert
بجای بررسی وجود و سپس insert، مستقیماً از upsert استفاده کنید:
Supabase Upsert → onConflict: email → دادهها۴. RPC Functions برای Logic پیچیده
کوئریهای پیچیده و aggregation را در PostgreSQL function بنویسید و از RPC فراخوانی کنید. بسیار سریعتر از چندین API call.
۵. Realtime Triggers
از Supabase Database Webhooks (pg_notify) بجای polling استفاده کنید.
۶. Storage Policies
برای Storage هم مثل tables، RLS policies بسازید تا دسترسی فایلها کنترل شود.
۷. Foreign Key Joins
Supabase از auto-join پشتیبانی میکند:
select: *, author:users(name, avatar)بدون نیاز به JOIN دستی.
۸. Full-Text Search
از PostgreSQL full-text search استفاده کنید:
CREATE INDEX idx_fts ON posts USING gin(to_tsvector('simple', title || ' ' || body));۹. Edge Functions
برای logic سمت سرور از Edge Functions (Deno) استفاده کنید. از n8n میتوانید آنها را invoke کنید.
۱۰. Batch Operations
چندین insert/update/delete را در یک request ارسال کنید. از HTTP Request node با Supabase REST API.
۱۱. Database Migrations
از Supabase CLI برای مدیریت migrations استفاده کنید. schema تغییرات را version control کنید.
۱۲. Self-hosted برای ایران
Supabase self-hosted روی سرور ایران: بدون VPN، سرعت بالا، و بدون محدودیت pricing.
۱۳. Signed URLs برای فایلهای خصوصی
از signed URLs با TTL برای دسترسی موقت به فایلهای خصوصی استفاده کنید.
۱۴. Row Count بهینه
بجای دریافت همه ردیفها و شمارش، از header Prefer: count=exact استفاده کنید.
۱۵. Error Handling
برای workflowهای حساس، از Error Trigger و retry logic استفاده کنید. Supabase ممکن است temporarily unavailable باشد.
رفع مشکلات
رفع مشکلات رایج
❌ خطای 401 Unauthorized
علت: API Key نامعتبر
راهحل
- مطمئن شوید از service_role key (نه anon key) استفاده میکنید
- Key را از Settings > API کپی کنید
- URL پروژه صحیح باشد
❌ خطای "relation does not exist"
علت: جدول وجود ندارد
راهحل
- نام جدول را exact بررسی کنید (case-sensitive)
- مطمئن شوید جدول در public schema است
- اگر در schema دیگری است:
schema_name.table_name
❌ خطای RLS (Row Level Security)
علت: policy اجازه دسترسی نمیدهد
راهحل
- در n8n از service_role key استفاده کنید (RLS bypass)
- یا policy مناسب بسازید
- برای debug، موقتاً RLS را غیرفعال کنید:
ALTER TABLE t DISABLE ROW LEVEL SECURITY
❌ خطای "duplicate key value violates unique constraint"
علت: مقدار تکراری برای ستون unique
راهحل
- از upsert بجای insert استفاده کنید
onConflictcolumn را مشخص کنید- مقدار unique بودن را قبل از insert بررسی کنید
❌ خطای "null value in column violates not-null constraint"
علت: ستون NOT NULL مقدار ندارد
راهحل
- همه ستونهای NOT NULL را مقدار بدهید
- یا default value در schema تنظیم کنید
❌ فایلها آپلود نمیشوند
علت: تنظیمات Storage نادرست
راهحل
- مطمئن شوید bucket وجود دارد و public/private تنظیم شده
- سایز فایل از limit تجاوز نکند
- MIME type مجاز باشد
- RLS policies برای storage بررسی شود
❌ RPC Function اجرا نمیشود
علت: Function وجود ندارد یا پارامترها نادرست
راهحل
- نام function exact باشد
- پارامترها مطابق definition ارسال شود
- Function در public schema باشد (یا schema مشخص شود)
❌ Performance ضعیف
علت: کوئریهای بهینه نشده
راهحل
- Index بسازید برای ستونهای پرکاربرد
- از
selectبرای انتخاب ستونهای خاص استفاده کنید - از
limitاستفاده کنید - از RPC functions برای کوئریهای پیچیده استفاده کنید
