261 lines
7.6 KiB
Go
261 lines
7.6 KiB
Go
package supabase
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
)
|
|
|
|
type serviceConfig[TEnvKeys, TDefaults any] struct {
|
|
Name string
|
|
EnvKeys TEnvKeys
|
|
Defaults TDefaults
|
|
}
|
|
|
|
func (cfg serviceConfig[TEnvKeys, TDefaults]) ObjectName(obj metav1.Object) string {
|
|
return fmt.Sprintf("%s-%s", obj.GetName(), cfg.Name)
|
|
}
|
|
|
|
func (cfg serviceConfig[TEnvKeys, TDefaults]) ObjectMeta(obj metav1.Object) metav1.ObjectMeta {
|
|
return metav1.ObjectMeta{Name: cfg.ObjectName(obj), Namespace: obj.GetNamespace()}
|
|
}
|
|
|
|
type postgrestEnvKeys struct {
|
|
Host fixedEnv
|
|
DBUri string
|
|
Schemas stringSliceEnv
|
|
AnonRole stringEnv
|
|
JWTSecret secretEnv
|
|
UseLegacyGucs boolEnv
|
|
ExtraSearchPath stringSliceEnv
|
|
AppSettingsJWTSecret secretEnv
|
|
AppSettingsJWTExpiry intEnv[int]
|
|
AdminServerPort intEnv[int32]
|
|
MaxRows intEnv[int]
|
|
OpenAPIProxyURI stringEnv
|
|
}
|
|
|
|
type postgrestConfigDefaults struct {
|
|
AnonRole string
|
|
Schemas []string
|
|
ExtraSearchPath []string
|
|
UID, GID int64
|
|
ServerPort, AdminPort int32
|
|
}
|
|
|
|
type authEnvKeys struct {
|
|
ApiHost fixedEnv
|
|
ApiPort fixedEnv
|
|
ApiExternalUrl stringEnv
|
|
DBDriver fixedEnv
|
|
DatabaseUrl string
|
|
SiteUrl stringEnv
|
|
AdditionalRedirectURLs stringSliceEnv
|
|
DisableSignup boolEnv
|
|
JWTIssuer fixedEnv
|
|
JWTAdminRoles fixedEnv
|
|
JWTAudience fixedEnv
|
|
JwtDefaultGroup fixedEnv
|
|
JwtExpiry intEnv[int]
|
|
JwtSecret secretEnv
|
|
EmailSignupDisabled boolEnv
|
|
MailerUrlPathsInvite stringEnv
|
|
MailerUrlPathsConfirmation stringEnv
|
|
MailerUrlPathsRecovery stringEnv
|
|
MailerUrlPathsEmailChange stringEnv
|
|
AnonymousUsersEnabled boolEnv
|
|
}
|
|
|
|
type authConfigDefaults struct {
|
|
MailerUrlPathsInvite string
|
|
MailerUrlPathsConfirmation string
|
|
MailerUrlPathsRecovery string
|
|
MailerUrlPathsEmailChange string
|
|
APIPort int32
|
|
UID, GID int64
|
|
}
|
|
|
|
type pgMetaEnvKeys struct {
|
|
APIPort intEnv[int32]
|
|
DBHost stringEnv
|
|
DBPort intEnv[int]
|
|
DBName stringEnv
|
|
DBUser secretEnv
|
|
DBPassword secretEnv
|
|
}
|
|
|
|
type pgMetaDefaults struct {
|
|
APIPort int32
|
|
DBPort string
|
|
NodeUID int64
|
|
NodeGID int64
|
|
}
|
|
|
|
type studioEnvKeys struct {
|
|
PGMetaURL stringEnv
|
|
DBPassword secretEnv
|
|
ApiUrl stringEnv
|
|
APIExternalURL stringEnv
|
|
JwtSecret secretEnv
|
|
AnonKey secretEnv
|
|
ServiceKey secretEnv
|
|
Host fixedEnv
|
|
}
|
|
|
|
type studioDefaults struct {
|
|
NodeUID int64
|
|
NodeGID int64
|
|
APIPort int32
|
|
}
|
|
|
|
type envoyDefaults struct {
|
|
ConfigKey string
|
|
UID, GID int64
|
|
}
|
|
|
|
type envoyServiceConfig struct {
|
|
Defaults envoyDefaults
|
|
}
|
|
|
|
func (envoyServiceConfig) ObjectName(obj metav1.Object) string {
|
|
return fmt.Sprintf("%s-envoy", obj.GetName())
|
|
}
|
|
|
|
type jwtDefaults struct {
|
|
SecretKey string
|
|
JwksKey string
|
|
AnonKey string
|
|
ServiceKey string
|
|
SecretLength int
|
|
Expiry int
|
|
}
|
|
|
|
type jwtConfig struct {
|
|
Defaults jwtDefaults
|
|
}
|
|
|
|
func (jwtConfig) ObjectName(obj metav1.Object) string {
|
|
return fmt.Sprintf("%s-jwt", obj.GetName())
|
|
}
|
|
|
|
var ServiceConfig = struct {
|
|
Postgrest serviceConfig[postgrestEnvKeys, postgrestConfigDefaults]
|
|
Auth serviceConfig[authEnvKeys, authConfigDefaults]
|
|
PGMeta serviceConfig[pgMetaEnvKeys, pgMetaDefaults]
|
|
Studio serviceConfig[studioEnvKeys, studioDefaults]
|
|
Envoy envoyServiceConfig
|
|
JWT jwtConfig
|
|
}{
|
|
Postgrest: serviceConfig[postgrestEnvKeys, postgrestConfigDefaults]{
|
|
Name: "postgrest",
|
|
EnvKeys: postgrestEnvKeys{
|
|
Host: fixedEnvOf("PGRST_SERVER_HOST", "*"),
|
|
DBUri: "PGRST_DB_URI",
|
|
Schemas: stringSliceEnv{key: "PGRST_DB_SCHEMAS", separator: ","},
|
|
AnonRole: "PGRST_DB_ANON_ROLE",
|
|
JWTSecret: "PGRST_JWT_SECRET",
|
|
UseLegacyGucs: "PGRST_DB_USE_LEGACY_GUCS",
|
|
AppSettingsJWTSecret: "PGRST_APP_SETTINGS_JWT_SECRET",
|
|
AppSettingsJWTExpiry: "PGRST_APP_SETTINGS_JWT_EXP",
|
|
AdminServerPort: "PGRST_ADMIN_SERVER_PORT",
|
|
ExtraSearchPath: stringSliceEnv{key: "PGRST_DB_EXTRA_SEARCH_PATH", separator: ","},
|
|
MaxRows: "PGRST_DB_MAX_ROWS",
|
|
OpenAPIProxyURI: "PGRST_OPENAPI_SERVER_PROXY_URI",
|
|
},
|
|
Defaults: postgrestConfigDefaults{
|
|
AnonRole: "anon",
|
|
Schemas: []string{"public", "graphql_public"},
|
|
ExtraSearchPath: []string{"public", "extensions"},
|
|
UID: 1000,
|
|
GID: 1000,
|
|
ServerPort: 3000,
|
|
AdminPort: 3001,
|
|
},
|
|
},
|
|
Auth: serviceConfig[authEnvKeys, authConfigDefaults]{
|
|
Name: "auth",
|
|
EnvKeys: authEnvKeys{
|
|
ApiHost: fixedEnvOf("GOTRUE_API_HOST", "0.0.0.0"),
|
|
ApiPort: fixedEnvOf("GOTRUE_API_PORT", "9999"),
|
|
ApiExternalUrl: "API_EXTERNAL_URL",
|
|
DBDriver: fixedEnvOf("GOTRUE_DB_DRIVER", "postgres"),
|
|
DatabaseUrl: "GOTRUE_DB_DATABASE_URL",
|
|
SiteUrl: "GOTRUE_SITE_URL",
|
|
AdditionalRedirectURLs: stringSliceEnv{key: "GOTRUE_URI_ALLOW_LIST", separator: ","},
|
|
DisableSignup: "GOTRUE_DISABLE_SIGNUP",
|
|
JWTIssuer: fixedEnvOf("GOTRUE_JWT_ISSUER", "supabase"),
|
|
JWTAdminRoles: fixedEnvOf("GOTRUE_JWT_ADMIN_ROLES", "service_role"),
|
|
JWTAudience: fixedEnvOf("GOTRUE_JWT_AUD", "authenticated"),
|
|
JwtDefaultGroup: fixedEnvOf("GOTRUE_JWT_DEFAULT_GROUP_NAME", "authenticated"),
|
|
JwtExpiry: "GOTRUE_JWT_EXP",
|
|
JwtSecret: "GOTRUE_JWT_SECRET",
|
|
EmailSignupDisabled: "GOTRUE_EXTERNAL_EMAIL_ENABLED",
|
|
MailerUrlPathsInvite: "MAILER_URLPATHS_INVITE",
|
|
MailerUrlPathsConfirmation: "MAILER_URLPATHS_CONFIRMATION",
|
|
MailerUrlPathsRecovery: "MAILER_URLPATHS_RECOVERY",
|
|
MailerUrlPathsEmailChange: "MAILER_URLPATHS_EMAIL_CHANGE",
|
|
AnonymousUsersEnabled: "GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED",
|
|
},
|
|
Defaults: authConfigDefaults{
|
|
MailerUrlPathsInvite: "/auth/v1/verify",
|
|
MailerUrlPathsConfirmation: "/auth/v1/verify",
|
|
MailerUrlPathsRecovery: "/auth/v1/verify",
|
|
MailerUrlPathsEmailChange: "/auth/v1/verify",
|
|
APIPort: 9999,
|
|
UID: 1000,
|
|
GID: 1000,
|
|
},
|
|
},
|
|
PGMeta: serviceConfig[pgMetaEnvKeys, pgMetaDefaults]{
|
|
Name: "pg-meta",
|
|
EnvKeys: pgMetaEnvKeys{
|
|
APIPort: "PG_META_PORT",
|
|
DBHost: "PG_META_DB_HOST",
|
|
DBPort: "PG_META_DB_PORT",
|
|
DBName: "PG_META_DB_NAME",
|
|
DBUser: "PG_META_DB_USER",
|
|
DBPassword: "PG_META_DB_PASSWORD",
|
|
},
|
|
Defaults: pgMetaDefaults{
|
|
APIPort: 8080,
|
|
DBPort: "5432",
|
|
NodeUID: 1000,
|
|
NodeGID: 1000,
|
|
},
|
|
},
|
|
Studio: serviceConfig[studioEnvKeys, studioDefaults]{
|
|
Name: "studio",
|
|
EnvKeys: studioEnvKeys{
|
|
PGMetaURL: "STUDIO_PG_META_URL",
|
|
DBPassword: "POSTGRES_PASSWORD",
|
|
ApiUrl: "SUPABASE_URL",
|
|
APIExternalURL: "SUPABASE_PUBLIC_URL",
|
|
JwtSecret: "AUTH_JWT_SECRET",
|
|
AnonKey: "SUPABASE_ANON_KEY",
|
|
ServiceKey: "SUPABASE_SERVICE_KEY",
|
|
Host: fixedEnvOf("HOSTNAME", "0.0.0.0"),
|
|
},
|
|
Defaults: studioDefaults{
|
|
NodeUID: 1000,
|
|
NodeGID: 1000,
|
|
APIPort: 3000,
|
|
},
|
|
},
|
|
Envoy: envoyServiceConfig{
|
|
Defaults: envoyDefaults{
|
|
ConfigKey: "config.yaml",
|
|
UID: 65532,
|
|
GID: 65532,
|
|
},
|
|
},
|
|
JWT: jwtConfig{
|
|
Defaults: jwtDefaults{
|
|
SecretKey: "secret",
|
|
JwksKey: "jwks.json",
|
|
AnonKey: "anon_key",
|
|
ServiceKey: "service_key",
|
|
SecretLength: 40,
|
|
Expiry: 3600,
|
|
},
|
|
},
|
|
}
|