fix: supbase index.ts format

This commit is contained in:
songtianlun
2024-08-20 20:36:42 +08:00
parent acfa032e61
commit 91dc35a138

View File

@@ -1,72 +1,72 @@
import { import {
type Schema, type Schema,
type Template, type Template,
generateBase64, generateBase64,
generatePassword, generateHash,
generateHash, generatePassword,
generateRandomDomain, generateRandomDomain,
} from "../utils"; } from "../utils";
export function generate(schema: Schema): Template { export function generate(schema: Schema): Template {
const mainServiceHash = generateHash(schema.projectName); const mainServiceHash = generateHash(schema.projectName);
const randomDomain = generateRandomDomain(schema); const randomDomain = generateRandomDomain(schema);
const secretBase = generateBase64(64); const secretBase = generateBase64(64);
const postgresPassword = generatePassword(32); const postgresPassword = generatePassword(32);
const jwtSecret = generateBase64(32); const jwtSecret = generateBase64(32);
const dashboardPassword = generatePassword(32); const dashboardPassword = generatePassword(32);
const logflareApiKey = generateBase64(64); const logflareApiKey = generateBase64(64);
const envs = [ const envs = [
`SUPABASE_HOST=${randomDomain}`, `SUPABASE_HOST=${randomDomain}`,
`POSTGRES_PASSWORD=${postgresPassword}`, `POSTGRES_PASSWORD=${postgresPassword}`,
`JWT_SECRET=${jwtSecret}`, `JWT_SECRET=${jwtSecret}`,
`ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE`, "ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE",
`SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q`, "SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q",
`DASHBOARD_USERNAME=supabase`, "DASHBOARD_USERNAME=supabase",
`DASHBOARD_PASSWORD=${dashboardPassword}`, `DASHBOARD_PASSWORD=${dashboardPassword}`,
`POSTGRES_HOSTNAME=db`, "POSTGRES_HOSTNAME=db",
`POSTGRES_DB=postgres`, "POSTGRES_DB=postgres",
`POSTGRES_PORT=5432`, "POSTGRES_PORT=5432",
`KONG_HTTP_PORT=8000`, "KONG_HTTP_PORT=8000",
`KONG_HTTPS_PORT=8443`, "KONG_HTTPS_PORT=8443",
`PGRST_DB_SCHEMAS=public,storage,graphql_public`, "PGRST_DB_SCHEMAS=public,storage,graphql_public",
`ADDITIONAL_REDIRECT_URLS=`, "ADDITIONAL_REDIRECT_URLS=",
`JWT_EXPIRY=3600`, "JWT_EXPIRY=3600",
`DISABLE_SIGNUP=false`, "DISABLE_SIGNUP=false",
`MAILER_URLPATHS_CONFIRMATION="/auth/v1/verify"`, `MAILER_URLPATHS_CONFIRMATION="/auth/v1/verify"`,
`MAILER_URLPATHS_INVITE="/auth/v1/verify"`, `MAILER_URLPATHS_INVITE="/auth/v1/verify"`,
`MAILER_URLPATHS_RECOVERY="/auth/v1/verify"`, `MAILER_URLPATHS_RECOVERY="/auth/v1/verify"`,
`MAILER_URLPATHS_EMAIL_CHANGE="/auth/v1/verify"`, `MAILER_URLPATHS_EMAIL_CHANGE="/auth/v1/verify"`,
`ENABLE_EMAIL_SIGNUP=true`, "ENABLE_EMAIL_SIGNUP=true",
`ENABLE_EMAIL_AUTOCONFIRM=false`, "ENABLE_EMAIL_AUTOCONFIRM=false",
`SMTP_ADMIN_EMAIL=admin@example.com`, "SMTP_ADMIN_EMAIL=admin@example.com",
`SMTP_HOSTNAME=supabase-mail`, "SMTP_HOSTNAME=supabase-mail",
`SMTP_PORT=2500`, "SMTP_PORT=2500",
`SMTP_USER=fake_mail_user`, "SMTP_USER=fake_mail_user",
`SMTP_PASS=fake_mail_password`, "SMTP_PASS=fake_mail_password",
`SMTP_SENDER_NAME=fake_sender`, "SMTP_SENDER_NAME=fake_sender",
`ENABLE_ANONYMOUS_USERS=false`, "ENABLE_ANONYMOUS_USERS=false",
`ENABLE_PHONE_SIGNUP=true`, "ENABLE_PHONE_SIGNUP=true",
`ENABLE_PHONE_AUTOCONFIRM=true`, "ENABLE_PHONE_AUTOCONFIRM=true",
`STUDIO_DEFAULT_ORGANIZATION=Default Organization`, "STUDIO_DEFAULT_ORGANIZATION=Default Organization",
`STUDIO_DEFAULT_PROJECT=Default Project`, "STUDIO_DEFAULT_PROJECT=Default Project",
`STUDIO_PORT=3000`, "STUDIO_PORT=3000",
`IMGPROXY_ENABLE_WEBP_DETECTION=true`, "IMGPROXY_ENABLE_WEBP_DETECTION=true",
`FUNCTIONS_VERIFY_JWT=false`, "FUNCTIONS_VERIFY_JWT=false",
`LOGFLARE_LOGGER_BACKEND_API_KEY=${logflareApiKey}`, `LOGFLARE_LOGGER_BACKEND_API_KEY=${logflareApiKey}`,
`LOGFLARE_API_KEY=${logflareApiKey}`, `LOGFLARE_API_KEY=${logflareApiKey}`,
`DOCKER_SOCKET_LOCATION=/var/run/docker.sock`, "DOCKER_SOCKET_LOCATION=/var/run/docker.sock",
`GOOGLE_PROJECT_ID=GOOGLE_PROJECT_ID`, "GOOGLE_PROJECT_ID=GOOGLE_PROJECT_ID",
`GOOGLE_PROJECT_NUMBER=GOOGLE_PROJECT_NUMBER`, "GOOGLE_PROJECT_NUMBER=GOOGLE_PROJECT_NUMBER",
`SECRET_KEY_BASE=${secretBase}`, `SECRET_KEY_BASE=${secretBase}`,
`HASH=${mainServiceHash}`, `HASH=${mainServiceHash}`,
]; ];
const mounts: Template["mounts"] = [ const mounts: Template["mounts"] = [
{ {
filePath: "/volumes/api/kong.yml", filePath: "/volumes/api/kong.yml",
content: ` content: `
_format_version: '2.1' _format_version: '2.1'
_transform: true _transform: true
@@ -309,38 +309,38 @@ services:
config: config:
hide_credentials: true hide_credentials: true
`, `,
}, },
{ {
filePath: "/volumes/db/jwt.sql", filePath: "/volumes/db/jwt.sql",
content: ` content: `
\\set jwt_secret \`echo "$JWT_SECRET"\` \\set jwt_secret \`echo "$JWT_SECRET"\`
\\set jwt_exp \`echo "$JWT_EXP"\` \\set jwt_exp \`echo "$JWT_EXP"\`
ALTER DATABASE postgres SET "app.settings.jwt_secret" TO :'jwt_secret'; ALTER DATABASE postgres SET "app.settings.jwt_secret" TO :'jwt_secret';
ALTER DATABASE postgres SET "app.settings.jwt_exp" TO :'jwt_exp'; ALTER DATABASE postgres SET "app.settings.jwt_exp" TO :'jwt_exp';
`, `,
}, },
{ {
filePath: "/volumes/db/logs.sql", filePath: "/volumes/db/logs.sql",
content: ` content: `
\\set pguser \`echo "$POSTGRES_USER"\` \\set pguser \`echo "$POSTGRES_USER"\`
create schema if not exists _analytics; create schema if not exists _analytics;
alter schema _analytics owner to :pguser; alter schema _analytics owner to :pguser;
`, `,
}, },
{ {
filePath: "/volumes/db/realtime.sql", filePath: "/volumes/db/realtime.sql",
content: ` content: `
\\set pguser \`echo "$POSTGRES_USER"\` \\set pguser \`echo "$POSTGRES_USER"\`
create schema if not exists _realtime; create schema if not exists _realtime;
alter schema _realtime owner to :pguser; alter schema _realtime owner to :pguser;
`, `,
}, },
{ {
filePath: "/volumes/db/roles.sql", filePath: "/volumes/db/roles.sql",
content: ` content: `
-- NOTE: change to your own passwords for production environments -- NOTE: change to your own passwords for production environments
\\set pgpass \`echo "$POSTGRES_PASSWORD"\` \\set pgpass \`echo "$POSTGRES_PASSWORD"\`
@@ -350,10 +350,10 @@ ALTER USER supabase_auth_admin WITH PASSWORD :'pgpass';
ALTER USER supabase_functions_admin WITH PASSWORD :'pgpass'; ALTER USER supabase_functions_admin WITH PASSWORD :'pgpass';
ALTER USER supabase_storage_admin WITH PASSWORD :'pgpass'; ALTER USER supabase_storage_admin WITH PASSWORD :'pgpass';
`, `,
}, },
{ {
filePath: "/volumes/db/webhooks.sql", filePath: "/volumes/db/webhooks.sql",
content: ` content: `
BEGIN; BEGIN;
-- Create pg_net extension -- Create pg_net extension
CREATE EXTENSION IF NOT EXISTS pg_net SCHEMA extensions; CREATE EXTENSION IF NOT EXISTS pg_net SCHEMA extensions;
@@ -563,10 +563,10 @@ BEGIN;
GRANT EXECUTE ON FUNCTION supabase_functions.http_request() TO postgres, anon, authenticated, service_role; GRANT EXECUTE ON FUNCTION supabase_functions.http_request() TO postgres, anon, authenticated, service_role;
COMMIT; COMMIT;
`, `,
}, },
{ {
filePath: "/volumes/functions/hello/index.ts", filePath: "/volumes/functions/hello/index.ts",
content: ` content: `
// Follow this setup guide to integrate the Deno language server with your editor: // Follow this setup guide to integrate the Deno language server with your editor:
// https://deno.land/manual/getting_started/setup_your_environment // https://deno.land/manual/getting_started/setup_your_environment
// This enables autocomplete, go to definition, etc. // This enables autocomplete, go to definition, etc.
@@ -584,10 +584,10 @@ serve(async () => {
// curl 'http://localhost:<KONG_HTTP_PORT>/functions/v1/hello' \ // curl 'http://localhost:<KONG_HTTP_PORT>/functions/v1/hello' \
// --header 'Authorization: Bearer <anon/service_role API key>' // --header 'Authorization: Bearer <anon/service_role API key>'
`, `,
}, },
{ {
filePath: "/volumes/functions/main/index.ts", filePath: "/volumes/functions/main/index.ts",
content: ` content: `
import { serve } from 'https://deno.land/std@0.131.0/http/server.ts' import { serve } from 'https://deno.land/std@0.131.0/http/server.ts'
import * as jose from 'https://deno.land/x/jose@v4.14.4/index.ts' import * as jose from 'https://deno.land/x/jose@v4.14.4/index.ts'
@@ -683,10 +683,10 @@ serve(async (req: Request) => {
} }
}) })
`, `,
}, },
{ {
filePath: "/volumes/logs/vector.yml", filePath: "/volumes/logs/vector.yml",
content: ` content: `
api: api:
enabled: true enabled: true
address: 0.0.0.0:9001 address: 0.0.0.0:9001
@@ -920,12 +920,11 @@ sinks:
retry_max_duration_secs: 10 retry_max_duration_secs: 10
uri: 'http://analytics:4000/api/logs?source_name=cloudflare.logs.prod&api_key=\${LOGFLARE_API_KEY?LOGFLARE_API_KEY is required}' uri: 'http://analytics:4000/api/logs?source_name=cloudflare.logs.prod&api_key=\${LOGFLARE_API_KEY?LOGFLARE_API_KEY is required}'
`, `,
}, },
];
]; return {
envs,
return { mounts,
envs, };
mounts,
};
} }