diff --git a/apps/docs/app/reference/[...slug]/page.tsx b/apps/docs/app/reference/[...slug]/page.tsx index 0ed5497704c71..560623c640846 100644 --- a/apps/docs/app/reference/[...slug]/page.tsx +++ b/apps/docs/app/reference/[...slug]/page.tsx @@ -46,7 +46,7 @@ export default async function ReferencePage(props: { params: Promise<{ slug: Arr } else if (isCliReference) { return } else if (isApiReference) { - return + return } else if (isSelfHostingReference) { return ( diff --git a/apps/docs/components/MetricsStackCards.data.ts b/apps/docs/components/MetricsStackCards.data.ts index d9217a230195d..04c76f26e0267 100644 --- a/apps/docs/components/MetricsStackCards.data.ts +++ b/apps/docs/components/MetricsStackCards.data.ts @@ -2,7 +2,7 @@ export type MetricsStackOption = { title: string description: string href: string - iconKind: 'grafana' | 'datadog' | 'flame' + iconKind: 'grafana' | 'datadog' | 'elastic' | 'flame' iconColor: string iconBg: string badges: { label: string; variant: 'default' | 'community' }[] @@ -39,6 +39,16 @@ export const metricsStackOptions: MetricsStackOption[] = [ iconBg: 'rgba(99,44,166,0.1)', badges: [{ label: 'Community', variant: 'community' }], }, + { + title: 'Elastic', + description: + "Use Elastic's managed Supabase integration to scrape metrics. The integration automatically installs dashboards, alert templates, and SLO templates as data arrives.", + href: 'https://www.elastic.co/docs/reference/integrations/supabase', + iconKind: 'elastic', + iconColor: '#00BFB3', + iconBg: 'rgba(0,191,179,0.1)', + badges: [{ label: 'Community', variant: 'community' }], + }, { title: 'Vendor-agnostic / BYO Prometheus', description: diff --git a/apps/docs/components/MetricsStackCards.tsx b/apps/docs/components/MetricsStackCards.tsx index 895a5b7daee1e..6d02659cfc307 100644 --- a/apps/docs/components/MetricsStackCards.tsx +++ b/apps/docs/components/MetricsStackCards.tsx @@ -1,4 +1,4 @@ -import { Datadog, Grafana } from 'icons' +import { Datadog, Elastic, Grafana } from 'icons' import { Flame } from 'lucide-react' import Link from 'next/link' import type { ReactNode } from 'react' @@ -8,6 +8,7 @@ import { metricsStackOptions, type MetricsStackOption } from './MetricsStackCard const ICONS: Record = { grafana: , datadog: , + elastic: , flame: , } diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 8f7c97d96f7b6..08c99b5eed010 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -3047,6 +3047,10 @@ export const telemetry: NavMenuConstant = { name: 'Datadog', url: 'https://docs.datadoghq.com/integrations/supabase/' as `/${string}`, }, + { + name: 'Elastic', + url: 'https://www.elastic.co/docs/reference/integrations/supabase' as `/${string}`, + }, { name: 'Vendor-agnostic setup', url: '/guides/monitoring-and-debugging/metrics/vendor-agnostic' as `/${string}`, @@ -3626,7 +3630,7 @@ export const references = [ label: 'Management API', description: 'something about the reference', icon: '/docs/img/icons/api-icon.svg', - url: '/reference/management-api/start', + url: '/reference/api/introduction', }, ], }, diff --git a/apps/docs/content/guides/monitoring-and-debugging/metrics.mdx b/apps/docs/content/guides/monitoring-and-debugging/metrics.mdx index 98014a389669a..addbd36aba80a 100644 --- a/apps/docs/content/guides/monitoring-and-debugging/metrics.mdx +++ b/apps/docs/content/guides/monitoring-and-debugging/metrics.mdx @@ -39,5 +39,6 @@ Pick the workflow that best matches your tooling. Cards link to Supabase-authore - [Supabase Grafana repository](https://github.com/supabase/supabase-grafana) for dashboard JSON and alert examples. - [Grafana Cloud’s Supabase integration doc](https://grafana.com/docs/grafana-cloud/monitor-infrastructure/integrations/integration-reference/integration-supabase/) (community-maintained, built on this Metrics API). - [Datadog’s Supabase integration doc](https://docs.datadoghq.com/integrations/supabase/) (community-maintained, built on this Metrics API). +- [Elastic’s Supabase integration doc](https://www.elastic.co/docs/reference/integrations/supabase) (community-maintained). - [Log Drains ](/docs/guides/monitoring-and-debugging/log-drains) for exporting event-based telemetry alongside metrics. - [Query Performance report](/dashboard/project/_/observability/query-performance) for built-in visualizations based on the same underlying metrics. diff --git a/apps/docs/content/guides/platform/privatelink.mdx b/apps/docs/content/guides/platform/privatelink.mdx index 2ccb08fc65f4e..a934dc535bd23 100644 --- a/apps/docs/content/guides/platform/privatelink.mdx +++ b/apps/docs/content/guides/platform/privatelink.mdx @@ -6,7 +6,7 @@ description: 'Secure private network connectivity to your Supabase database usin -PrivateLink is currently in beta and available only to Team and Enterprise customers. +PrivateLink is available only to Team and Enterprise customers. Contact support if you would like to create a PrivateLink connection for a read-only replica. @@ -20,13 +20,12 @@ By enabling PrivateLink, database connections never traverse the public internet Supabase PrivateLink is an organisation level configuration. It works by sharing a [VPC Lattice Resource Configuration](https://docs.aws.amazon.com/vpc-lattice/latest/ug/resource-configuration.html) to any number of AWS Accounts for each of your Supabase projects. Connectivity can be achieved by either associating the Resource Configuration to a PrivateLink endpoint, or a [VPC Lattice Service Network](https://docs.aws.amazon.com/vpc-lattice/latest/ug/service-networks.html). This means: - Database traffic flows through private AWS infrastructure only -- Connection latency is typically reduced compared to public internet routing - Network isolation provides enhanced security posture - Attack surface is minimized by eliminating public exposure The connection architecture changes from public internet routing to a dedicated private path through AWS's secure network backbone. -Supabase PrivateLink currently supports direct database and PgBouncer connections only. It does not support other Supabase services like API, Storage, Auth, or Realtime. These services will continue to operate over public internet connections. +Supabase PrivateLink supports direct database connections on port `5432` and PgBouncer connections on port `6543`. It does not support other Supabase services like API, Storage, Auth, or Realtime. These services will continue to operate over public internet connections. ## Requirements @@ -76,9 +75,11 @@ Ensure your security groups allow traffic on the appropriate ports: 1. Navigate to the [VPC console > Security Groups](https://console.aws.amazon.com/vpcconsole/home#SecurityGroups:) 2. Create a new security group for the endpoint or service network by clicking [Create security group](https://console.aws.amazon.com/vpcconsole/home#CreateSecurityGroup:) 3. Give your security group a descriptive name and select the appropriate VPC -4. Add an inbound rule for: - - Type: Postgres (TCP, port 5432) - - Destination that is appropriate for your network. i.e. the subnet of your VPC or security group of your application instances +4. Add inbound rule(s) for the connection mode you use: + - Direct connection: Postgres (TCP, port `5432`) + - PgBouncer connection: Custom TCP (port `6543`) + - If you use both direct and PgBouncer connections, add both rules + - Set the destination appropriate for your network (for example, your VPC subnet or your application instances' security group) 5. Finish creating the security group by clicking **Create security group** ### Step 4: Create connection @@ -127,7 +128,11 @@ Verify the private connection is working correctly from your VPC: 3. Test the connection using the private endpoint: ```bash +# Direct connection (Postgres) psql "postgresql://[username]:[password]@[private-endpoint]:5432/postgres" + +# PgBouncer connection +psql "postgresql://[username]:[password]@[private-endpoint]:6543/postgres" ``` You should see a successful connection without any public internet traffic. @@ -141,27 +146,33 @@ Configure your applications to use the private connection details: 3. Update any database connection pooling configurations 4. Test application connectivity thoroughly -Example connection string update: +Example connection string updates: ``` +# Direct connection (Postgres) # Before (public) postgresql://user:pass@db.[project-ref].supabase.co:5432/postgres # After (private) postgresql://user:pass@your-private-endpoint.vpce.amazonaws.com:5432/postgres -``` -### Step 7: Disable public connectivity (optional) +# PgBouncer connection +# Before (public) +postgresql://user:pass@db.[project-ref].supabase.co:6543/postgres + +# After (private) +postgresql://user:pass@your-private-endpoint.vpce.amazonaws.com:6543/postgres +``` -For maximum security, you can disable public internet access for your database: +### Step 7: Restrict public database access (optional) -1. Contact Supabase support to disable public connectivity -2. Ensure all applications are successfully using the private connection -3. Update any monitoring or backup tools to use the private endpoint +For maximum security, you can restrict public database access in your project settings: -## Beta limitations +1. Go to [**Database** > **Settings**](/dashboard/project/_/database/settings) +2. In **Network Restrictions**, enable **Restrict all access** +3. Ensure all applications, monitoring, and backup tools are using the private endpoint before enabling this setting -During the beta phase: +## Limitations - **Read Replicas**: To establish PrivateLink with a Read Replica, reach out to your account rep. - **Feature Evolution**: The setup process and capabilities may evolve as we refine the offering diff --git a/apps/docs/content/guides/security/platform-security.mdx b/apps/docs/content/guides/security/platform-security.mdx index 43003089c3b1d..e6ed64b34c023 100644 --- a/apps/docs/content/guides/security/platform-security.mdx +++ b/apps/docs/content/guides/security/platform-security.mdx @@ -61,6 +61,6 @@ For configuration information, see [PrivateLink](/docs/guides/platform/privateli -PrivateLink is currently in beta. To establish PrivateLink with a Read Replica, reach out to your account rep. +To establish PrivateLink with a Read Replica, reach out to your account rep. diff --git a/apps/docs/content/troubleshooting/schema-pg_pgrst_no_exposed_schemas-does-not-exist.mdx b/apps/docs/content/troubleshooting/schema-pg_pgrst_no_exposed_schemas-does-not-exist.mdx index 41e41acd67ebb..3124757bbf0f2 100644 --- a/apps/docs/content/troubleshooting/schema-pg_pgrst_no_exposed_schemas-does-not-exist.mdx +++ b/apps/docs/content/troubleshooting/schema-pg_pgrst_no_exposed_schemas-does-not-exist.mdx @@ -19,3 +19,38 @@ PostgREST logs showing the error: - Currently, we don't really shutdown PostgREST when the Data API is disabled. You will see a schema called `pg_pgrst_no_exposed_schemas` added in the exposed schemas. - This should not adversely affect the project, although it may result in additional entries in your logs. - We're aware of this issue and are working on it. + +## Workaround + +To stop the missing-schema log entries: + +1. Open the SQL Editor. +2. Run the following statements: + + ```sql + -- Create a schema with nothing inside + create schema pgrst_no_exposed_schemas; + + -- Set the db-schemas configuration + alter role authenticator set pgrst.db_schemas = 'pgrst_no_exposed_schemas'; + + -- Reload PostgREST's schema cache and configuration + notify pgrst; + ``` + +PostgREST now exposes an empty schema, which stops the missing-schema errors. + +## Re-enable the Data API + +Before you re-enable the data API: + +1. Open the SQL Editor. +2. Run the following statements: + + ```sql + -- Reset the db-schemas configuration + alter role authenticator reset pgrst.db_schemas; + + -- Reload PostgREST's schema cache and configuration + notify pgrst; + ``` diff --git a/apps/docs/features/docs/Reference.apiPage.tsx b/apps/docs/features/docs/Reference.apiPage.tsx index 3e77558f3e6a0..e8344cb3a8560 100644 --- a/apps/docs/features/docs/Reference.apiPage.tsx +++ b/apps/docs/features/docs/Reference.apiPage.tsx @@ -1,13 +1,32 @@ +import { notFound, redirect } from 'next/navigation' + import { MenuId } from '~/components/Navigation/NavigationMenu/NavigationMenu' import { reference_api } from '~/components/Navigation/NavigationMenu/NavigationMenu.constants' -import { ClientLibIntroduction } from '~/features/docs/Reference.introduction' +import { getSectionsBySlug } from '~/features/docs/Reference.generated.singleton' import { ReferenceNavigation } from '~/features/docs/Reference.navigation' import { ReferenceContentScrollHandler } from '~/features/docs/Reference.navigation.client' -import { RefSections } from '~/features/docs/Reference.sections' +import { SectionSwitch } from '~/features/docs/Reference.sections' import { LayoutMainContent } from '~/layouts/DefaultLayout' import { SidebarSkeleton } from '~/layouts/MainSkeleton' -export async function ApiReferencePage() { +export async function ApiReferencePage({ path }: { path: Array }) { + const operationSlug = path[0] + + if (!operationSlug) { + redirect('/reference/api/introduction') + } + + return +} + +// DOCS-1268: one endpoint per page, reusing the same SectionSwitch (and +// therefore the same ApiEndpointSection/MarkdownSection) that used to render +// every operation on the single monolithic /reference/api page. +async function ApiOperationPage({ operationSlug }: { operationSlug: string }) { + const sectionsBySlug = await getSectionsBySlug('api', 'latest') + const section = sectionsBySlug?.get(operationSlug) + if (!section) notFound() + return ( } >
- - +
diff --git a/apps/docs/features/docs/Reference.navigation.client.tsx b/apps/docs/features/docs/Reference.navigation.client.tsx index 4ddf294fd202b..b676573baaf06 100644 --- a/apps/docs/features/docs/Reference.navigation.client.tsx +++ b/apps/docs/features/docs/Reference.navigation.client.tsx @@ -239,11 +239,16 @@ export function RefLink({ section, skipChildren = false, className, + realNavigation, }: { basePath: string section: AbbrevApiReferenceSection skipChildren?: boolean className?: string + // Spike (DOCS-1268): when true, this link does a real navigation instead of + // the scroll-hijack below — used only by the API reference, whose endpoints + // are now real pages. Undefined everywhere else preserves current behavior. + realNavigation?: boolean }) { const ref = useRef(null) @@ -260,8 +265,11 @@ export function RefLink({ }, [isActive, className]) const onClick = useCallback( - (evt: MouseEvent) => createReferenceSubsectionNavigator(href, section.slug)(evt), - [href, section.slug] + (evt: MouseEvent) => { + if (realNavigation) return + createReferenceSubsectionNavigator(href, section.slug)(evt) + }, + [href, section.slug, realNavigation] ) if (!('title' in section)) return null @@ -272,13 +280,13 @@ export function RefLink({ return ( <> {isCompoundSection ? ( - + ) : ( { return (
  • - +
  • ) })} diff --git a/apps/docs/features/docs/Reference.navigation.tsx b/apps/docs/features/docs/Reference.navigation.tsx index 51e594b2874c2..393624245c307 100644 --- a/apps/docs/features/docs/Reference.navigation.tsx +++ b/apps/docs/features/docs/Reference.navigation.tsx @@ -19,6 +19,10 @@ interface ReferenceNavigationProps { libPath: string version: string isLatestVersion: boolean + // Spike (DOCS-1268): API reference sidebar links navigate to real pages + // instead of scrolling within one giant page. SDK/CLI/self-hosting callers + // never pass this, so their behavior is unchanged. + realNavigation?: boolean } export async function ReferenceNavigation({ @@ -28,6 +32,7 @@ export async function ReferenceNavigation({ libPath, version, isLatestVersion, + realNavigation, }: ReferenceNavigationProps) { const navSections = await getReferenceSections(libraryId, version) const filteredNavSections = navSections?.filter((section) => section.title !== 'Auth') @@ -46,11 +51,11 @@ export async function ReferenceNavigation({ {displayedNavSections?.map((section, index) => section.type === 'category' ? (
  • - +
  • ) : (
  • - +
  • ) )} @@ -64,9 +69,11 @@ const topLvlRefNavItemStyles = 'leading-5' function RefCategory({ basePath, section, + realNavigation, }: { basePath: string section: AbbrevApiReferenceSection + realNavigation?: boolean }) { if (!('items' in section && section.items && section.items.length > 0)) return null @@ -77,7 +84,7 @@ function RefCategory({
      {section.items?.map((item) => (
    • - +
    • ))}
    diff --git a/apps/docs/features/docs/Reference.utils.ts b/apps/docs/features/docs/Reference.utils.ts index 5824f27901afd..5fe986caaee44 100644 --- a/apps/docs/features/docs/Reference.utils.ts +++ b/apps/docs/features/docs/Reference.utils.ts @@ -95,6 +95,21 @@ async function generateStaticParamsForSdkVersion(sdkId: string, version: string) })) } +// Spike (DOCS-1268): one static page per Management API endpoint, in addition +// to the existing bare `/reference/api` monolith. Deliberately does not reuse +// generateStaticParamsForSdkVersion's output shape — that function bakes in a +// 'crawlers' path segment for a separate crawler-only mechanism unrelated to +// these human-facing per-operation URLs. +async function generateStaticParamsForApi() { + const flattenedSections = await getFlattenedSections('api', 'latest') + + return (flattenedSections || []) + .filter((section) => section.type !== 'category' && !!section.slug) + .map((section) => ({ + slug: ['api', section.slug], + })) +} + export async function generateReferenceStaticParams() { const sdkPages = clientSdkIds .flatMap((sdkId) => @@ -117,6 +132,7 @@ export async function generateReferenceStaticParams() { { slug: ['api'], }, + ...(await generateStaticParamsForApi()), ] const selfHostingPages = selfHostingServices.map((service) => ({ @@ -178,9 +194,35 @@ export async function generateReferenceMetadata( description: 'CLI reference for the Supabase CLI', } } else if (isApiReference) { + const { path } = parsedPath + const operationSlug = path[0] + + const flattenedSections = operationSlug + ? await getFlattenedSections('api', 'latest') + : undefined + const sectionTitle = flattenedSections?.find((section) => section.slug === operationSlug)?.title + + const url = [BASE_PATH, 'reference', 'api', operationSlug].filter(Boolean).join('/') + const images = generateOpenGraphImageMeta({ + type: 'API Reference', + title: `Management API${sectionTitle ? `: ${sectionTitle}` : ''}`, + }) + return { - title: 'Management API Reference | Supabase Docs', - description: 'Management API reference for the Supabase API', + title: `${sectionTitle ? `${sectionTitle} | ` : ''}Management API Reference | Supabase Docs`, + description: `Management API reference for the Supabase API${sectionTitle ? `: ${sectionTitle}` : ''}`, + ...(operationSlug + ? { + alternates: { + canonical: url, + }, + } + : {}), + openGraph: { + ...parentOg, + url, + images, + }, } } else if (isSelfHostingReference) { return { diff --git a/apps/docs/middleware.ts b/apps/docs/middleware.ts index fd885725c23be..cd31319d43f1d 100644 --- a/apps/docs/middleware.ts +++ b/apps/docs/middleware.ts @@ -63,7 +63,10 @@ export function middleware(request: NextRequest) { return NextResponse.rewrite(new URL(rewritePath, request.url)) } - if (lib === 'api') { + // Spike (DOCS-1268): only the bare /reference/api needs normalizing now. + // /reference/api/ has its own statically generated page — don't + // collapse it back to the monolith. + if (lib === 'api' && !maybeVersion) { const rewritePath = [REFERENCE_PATH, 'api'].join('/') return NextResponse.rewrite(new URL(rewritePath, request.url)) } diff --git a/apps/docs/public/humans.txt b/apps/docs/public/humans.txt index dfba1de529876..990fd6c989ee7 100644 --- a/apps/docs/public/humans.txt +++ b/apps/docs/public/humans.txt @@ -241,6 +241,7 @@ Qiao Han Quintin Willison Rafael Chacón Raminder Singh +Rand Arete Raúl Barroso Riccardo Busetti Richard Kasprzak diff --git a/apps/www/data/features.tsx b/apps/www/data/features.tsx index 0d9c62aaa1420..328b9db7630f3 100644 --- a/apps/www/data/features.tsx +++ b/apps/www/data/features.tsx @@ -672,7 +672,7 @@ Schema change support is currently in beta and limited to supported BigQuery cha Pipelines keeps the current destination table state synchronized. It does not automatically create a queryable history of every row version.`, icon: CloudCog, products: [PRODUCT_SHORTNAMES.DATABASE], - heroImage: '', + heroImage: 'https://www.youtube-nocookie.com/embed/8o3duiYqppA', docsUrl: 'https://supabase.com/docs/guides/database/replication/pipelines', slug: 'supabase-pipelines', status: { diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 2ec7c41125d95..866bef5ec9ebc 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -2081,7 +2081,17 @@ module.exports = [ { permanent: true, source: '/docs/reference/api', - destination: '/docs/reference/api/start', + destination: '/docs/reference/api/introduction', + }, + // 'start' was never a real API reference slug — it only ever worked because + // the old /reference/api/* routing collapsed every sub-path to the same + // monolith, and the bare /docs/reference/api redirect pointed here for years. + // Keep redirecting so external links and bookmarks don't 404 now that only + // real slugs resolve. + { + permanent: true, + source: '/docs/reference/api/start', + destination: '/docs/reference/api/introduction', }, { permanent: true, diff --git a/docker/CHANGELOG.md b/docker/CHANGELOG.md index 20b48fe1c1467..96081665b1633 100644 --- a/docker/CHANGELOG.md +++ b/docker/CHANGELOG.md @@ -11,8 +11,42 @@ See per-service updates below for details. Only the most important changes relev --- ## Unreleased +- Self-hosted Supabase: Envoy becomes the default API gateway (breaking change) [#48048](https://github.com/orgs/supabase/discussions/48048) (PR [#48153](https://github.com/supabase/supabase/pull/48153)) -Check the main Supabase [changelog](https://github.com/orgs/supabase/discussions/categories/changelog?discussions_q=is%3Aopen+category%3AChangelog+label%3Aself-hosted) for updates. +--- + +## [0.7.1](https://github.com/supabase/supabase/releases/tag/self-hosted/v0.7.1) - 2026-08-03 + +### Configuration +- Added `SUPABASE_JWKS` configuration for Edge Functions to `docker-compose.yml` - PR [#45635](https://github.com/supabase/supabase/pull/45635) +- Added `upgrades.json` - a version-keyed manifest to gate breaking changes (required for `update.sh`) - PR [#47851](https://github.com/supabase/supabase/pull/47851) +- Updated `.gitignore` (required for `update.sh`) + +### Documentation +- Added new how-to guides ([Custom Postgres Extensions](https://supabase.com/docs/guides/self-hosting/custom-postgres-extensions) and [Update Your Self-Hosted Deployment](https://supabase.com/docs/guides/self-hosting/updating)) - PR [#48203](https://github.com/supabase/supabase/pull/48203), PR [#48535](https://github.com/supabase/supabase/pull/48535) + +### Utils and tests +- Added base version stamp to `setup.sh` (saved in `.supabase-version`, required for `update.sh`) - PR [#47848](https://github.com/supabase/supabase/pull/47848) +- Added `update.sh`. Refer to [Update Your Self-Hosted Deployment](https://supabase.com/docs/guides/self-hosting/updating) - PR [#47851](https://github.com/supabase/supabase/pull/47851) +- Added `SUPABASE_JWKS` configuration for Edge Functions to `utils/add-new-auth-keys.sh` - PR [#45635](https://github.com/supabase/supabase/pull/45635) +- Updated `tests/test-s3.sh` and `test-s3-backend.sh` - PR [#48500](https://github.com/supabase/supabase/pull/48500) + +### API gateway +- Updated Kong to `3.9.3` +- Added `KONG_DNS_VALID_TTL` configuration environment variable (requires `docker-compose.yml` update) - PR [#47846](https://github.com/supabase/supabase/pull/47846) +- Updated Envoy to `1.39.0` (requires `docker-compose.envoy.yml` update) +- Updated [nginx-certbot](https://github.com/JonasAlfredsson/docker-nginx-certbot) to `6.2.0-nginx1.31.3` (requires `docker-compose.nginx.yml` update) + +### Studio +- Updated to `2026.08.03-sha-022b374` +- Fixed URL generation for Edge Functions - PR [#47861](https://github.com/supabase/supabase/pull/47861) (via [@7ttp](https://github.com/7ttp)) +- Fixed the Logs tab visibility in **Auth > Users** - PR [#48122](https://github.com/supabase/supabase/pull/48122) (via [@luizfelmach](https://github.com/luizfelmach/)) + +### Storage +- Changed RustFS image to `1.0.0-beta.11` temporarily (requires `docker-compose.rustfs.yml` update) - PR [#48500](https://github.com/supabase/supabase/pull/48500) + +### Edge Runtime +- Changed JWKS configuration mechanism for main worker (requires `docker-compose.yml` and `volumes/functions/main/index.ts` update) - PR [#45635](https://github.com/supabase/supabase/pull/45635) --- @@ -42,8 +76,8 @@ Check the main Supabase [changelog](https://github.com/orgs/supabase/discussions ### Studio - Updated to `2026.07.07-sha-a6a04f2` - Fixed the local SQL snippets not being shown in the SQL Editor - PR [#47403](https://github.com/supabase/supabase/pull/47403), PR [#47409](https://github.com/supabase/supabase/pull/47409) -- Fixed the exposed schemas and tables UI to properly reflect non-platform configuration (Data API > Settings) - PR [#47511](https://github.com/supabase/supabase/pull/47511) -- Fixed the behavior of the type generator (Data API > Docs) - PR [#47577](https://github.com/supabase/supabase/pull/47577) +- Fixed the exposed schemas and tables UI to properly reflect non-platform configuration (**Data API > Settings**) - PR [#47511](https://github.com/supabase/supabase/pull/47511) +- Fixed the behavior of the type generator (**Data API > Docs**) - PR [#47577](https://github.com/supabase/supabase/pull/47577) ### Auth - ⚠️ Changed Auth configuration placeholders to match the new default `API_EXTERNAL_URL` (requires `docker-compose.yml` update) - PR [#47640](https://github.com/supabase/supabase/pull/47640) diff --git a/docker/docker-compose.envoy.yml b/docker/docker-compose.envoy.yml index 38391afd7cdcb..8a2d706ffdba3 100644 --- a/docker/docker-compose.envoy.yml +++ b/docker/docker-compose.envoy.yml @@ -16,7 +16,7 @@ services: # Envoy API gateway api-gw: container_name: supabase-envoy - image: envoyproxy/envoy:v1.38.0 + image: envoyproxy/envoy:v1.39.0 restart: unless-stopped ports: - ${KONG_HTTP_PORT}:8000/tcp diff --git a/docker/docker-compose.nginx.yml b/docker/docker-compose.nginx.yml index 412f2fb50a495..7c1f915d7e88e 100644 --- a/docker/docker-compose.nginx.yml +++ b/docker/docker-compose.nginx.yml @@ -20,7 +20,7 @@ services: nginx: container_name: supabase-nginx - image: jonasal/nginx-certbot:6.2.0-nginx1.31.0 + image: jonasal/nginx-certbot:6.2.0-nginx1.31.3 restart: unless-stopped ports: - "80:80" diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 12b7efe9d0549..d34a43fe75597 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -14,7 +14,7 @@ services: studio: container_name: supabase-studio - image: supabase/studio:2026.07.07-sha-a6a04f2 + image: supabase/studio:2026.08.03-sha-022b374 restart: unless-stopped healthcheck: test: @@ -67,7 +67,7 @@ services: kong: container_name: supabase-kong - image: kong/kong:3.9.1 + image: kong/kong:3.9.3 restart: unless-stopped networks: default: diff --git a/docker/versions.md b/docker/versions.md index c3714f7e6baa2..36792c99c0976 100644 --- a/docker/versions.md +++ b/docker/versions.md @@ -1,4 +1,8 @@ -# Docker Image Versions +# Docker image version updates in docker-compose.yml + +## 2026-08-03 +- supabase/studio:2026.08.03-sha-022b374 (prev supabase/studio:2026.07.07-sha-a6a04f2) +- kong/kong:3.9.3 (prev kong/kong:3.9.1) ## 2026-07-07 - supabase/studio:2026.07.07-sha-a6a04f2 (prev supabase/studio:2026.06.03-sha-0bca601) diff --git a/packages/icons/__registry__/index.tsx b/packages/icons/__registry__/index.tsx index ef6d1913e9874..6c75467e9ee6a 100644 --- a/packages/icons/__registry__/index.tsx +++ b/packages/icons/__registry__/index.tsx @@ -154,6 +154,16 @@ export const Index: Record = [ svg: "\n \n \n \n \n", jsx: "import { EdgeFunctions } from \"icons\"\n \n " }, +{ + name: "elastic", + componentName: "Elastic", + deprecated: false, + raw: "import createSupabaseIcon from '../createSupabaseIcon';\n\n/**\n * @component @name Elastic\n * @description Supabase SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBmaWxsPSIjMEI2NEREIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS4yIiBkPSJNMjcuNTY1IDExLjI0MmM1LjEgMS45NCA0Ljg3MiA5LjM5Ni0uMjQ1IDExLjEyN2wtLjE2Mi4wNTUtLjE2Ny0uMDM5LTUuMjgtMS4yMzgtLjI2OC0uMDYzLS4xMjctLjI0NC0xLjQtMi42OS0uMjE3LS40MTcuMzUyLS4zMSA2LjkwNC02LjA3LjI3Mi0uMjQuMzM4LjEzWiIvPgo8cGF0aCBmaWxsPSIjOUFEQzMwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS4yIiBkPSJtMjIuMDQ3IDIxLjIzOSA0LjggMS4xMjUuMzE2LjA3NC4xMS4zMDQuMDY2LjE5Yy42MjMgMS45NjQtLjI2IDMuNzgtMS42NTIgNC43OTctMS40MzQgMS4wNDgtMy41MSAxLjMyLTUuMTgyLjAyMmwtLjI5LS4yMjUuMDY5LS4zNjEgMS4wMzctNS40NTQuMTE3LS42MTUuNjEuMTQzWiIvPgo8cGF0aCBmaWxsPSIjMUJBOUY1IiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS4yIiBkPSJtNS4wMSA5LjYzIDUuMjY3IDEuMjU1LjI4My4wNjcuMTIyLjI2NCAxLjIzNSAyLjY1LjE4Ny40LS4zMjguMjk4LTYuNzMzIDYuMS0uMjcyLjI0OC0uMzQ1LS4xMzJDMS45MzkgMTkuODMuNzIgMTcuNDU2Ljc1MiAxNS4xNTNjLjAzMi0yLjMwOCAxLjMyMS00LjY0NCAzLjkzMi01LjUwOGwuMTYyLS4wNTQuMTY1LjAzOVoiLz4KPHBhdGggZmlsbD0iI0YwNEU5OCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEuMiIgZD0iTTYuMjgxIDQuMzJjMS40MTYtMS4wOCAzLjQ4LTEuMzg3IDUuMjIyLS4wNjlsLjI5Ny4yMjYtLjA3LjM2Ni0xLjA1MyA1LjQ3NC0uMTE4LjYxNS0uNjA5LS4xNDQtNC44LTEuMTM3LS4zMTYtLjA3NS0uMTEtLjMwNmMtLjcwOS0xLjk2Ny4xNDktMy44NzYgMS41NTctNC45NVoiLz4KPHBhdGggZmlsbD0iIzAyQkNCNyIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEuMiIgZD0ibTEyLjQ2NiAxNC40MzMgNy4wMyAzLjIxMS4xODguMDg2LjA5NS4xODMgMS41NTUgMi45ODUuMDk2LjE4NC0uMDQuMjA2LTEuMTY1IDYuMTAxLS4wMjQuMTIyLS4wNjguMTAzYy0yLjY4IDMuOTU4LTYuOTAyIDQuNzEtMTAuMjY4IDMuMjYtMy4zNTYtMS40NDctNS44MzQtNS4wNy01LjEyNi05LjczNmwuMDMzLS4yMS4xNTgtLjE0NCA2Ljg4NC02LjI1LjI5My0uMjY1LjM2LjE2NFoiLz4KPHBhdGggZmlsbD0iI0ZFQzUxNCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEuMiIgZD0iTTExLjg5MiA0LjQxQzE0LjQzOC42NzYgMTguNzQxLjEwNSAyMi4xMzQgMS41NGMzLjM5MiAxLjQzMyA1Ljk5IDQuOTIgNS4xMDIgOS4zNjJsLS4wMzkuMi0uMTUzLjEzMy03LjA2NiA2LjIxMy0uMjkzLjI1OC0uMzUzLS4xNjMtNy4wMDItMy4yMS0uMjAxLS4wOTMtLjA5NC0uMi0xLjM4LTIuOTg4LS4wODEtLjE3Ny4wMzctLjE5TDExLjggNC42MzNsLjAyMy0uMTIxLjA3LS4xMDJaIi8+Cjwvc3ZnPgo=)\n *\n * @param {Object} props - Supabase icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Elastic = createSupabaseIcon(\n 'Elastic',\n [\n [\n 'path',\n {\n fill: '#0B64DD',\n stroke: '#fff',\n 'stroke-width': '1.2',\n d: 'M27.565 11.242c5.1 1.94 4.872 9.396-.245 11.127l-.162.055-.167-.039-5.28-1.238-.268-.063-.127-.244-1.4-2.69-.217-.417.352-.31 6.904-6.07.272-.24.338.13Z',\n key: 'el1',\n },\n ],\n [\n 'path',\n {\n fill: '#9ADC30',\n stroke: '#fff',\n 'stroke-width': '1.2',\n d: 'm22.047 21.239 4.8 1.125.316.074.11.304.066.19c.623 1.964-.26 3.78-1.652 4.797-1.434 1.048-3.51 1.32-5.182.022l-.29-.225.069-.361 1.037-5.454.117-.615.61.143Z',\n key: 'el2',\n },\n ],\n [\n 'path',\n {\n fill: '#1BA9F5',\n stroke: '#fff',\n 'stroke-width': '1.2',\n d: 'm5.01 9.63 5.267 1.255.283.067.122.264 1.235 2.65.187.4-.328.298-6.733 6.1-.272.248-.345-.132C1.939 19.83.72 17.456.752 15.153c.032-2.308 1.321-4.644 3.932-5.508l.162-.054.165.039Z',\n key: 'el3',\n },\n ],\n [\n 'path',\n {\n fill: '#F04E98',\n stroke: '#fff',\n 'stroke-width': '1.2',\n d: 'M6.281 4.32c1.416-1.08 3.48-1.387 5.222-.069l.297.226-.07.366-1.053 5.474-.118.615-.609-.144-4.8-1.137-.316-.075-.11-.306c-.709-1.967.149-3.876 1.557-4.95Z',\n key: 'el4',\n },\n ],\n [\n 'path',\n {\n fill: '#02BCB7',\n stroke: '#fff',\n 'stroke-width': '1.2',\n d: 'm12.466 14.433 7.03 3.211.188.086.095.183 1.555 2.985.096.184-.04.206-1.165 6.101-.024.122-.068.103c-2.68 3.958-6.902 4.71-10.268 3.26-3.356-1.447-5.834-5.07-5.126-9.736l.033-.21.158-.144 6.884-6.25.293-.265.36.164Z',\n key: 'el5',\n },\n ],\n [\n 'path',\n {\n fill: '#FEC514',\n stroke: '#fff',\n 'stroke-width': '1.2',\n d: 'M11.892 4.41C14.438.676 18.741.105 22.134 1.54c3.392 1.433 5.99 4.92 5.102 9.362l-.039.2-.153.133-7.066 6.213-.293.258-.353-.163-7.002-3.21-.201-.093-.094-.2-1.38-2.988-.081-.177.037-.19L11.8 4.633l.023-.121.07-.102Z',\n key: 'el6',\n },\n ],\n ],\n { fill: 'none', stroke: 'none', viewBox: '0 0 32 32' },\n);\n\nexport default Elastic;\n", + component: React.lazy(() => import('icons/src/icons/elastic')), + import: "import { Elastic } from 'icons'", + svg: "\n\n\n\n\n\n\n\n", + jsx: "import { Elastic } from \"icons\"\n \n " +}, { name: "files-bucket", componentName: "FilesBucket", diff --git a/packages/icons/src/icons/elastic.ts b/packages/icons/src/icons/elastic.ts new file mode 100644 index 0000000000000..3363932c4e4a3 --- /dev/null +++ b/packages/icons/src/icons/elastic.ts @@ -0,0 +1,80 @@ +import createSupabaseIcon from '../createSupabaseIcon'; + +/** + * @component @name Elastic + * @description Supabase SVG icon component, renders SVG Element with children. + * + * @preview ![img](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBmaWxsPSIjMEI2NEREIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS4yIiBkPSJNMjcuNTY1IDExLjI0MmM1LjEgMS45NCA0Ljg3MiA5LjM5Ni0uMjQ1IDExLjEyN2wtLjE2Mi4wNTUtLjE2Ny0uMDM5LTUuMjgtMS4yMzgtLjI2OC0uMDYzLS4xMjctLjI0NC0xLjQtMi42OS0uMjE3LS40MTcuMzUyLS4zMSA2LjkwNC02LjA3LjI3Mi0uMjQuMzM4LjEzWiIvPgo8cGF0aCBmaWxsPSIjOUFEQzMwIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS4yIiBkPSJtMjIuMDQ3IDIxLjIzOSA0LjggMS4xMjUuMzE2LjA3NC4xMS4zMDQuMDY2LjE5Yy42MjMgMS45NjQtLjI2IDMuNzgtMS42NTIgNC43OTctMS40MzQgMS4wNDgtMy41MSAxLjMyLTUuMTgyLjAyMmwtLjI5LS4yMjUuMDY5LS4zNjEgMS4wMzctNS40NTQuMTE3LS42MTUuNjEuMTQzWiIvPgo8cGF0aCBmaWxsPSIjMUJBOUY1IiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS4yIiBkPSJtNS4wMSA5LjYzIDUuMjY3IDEuMjU1LjI4My4wNjcuMTIyLjI2NCAxLjIzNSAyLjY1LjE4Ny40LS4zMjguMjk4LTYuNzMzIDYuMS0uMjcyLjI0OC0uMzQ1LS4xMzJDMS45MzkgMTkuODMuNzIgMTcuNDU2Ljc1MiAxNS4xNTNjLjAzMi0yLjMwOCAxLjMyMS00LjY0NCAzLjkzMi01LjUwOGwuMTYyLS4wNTQuMTY1LjAzOVoiLz4KPHBhdGggZmlsbD0iI0YwNEU5OCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEuMiIgZD0iTTYuMjgxIDQuMzJjMS40MTYtMS4wOCAzLjQ4LTEuMzg3IDUuMjIyLS4wNjlsLjI5Ny4yMjYtLjA3LjM2Ni0xLjA1MyA1LjQ3NC0uMTE4LjYxNS0uNjA5LS4xNDQtNC44LTEuMTM3LS4zMTYtLjA3NS0uMTEtLjMwNmMtLjcwOS0xLjk2Ny4xNDktMy44NzYgMS41NTctNC45NVoiLz4KPHBhdGggZmlsbD0iIzAyQkNCNyIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEuMiIgZD0ibTEyLjQ2NiAxNC40MzMgNy4wMyAzLjIxMS4xODguMDg2LjA5NS4xODMgMS41NTUgMi45ODUuMDk2LjE4NC0uMDQuMjA2LTEuMTY1IDYuMTAxLS4wMjQuMTIyLS4wNjguMTAzYy0yLjY4IDMuOTU4LTYuOTAyIDQuNzEtMTAuMjY4IDMuMjYtMy4zNTYtMS40NDctNS44MzQtNS4wNy01LjEyNi05LjczNmwuMDMzLS4yMS4xNTgtLjE0NCA2Ljg4NC02LjI1LjI5My0uMjY1LjM2LjE2NFoiLz4KPHBhdGggZmlsbD0iI0ZFQzUxNCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEuMiIgZD0iTTExLjg5MiA0LjQxQzE0LjQzOC42NzYgMTguNzQxLjEwNSAyMi4xMzQgMS41NGMzLjM5MiAxLjQzMyA1Ljk5IDQuOTIgNS4xMDIgOS4zNjJsLS4wMzkuMi0uMTUzLjEzMy03LjA2NiA2LjIxMy0uMjkzLjI1OC0uMzUzLS4xNjMtNy4wMDItMy4yMS0uMjAxLS4wOTMtLjA5NC0uMi0xLjM4LTIuOTg4LS4wODEtLjE3Ny4wMzctLjE5TDExLjggNC42MzNsLjAyMy0uMTIxLjA3LS4xMDJaIi8+Cjwvc3ZnPgo=) + * + * @param {Object} props - Supabase icons props and any valid SVG attribute + * @returns {JSX.Element} JSX Element + * + */ +const Elastic = createSupabaseIcon( + 'Elastic', + [ + [ + 'path', + { + fill: '#0B64DD', + stroke: '#fff', + 'stroke-width': '1.2', + d: 'M27.565 11.242c5.1 1.94 4.872 9.396-.245 11.127l-.162.055-.167-.039-5.28-1.238-.268-.063-.127-.244-1.4-2.69-.217-.417.352-.31 6.904-6.07.272-.24.338.13Z', + key: 'el1', + }, + ], + [ + 'path', + { + fill: '#9ADC30', + stroke: '#fff', + 'stroke-width': '1.2', + d: 'm22.047 21.239 4.8 1.125.316.074.11.304.066.19c.623 1.964-.26 3.78-1.652 4.797-1.434 1.048-3.51 1.32-5.182.022l-.29-.225.069-.361 1.037-5.454.117-.615.61.143Z', + key: 'el2', + }, + ], + [ + 'path', + { + fill: '#1BA9F5', + stroke: '#fff', + 'stroke-width': '1.2', + d: 'm5.01 9.63 5.267 1.255.283.067.122.264 1.235 2.65.187.4-.328.298-6.733 6.1-.272.248-.345-.132C1.939 19.83.72 17.456.752 15.153c.032-2.308 1.321-4.644 3.932-5.508l.162-.054.165.039Z', + key: 'el3', + }, + ], + [ + 'path', + { + fill: '#F04E98', + stroke: '#fff', + 'stroke-width': '1.2', + d: 'M6.281 4.32c1.416-1.08 3.48-1.387 5.222-.069l.297.226-.07.366-1.053 5.474-.118.615-.609-.144-4.8-1.137-.316-.075-.11-.306c-.709-1.967.149-3.876 1.557-4.95Z', + key: 'el4', + }, + ], + [ + 'path', + { + fill: '#02BCB7', + stroke: '#fff', + 'stroke-width': '1.2', + d: 'm12.466 14.433 7.03 3.211.188.086.095.183 1.555 2.985.096.184-.04.206-1.165 6.101-.024.122-.068.103c-2.68 3.958-6.902 4.71-10.268 3.26-3.356-1.447-5.834-5.07-5.126-9.736l.033-.21.158-.144 6.884-6.25.293-.265.36.164Z', + key: 'el5', + }, + ], + [ + 'path', + { + fill: '#FEC514', + stroke: '#fff', + 'stroke-width': '1.2', + d: 'M11.892 4.41C14.438.676 18.741.105 22.134 1.54c3.392 1.433 5.99 4.92 5.102 9.362l-.039.2-.153.133-7.066 6.213-.293.258-.353-.163-7.002-3.21-.201-.093-.094-.2-1.38-2.988-.081-.177.037-.19L11.8 4.633l.023-.121.07-.102Z', + key: 'el6', + }, + ], + ], + { fill: 'none', stroke: 'none', viewBox: '0 0 32 32' }, +); + +export default Elastic; diff --git a/packages/icons/src/icons/index.ts b/packages/icons/src/icons/index.ts index 97174acb47c5a..4348e1c6508ba 100644 --- a/packages/icons/src/icons/index.ts +++ b/packages/icons/src/icons/index.ts @@ -13,6 +13,7 @@ export { default as ClickHouse } from './click-house'; export { default as Database } from './database'; export { default as Datadog } from './datadog'; export { default as EdgeFunctions } from './edge-functions'; +export { default as Elastic } from './elastic'; export { default as FilesBucket } from './files-bucket'; export { default as Grafana } from './grafana'; export { default as Graphql } from './graphql'; diff --git a/packages/icons/src/raw-icons/elastic.svg b/packages/icons/src/raw-icons/elastic.svg new file mode 100644 index 0000000000000..d104b19fb9310 --- /dev/null +++ b/packages/icons/src/raw-icons/elastic.svg @@ -0,0 +1,8 @@ + + + + + + + +