Supabase Storage Middleware
A scalable, light-weight object storage service.
Read this post on why we decided to build a new object storage service.
- Uses Postgres as it's datastore for storing metadata
- Authorization rules are written as Postgres Row Level Security policies
- Integrates with S3 as the storage backend (with more in the pipeline!)
- Extremely lightweight and performant
Documentation
Development
- Copy
.env.sample
to.env
file. - Copy
.env.test.sample
to.env.test
. - Change
GLOBAL_S3_BUCKET
andREGION
to the name and region of a S3 bucket.- If you just want to run the tests and not develop locally, you can skip this step because S3 calls are mocked in our tests.
- Set up your AWS credentials. Your user must have permissions to
s3:PutObject, s3:GetObject, s3:DeleteObject
in the bucket you have chosen.
Your root directory should now have both .env
and .env.test
files.
- Then run the following:
# this sets up a postgres database and postgrest locally via docker
npm run infra:restart
# Start the storage server
npm run dev
The server should now be running at http://localhost:5000/
The following request should insert and return the list of buckets.
# insert a bucket named avatars
curl --location --request POST 'http://localhost:5000/bucket' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjEzNTMxOTg1LCJleHAiOjE5MjkxMDc5ODV9.th84OKK0Iz8QchDyXZRrojmKSEZ-OuitQm_5DvLiSIc' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "avatars"
}'
# get buckets
curl --location --request GET 'http://localhost:5000/bucket' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNjEzNTMxOTg1LCJleHAiOjE5MjkxMDc5ODV9.th84OKK0Iz8QchDyXZRrojmKSEZ-OuitQm_5DvLiSIc'
Testing
To perform your tests you can run the following command: npm test