Supabase
The Open Source Firebase Alternative
Categories
Features
- 백엔드를 쉽게 만들기
- Postgres 기반에 Elixir를 이용한 실시간 DB엔진
- 웹소켓으로 변경을 실시간 반영
Architecture
- https://github.com/supabase/supabase/blob/master/i18n/README.ko.md
- PostgreSQL - PostgreSQL 은 30 년 이상 개발 · 개선되어왔다 객체 관계형 데이터베이스 시스템에서의 안정성, 기능의 안정성, 성능면에서 높은 평가를 얻고 있습니다.
- Realtime 은 웹 소켓을 사용하여 PostgreSQL 삽입, 업데이트 및 삭제를 수신 할 수있는 Elixir 서버입니다. Supabase는 Postgres의 내장 복제 기능을 수신하고 복제 바이트 스트림을 JSON으로 변환 한 다음 웹 소켓을 통해 JSON을 브로드 캐스트합니다.
- PostgREST - 는 PostgreSQL 데이터베이스를 RESTful API로 직접 변환하는 웹 서버입니다.
- Storage 는 Postgres를 사용하여 권한을 관리하여 S3에 저장된 파일을 관리하기위한 RESTful 인터페이스를 제공합니다.
- postgres-meta 는 Postgres를 관리하기위한 RESTful API로, 테이블을 가져오고, 역할을 추가하고, 쿼리를 실행할 수 있습니다.
- GoTrue 는 사용자 관리 및 SWT 토큰 발급을위한 SWT 기반 API입니다.
- Kong 은 클라우드 네이티브 API 게이트웨이입니다.
환경변수
- POSTGRES_URL
- POSTGRES_PRISMA_URL
- POSTGRES_URL_NON_POOLING
- POSTGRES_USER
- POSTGRES_HOST
- POSTGRES_PASSWORD
- POSTGRES_DATABASE
- SUPABASE_SERVICE_ROLE_KEY
- SUPABASE_ANON_KEY
- SUPABASE_URL
- NEXT_PUBLIC_SUPABASE_ANON_KEY
- NEXT_PUBLIC_SUPABASE_URL
varchar(n)를 기본적으로 사용하지 말아야 하는 이유
해당 행목 참조.
varchar(n) 대신 글자수 제한 방법
PostgreSQL:Constraints#글자 수 제한 항목 참조. 간단히:
Quickstart guide Nextjs with supabase
SQL Editor 에서 사용자 확인 가능:
프로젝트 생성:
npx create-next-app -e with-supabase my-app && cd my-app
## or
yarn create next-app -e with-supabase my-app && cd my-app
.env.local.example 파일을 .env.local 으로 바꾸고 다음 환경변수 확인:
- NEXT_PUBLIC_SUPABASE_URL
- NEXT_PUBLIC_SUPABASE_ANON_KEY
-
SUPABASE_SERVICE_ROLE_KEY- 이건 뭐지?
실행하고 확인하자.
Github 인증 연동
Github OAuth 페이지 참조.
Google 인증 연동
Configuration
To use the OAuth 2.0 flow, you will require the following information:
- Obtain OAuth credentials for your Google Cloud project in the Credentials page of the console. When creating a new credential, choose Web application. In Authorized redirect URIs enter
https://<project-id>.supabase.co/auth/v1/callback. This URL will be seen by your users, and you can customize it by configuring custom domains. - Configure the OAuth Consent Screen. This information is shown to the user when giving consent to your app. Within Authorized domains make sure you add your Supabase project's domain <project-id>
.supabase.co. Configure the non-sensitive scopes by making sure the following ones are selected:.../auth/userinfo.email,.../auth/userinfo.profile,openid. If you're selecting other sensitive scopes, your app may require additional verification. In those cases, it's best to use custom domains. - Finally, add the client ID and secret from step 1 in the Google provider on the Supabase Dashboard.
API Settings
프로젝트 셋팅 페이지로 들어가면 다음 항목이 있다.
- Exposed schemas
- 기본 값 - public, storage, graphql_public
- API에 노출할 스키마 목록. 이러한 스키마의 테이블, 뷰 및 저장 프로시저는 API 엔드포인트를 얻습니다. public 및 storage 는 기본적으로 보호됩니다. 즉, 변경 불가.
- Extra search path
- 기본 값 - public, extensions
- 모든 요청의 검색 경로에 추가할 추가 스키마입니다. 여러 스키마는 쉼표로 구분되어야 합니다.
- Max rows
- 기본 값 - 1000
- 뷰, 테이블 또는 저장 프로시저에서 반환되는 최대 행 수입니다. 우발적이거나 악의적인 요청에 대한 페이로드 크기를 제한합니다.
Postgres 드라이버 연결 방법
Supabase 의 Connect 버튼을 누르면 출력되는 URI 는 다음과 같을거다:
그런데 이건 Method: Direct connection 으로 연결하려면 IPv4 가 켜져 있어야 할거다 (확인 필요) 그런데 이건 유료 서비스임. 그래서 접속이 안될거다.
Method: Transaction pooler 로 바꾸면 접속 주소가 바뀌는데 다음과 같이 바뀔거다:
postgresql://postgres.[PROJECT-ID]:[YOUR-PASSWORD]@aws-1-ap-southeast-1.pooler.supabase.com:6543/postgres
중요한건 사용자명이 postgres.[PROJECT-ID] 이고, Host 주소도 및 포트 번호도 바뀌어 있다.
참고로 비밀번호는 데이터베이스 설정 페이지로 이동하면 바꿀 수 있다.
Self-Hosting with Docker
Learn how to configure and deploy Supabase with Docker.
Docker is the easiest way to get started with self-hosted Supabase. This guide assumes you are running the command from the machine you intend to host from.
Managing your secrets
Many components inside Supabase use secure secrets and passwords. These are listed in the self-hosting env file, but we strongly recommend using a secrets manager when deploying to production. Plain text files like dotenv lead to accidental costly leaks.
Some suggested systems include:
- Doppler
- Infisical
- Key Vault by Azure (Microsoft)
- Secrets Manager by AWS
- Secrets Manager by GCP
- Vault by Hashicorp
Architecture
Supabase is a combination of open source tools, each specifically chosen for Enterprise-readiness.
If the tools and communities already exist, with an MIT, Apache 2, or equivalent open license, we will use and support that tool. If the tool doesn't exist, we build and open source it ourselves.
- Kong is a cloud-native API gateway.
- GoTrue is an JWT based API for managing users and issuing JWT tokens.
- PostgREST is a web server that turns your PostgreSQL database directly into a RESTful API
- Realtime is an Elixir server that allows you to listen to PostgreSQL inserts, updates, and deletes using websockets. Realtime polls Postgres' built-in replication functionality for database changes, converts changes to JSON, then broadcasts the JSON over websockets to authorized clients.
- Storage provides a RESTful interface for managing Files stored in S3, using Postgres to manage permissions.
- postgres-meta is a RESTful API for managing your Postgres, allowing you to fetch tables, add roles, and run queries, etc.
- PostgreSQL is an object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance.
Configuring services
Each system has a number of configuration options which can be found in the relevant product documentation.
Installing and running Supabase
# Get the code
git clone --depth 1 https://github.com/supabase/supabase
# Go to the docker folder
cd supabase/docker
# Copy the fake env vars
cp .env.example .env
# Pull the latest images
docker compose pull
# Start the services (in detached mode)
docker compose up -d
이후 http://localhost:8000/ 으로 접속하면 된다. 사용자 ID/PW 는 다음과 같다:
- Username:
supabase - Password:
this_password_is_insecure_and_should_be_updated
변경하고 싶다면 .env 파일에서 변경하자.
API Key 는 이 곳에서 만들자. ANON_KEY 또는 SERVICE_ROLE_KEY 를 .env 파일에서 확인하면 된다.
Free Tier 에서 실질적으로 얻을 수 있는 것
Supabase의 무료 플랜은 다른 서비스에 비해 놀라울 정도로 관대합니다. 자세한 내용은 다음과 같습니다.
- 500MB의 데이터베이스 저장 공간이 필요합니다. 이는 테이블, 인덱스 및 데이터를 저장하는 데 필요한 PostgreSQL의 기본 저장 공간입니다. 참고로, 500MB는 일반적인 앱 데이터(사용자, 게시물, 댓글) 약 200만~500만 행을 저장할 수 있는 용량입니다. 대부분의 MVP 프로젝트는 몇 달 동안 이 용량에 도달하지 않을 것입니다.
- 1GB 파일 저장 용량. Supabase 스토리지에 저장된 이미지, 문서 및 기타 파일용입니다.
- 2GB 대역폭. 이는 데이터베이스와 스토리지를 통해 전송되는 데이터를 모두 합한 총 송신 대역폭입니다. 무료 요금제의 대역폭 제한이 예상보다 빠르게 발생하는 지점이 바로 이 부분입니다.
- Auth의 월간 활성 사용자 수는 5만 명입니다. 대부분의 스타트업에게는 충분한 수치죠. 이 부분이 병목 현상이 되려면 사업이 상당히 잘 되고 있어야 할 겁니다.
- Supabase의 서버리스 함수인 Edge Function이 월 50만 회 호출되었습니다. 대부분의 사용 사례에서 이 정도면 충분한 성능입니다.
- 프로젝트는 최대 두 개까지만 허용됩니다. 하나는 운영 환경용, 하나는 스테이징 환경용입니다. 실험용으로 프로젝트를 여러 개 만들고 싶다면 이 제한 사항이 상당히 중요할 수 있습니다.
아냐는 5개월 동안 무료 플랜으로 SaaS 서비스를 운영했습니다. 사용자 수는 약 400명, 데이터 사용량은 약 100MB, API 트래픽은 적당한 수준이었습니다. 사용량 제한을 충분히 초과하지 않았습니다. 프로젝트 수가 두 개로 제한된 점은 아쉬웠지만(실험 삼아 세 번째 프로젝트를 추가하고 싶었지만), 주력 제품의 경우 무료 플랜으로 충분했습니다.
무료 티어의 한계점
대역폭 제한은 조용한 살인자입니다. 2GB는 많아 보이지만, API 호출 한 번당 데이터가 전송된다는 사실을 깨닫고 나면 생각이 달라집니다. 일반적인 SaaS 페이지 로드 시 Supabase에서 50~100KB 정도의 데이터가 전송됩니다. 계산해 보면, 일일 활성 사용자 500명, 사용자당 20번의 API 호출, 호출당 평균 50KB라고 할 때 하루에 500MB를 사용하게 됩니다. 이렇게 되면 2GB 허용량이 나흘 만에 소진됩니다.
아냐는 출시 4개월 차에 이 문제에 직면했습니다. 그녀의 앱에는 방문할 때마다 다소 복잡한 데이터 세트를 불러오는 대시보드가 있었는데, 사용자들이 하루에도 여러 번 새로고침을 했습니다. 사용자 수가 300명에서 500명으로 늘어나면서 약 2주 만에 "허용 범위 내"에서 "대역폭 제한 초과" 상태가 되었습니다.
또 다른 문제점은 데이터베이스 컴퓨팅입니다. 무료 티어 역시 공유 컴퓨팅 환경에서 실행됩니다. Anya는 피크 시간대에 API 응답 시간이 50ms에서 300ms로 급증하는 것을 목격했습니다. 심각한 문제는 아니지만 지표상으로 확인할 수 있는 현상이며, 트래픽이 증가함에 따라 문제가 될 수 있는 부분입니다.
프로 플랜: 합리적인 기본 설정
안야는 요금제를 업그레이드하면서 월 25달러의 프로 플랜으로 변경했습니다. 변경된 사항은 다음과 같습니다.
- 8GB 데이터베이스 저장 공간. 무료 버전 대비 16배 증가.
- 100GB 대역폭. 이게 가장 큰 변화였다. 2GB에서 100GB로 늘어나면서 그녀는 더 이상 대역폭에 대해 걱정할 필요가 없어졌다.
- 전용 컴퓨팅(마이크로 인스턴스). 공유 리소스 대신 일관된 성능을 제공합니다.
- Auth의 월간 활성 사용자 수는 10만 명입니다.
- 2백만 건의 엣지 함수 호출.
- 프로젝트 수에는 제한이 없습니다. 필요한 만큼 프로젝트를 생성하세요.
- 7일간 백업이 보존됩니다. 무료 버전에는 자동 백업 기능이 없는데, 생각해보면 정말 끔찍한 일입니다.
월 25달러의 프로 플랜은 제공되는 서비스에 비해 정말 저렴합니다. 안야는 이를 AWS에서 직접 포스트그레스 인스턴스를 운영하는 것(RDS t4g.micro, 월 약 13달러에 로드 밸런싱, 인증 서비스, 스토리지, 대역폭 추가)과 비교하며, AWS를 이용할 경우 관리하는 데 드는 시간을 제외하고도 월 80~120달러 정도의 비용이 발생할 것으로 예상했습니다.
Pro 플랜에 포함된 대역폭과 컴퓨팅 리소스는 활성 사용자 수가 수천 명에 달하는 앱에 맞춰져 있습니다. 그 이상을 사용하려면 컴퓨팅 추가 기능을 고려해야 합니다.
컴퓨팅 부가 기능: 비용이 실제로 증가하는 부분
Supabase의 가격 모델은 기본 플랜 가격이 비교적 고정되어 있고, 변동 비용은 컴퓨팅 추가 기능에서 발생한다는 점에서 독특합니다. 데이터베이스에 더 많은 처리 능력이 필요한 경우 더 큰 컴퓨팅 인스턴스를 연결하면 됩니다.
- Micro(Pro의 기본 사양): 2코어 ARM, 1GB RAM — Pro에 포함됨
- 소형: 2코어 ARM, 2GB RAM — 월 50달러 추가 요금
- 중형: 2코어 ARM, 4GB RAM — 월 100달러 추가 요금
- 대형: 2코어 ARM, 8GB RAM — 월 200달러 추가 요금
- XL 이상: 더 무거운 작업 부하를 처리하기 위해 그 이상으로 확장 가능
안야의 경우, 앱의 일일 활성 사용자 수가 약 2,000명에 달해 복잡한 대시보드 쿼리를 실행하기 전까지는 마이크로 인스턴스를 문제없이 사용했습니다. 그러다 스몰 인스턴스(50달러 추가 요금)로 업그레이드하자 성능 문제가 해결되었습니다. 그녀의 월별 수파베이스 요금은 총 75달러가 되었지만, 자체 관리형 인프라를 구축하는 것보다는 훨씬 저렴했습니다.
중요한 점은 컴퓨팅 비용이 확장성의 주요 요소라는 것입니다. 스토리지 용량은 증가할 수 있고 대역폭도 급증할 수 있지만, 대부분의 애플리케이션에서 실제로 업그레이드가 필요한 것은 컴퓨팅 인스턴스입니다. 증가하는 데이터 세트에 대한 복잡한 쿼리를 실행하려면 더 많은 CPU와 메모리가 필요하기 때문입니다.
팀 계획: 기업가 정신을 위한 디딤돌
월 599달러인 팀 플랜은 SOC 2 규정 준수, 우선 지원 및 SSO(단일 로그인)가 필요한 기업을 대상으로 합니다. 프로 플랜과의 기능적 차이는 비교적 작습니다. 더 많은 저장 공간, 더 높은 대역폭, 더 긴 백업 보존 기간이 제공됩니다. 사실상 규정 준수 및 지원 서비스에 대한 비용이라고 볼 수 있습니다.
안야는 아직 그 단계에 이르지 못했습니다. 첫 번째 기업 고객이 SOC 2 보고서를 요청할 때 비로소 그 단계에 도달할 것이라는 것을 그녀 자신도 알고 있습니다. 하지만 현재로서는 Pro 버전과 컴퓨팅 추가 기능을 통해 그녀의 작업량을 처리하고 있습니다.
저렴하게 지내기 위한 전략
다음은 앱이 확장됨에 따라 Subabase 비용을 낮게 유지하는 것에 대해 Anya가 배운 것입니다.
- 미들웨어 대신 RLS를 사용하십시오. 행 레벨 보안 정책은 데이터베이스 내에서 실행되며, 이는 필터링된 쿼리가 데이터를 덜 반환한다는 것을 의미합니다. 데이터가 적게 반환된다는 것은 대역폭이 덜 소비된다는 것을 의미합니다. 전체 데이터 세트를 가져온 후 애플리케이션 코드에서 필터링하는 경우 말 그대로 피할 수 있는 대역폭에 대해 비용을 지불하고 있습니다.
- 공격적으로 페이징. 사용자가 20개만 볼 때 왜 500개의 행을 로드합니까? Supabase 지원 range헤더 및 limit/ / offset매개 변수. 그들을 사용하십시오. Anya는 대시 보드 테이블에서 적절한 pagination을 구현하여 대역폭 사용량을 60 % 줄였습니다.
- 클라이언트에 캐시. React Query, SWR 또는 일반 localStorage 캐싱은 Supabase로의 왕복 횟수를 극적으로 줄입니다. 데이터에 대해 5분 캐시 TTL을 차단하면 시간당만 변경되며 하루에 수천 개의 무의미한 API 호출을 제거합니다.
- 무거운 리프팅을 위해 데이터베이스 기능을 사용합니다. 앱을 변환하고, 변환하고, 뒤로 밀어내는 대신, 데이터 기반 내 모든 작업을 수행하는 Postgres 함수를 작성하십시오. 하나의 기능 호출은 세 번의 왕복 여행을 대체합니다.
- 대역폭을 모니터링합니다. Supabase 대시보드는 실시간으로 사용량을 표시합니다. 한계에 접근하기 전에 경고를 설정하십시오. 통과한 후가 아니라. Anya는 그녀가 은행 계좌를 확인하는 것과 같은 방식으로 매주 그녀를 확인합니다.
에이전트가 Ops 세금을 처리하도록하십시오
Supabase 청구서에 표시되지 않는 한 가지 비용은 데이터 작업에 소요되는 개발자 시간입니다. 대량 업데이트, 정리 패스, 시스템 간의 동기화 기록 - 이들은 기능을 구축하는 방향으로 갈 수있는 시간을 먹습니다.
Supabase Inventory Tracker 에이전트는 Anya가 손으로 수행하는 데 사용되는 운영 작업을 선택합니다. 그녀는 전자 상거래 제품을 실행하고 있으며, 매주 일부를 먹는 데 사용되는 Supabase 데이터베이스와 Shopify 스토어간에 재고 수준을 정확하게 유지합니다. 에이전트는 일회성 스크립트를 작성하지 않고 재고 수준, 불일치 플래그 및 업데이트 기록을 모니터링합니다.
Anya의 경우 수학은 간단합니다. 그녀는 Supabase 인프라에 대해 $ 75/month를 지불합니다. 그녀는 데이터 작업에 에이전트를 사용하여 한 달에 5-10 시간의 개발자 시간을 절약합니다. 그녀의 컨설팅 속도에서 이러한 시간은 인프라 비용보다 훨씬 더 가치가 있습니다. 데이터베이스를 실행하는 데 가장 비싼 것은 데이터베이스 자체가 결코 아니었다. 데이터를 돌보는 데 보낸 것은 인간의 시간이었습니다.
Try These Agents
- Supabase Inventory Tracker — Track inventory levels, flag discrepancies, and keep stock data accurate in Supabase
- Supabase Data Sync Agent — Sync data between Supabase tables and external sources without manual scripts
- Supabase Database Cleanup Agent — Find and resolve duplicate, orphaned, and stale records automatically
Troubleshooting
Multiple accounts with the same email address in the same linking domain detected: default
- error=server_error
- error_code=500
- error_description=Multiple accounts with the same email address in the same linking domain detected: default
사용하려는 OAuth 서비스 (나의 경우 github) 에 등록된 한 계정에 여러 이메일이 등록되어 있을 가능성이 있다.
한마디로 보조 메일을 supabase.auth 에 등록하지 말라.
OAuth 로그인 후 http://localhost:3000 으로 리다이렉트 되는 현상
Authentication > URL Configuration 메뉴의 Site URL 을 갱신하자.