diff --git a/apps/docs/content/guides/getting-started/tutorials/with-solidjs.mdx b/apps/docs/content/guides/getting-started/tutorials/with-solidjs.mdx index a4f1a76f1f59a..b86dc0cea4377 100644 --- a/apps/docs/content/guides/getting-started/tutorials/with-solidjs.mdx +++ b/apps/docs/content/guides/getting-started/tutorials/with-solidjs.mdx @@ -45,7 +45,7 @@ VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. -```js src/supabaseClient.jsx +```tsx src/supabaseClient.tsx import { createClient } from '@supabase/supabase-js' const supabaseUrl = import.meta.env.VITE_SUPABASE_URL diff --git a/apps/docs/content/guides/platform/ipv4-address.mdx b/apps/docs/content/guides/platform/ipv4-address.mdx index 7a3988ca1b902..6aa9cc57251fc 100644 --- a/apps/docs/content/guides/platform/ipv4-address.mdx +++ b/apps/docs/content/guides/platform/ipv4-address.mdx @@ -26,7 +26,12 @@ IPv4 addresses are guaranteed to be static for ingress traffic. If your database ## Enabling the IPv4 add-on -You can enable the IPv4 add-on in your project's [add-ons settings](/dashboard/project/_/settings/addons). Enabling the add-on may briefly disable your database during reconfiguration. +You can enable the IPv4 add-on in your project's [add-ons settings](/dashboard/project/_/settings/addons). + + + Note that direct database connections can experience a short amount of downtime when toggling the + add-on due to DNS reconfiguration and propagation. Generally, this should be less than a minute. + ## Read replicas and IPv4 add-on diff --git a/apps/docs/spec/api_v1_openapi.json b/apps/docs/spec/api_v1_openapi.json index 6b1c9fc67bc93..1660b7e6d4502 100644 --- a/apps/docs/spec/api_v1_openapi.json +++ b/apps/docs/spec/api_v1_openapi.json @@ -314,7 +314,12 @@ "operationId": "v1-get-a-snippet", "summary": "Gets a specific SQL snippet", "parameters": [ - { "name": "id", "required": true, "in": "path", "schema": { "type": "uuid" } } + { + "name": "id", + "required": true, + "in": "path", + "schema": { "format": "uuid", "type": "string" } + } ], "responses": { "200": { @@ -2070,10 +2075,10 @@ "schema": { "type": "string" } }, { - "name": "resource_multiplier", + "name": "compute_multiplier", "required": false, "in": "query", - "schema": { "type": "string" } + "schema": { "minimum": 1, "maximum": 4, "type": "number" } } ], "requestBody": { @@ -2219,10 +2224,10 @@ "schema": { "type": "string" } }, { - "name": "resource_multiplier", + "name": "compute_multiplier", "required": false, "in": "query", - "schema": { "type": "string" } + "schema": { "minimum": 1, "maximum": 4, "type": "number" } } ], "requestBody": { @@ -2849,12 +2854,12 @@ }, "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"], + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"], "description": "Release channel. If not provided, GA will be used." }, "postgres_engine": { "type": "string", - "enum": ["15"], + "enum": ["15", "17-oriole"], "description": "Postgres engine version. If not provided, the latest version will be used." } }, @@ -3087,12 +3092,12 @@ }, "ReleaseChannel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "PostgresEngine": { "type": "string", "description": "Postgres engine version. If not provided, the latest version will be used.", - "enum": ["15"] + "enum": ["15", "17-oriole"] }, "CreateBranchBody": { "type": "object", @@ -4246,7 +4251,7 @@ "name": { "type": "string" }, "body": { "type": "string" }, "verify_jwt": { "type": "boolean" }, - "resource_multiplier": { "type": "string" } + "compute_multiplier": { "type": "number", "minimum": 1, "maximum": 4 } }, "required": ["slug", "name", "body"] }, @@ -4264,7 +4269,7 @@ "import_map": { "type": "boolean" }, "entrypoint_path": { "type": "string" }, "import_map_path": { "type": "string" }, - "resource_multiplier": { "type": "string" } + "compute_multiplier": { "type": "number" } }, "required": ["version", "created_at", "updated_at", "id", "slug", "name", "status"] }, @@ -4282,7 +4287,7 @@ "import_map": { "type": "boolean" }, "entrypoint_path": { "type": "string" }, "import_map_path": { "type": "string" }, - "resource_multiplier": { "type": "string" } + "compute_multiplier": { "type": "number" } }, "required": ["version", "created_at", "updated_at", "id", "slug", "name", "status"] }, @@ -4292,7 +4297,7 @@ "name": { "type": "string" }, "body": { "type": "string" }, "verify_jwt": { "type": "boolean" }, - "resource_multiplier": { "type": "string" } + "compute_multiplier": { "type": "number", "minimum": 1, "maximum": 4 } } }, "V1StorageBucketResponse": { diff --git a/apps/docs/spec/supabase_py_v2.yml b/apps/docs/spec/supabase_py_v2.yml index ed7dfb76977df..25a1d45ff297c 100644 --- a/apps/docs/spec/supabase_py_v2.yml +++ b/apps/docs/spec/supabase_py_v2.yml @@ -6019,9 +6019,9 @@ functions: type: string description: Set this to limit rows of foreign tables instead of the parent table. notes: | - Limit the query result by starting at an offset (`from`) and ending at the offset (`from + to`). Only records within this range are returned. This respects the query order and if there is no order clause the range could behave unexpectedly. + Limit the query result by starting at an offset (`start`) and ending at the offset (`end`). Only records within this range are returned. This respects the query order and if there is no order clause the range could behave unexpectedly. - The `from` and `to` values are 0-based and inclusive: `range(1, 3)` will include the second, third and fourth rows of the query. + The `start` and `end` values are 0-based and inclusive: `range(1, 3)` will include the second, third and fourth rows of the query. examples: - id: with-select name: With `select()` diff --git a/apps/docs/spec/transforms/api_v1_openapi_deparsed.json b/apps/docs/spec/transforms/api_v1_openapi_deparsed.json index e5f544715303b..6c6e1572af7fe 100644 --- a/apps/docs/spec/transforms/api_v1_openapi_deparsed.json +++ b/apps/docs/spec/transforms/api_v1_openapi_deparsed.json @@ -561,12 +561,12 @@ }, "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"], + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"], "description": "Release channel. If not provided, GA will be used." }, "postgres_engine": { "type": "string", - "enum": ["15"], + "enum": ["15", "17-oriole"], "description": "Postgres engine version. If not provided, the latest version will be used." } }, @@ -1027,7 +1027,8 @@ "required": true, "in": "path", "schema": { - "type": "uuid" + "format": "uuid", + "type": "string" } } ], @@ -1866,12 +1867,12 @@ }, "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "postgres_engine": { "type": "string", "description": "Postgres engine version. If not provided, the latest version will be used.", - "enum": ["15"] + "enum": ["15", "17-oriole"] }, "branch_name": { "type": "string" @@ -4052,7 +4053,7 @@ "properties": { "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "target_version": { "type": "string" @@ -4122,7 +4123,7 @@ "properties": { "current_app_version_release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "duration_estimate_hours": { "type": "integer" @@ -4144,11 +4145,11 @@ "postgres_version": { "type": "string", "description": "Postgres engine version. If not provided, the latest version will be used.", - "enum": ["15"] + "enum": ["15", "17-oriole"] }, "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "app_version": { "type": "string" @@ -8182,11 +8183,13 @@ } }, { - "name": "resource_multiplier", + "name": "compute_multiplier", "required": false, "in": "query", "schema": { - "type": "string" + "minimum": 1, + "maximum": 4, + "type": "number" } } ], @@ -8210,8 +8213,10 @@ "verify_jwt": { "type": "boolean" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number", + "minimum": 1, + "maximum": 4 } }, "required": ["slug", "name", "body"] @@ -8234,8 +8239,10 @@ "verify_jwt": { "type": "boolean" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number", + "minimum": 1, + "maximum": 4 } }, "required": ["slug", "name", "body"] @@ -8287,8 +8294,8 @@ "import_map_path": { "type": "string" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number" } }, "required": [ @@ -8381,8 +8388,8 @@ "import_map_path": { "type": "string" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number" } }, "required": [ @@ -8486,8 +8493,8 @@ "import_map_path": { "type": "string" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number" } }, "required": [ @@ -8593,11 +8600,13 @@ } }, { - "name": "resource_multiplier", + "name": "compute_multiplier", "required": false, "in": "query", "schema": { - "type": "string" + "minimum": 1, + "maximum": 4, + "type": "number" } } ], @@ -8617,8 +8626,10 @@ "verify_jwt": { "type": "boolean" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number", + "minimum": 1, + "maximum": 4 } } } @@ -8636,8 +8647,10 @@ "verify_jwt": { "type": "boolean" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number", + "minimum": 1, + "maximum": 4 } } } @@ -8688,8 +8701,8 @@ "import_map_path": { "type": "string" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number" } }, "required": [ @@ -9961,7 +9974,7 @@ "type": "array", "items": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] } }, "id": { @@ -10336,12 +10349,12 @@ }, "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"], + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"], "description": "Release channel. If not provided, GA will be used." }, "postgres_engine": { "type": "string", - "enum": ["15"], + "enum": ["15", "17-oriole"], "description": "Postgres engine version. If not provided, the latest version will be used." } }, @@ -10898,12 +10911,12 @@ }, "ReleaseChannel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "PostgresEngine": { "type": "string", "description": "Postgres engine version. If not provided, the latest version will be used.", - "enum": ["15"] + "enum": ["15", "17-oriole"] }, "CreateBranchBody": { "type": "object", @@ -10925,12 +10938,12 @@ }, "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "postgres_engine": { "type": "string", "description": "Postgres engine version. If not provided, the latest version will be used.", - "enum": ["15"] + "enum": ["15", "17-oriole"] }, "branch_name": { "type": "string" @@ -11647,7 +11660,7 @@ "properties": { "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "target_version": { "type": "string" @@ -11670,11 +11683,11 @@ "postgres_version": { "type": "string", "description": "Postgres engine version. If not provided, the latest version will be used.", - "enum": ["15"] + "enum": ["15", "17-oriole"] }, "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "app_version": { "type": "string" @@ -11687,7 +11700,7 @@ "properties": { "current_app_version_release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "duration_estimate_hours": { "type": "integer" @@ -11709,11 +11722,11 @@ "postgres_version": { "type": "string", "description": "Postgres engine version. If not provided, the latest version will be used.", - "enum": ["15"] + "enum": ["15", "17-oriole"] }, "release_channel": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] }, "app_version": { "type": "string" @@ -13823,8 +13836,10 @@ "verify_jwt": { "type": "boolean" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number", + "minimum": 1, + "maximum": 4 } }, "required": ["slug", "name", "body"] @@ -13868,8 +13883,8 @@ "import_map_path": { "type": "string" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number" } }, "required": ["version", "created_at", "updated_at", "id", "slug", "name", "status"] @@ -13913,8 +13928,8 @@ "import_map_path": { "type": "string" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number" } }, "required": ["version", "created_at", "updated_at", "id", "slug", "name", "status"] @@ -13931,8 +13946,10 @@ "verify_jwt": { "type": "boolean" }, - "resource_multiplier": { - "type": "string" + "compute_multiplier": { + "type": "number", + "minimum": 1, + "maximum": 4 } } }, @@ -14952,7 +14969,7 @@ "type": "array", "items": { "type": "string", - "enum": ["internal", "alpha", "beta", "ga", "withdrawn"] + "enum": ["internal", "alpha", "beta", "ga", "withdrawn", "preview"] } }, "id": { diff --git a/apps/www/_blog/2024-12-05-high-performance-disks.mdx b/apps/www/_blog/2024-12-05-high-performance-disks.mdx index da19133548009..252eb18447417 100644 --- a/apps/www/_blog/2024-12-05-high-performance-disks.mdx +++ b/apps/www/_blog/2024-12-05-high-performance-disks.mdx @@ -1,5 +1,5 @@ --- -title: 'Scaling Database Storage: Introducing High Performance Disks' +title: 'High Performance Disk' description: Store up to 60 TB of data with 100x improved durability and 5x more IOPS author: pcnc,jonny,gregpapas image: launch-week-13/high-performance-disks/og.jpg @@ -14,35 +14,35 @@ toc_depth: 3 launchweek: '13' --- -At Supabase, we're constantly working to provide developers with the tools they need to build powerful applications at scale. In our previous [blog post](https://supabase.com/blog/supabase-clickhouse-partnership#improved-disk-management) we mentioned a new type of high performance disk. Today, we’re here to tell you all about it. - -With advanced disks you can store up to 60 TB of data with 100x improved durability, and provision up to 5x more IOPS than the default disks we offer. +High Performance disks store up to 60 TB of data with 100x improved durability, and provision up to 5x more IOPS than the default disks we offer. ## A Two-Pronged Approach to Disk Scalability -We've been tackling disk scalability from two angles. On the software side, our implementation of [Oriole DB's index-organized tables](https://www.orioledb.com/blog/orioledb-beta7-benchmarks) significantly reduces disk I/O operations, improving performance without additional hardware resources. However, this focus for this post is on our infrastructure improvements: the introduction of new disk options that allow advanced scaling for your Postgres databases. +We've been tackling disk scalability from two angles. On the software side, our implementation of [Oriole DB's index-organized tables](https://www.orioledb.com/blog/orioledb-beta7-benchmarks) significantly reduces disk I/O operations, improving performance without additional hardware resources. + +On the infrastructure side we've added new disk options that allow for advanced scaling of your Postgres databases. ## Expanded Capacity One of the most significant improvements is our increased storage capacity. We've moved beyond our previous 16 TB limit, now offering up to 60 TB of storage for your largest databases. But with greater capacity comes the need for enhanced performance - particularly in how quickly your database can read and write data. This makes IOPS (Input/Output Operations Per Second) especially important. -To address these needs, we’re introducing high performance disks. These high performance disks can handle up to 80,000 IOPS - a 5x increase from the 16,000 IOPS limit of our general purpose disks. +To address these needs, our new High Performance disks can handle up to 80,000 IOPS - a 5x increase from the 16,000 IOPS limit of our General Purpose disks. ## Understanding Performance: IOPS and Throughput IOPS is a critical metric that measures how many read and write operations your database can perform each second. Think of it as the "speed limit" for your database's ability to access stored data. Higher IOPS means faster database operations, which translates to better application performance, especially for data-intensive workloads. -Throughput, measured in MiB/s (Mebibytes per second), is equally important as it determines how much total data can flow through your disk at once. While IOPS tells you how many individual read/write operations can happen per second, throughput determines the total volume of data that can be moved. With our general purpose disks, you start with a baseline throughput of 125 MiB/s, which can be provisioned up to 1,000 MiB/s. Our new high performance disks automatically scale throughput with IOPS, providing better performance for data-intensive workloads. +Throughput, measured in MiB/s (Mebibytes per second), is equally important as it determines how much total data can flow through your disk at once. While IOPS tells you how many individual read/write operations can happen per second, throughput determines the total volume of data that can be moved. With our General Purpose disks, you start with a baseline throughput of 125 MiB/s, which can be provisioned up to 1,000 MiB/s. Our High Performance disks automatically scale throughput with IOPS, providing better performance for data-intensive workloads. -Effective throughput and IOPS also depends on your compute instance size. You can check out our [compute and disk documentation](https://supabase.com/docs/guides/platform/compute-and-disk#compute-size) for more detail. +Effective throughput and IOPS also depends on your compute instance size. You can read more about these interdependencies in our [compute and disk documentation](https://supabase.com/docs/guides/platform/compute-and-disk#compute-size). ## Durability: Keeping Your Data Safe -Another benefit of our High performance disks is increased durability. Our new disks offer 99.999% durability, a 100x increase over our standard disk. This means that if you’re using high performance disk, you will almost never need to worry about disk failure — say goodbye to recovery from backups. +Another benefit of our High Performance disks is increased durability. Our new disks offer 99.999% durability, a 100x increase over our standard disk. This means that if you use High Performance Disk, you will almost never need to worry about disk failure — say goodbye to recovery from backups. ## Consolidated Disk and Compute User Interface -With these advanced options comes complexity—both in the number of options available, and how they interplay with compute settings. To address this we've completely redesigned our disk management interface to coexist and interoperate with our compute upgrade UI. When designing the new UI, we adhered to the following principles: +With these advanced options comes complexity—both in the number of options available, and how they interplay with compute settings. To address this we've redesigned our disk management interface to coexist and interoperate with our compute upgrade UI. When designing the new UI, we adhered to the following principles: ### Transparent Billing @@ -71,7 +71,7 @@ The Disk Size Usage graph breaks down the space used by the Database, Write-Ahea ### Preventing Footguns -The effective IOPS is limited by both your compute add-on and disk configuration and it is technically possible to over provision the disk throughput and IOPS with the instance not being able to make full use of it. For example, to achieve maximum IOPS (80,000), you'll need a 16XL or larger compute instance. The dashboard warns you when it detects scenarios like these. +Effective IOPS is limited by both your compute add-on and disk configuration and it is technically possible to over provision the disk throughput and IOPS with the instance not being able to make full use of it. For example, to achieve maximum IOPS (80,000), you'll need a 16XL or larger compute instance. The dashboard warns you when it detects scenarios like these. Preventing footguns https://supabase.com/blog/high-performance-disks - Scaling Database Storage: Introducing High Performance Disks + High Performance Disks https://supabase.com/blog/high-performance-disks Store up to 60 TB of data with 100x improved durability and 5x more IOPS Thu, 05 Dec 2024 00:00:00 -0700