Find a file
Peter Kurfer 89b682935b
Some checks failed
Docs / deploy (push) Successful in 1m56s
Lint / Run on Ubuntu (push) Failing after 4m27s
release / release (push) Successful in 5m46s
E2E Tests / Run on Ubuntu (push) Failing after 3m50s
Tests / Run on Ubuntu (push) Failing after 3m23s
docs: extend docs
2025-01-28 18:01:34 +01:00
.devcontainer feat(db): prepare migrations and core CRD 2024-12-13 09:09:14 +01:00
.github/workflows feat(storage): finish initial basic implementation 2025-01-23 18:00:05 +01:00
.zed feat(db): prepare migrations and core CRD 2024-12-13 09:09:14 +01:00
api refactor(apigateway): configure api & dashboard listeneres individually 2025-01-24 09:16:58 +01:00
assets/migrations chore: add license header to all files 2025-01-20 17:20:04 +01:00
cmd feat(storage): finish initial basic implementation 2025-01-23 18:00:05 +01:00
config docs: extend docs 2025-01-28 18:01:34 +01:00
dev feat(storage): finish initial basic implementation 2025-01-23 18:00:05 +01:00
docs docs: extend docs 2025-01-28 18:01:34 +01:00
hack refactor: implement control plane as controller-runtime manager 2025-01-20 17:06:41 +01:00
internal docs: extend docs 2025-01-28 18:01:34 +01:00
magefiles feat(storage): finish initial basic implementation 2025-01-23 18:00:05 +01:00
test fix: minor issues 2025-01-21 19:50:11 +01:00
testdata docs: extend docs 2025-01-28 18:01:34 +01:00
tools feat: prepare test execution with mage & update tools 2025-01-22 19:15:26 +01:00
.dockerignore feat: basic functionality implemented 2025-01-04 17:07:49 +01:00
.gitignore docs: initial CI setup 2025-01-21 10:40:27 +01:00
.golangci.yml feat: prepare test execution with mage & update tools 2025-01-22 19:15:26 +01:00
.goreleaser.yaml fix(ci): configure gitea URLs 2025-01-22 11:25:21 +01:00
.husky.toml fix: minor issues 2025-01-21 19:50:11 +01:00
crd-docs.yaml feat: basic functionality implemented 2025-01-04 17:07:49 +01:00
Dockerfile feat: basic functionality implemented 2025-01-04 17:07:49 +01:00
go.mod fix: minor issues 2025-01-21 19:50:11 +01:00
go.sum fix: minor issues 2025-01-21 19:50:11 +01:00
mage.go initial commit 2024-12-10 08:43:59 +01:00
mage.sh feat: basic functionality implemented 2025-01-04 17:07:49 +01:00
Makefile feat(db): prepare migrations and core CRD 2024-12-13 09:09:14 +01:00
mkdocs.yml docs: extend docs 2025-01-28 18:01:34 +01:00
openapi.json feat(dashboard): initial support for studio & pg-meta services 2025-01-11 16:51:53 +01:00
PROJECT feat(storage): prepare custom resource for storage API 2025-01-21 21:56:17 +01:00
README.md docs: initial CI setup 2025-01-21 10:40:27 +01:00
requirements.txt docs: initial CI setup 2025-01-21 10:40:27 +01:00
Tiltfile docs: extend docs 2025-01-28 18:01:34 +01:00

supabase-operator

This is a Kubernetes operator for managing Supabase instances. It is built using the Kubebuilder framework.

Description

This is currently a work-in-progress experiment to replace existing Helm charts for Supabase as they tend to be hard to deploy and to manage and the default Supabase stack - although working great as a single instance or in their SaaS instances - isn't a perfect fit for Kubernetes. This operator replaces tedious Helm values files with a small set of custom resources that allow an user to quickly deploy a Supabase instance without having to know much (if anything) of the Supabase internals.

Targets

  • Make it as easy as possible to deploy Supabase on a Kubernetes cluster
  • Manage updates of components
  • Run Supabase specific migrations on the database (those managed in the supabase/postgres repository)
  • Make Supabase as resource effective as possible (e.g. replaced Kong with Envoy)
  • Keep it as secure as possible (e.g. adding OAuth2/Basic auth to studio if desired)
  • Manage all aspects of the Kubernetes resources, this operator manages everything where a user would need deeper insights into Supabase like:
    • Deployments
    • Services
    • Secrets (although you can ship your own if you want to)
    • ConfigMaps
    • soon: NetworkPolicies

Non-Targets

  • Manage all Kubernetes aspects, it does not create:
    • PodDisruptionBudgets
    • HorizontalPodAutoscalers
    • Ingress or HTTPRoutes
  • Replace existing Postgres operators like cloudnative-pg, CrunchyData, Zalando Postgres Operator, ...
  • Manage the database instance e.g. making backups, ... that should be done by the Postgres operator or by the user
  • Manage your application e.g. run app specific migrations, host your frontend, ...

This operator tries to be as un-opionionated as possible and thereofore does not make assumptions on how you expose APIs to your users (Ingress, GatewayAPI, LoadBalancer service (coming soon))...

Getting Started

Prerequisites

  • go version v1.23.x+
  • docker version 27.+.
  • kubectl version v1.30.0+.
  • Access to a Kubernetes v1.30.+ cluster.

To Deploy on the cluster

Build and push your image to the location specified by IMG:

make docker-build docker-push IMG=<some-registry>/supabase-operator:tag

NOTE: This image ought to be published in the personal registry you specified. And it is required to have access to pull the image from the working environment. Make sure you have the proper permission to the registry if the above commands dont work.

Install the CRDs into the cluster:

make install

Deploy the Manager to the cluster with the image specified by IMG:

make deploy IMG=<some-registry>/supabase-operator:tag

NOTE: If you encounter RBAC errors, you may need to grant yourself cluster-admin privileges or be logged in as admin.

Create instances of your solution You can apply the samples (examples) from the config/sample:

kubectl apply -k config/samples/

NOTE: Ensure that the samples has default values to test it out.

To Uninstall

Delete the instances (CRs) from the cluster:

kubectl delete -k config/samples/

Delete the APIs(CRDs) from the cluster:

make uninstall

UnDeploy the controller from the cluster:

make undeploy

Project Distribution

Following are the steps to build the installer and distribute this project to users.

  1. Build the installer for the image built and published in the registry:
make build-installer IMG=<some-registry>/supabase-operator:tag

NOTE: The makefile target mentioned above generates an 'install.yaml' file in the dist directory. This file contains all the resources built with Kustomize, which are necessary to install this project without its dependencies.

  1. Using the installer

Users can just run kubectl apply -f to install the project, i.e.:

kubectl apply -f https://raw.githubusercontent.com/<org>/supabase-operator/<tag or branch>/dist/install.yaml

License

Copyright 2025 Peter Kurfer.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.