No files matched your search
@@ -1286,6 +1286,7 @@ export const platform: NavMenuConstant = {
|
||||
{ name: 'Compute Add-ons', url: '/guides/platform/compute-add-ons' },
|
||||
{ name: 'Custom Domains', url: '/guides/platform/custom-domains' },
|
||||
{ name: 'Database Backups', url: '/guides/platform/backups' },
|
||||
{ name: 'Read Replicas', url: '/guides/platform/read-replicas' },
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
import Layout from '~/layouts/DefaultGuideLayout'
|
||||
import { Admonition } from 'ui'
|
||||
|
||||
export const meta = {
|
||||
title: 'Read Replicas',
|
||||
description: 'Spin up additional read-only databases for your project.',
|
||||
subtitle: 'Spin up additional read-only databases for your project',
|
||||
}
|
||||
|
||||
<Admonition type="caution" label="Read replicas are only currently available for Early Access for projects on the Pro Plan and above.">
|
||||
|
||||
To try out read replicas, [request access here](https://forms.supabase.com/read-replica).
|
||||
|
||||
</Admonition>
|
||||
|
||||
Read replicas continuously replicate data from a primary database. You can both read and write data on a primary database, but you can _only_ read (for example, use `select` statements), and not write, on a read replica.
|
||||
|
||||
| | select | insert | update | delete |
|
||||
| ------------ | ------ | ------ | ------ | ------ |
|
||||
| Primary | ✅ | ✅ | ✅ | ✅ |
|
||||
| Read Replica | ✅ | - | - | - |
|
||||
|
||||
When you create a project, the automatically created database is considered the primary database. If you then add read replicas, they will receive and synchronize data from this primary database. Replication is asynchronous. It happens in the background, so transactions on the primary aren't blocked. The time delay between writing data to the primary and the read replica receiving the change is called replication lag.
|
||||
|
||||
Read replicas have many applications:
|
||||
|
||||
- They reduce read load on the primary database.
|
||||
- For example, you can use a read replica for complex analytical queries and reserve the primary for user-facing create, update, and delete operations.
|
||||
- For projects that need to cover a global audience, additional databases can be spun up closer to users in any of our twelve supported regions to reduce latency.
|
||||
- Read replicas provide data redundancy.
|
||||
|
||||
## How are Read Replicas made?
|
||||
|
||||
We use a hybrid approach to replicate data from a primary to its read replicas, combining the native methods of streaming replication and file-based log shipping.
|
||||
|
||||
### Streaming replication
|
||||
|
||||
Postgres generates a Write Ahead Log (WAL) as database changes occur. With streaming replication, these changes stream from the primary to the read replica server. The WAL alone is sufficient to reconstruct the database to its current state.
|
||||
|
||||
This replication method is fast, since changes are streamed directly from the primary to the read replica. On the other hand, it faces challenges when the read replica can't keep up with the WAL changes from its primary. This can happen when the read replica is too small, running on degraded hardware, or has a heavier workload running.
|
||||
|
||||
To address this, Postgres does provide tunable configuration, like `wal_keep_size`, to adjust the WAL retained by the primary. If the read replica fails to “catch up” before the WAL surpasses the `wal_keep_size` setting, the replication is terminated. Tuning is a bit of an art - the amount of WAL required is variable for every situation.
|
||||
|
||||
### File-based log shipping
|
||||
|
||||
In this replication method, the primary continuously buffers WAL changes to a local file and then sends the file to the read replica. If multiple read replicas are present, files could also be sent to an intermediary location accessible by all. The read replica then reads the WAL files and applies those changes. There is higher replication lag than streaming replication since the primary buffers the changes locally first. It also means there is a small chance that WAL changes do not reach read replicas if the primary goes down before the file is transferred. In these cases, if the primary fails a replica using streaming replication would (in most cases) be more up-to-date than a replica using file-based log shipping.
|
||||
|
||||
### File-based log shipping 🤝 Streaming replication
|
||||
|
||||
<figure className="max-w-[700px] mx-auto">
|
||||
<Image
|
||||
className="hidden dark:block"
|
||||
alt="How replication is achieved."
|
||||
src="/docs/img/guides/platform/read-replicas/streaming-replication-dark.png?v=1"
|
||||
/>
|
||||
|
||||
<Image
|
||||
className="dark:hidden"
|
||||
alt="How replication is achieved."
|
||||
src="/docs/img/guides/platform/read-replicas/streaming-replication-light.png?v=1"
|
||||
/>
|
||||
<figcaption>How replication is achieved.</figcaption>
|
||||
|
||||
</figure>
|
||||
|
||||
We bring these two methods together to achieve quick, stable, and reliable replication. Each method addresses the limitations of the other. Streaming replication minimizes replication lag, while file-based log shipping provides a fallback. For file-based log shipping, we use our existing Point In Time Recovery (PITR) infrastructure. We regularly archive files from the primary using [WAL-G](https://github.com/wal-g/wal-g), an open source archival and restoration tool, and ship the WAL files to S3.
|
||||
|
||||
We combine it with streaming replication to reduce replication lag. Once WAL-G files have been synced from S3, read replicas connect to the primary and stream the WAL directly.
|
||||
|
||||
## Getting started
|
||||
|
||||
<figure className="max-w-[700px] mx-auto">
|
||||
<Image
|
||||
className="hidden dark:block"
|
||||
alt="Map view of all project databases"
|
||||
src="/docs/img/guides/platform/read-replicas/map-view.png?v=1"
|
||||
/>
|
||||
|
||||
<Image
|
||||
className="dark:hidden"
|
||||
alt="Map view of all project databases."
|
||||
src="/docs/img/guides/platform/read-replicas/map-view.png?v=1"
|
||||
/>
|
||||
|
||||
</figure>
|
||||
|
||||
Read replicas can be managed from the [infrastructure settings page](https://supabase.com/dashboard/project/_/settings/infrastructure). For now, each project can only spin up to two read replicas. Read replicas also inherit the compute size of their primary database.
|
||||
|
||||
Read replicas offer the following features:
|
||||
|
||||
### Dedicated endpoints
|
||||
|
||||
Each read replica has its own dedicated database and API endpoints. The database endpoint can be found in your [dashboard database settings](https://supabase.com/dashboard/project/_/settings/database) under **Connection info**. The API endpoint can be found in [dashboard API settings](https://supabase.com/dashboard/project/_/settings/api) under **Project URL**.
|
||||
|
||||
A read replica's API endpoint only supports `GET` requests to the [REST API](https://supabase.com/docs/guides/api). Requests towards other Supabase products, such as Auth, Storage, and Realtime are not able to utilize a read replica nor its API endpoint for now. We are working on adding read replica support for them.
|
||||
|
||||
### Dedicated connection pool
|
||||
|
||||
A connection pool through Supavisor is also available for each read replica. Its unique connection string can be found in your [dashboard database settings](https://supabase.com/dashboard/project/_/settings/database) under **Connection Pooling Custom Configuration**.
|
||||
|
||||
### Querying through the SQL editor
|
||||
|
||||
<figure className="max-w-[700px] mx-auto">
|
||||
<Image
|
||||
className="hidden dark:block"
|
||||
alt="SQL editor view."
|
||||
src="/docs/img/guides/platform/read-replicas/sql-editor.png?v=1"
|
||||
/>
|
||||
|
||||
<Image
|
||||
className="dark:hidden"
|
||||
alt="SQL editor view."
|
||||
src="/docs/img/guides/platform/read-replicas/sql-editor.png?v=1"
|
||||
/>
|
||||
|
||||
</figure>
|
||||
|
||||
In the SQL editor, you can choose if you want to run the query on the primary or one of the replicas.
|
||||
|
||||
### API load balancer
|
||||
|
||||
When read replicas are spun up, an API load balancer becomes available for the project. An endpoint for it is provisioned and can be found [here](https://supabase.com/dashboard/project/_/settings/api).
|
||||
|
||||
The load balancer uses a round-robin strategy to route `GET` requests to any of the API endpoints available, including that of the primary database. Non-`GET` requests can also be sent through this endpoint. They are immediately redirected to the primary database.
|
||||
|
||||
Similar to the read replica API endpoints, only requests to the REST API are available for now. Support for other Supabase products will become available once read replica support has been completed for them.
|
||||
|
||||
When a project no longer has any read replicas, the load balancer and its endpoint are brought down as well.
|
||||
|
||||
### Centralized configuration management
|
||||
|
||||
All settings made through the dashboard will be propagated across all databases of a project. This ensures that no read replica get out of sync with its primary database or with other read replicas.
|
||||
|
||||
## Limitations
|
||||
|
||||
### Prerequisites for using read replicas
|
||||
|
||||
A project needs to satisfy these requirements to spin up a read replica:
|
||||
|
||||
1. Running on AWS.
|
||||
- Support for projects on Fly is in progress.
|
||||
2. Running on at least a small compute.
|
||||
3. PostgreSQL 15.
|
||||
- For projects running on older versions of PostgreSQL, you can initiate self-serve upgrades with pg_upgrade. For details, see the [upgrade guide](/docs/guides/platform/migrating-and-upgrading-projects#pgupgrade).
|
||||
|
||||
### Read replicas need to be brought down before starting the following procedures
|
||||
|
||||
The following procedures require all read replicas for a project to be brought down before they can be started:
|
||||
|
||||
1. Upgrading a project via pg_upgrade.
|
||||
2. Performing data restoration.
|
||||
|
||||
Changes made to the primary database during these operations heavily disrupt replication and potentially leave active read replicas in unstable states. Once these operations complete, read replicas can be spun back up.
|
||||
|
||||
export const Page = ({ children }) => <Layout meta={meta} children={children} />
|
||||
|
||||
export default Page
|
||||
|
After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 64 KiB |
@@ -30,7 +30,7 @@ To expose log data to customers, we leverage Logflare Endpoints. This provides a
|
||||
src="https://www.youtube-nocookie.com/embed/Ai2BjHV36Ng"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -30,7 +30,7 @@ Edge Runtime is MIT licensed, written in Rust, and based on the latest Deno Runt
|
||||
src="https://www.youtube-nocookie.com/embed/cPGxPl1lx4Y"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -111,7 +111,7 @@ For example, you can restrict your users a 1 MB and `image/*` files when uploadi
|
||||
src="https://www.youtube-nocookie.com/embed/pT2PcZFq_M0"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -34,7 +34,7 @@ Building SSO into your application isn't necessarily hard, but does come with so
|
||||
src="https://www.youtube-nocookie.com/embed/hAwJeR6mhB0"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -91,7 +91,7 @@ This Launch Week had a big focus on self-hosting, adding support for self-hosted
|
||||
src="https://www.youtube-nocookie.com/embed/dDhy6pk282U"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -23,7 +23,7 @@ Today we're announcing Supabase Studio 2.0, packed with a ton of new stuff. We h
|
||||
src="https://www.youtube-nocookie.com/embed/0rcNqHt5KWU"
|
||||
title="YouTube video player"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -24,7 +24,7 @@ Want to get started right away? [Fork the template on GitHub](https://github.com
|
||||
src="https://www.youtube-nocookie.com/embed/4pa-eEXQHJQ"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -23,7 +23,7 @@ Now, without further ado, let's look at some of our favorites in more detail:
|
||||
src="https://www.youtube-nocookie.com/embed/AazB9mQetkw"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -28,7 +28,7 @@ We’ve added support in our [Python Vector Client](https://supabase.com/docs/gu
|
||||
src="https://www.youtube-nocookie.com/embed/RJccSbJ9Go4"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -24,7 +24,7 @@ We received feedback recently about our local development experience, encouragin
|
||||
src="https://www.youtube-nocookie.com/embed/N0Wb85m3YMI"
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -24,7 +24,7 @@ Supabase Studio 3.0 is here, with some huge new features, including a brand new
|
||||
src="https://www.youtube-nocookie.com/embed/51tCMQPiitQ"
|
||||
title="YouTube video player"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -89,7 +89,7 @@ We've released full instructions in our [Build with Supabase](https://supabase.c
|
||||
src="https://www.youtube-nocookie.com/embed/gtJo1lTxHfs"
|
||||
title="YouTube video player"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -95,7 +95,7 @@ The new App Router in Next.js adds a lot of exciting features, like React Suspen
|
||||
src="https://www.youtube-nocookie.com/embed/w3LD0Z73vgU"
|
||||
title="YouTube video player"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -344,7 +344,7 @@ If you are interested in exploring Supavisor's potential or want to implement it
|
||||
src="https://www.youtube-nocookie.com/embed/qzxzLSAJDfE"
|
||||
title="YouTube video player"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
@@ -29,7 +29,7 @@ When you type `supabase login`, several things occur. First, a random UUID is ge
|
||||
src="https://www.youtube-nocookie.com/embed/lNgsIITU3pc?si=X6KE7X819Hk"
|
||||
title="YouTube video player"
|
||||
frameBorder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
@@ -24,7 +24,7 @@ Today, we're introducing the Supabase Assistant, an AI side-kick inside the dash
|
||||
className="w-full"
|
||||
src="https://www.youtube-nocookie.com/embed/hu2SQjvCXIw"
|
||||
title="YouTube video player"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -32,7 +32,7 @@ We created a demo to show how to migrate a Node app that uses Express, Node Post
|
||||
className="w-full"
|
||||
src="https://www.youtube-nocookie.com/embed/eCbiywoDORw"
|
||||
title="YouTube video player"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -27,7 +27,7 @@ We're operating on a first-signed-up, first-served basis, rolling it out in batc
|
||||
className="w-full"
|
||||
src="https://www.youtube-nocookie.com/embed/peXKxavGnBo"
|
||||
title="YouTube video player"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -34,7 +34,7 @@ Supavisor is built with Elixir. Since the [Dashbit](https://dashbit.co/) team ha
|
||||
className="w-full"
|
||||
src="https://www.youtube-nocookie.com/embed/ogYNmJOFEpk"
|
||||
title="YouTube video player"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -27,7 +27,7 @@ We're excited to announce four new features for Supabase Auth:
|
||||
className="w-full"
|
||||
src="https://www.youtube-nocookie.com/embed/LF8GABnAFyE"
|
||||
title="YouTube video player"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -94,7 +94,7 @@ We’ve [worked with the Expo team](https://docs.expo.dev/guides/using-supabase/
|
||||
className="w-full"
|
||||
src="https://www.youtube-nocookie.com/embed/7DYZdAPPJOw"
|
||||
title="YouTube video player"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
---
|
||||
title: 'Introducing Read Replicas'
|
||||
description: 'We are launching support for Postgres Read Replicas'
|
||||
launchweek: x
|
||||
categories:
|
||||
- product
|
||||
tags:
|
||||
- launch-week
|
||||
- postgres
|
||||
date: '2023-12-15'
|
||||
published_at: '2023-12-15:01:00.000-07:00'
|
||||
to_depth: 3
|
||||
author: angelico_de_los_reyes
|
||||
image: lwx-read-replicas/introducing-read-replicas-og.png
|
||||
thumb: lwx-read-replicas/read-replicas-thumb.png
|
||||
---
|
||||
|
||||
Today, we are launching support for Postgres Read Replicas. You can use Read Replicas to:
|
||||
|
||||
1. Distribute load across various databases.
|
||||
2. Serve data closer to your users.
|
||||
3. Provide data redundancy.
|
||||
4. Run complex queries without affecting your primary database.
|
||||
|
||||
You can create read replicas in any of our 12 supported regions. To start, each project supports up to two replicas.
|
||||
|
||||
## What are Read Replicas?
|
||||
|
||||
Read replicas continuously, well, _replicate_ data from a primary database. It contains a constantly-updated copy of the data in the Primary.
|
||||
|
||||
You can both read and write data on the Primary database. You can _only_ read, on a Read Replica:
|
||||
|
||||
| | `select` | `insert` | `update` | `delete` |
|
||||
| ------------ | -------- | -------- | -------- | -------- |
|
||||
| Primary | ✅ | ✅ | ✅ | ✅ |
|
||||
| Read Replica | ✅ | - | - | - |
|
||||
|
||||
Replication is asynchronous. It happens in the background so that transactions aren't blocked on the primary. The delay between writing data to the primary and the read replica receiving the change is called _replication lag_.
|
||||
|
||||
<div className="video-container">
|
||||
<iframe
|
||||
className="w-full"
|
||||
src="https://www.youtube-nocookie.com/embed/PX3R1fXjJ2M"
|
||||
title="YouTube video player"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture; web-share"
|
||||
allowfullscreen
|
||||
/>
|
||||
</div>
|
||||
|
||||
## Why Read Replicas?
|
||||
|
||||
To scale your database, you have two choices: horizontal scaling and vertical scaling. Vertical scaling involves adding more RAM and CPU to your existing server. Our 16XL [compute add-on](https://supabase.com/docs/guides/platform/compute-add-ons) has 64 cores CPU and 256 GB RAM - sufficient for almost any well-architected workload.
|
||||
|
||||
However, certain workloads may push against the CPU and memory limits of a single server. There’s a limit to how much you can scale vertically. Most cloud providers do not provide instances larger than our 16XL specifications.
|
||||
|
||||
This is where horizontal scaling is useful. You can add read replicas to scale more easily. Instead of a single database handling all of your traffic, you can split the traffic across multiple databases.
|
||||
|
||||
<Admonition type="note" label="Compute Size">
|
||||
|
||||
Our read replicas will inherit the compute size of its primary. They will eventually scale independently.
|
||||
|
||||
</Admonition>
|
||||
|
||||
Read replicas are great for reducing the load on your primary database. For instance, you can designate one of your read replicas for analytical tasks. This way, a runaway query in a read replica won't impact the primary.
|
||||
|
||||
One of the best features of read replicas is that you can launch them in a different region from your primary. This moves the data closer to your users - querying the nearest read replica for data minimizes overall application latency. We are working on making this easier, stay tuned!
|
||||
|
||||
The main drawback of horizontal scaling is complexity. Typically, you need to manage replication lag, handle recovery when a replica fails, and implement some level of application level changes to fully utilize the read replica. In line with our promise to “make Postgres simpler for developers”, we have handled most of that complexity for you:
|
||||
|
||||
## Using Read Replicas
|
||||
|
||||
You can manage and visualize read replicas from the [infrastructure settings page](https://supabase.com/dashboard/project/_/settings/infrastructure).
|
||||
|
||||
<Img
|
||||
src="/images/blog/lwx-read-replicas/read-replicas-02.png"
|
||||
alt="Read Replicas in the dashboard"
|
||||
/>
|
||||
|
||||
In the SQL editor, you can choose if you want to run the query on the primary or one of the read replicas.
|
||||
|
||||
<Img src="/images/blog/lwx-read-replicas/read-replicas.png" alt="Read Replicas" />
|
||||
|
||||
To make use of your read replicas, copy your connection string for the read replica, update your apps to use the new read replica and you are done! A unique connection pool is also provisioned for each read replica via [Supavisor](https://github.com/supabase/supavisor).
|
||||
|
||||
Each replica also has its own associated instance of [PostgREST](https://supabase.com/docs/guides/api), a Data API for [REST](/docs/guides/api) and [GraphQL](/docs/guides/graphql). You can directly access each PostgREST instance, similar to connecting to a specific read replica. Alternatively, we offer a load-balancing endpoint which uses a round-robin strategy to route to each of the PostgREST instances.
|
||||
|
||||
## Implementation
|
||||
|
||||
Postgres offers various methods to replicate data, each with trade-offs. We use the following native methods:
|
||||
|
||||
### Streaming replication
|
||||
|
||||
Postgres generates a Write Ahead Log (WAL) as database changes occur. With streaming replication, these changes stream from the primary to the read replica server. The WAL alone is sufficient to reconstruct the database to its current state.
|
||||
|
||||
This replication method is fast, since changes are streamed directly from the primary to the read replica. On the other hand, it faces challenges when the read replica can't keep up with the WAL changes from its primary. This can happen when the read replica is too small, running on degraded hardware, or has a heavier workload running.
|
||||
|
||||
To address this, Postgres does provide tunable configuration, like `wal_keep_size`, to adjust the WAL retained by the primary. If the read replica fails to “catch up” before the WAL surpasses the `wal_keep_size` setting, the replication is terminated. Tuning is a bit of an art - the amount of WAL required is variable for every situation.
|
||||
|
||||
### File-based Log shipping
|
||||
|
||||
In this replication method, the primary continuously buffers WAL changes to a local file and then sends the file to the read replica. If multiple read replicas are present, files could also be sent to an intermediary location accessible by all. The read replica then reads the WAL files and applies those changes. There is higher replication lag than streaming replication since the primary buffers the changes locally first. It also means there is a small chance that WAL changes do not reach read replicas if the primary goes down before the file is transferred. In these cases, if the primary fails a replica using streaming replication would (in most cases) be more up-to-date than a replica using file-based log shipping.
|
||||
|
||||
### File-Based Log shipping 🤝 Streaming replication
|
||||
|
||||
We use a hybrid approach to address the limitations of each method.
|
||||
|
||||
<Img
|
||||
src={{
|
||||
dark: '/images/blog/lwx-read-replicas/streaming-replication-dark.png',
|
||||
light: '/images/blog/lwx-read-replicas/streaming-replication-light.png',
|
||||
}}
|
||||
alt="Streaming replication"
|
||||
/>
|
||||
|
||||
Streaming replication minimizes replication lag, while file-based log shipping provides a fallback. For file-based log shipping, we use our existing Point In Time Recovery (PITR) infrastructure. We regularly archive files from the primary using [WAL-G](https://github.com/wal-g/wal-g), an open source archival and restoration tool, and ship the WAL files to S3.
|
||||
|
||||
We combine it with streaming replication to reduce replication lag. Once WAL-G files have been synced from S3, read replicas connect to the primary and stream the WAL directly.
|
||||
|
||||
## What's coming
|
||||
|
||||
### Automatic Failover
|
||||
|
||||
With automatic failovers, a read replica is promoted to be the primary if the primary is unhealthy. This feature is currently only available on our enterprise plan. However, we are planning to extend this to all paid plans. The introduction of self-serve read replicas is a step in that direction.
|
||||
|
||||
### Geo-based load balancing
|
||||
|
||||
Currently, we have implemented a round-robin strategy of routing PostgREST requests to the different databases. This is useful for sharing the load across the primary and the read replica, but in cases where latency is important, you might want to always route to the closest database instead.
|
||||
|
||||
### Supabase Products leveraging Replicas
|
||||
|
||||
We are working on support for database-level load balancing through [Supavisor](https://supabase.com/blog/supavisor-postgres-connection-pooler). When routing database traffic through Supavisor, it routes write queries to the primary and splits read queries between the primary and read replica. This distributes load to all your databases without any changes to your application. Other Supabase products like Auth, Storage, and Realtime use the database heavily. We are working on adding read replica support to these products, so that they can leverage the read replica when appropriate. This means they won’t just query the primary but will also use the read replica’s compute when possible.
|
||||
|
||||
## Pricing and Availability
|
||||
|
||||
Read replicas are priced like regular databases for compute and storage. There is also a per-GB cost for WAL transfer between the primary and read replica. The total price is the sum of:
|
||||
|
||||
- The compute instance of the read replica. The compute hours used by your read replica will be added to the total compute hours used by your organization and charged at the same rate.
|
||||
- The disk size of the read replica will be charged at the same rate of 0.125$ / GB
|
||||
- Any WAL transfer between the primary and read replica will be charged at 9c / GB
|
||||
|
||||
[Sign-ups](https://forms.supabase.com/read-replica) for early access of self-serve Read Replica support are now open. Following which we will progressively rollout self-serve Read Replica support to all paid plans over the next few months.
|
||||
@@ -7,7 +7,6 @@ import { Button, IconBookOpen } from 'ui'
|
||||
import SectionContainer from '~/components/Layouts/SectionContainer'
|
||||
import HeroFrameworks from './HeroFrameworks'
|
||||
import styles from './hero.module.css'
|
||||
import Image from 'next/image'
|
||||
import AnnouncementBadge from '../Announcement/Badge'
|
||||
|
||||
const Hero = () => {
|
||||
@@ -32,8 +31,8 @@ const Hero = () => {
|
||||
<div className="flex flex-col items-center">
|
||||
<div className="z-40 w-full flex justify-center mb-8 lg:mb-8">
|
||||
<AnnouncementBadge
|
||||
announcement="Launch Week X — Day 4"
|
||||
url="/launch-week#day-4"
|
||||
announcement="Launch Week X — Day 5"
|
||||
url="/launch-week#day-5"
|
||||
badge="Live"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -4,7 +4,7 @@ import { IconArrowRight, cn } from 'ui'
|
||||
|
||||
const Player = () => {
|
||||
const [audio, state, controls, ref] = useAudio({
|
||||
src: 'https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/audio/supabase-album/Starbuck.m4a',
|
||||
src: 'https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/audio/supabase-album/Bernard.m4a',
|
||||
loop: true,
|
||||
})
|
||||
|
||||
|
||||
@@ -32,13 +32,11 @@ const LWXSummary = () => {
|
||||
(day, i: number) =>
|
||||
day.shipped && (
|
||||
<ol key={day.id}>
|
||||
<Link
|
||||
href={day.blog}
|
||||
className="group flex items-center justify-between py-1 hover:text-foreground"
|
||||
>
|
||||
<span>
|
||||
Day {i + 1} - {day.description}
|
||||
<Link href={day.blog} className="group flex py-1 gap-2 hover:text-foreground">
|
||||
<span className="shrink-0 text-sm font-mono uppercase leading-6">
|
||||
Day {i + 1} -
|
||||
</span>
|
||||
<span className="leading-6">{day.description}</span>
|
||||
</Link>
|
||||
</ol>
|
||||
)
|
||||
|
||||
@@ -193,7 +193,6 @@ const days: WeekDayProps[] = [
|
||||
dd: 'Thu',
|
||||
title: '',
|
||||
shipped: true,
|
||||
isToday: true,
|
||||
hasCountdown: false,
|
||||
blog: '/blog/supabase-auth-identity-linking-hooks',
|
||||
date: '14 Dec',
|
||||
@@ -201,7 +200,7 @@ const days: WeekDayProps[] = [
|
||||
description: (
|
||||
<>
|
||||
Supabase Auth: <strong>Identity Linking</strong>, <strong>Session Control</strong>,{' '}
|
||||
<strong>Passwords</strong> and <strong>Hooks</strong>
|
||||
<strong>Password Protection</strong> and <strong>Hooks</strong>
|
||||
</>
|
||||
),
|
||||
links: [
|
||||
@@ -237,19 +236,44 @@ const days: WeekDayProps[] = [
|
||||
d: 5,
|
||||
dd: 'Fri',
|
||||
title: '',
|
||||
shipped: false,
|
||||
hasCountdown: true,
|
||||
blog: '',
|
||||
shipped: true,
|
||||
isToday: true,
|
||||
hasCountdown: false,
|
||||
blog: '/blog/introducing-read-replicas',
|
||||
date: '15 Dec',
|
||||
published_at: '2023-12-15T08:00:00.000-08:00',
|
||||
description: '',
|
||||
description: (
|
||||
<>
|
||||
Introducing <strong>Read Replicas</strong> for low latency
|
||||
</>
|
||||
),
|
||||
links: [
|
||||
{
|
||||
type: 'blog',
|
||||
href: '/blog/introducing-read-replicas',
|
||||
},
|
||||
{
|
||||
type: 'video',
|
||||
href: 'PX3R1fXjJ2M',
|
||||
},
|
||||
{
|
||||
type: 'xSpace',
|
||||
href: 'https://twitter.com/i/spaces/1vAxRvjmvRgxl',
|
||||
},
|
||||
],
|
||||
steps: [],
|
||||
steps: [
|
||||
{
|
||||
title: '',
|
||||
blog: '/blog/introducing-read-replicas',
|
||||
bg_layers: [
|
||||
{
|
||||
img: '/images/launchweek/lwx/day5/d5_read_replicas.svg',
|
||||
mobileImg: '/images/launchweek/lwx/day5/d5_read_replicas_mobile.svg',
|
||||
},
|
||||
],
|
||||
steps: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 465 KiB |
|
After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 64 KiB |
@@ -0,0 +1,81 @@
|
||||
<svg width="765" height="208" viewBox="0 0 765 208" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1058_7467)">
|
||||
<rect width="764" height="208" transform="translate(0.517578)" fill="#121516"/>
|
||||
<g style="mix-blend-mode:lighten">
|
||||
<path opacity="0.6" d="M517.785 389.109C516.068 388.062 519.195 379.17 526.825 363.309C534.456 347.448 546.334 325.185 561.257 298.748C576.18 272.311 593.626 242.643 611.843 212.73C630.068 182.804 648.419 153.693 665.044 128.295C681.684 102.905 696.018 82.1368 706.604 68.0851C717.198 54.0191 723.672 47.1723 725.388 48.2188" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M492.72 371.063C485.591 365.03 484.537 352.061 489.655 333.46C494.787 314.867 505.925 291.278 521.941 265.093C537.958 238.908 558.308 211.039 580.927 184.3C603.554 157.546 627.649 132.858 650.794 112.705C673.954 92.5606 695.344 77.6535 712.831 69.5071C730.318 61.3607 743.282 60.248 750.42 66.2659" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M468.268 346.431C457.991 334.093 454.992 316.084 459.543 294.198C464.094 272.312 476.067 247.319 494.236 221.732C512.405 196.144 536.138 170.864 563.051 148.433C589.964 126.002 619.11 107.22 647.542 93.9625C675.988 80.7131 702.72 73.442 725.082 72.8969C747.437 72.366 764.617 78.5628 774.88 90.8928" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M444.62 310.944C434.603 291.746 432.937 268.612 439.797 243.88C446.657 219.148 461.801 193.693 483.686 170.057C505.585 146.43 533.459 125.466 564.518 109.259C595.577 93.0529 628.736 82.215 660.638 77.7774C692.554 73.3476 722.094 75.5181 746.293 84.0435C770.492 92.569 788.507 107.186 798.524 126.384" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M425.898 257.874C420.83 232.59 424.893 205.931 437.679 180.586C450.464 155.241 471.517 132.096 498.732 113.493C525.948 94.8912 558.356 81.4697 592.703 74.5795C627.05 67.6892 662.127 67.5921 694.41 74.2745C726.694 80.9569 755.038 94.1939 776.6 112.649C798.162 131.104 812.186 154.152 817.253 179.437" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M425.236 182.91C430.28 155.19 444.311 129.621 465.922 108.766C487.519 87.9028 515.935 72.4884 548.317 64.0584C580.69 55.6427 615.878 54.5051 650.342 60.7921C684.814 67.0649 717.344 80.5342 744.659 99.8303C771.974 119.126 793.145 143.566 805.998 170.708C818.85 197.85 822.973 226.719 817.929 254.439" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M460.117 101.369C485.542 66.3813 526.927 45.1688 575.189 42.4187C623.45 39.6687 674.616 55.604 717.436 86.7041C760.255 117.804 791.234 161.549 803.538 208.28C815.835 255.025 808.475 300.941 783.064 335.936" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M521.846 45.7892C557.352 25.309 601.916 23.8682 645.729 41.8098C689.542 59.7513 729.015 95.5674 755.457 141.426C781.908 187.271 793.168 239.38 786.752 286.287C780.336 333.194 756.789 371.055 721.284 391.536" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M582.355 22.9803C617.601 15.917 655.533 29.7517 687.814 61.4628C720.096 93.1739 744.065 140.124 754.471 192.021C764.878 243.918 760.841 296.498 743.276 338.186C725.712 379.874 696.039 407.273 660.793 414.336" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M630.434 19.2902C658.851 20.5568 685.176 42.7778 703.614 81.0533C722.052 119.329 731.077 170.552 728.745 223.425C726.39 276.304 712.857 326.507 691.095 363.006C669.333 399.505 641.151 419.308 612.735 418.041" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M667.873 24.5431C686.366 28.9474 699.215 53.6405 703.608 93.1574C708.001 132.674 703.573 183.805 691.286 235.297C679.007 286.775 659.876 334.41 638.121 367.701C616.367 400.991 593.757 417.219 575.271 412.801" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M698.537 34.5233C706.176 37.7194 705.38 60.1772 696.346 96.9638C687.312 133.75 670.778 181.857 650.368 230.687C629.958 279.518 607.357 325.096 587.51 357.372C567.685 389.642 552.255 405.991 544.616 402.795" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M553.243 406.187C533.763 399.087 514.846 388.582 498.521 375.8M626.019 418.189C595.28 418.884 559.288 408.89 526.153 390.49C493.017 372.089 465.53 346.814 449.848 320.361M673.58 411.352C634.491 421.904 579.897 411.368 529.972 383.645C480.047 355.922 442.244 315.149 430.538 276.39M713.111 396.002C692.505 406.638 664.541 410.106 632.93 405.945C601.32 401.784 567.517 390.204 536.037 372.724C504.557 355.243 476.85 332.684 456.616 308.037C436.375 283.404 424.536 257.833 422.671 234.719M746.611 374.222C726.474 390.404 695.52 397.609 658.769 394.666C622.018 391.723 581.635 378.805 544.188 358.011C506.741 337.216 474.429 309.765 452.503 280.125C430.577 250.485 420.33 220.401 423.421 194.753M774.342 347.089C756.224 368.651 723.752 379.833 683.16 378.493C642.56 377.166 596.666 363.411 554.279 339.873C511.892 316.336 475.954 284.649 453.367 250.887C430.779 217.125 423.105 183.65 431.822 156.886M796.058 315.552C786.299 333.126 768.656 345.893 744.901 352.613C721.131 359.325 692.101 359.735 660.699 353.785C629.298 347.836 596.649 335.757 566.012 318.744C535.375 301.731 507.863 280.402 486.213 256.892C464.563 233.382 449.55 208.515 442.697 184.798C435.829 161.073 437.362 139.341 447.113 121.781M796.058 315.552C770.364 361.822 727.329 395.996 676.436 410.547C625.544 425.099 570.97 418.833 524.686 393.131C478.416 367.437 444.242 324.401 429.682 273.524C415.131 222.632 421.397 168.057 447.099 121.773C472.793 75.5032 515.828 41.3287 566.706 26.7697C617.598 12.2186 672.173 18.4843 718.457 44.1862C764.727 69.8801 798.901 112.916 813.46 163.793C828.011 214.686 821.752 269.282 796.058 315.552ZM811.349 280.447C804.688 300.918 788.743 316.514 765.345 325.45C741.955 334.372 712.078 336.273 679.138 330.907C646.191 325.556 611.516 313.156 579.109 295.16C546.687 277.156 517.845 254.285 495.886 229.146C473.926 204.007 459.724 177.648 454.947 153.084C450.155 128.513 454.979 106.742 468.829 90.2436M819.713 242.579C816.945 265.492 803.672 283.711 781.64 294.862C759.6 306.028 729.812 309.585 696.198 305.096C662.585 300.608 626.701 288.265 593.252 269.69C559.802 251.116 530.356 227.181 508.777 201.02C487.198 174.86 474.471 147.694 472.298 123.083C470.125 98.4721 478.573 77.5736 496.552 63.1255M820.5 202.614C822.499 227.371 812.943 248.009 793.285 261.412C773.626 274.816 744.933 280.269 711.518 276.937C678.103 273.605 641.799 261.682 608.078 242.957C574.357 224.232 545.032 199.71 524.553 173.115C504.061 146.512 493.522 119.272 494.507 95.4998C495.492 71.7271 507.975 52.7137 530.032 41.3149M812.633 160.943C820.445 186.837 815.94 209.682 799.9 225.449C783.859 241.217 757.322 248.876 724.981 247.074C692.654 245.28 656.618 234.123 623.268 215.603C589.918 197.084 561.411 172.4 542.785 145.9C524.174 119.408 516.647 92.8325 521.552 70.8815C526.457 48.9305 543.476 33.0154 569.577 25.9729M793.295 116.957C808.696 142.974 811.407 167.995 800.815 186.564C790.224 205.133 767.199 215.752 736.776 216.08C706.345 216.422 670.973 206.455 638.394 188.364C605.815 170.273 578.656 145.516 562.86 119.503C547.064 93.4913 543.898 68.3474 554.061 49.5406C564.225 30.7338 586.898 19.8076 617.124 19.1277M744.628 61.5395C766.432 78.6161 782.322 98.7407 789.389 118.206C796.441 137.662 794.186 155.145 783.013 167.395C771.839 179.645 752.53 185.827 728.641 184.814C704.753 183.802 677.921 175.645 653.122 161.875C628.31 148.096 607.216 129.64 593.729 109.897C580.241 90.1541 575.281 70.4953 579.773 54.5351C584.265 38.5749 597.899 27.4108 618.157 23.1197C638.401 18.8207 663.898 21.6787 689.92 31.1602M771.507 135.304C764.816 147.353 750.043 154.279 730.462 154.558C710.868 154.828 688.068 148.424 667.067 136.763C646.052 125.093 628.564 109.124 618.45 92.3562C608.321 75.5804 606.397 59.4009 613.096 47.3373C619.787 35.288 634.56 28.3618 654.14 28.0837C673.735 27.8135 696.535 34.217 717.536 45.8787C738.536 57.5405 756.039 73.5171 766.153 90.2851C776.268 107.053 778.198 123.255 771.507 135.304ZM750.974 112.676C746.415 120.885 736.365 125.596 723.039 125.779C709.712 125.963 694.177 121.613 679.887 113.678C665.596 105.742 653.684 94.8682 646.803 83.4448C639.914 72.0357 638.6 61.0142 643.158 52.8052C647.717 44.5963 657.767 39.8852 671.093 39.7018C684.42 39.5185 699.955 43.8677 714.246 51.8035C728.536 59.7392 740.448 70.6128 747.329 82.0362C754.219 93.4453 755.532 104.467 750.974 112.676ZM727.258 92.651C722.454 101.303 706.34 101.526 691.264 93.1544C676.189 84.7826 667.86 70.9867 672.665 62.3352C677.469 53.6837 693.582 53.4601 708.658 61.8319C723.734 70.2036 732.062 83.9995 727.258 92.651Z" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M616.209 87.9218C599.431 92.7016 576.511 102.341 558.804 112.37C556.171 107.185 550.64 94.8484 549.584 86.9834" stroke="url(#paint0_linear_1058_7467)" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M586.947 98.5664C565.955 106.748 527.276 129.773 507.771 147.1" stroke="url(#paint1_linear_1058_7467)" stroke-width="0.5"/>
|
||||
</g>
|
||||
<ellipse cx="615.94" cy="88.0894" rx="3.04834" ry="3.27675" transform="rotate(-90 615.94 88.0894)" fill="white"/>
|
||||
<ellipse cx="507.502" cy="146.499" rx="3.04834" ry="3.27675" transform="rotate(-90 507.502 146.499)" fill="white"/>
|
||||
<ellipse cx="728.791" cy="182.932" rx="3.04834" ry="3.27675" transform="rotate(-90 728.791 182.932)" fill="white"/>
|
||||
<path d="M615.939 87.7544C613.269 83.0489 608.166 71.1103 609.12 61.0005C610.074 50.8907 614.08 45.5977 615.272 44.1189C597.961 41.4009 560.382 39.9227 530.72 50.7002" stroke="url(#paint2_linear_1058_7467)" stroke-width="0.5"/>
|
||||
<path d="M530.72 50.7002C560.382 39.9227 597.961 41.4009 615.272 44.1189C614.252 45.3844 611.171 49.4427 609.706 56.9222" stroke="url(#paint3_linear_1058_7467)" stroke-width="0.5"/>
|
||||
<path d="M563.92 205.585C569.994 196.148 590.742 172.841 600.408 162.17C591.09 154.758 580.508 142.893 576.294 137.819C591.489 125.695 616.523 110.497 627.141 104.414C624.343 101.07 618.198 93.1578 615.997 88.2627" stroke="url(#paint4_linear_1058_7467)" stroke-width="0.5"/>
|
||||
<path d="M657.607 211.413C664.157 199.477 676.733 161.646 682.595 144.365C656.689 133.62 638.241 117.431 627.133 104.355" stroke="url(#paint5_linear_1058_7467)" stroke-width="0.5"/>
|
||||
<path d="M728.435 185.115C704.866 183.809 681.795 175.696 673.206 171.803C675.466 165.597 680.513 151.429 682.622 144.4" stroke="url(#paint6_linear_1058_7467)" stroke-width="0.5"/>
|
||||
<rect x="600.459" y="40.4072" width="31.5" height="31.5" rx="4.75" fill="#191D1E"/>
|
||||
<rect x="600.459" y="40.4072" width="31.5" height="31.5" rx="4.75" stroke="#172021" stroke-width="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M610.709 51.1562C610.709 50.3278 611.381 49.6562 612.209 49.6562H620.209C621.037 49.6562 621.709 50.3278 621.709 51.1562V53.1562C621.709 53.6892 621.431 54.1573 621.012 54.4233V57.8909C621.431 58.1569 621.709 58.625 621.709 59.158V61.158C621.709 61.9864 621.037 62.658 620.209 62.658H612.209C611.381 62.658 610.709 61.9864 610.709 61.158V59.158C610.709 58.6187 610.994 58.1458 611.421 57.8815V54.4327C610.994 54.1684 610.709 53.6956 610.709 53.1562V51.1562ZM620.225 53.656H612.193C611.924 53.6477 611.709 53.4271 611.709 53.1562V51.1562C611.709 50.8801 611.933 50.6562 612.209 50.6562H620.209C620.485 50.6562 620.709 50.8801 620.709 51.1562V53.1562C620.709 53.4271 620.494 53.6477 620.225 53.656ZM612.421 54.6562V57.656H620.012V54.6562H612.421ZM612.209 58.658C611.933 58.658 611.709 58.8818 611.709 59.158V61.158C611.709 61.4341 611.933 61.658 612.209 61.658H620.209C620.485 61.658 620.709 61.4341 620.709 61.158V59.158C620.709 58.8818 620.485 58.658 620.209 58.658H612.209Z" fill="#B0B0B0"/>
|
||||
<rect x="492.021" y="98.8164" width="31.5" height="31.5" rx="4.75" fill="#191D1E"/>
|
||||
<rect x="492.021" y="98.8164" width="31.5" height="31.5" rx="4.75" stroke="#172021" stroke-width="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M511.505 114.411C511.643 114.172 511.948 114.09 512.188 114.228L513.473 114.97C513.937 115.238 514.223 115.734 514.223 116.269V117.132C514.223 117.668 513.937 118.163 513.473 118.431L509.492 120.73C508.409 121.355 507.075 121.355 505.992 120.73L502.011 118.431C501.547 118.163 501.261 117.668 501.261 117.132V116.371C501.261 115.843 501.539 115.353 501.993 115.083L503.421 114.232C503.658 114.09 503.965 114.168 504.106 114.405C504.248 114.643 504.17 114.949 503.933 115.091L502.505 115.942C502.353 116.032 502.261 116.195 502.261 116.371V117.132C502.261 117.311 502.356 117.476 502.511 117.565L506.492 119.864C507.265 120.31 508.218 120.31 508.992 119.864L512.973 117.565C513.128 117.476 513.223 117.311 513.223 117.132V116.269C513.223 116.091 513.128 115.926 512.973 115.836L511.688 115.094C511.448 114.956 511.367 114.65 511.505 114.411Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M506.478 108.143C507.256 107.68 508.224 107.673 509.008 108.126L513.473 110.704C513.937 110.972 514.223 111.467 514.223 112.003V112.866C514.223 113.401 513.937 113.897 513.473 114.165L509.492 116.463C508.409 117.088 507.075 117.088 505.992 116.463L502.011 114.165C501.547 113.897 501.261 113.401 501.261 112.866V112.105C501.261 111.576 501.539 111.087 501.993 110.816L506.478 108.143ZM508.508 108.992C508.037 108.72 507.457 108.724 506.99 109.002L502.505 111.675C502.353 111.765 502.261 111.929 502.261 112.105V112.866C502.261 113.044 502.356 113.209 502.511 113.299L506.492 115.597C507.265 116.044 508.218 116.044 508.992 115.597L512.973 113.299C513.128 113.209 513.223 113.044 513.223 112.866V112.003C513.223 111.824 513.128 111.659 512.973 111.57L508.508 108.992Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M514 115.533C514.136 115.774 514.05 116.078 513.809 116.214L509.001 118.913C508.239 119.34 507.31 119.339 506.549 118.911L501.765 116.213C501.525 116.077 501.44 115.773 501.575 115.532C501.711 115.291 502.016 115.206 502.257 115.342L507.04 118.039C507.497 118.297 508.055 118.297 508.511 118.041L513.32 115.342C513.56 115.206 513.865 115.292 514 115.533Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M514 111.266C514.136 111.507 514.05 111.812 513.809 111.947L509.001 114.646C508.239 115.074 507.31 115.073 506.549 114.644L501.765 111.947C501.525 111.811 501.44 111.506 501.575 111.266C501.711 111.025 502.016 110.94 502.257 111.076L507.04 113.773C507.497 114.03 508.055 114.031 508.511 113.774L513.32 111.075C513.56 110.94 513.865 111.026 514 111.266Z" fill="#B0B0B0"/>
|
||||
<rect x="713.311" y="135.25" width="31.5" height="31.5" rx="4.75" fill="#191D1E"/>
|
||||
<rect x="713.311" y="135.25" width="31.5" height="31.5" rx="4.75" stroke="#172021" stroke-width="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M732.794 150.845C732.932 150.606 733.238 150.524 733.477 150.662L734.762 151.404C735.226 151.672 735.512 152.167 735.512 152.703V153.566C735.512 154.102 735.226 154.597 734.762 154.865L730.781 157.163C729.698 157.788 728.364 157.788 727.281 157.163L723.3 154.865C722.836 154.597 722.55 154.102 722.55 153.566V152.805C722.55 152.276 722.828 151.787 723.282 151.516L724.71 150.665C724.947 150.524 725.254 150.602 725.395 150.839C725.537 151.076 725.459 151.383 725.222 151.524L723.794 152.375C723.643 152.465 723.55 152.629 723.55 152.805V153.566C723.55 153.744 723.645 153.909 723.8 153.999L727.781 156.297C728.554 156.744 729.507 156.744 730.281 156.297L734.262 153.999C734.417 153.909 734.512 153.744 734.512 153.566V152.703C734.512 152.524 734.417 152.359 734.262 152.27L732.977 151.528C732.738 151.39 732.656 151.084 732.794 150.845Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M727.767 144.577C728.545 144.113 729.513 144.107 730.297 144.56L734.762 147.137C735.226 147.405 735.512 147.901 735.512 148.437V149.299C735.512 149.835 735.226 150.33 734.762 150.598L730.781 152.897C729.698 153.522 728.364 153.522 727.281 152.897L723.3 150.598C722.836 150.33 722.55 149.835 722.55 149.299V148.538C722.55 148.01 722.828 147.52 723.282 147.25L727.767 144.577ZM729.797 145.426C729.326 145.154 728.746 145.158 728.279 145.436L723.794 148.109C723.643 148.199 723.55 148.362 723.55 148.538V149.299C723.55 149.478 723.645 149.643 723.8 149.732L727.781 152.031C728.554 152.477 729.507 152.477 730.281 152.031L734.262 149.732C734.417 149.643 734.512 149.478 734.512 149.299V148.437C734.512 148.258 734.417 148.093 734.262 148.003L729.797 145.426Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M735.29 151.966C735.425 152.207 735.339 152.512 735.098 152.647L730.29 155.346C729.529 155.774 728.599 155.773 727.838 155.344L723.054 152.647C722.814 152.511 722.729 152.206 722.864 151.966C723 151.725 723.305 151.64 723.546 151.776L728.33 154.473C728.786 154.73 729.344 154.731 729.801 154.474L734.609 151.775C734.85 151.64 735.154 151.726 735.29 151.966Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M735.29 147.7C735.425 147.941 735.339 148.246 735.098 148.381L730.29 151.08C729.529 151.508 728.599 151.507 727.838 151.078L723.054 148.38C722.814 148.245 722.729 147.94 722.864 147.699C723 147.459 723.305 147.374 723.546 147.509L728.33 150.207C728.786 150.464 729.344 150.465 729.801 150.208L734.609 147.509C734.85 147.374 735.154 147.459 735.29 147.7Z" fill="#B0B0B0"/>
|
||||
<path d="M615.939 87.4883V72.1572" stroke="white" stroke-width="0.5" stroke-dasharray="0.5 1"/>
|
||||
<path d="M507.502 145.897V130.566" stroke="white" stroke-width="0.5" stroke-dasharray="0.5 1"/>
|
||||
<path d="M728.791 182.331V167" stroke="white" stroke-width="0.5" stroke-dasharray="0.5 1"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_1058_7467" x1="627.773" y1="90.6494" x2="599.935" y2="113.712" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_1058_7467" x1="596.26" y1="96.2593" x2="510.475" y2="166.414" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_1058_7467" x1="615.939" y1="85.9359" x2="605.369" y2="61.5087" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_1058_7467" x1="615.271" y1="46.5474" x2="530.72" y2="51.0624" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_1058_7467" x1="616.391" y1="114.091" x2="575.928" y2="196.152" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear_1058_7467" x1="647.772" y1="129.435" x2="657.45" y2="201.108" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white" stop-opacity="0.51"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint6_linear_1058_7467" x1="698.115" y1="177.299" x2="732.042" y2="188.981" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_1058_7467">
|
||||
<rect width="764" height="208" fill="white" transform="translate(0.517578)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,81 @@
|
||||
<svg width="349" height="174" viewBox="0 0 349 174" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1058_7510)">
|
||||
<rect width="349" height="174" fill="#121516"/>
|
||||
<g style="mix-blend-mode:lighten">
|
||||
<path opacity="0.6" d="M91.2673 362.109C89.5509 361.062 92.677 352.17 100.308 336.309C107.939 320.448 119.816 298.185 134.739 271.748C149.663 245.311 167.109 215.643 185.326 185.73C203.551 155.804 221.901 126.693 238.527 101.295C255.166 75.9048 269.501 55.1368 280.087 41.0851C290.681 27.0191 297.154 20.1723 298.87 21.2188" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M66.2027 344.063C59.0736 338.03 58.0196 325.061 63.1375 306.46C68.2698 287.867 79.4076 264.278 95.4238 238.093C111.44 211.908 131.791 184.039 154.41 157.3C177.037 130.546 201.131 105.858 224.277 85.7054C247.436 65.5606 268.827 50.6535 286.314 42.5071C303.8 34.3607 316.765 33.248 323.902 39.2659" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M41.7509 319.431C31.4738 307.093 28.4742 289.084 33.0253 267.198C37.5764 245.312 49.5498 220.319 67.7185 194.732C85.8872 169.144 109.62 143.864 136.533 121.433C163.447 99.0017 192.593 80.2198 221.024 66.9625C249.47 53.7131 276.202 46.442 298.565 45.8969C320.919 45.366 338.099 51.5628 348.362 63.8928" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M18.1025 283.944C8.08581 264.746 6.41913 241.612 13.2791 216.88C20.139 192.148 35.283 166.693 57.1682 143.057C79.0678 119.43 106.941 98.4657 138 82.2593C169.059 66.0529 202.218 55.215 234.12 50.7774C266.036 46.3476 295.576 48.5181 319.775 57.0435C343.975 65.569 361.989 80.1862 372.006 99.3841" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M-0.619894 230.874C-5.68757 205.59 -1.62432 178.931 11.1612 153.586C23.9466 128.241 44.9993 105.096 72.2149 86.4935C99.4304 67.8912 131.838 54.4697 166.186 47.5795C200.533 40.6892 235.61 40.5921 267.893 47.2745C300.176 53.9569 328.521 67.1939 350.082 85.6488C371.644 104.104 385.668 127.152 390.736 152.437" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M-1.28202 155.91C3.76282 128.19 17.7933 102.621 39.4048 81.7658C61.0019 60.9028 89.4171 45.4884 121.799 37.0584C154.173 28.6427 189.36 27.5051 223.824 33.7921C258.296 40.0649 290.827 53.5342 318.142 72.8303C345.456 92.1263 366.628 116.566 379.48 143.708C392.333 170.85 396.456 199.719 391.411 227.439" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M33.5996 74.3692C59.0245 39.3813 100.41 18.1688 148.671 15.4187C196.933 12.6687 248.099 28.604 290.918 59.7041C333.738 90.8041 364.716 134.549 377.021 181.28C389.317 228.025 381.957 273.941 356.546 308.936" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M95.3283 18.7892C130.834 -1.69101 175.398 -3.13178 219.212 14.8098C263.025 32.7513 302.497 68.5674 328.94 114.426C355.391 160.271 366.651 212.38 360.234 259.287C353.818 306.194 330.272 344.055 294.766 364.536" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M155.837 -4.01968C191.084 -11.083 229.015 2.75167 261.297 34.4628C293.578 66.1739 317.547 113.124 327.954 165.021C338.361 216.918 334.323 269.498 316.759 311.186C299.194 352.874 269.522 380.273 234.275 387.336" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M203.916 -7.70982C232.333 -6.44321 258.659 15.7778 277.096 54.0533C295.534 92.3287 304.559 143.552 302.227 196.425C299.872 249.304 286.34 299.507 264.577 336.006C242.815 372.505 214.634 392.308 186.217 391.041" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M241.355 -2.45687C259.849 1.94737 272.698 26.6405 277.091 66.1574C281.484 105.674 277.056 156.805 264.769 208.297C252.489 259.775 233.359 307.41 211.604 340.701C189.849 373.991 167.239 390.219 148.754 385.801" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M272.02 7.5233C279.659 10.7194 278.862 33.1772 269.828 69.9638C260.795 106.75 244.261 154.857 223.851 203.687C203.441 252.518 180.839 298.096 160.992 330.372C141.168 362.642 125.738 378.991 118.099 375.795" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M126.725 379.187C107.245 372.087 88.3289 361.582 72.0039 348.8M199.501 391.189C168.763 391.884 132.771 381.89 99.635 363.49C66.4994 345.089 39.0122 319.814 23.3301 293.361M247.063 384.352C207.973 394.904 153.379 384.368 103.455 356.645C53.5299 328.922 15.7269 288.149 4.02035 249.39M286.593 369.002C265.987 379.638 238.023 383.106 206.413 378.945C174.803 374.784 140.999 363.204 109.519 345.724C78.0398 328.243 50.3326 305.684 30.0988 281.037C9.85698 256.404 -1.98185 230.833 -3.84677 207.719M320.094 347.222C299.957 363.404 269.002 370.609 232.251 367.666C195.501 364.723 155.118 351.805 117.671 331.011C80.2236 310.216 47.911 282.765 25.9854 253.125C4.05981 223.485 -6.1874 193.401 -3.09624 167.753M347.825 320.089C329.706 341.651 297.234 352.833 256.643 351.493C216.043 350.166 170.148 336.411 127.761 312.873C85.3744 289.336 49.4368 257.649 26.849 223.887C4.26121 190.125 -3.41242 156.65 5.30443 129.886M369.54 288.552C359.781 306.126 342.138 318.893 318.383 325.613C294.613 332.325 265.583 332.735 234.182 326.785C202.781 320.836 170.132 308.757 139.494 291.744C108.857 274.731 81.3452 253.402 59.6952 229.892C38.0451 206.382 23.0327 181.515 16.1793 157.798C9.31172 134.073 10.8445 112.341 20.5957 94.7811M369.54 288.552C343.847 334.822 300.811 368.996 249.919 383.547C199.027 398.099 144.453 391.833 98.1684 366.131C51.8985 340.437 17.724 297.401 3.1649 246.524C-11.3862 195.632 -5.12047 141.057 20.5814 94.7732C46.2753 48.5032 89.3109 14.3287 140.189 -0.230322C191.081 -14.7814 245.655 -8.51567 291.939 17.1862C338.209 42.8801 372.384 85.9156 386.943 136.793C401.494 187.686 395.234 242.282 369.54 288.552ZM384.832 253.447C378.171 273.918 362.226 289.514 338.827 298.45C315.437 307.372 285.56 309.273 252.621 303.907C219.673 298.556 184.999 286.156 152.591 268.16C120.169 250.156 91.3279 227.285 69.3683 202.146C47.4086 177.007 33.2064 150.648 28.4291 126.084C23.6375 101.513 28.4614 79.7417 42.3113 63.2436M393.196 215.579C390.428 238.492 377.154 256.711 355.122 267.862C333.082 279.028 303.294 282.585 269.681 278.096C236.067 273.608 200.184 261.265 166.734 242.69C133.284 224.116 103.839 200.181 82.2595 174.02C60.6803 147.86 47.953 120.694 45.7801 96.0832C43.6071 71.4721 52.0555 50.5736 70.0344 36.1255M393.983 175.614C395.981 200.371 386.426 221.009 366.767 234.412C347.108 247.816 318.415 253.269 285 249.937C251.585 246.605 215.282 234.682 181.561 215.957C147.84 197.232 118.514 172.71 98.0359 146.115C77.5431 119.512 67.0046 92.2725 67.9897 68.4998C68.9749 44.7271 81.4571 25.7137 103.514 14.3149M386.116 133.943C393.928 159.837 389.423 182.682 373.382 198.449C357.342 214.217 330.805 221.876 298.464 220.074C266.137 218.28 230.1 207.123 196.75 188.603C163.401 170.084 134.894 145.4 116.268 118.9C97.656 92.4078 90.1296 65.8325 95.0344 43.8815C99.9392 21.9305 116.958 6.01544 143.059 -1.02709M366.778 89.9565C382.179 115.974 384.889 140.995 374.298 159.564C363.706 178.133 340.681 188.752 310.258 189.08C279.827 189.422 244.455 179.455 211.877 161.364C179.298 143.273 152.139 118.516 136.343 92.5035C120.546 66.4913 117.381 41.3474 127.544 22.5406C137.707 3.73382 160.38 -7.19241 190.606 -7.87229M318.11 34.5395C339.914 51.6161 355.805 71.7407 362.871 91.2055C369.924 110.662 367.668 128.145 356.495 140.395C345.322 152.645 326.012 158.827 302.123 157.814C278.235 156.802 251.403 148.645 226.605 134.875C201.792 121.096 180.698 102.64 167.211 82.8969C153.724 63.1541 148.764 43.4953 153.256 27.5351C157.747 11.5749 171.381 0.410837 191.64 -3.88027C211.884 -8.17931 237.381 -5.32126 263.403 4.16024M344.99 108.304C338.299 120.353 323.525 127.279 303.945 127.558C284.35 127.828 261.55 121.424 240.55 109.763C219.535 98.0928 202.047 82.1242 191.932 65.3562C181.803 48.5804 179.879 32.4009 186.578 20.3373C193.269 8.288 208.042 1.36183 227.623 1.08369C247.217 0.813477 270.017 7.21697 291.018 18.8787C312.019 30.5405 329.521 46.5171 339.636 63.2851C349.75 80.053 351.681 96.2547 344.99 108.304ZM324.456 85.6758C319.898 93.8848 309.848 98.5958 296.521 98.7792C283.195 98.9625 267.66 94.6133 253.369 86.6775C239.078 78.7418 227.166 67.8682 220.285 56.4448C213.396 45.0357 212.082 34.0142 216.641 25.8052C221.199 17.5963 231.249 12.8852 244.576 12.7018C257.902 12.5185 273.437 16.8677 287.728 24.8035C302.019 32.7392 313.931 43.6128 320.812 55.0362C327.701 66.4453 329.015 77.4669 324.456 85.6758ZM300.74 65.651C295.936 74.3026 279.823 74.5261 264.747 66.1544C249.671 57.7826 241.343 43.9867 246.147 35.3352C250.951 26.6837 267.065 26.4601 282.14 34.8319C297.216 43.2036 305.544 56.9995 300.74 65.651Z" stroke="#575E61" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M189.692 60.9218C172.913 65.7016 149.994 75.341 132.286 85.3701C129.653 80.1849 124.123 67.8484 123.066 59.9834" stroke="url(#paint0_linear_1058_7510)" stroke-width="0.5"/>
|
||||
<path opacity="0.6" d="M160.43 71.5664C139.438 79.7485 100.759 102.773 81.2539 120.1" stroke="url(#paint1_linear_1058_7510)" stroke-width="0.5"/>
|
||||
</g>
|
||||
<ellipse cx="189.422" cy="61.0894" rx="3.04834" ry="3.27675" transform="rotate(-90 189.422 61.0894)" fill="white"/>
|
||||
<ellipse cx="80.9848" cy="119.499" rx="3.04834" ry="3.27675" transform="rotate(-90 80.9848 119.499)" fill="white"/>
|
||||
<ellipse cx="302.274" cy="155.932" rx="3.04834" ry="3.27675" transform="rotate(-90 302.274 155.932)" fill="white"/>
|
||||
<path d="M189.422 60.7544C186.751 56.0489 181.649 44.1103 182.602 34.0005C183.556 23.8907 187.562 18.5977 188.754 17.1189C171.443 14.4009 133.865 12.9227 104.202 23.7002" stroke="url(#paint2_linear_1058_7510)" stroke-width="0.5"/>
|
||||
<path d="M104.202 23.7002C133.865 12.9227 171.443 14.4009 188.754 17.1189C187.734 18.3844 184.654 22.4427 183.188 29.9222" stroke="url(#paint3_linear_1058_7510)" stroke-width="0.5"/>
|
||||
<path d="M137.402 178.585C143.476 169.148 164.225 145.841 173.89 135.17C164.572 127.758 153.99 115.893 149.777 110.819C164.971 98.6953 190.006 83.4975 200.623 77.4141C197.826 74.0699 191.68 66.1578 189.48 61.2627" stroke="url(#paint4_linear_1058_7510)" stroke-width="0.5"/>
|
||||
<path d="M231.089 184.413C237.64 172.477 250.216 134.646 256.077 117.365C230.171 106.62 211.724 90.4312 200.615 77.3555" stroke="url(#paint5_linear_1058_7510)" stroke-width="0.5"/>
|
||||
<path d="M301.917 158.115C278.348 156.809 255.278 148.696 246.688 144.803C248.949 138.597 253.996 124.429 256.104 117.4" stroke="url(#paint6_linear_1058_7510)" stroke-width="0.5"/>
|
||||
<rect x="173.941" y="13.4072" width="31.5" height="31.5" rx="4.75" fill="#191D1E"/>
|
||||
<rect x="173.941" y="13.4072" width="31.5" height="31.5" rx="4.75" stroke="#172021" stroke-width="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M184.191 24.1562C184.191 23.3278 184.863 22.6562 185.691 22.6562H193.691C194.52 22.6562 195.191 23.3278 195.191 24.1562V26.1562C195.191 26.6892 194.913 27.1573 194.495 27.4233V30.8909C194.913 31.1569 195.191 31.625 195.191 32.158V34.158C195.191 34.9864 194.52 35.658 193.691 35.658H185.691C184.863 35.658 184.191 34.9864 184.191 34.158V32.158C184.191 31.6187 184.476 31.1458 184.903 30.8815V27.4327C184.476 27.1684 184.191 26.6956 184.191 26.1562V24.1562ZM193.707 26.656H185.676C185.407 26.6477 185.191 26.4271 185.191 26.1562V24.1562C185.191 23.8801 185.415 23.6562 185.691 23.6562H193.691C193.968 23.6562 194.191 23.8801 194.191 24.1562V26.1562C194.191 26.4271 193.976 26.6477 193.707 26.656ZM185.903 27.6562V30.656H193.495V27.6562H185.903ZM185.691 31.658C185.415 31.658 185.191 31.8818 185.191 32.158V34.158C185.191 34.4341 185.415 34.658 185.691 34.658H193.691C193.968 34.658 194.191 34.4341 194.191 34.158V32.158C194.191 31.8818 193.968 31.658 193.691 31.658H185.691Z" fill="#B0B0B0"/>
|
||||
<rect x="65.5039" y="71.8164" width="31.5" height="31.5" rx="4.75" fill="#191D1E"/>
|
||||
<rect x="65.5039" y="71.8164" width="31.5" height="31.5" rx="4.75" stroke="#172021" stroke-width="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M84.987 87.4113C85.1251 87.1722 85.4309 87.0902 85.6701 87.2283L86.9554 87.9704C87.4195 88.2383 87.7054 88.7335 87.7054 89.2694V90.132C87.7054 90.6679 87.4195 91.1631 86.9554 91.4311L82.9743 93.7295C81.8914 94.3548 80.5572 94.3548 79.4743 93.7295L75.4932 91.4311C75.0291 91.1631 74.7432 90.6679 74.7432 90.132V89.3712C74.7432 88.8427 75.0213 88.3532 75.4753 88.0826L76.9031 87.2318C77.1403 87.0904 77.4472 87.1682 77.5886 87.4054C77.7299 87.6426 77.6522 87.9495 77.415 88.0908L75.9872 88.9417C75.8359 89.0318 75.7432 89.195 75.7432 89.3712V90.132C75.7432 90.3106 75.8385 90.4757 75.9932 90.565L79.9743 92.8635C80.7478 93.3101 81.7008 93.3101 82.4743 92.8635L86.4554 90.565C86.6101 90.4757 86.7054 90.3106 86.7054 90.132V89.2694C86.7054 89.0908 86.6101 88.9257 86.4554 88.8364L85.1701 88.0943C84.9309 87.9563 84.849 87.6505 84.987 87.4113Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M79.9605 81.1434C80.7384 80.6799 81.7061 80.6732 82.4903 81.126L86.9554 83.7039C87.4195 83.9718 87.7054 84.467 87.7054 85.0029V85.8655C87.7054 86.4014 87.4195 86.8966 86.9554 87.1646L82.9743 89.463C81.8914 90.0883 80.5572 90.0883 79.4743 89.463L75.4932 87.1646C75.0291 86.8966 74.7432 86.4014 74.7432 85.8655V85.1047C74.7432 84.5762 75.0213 84.0867 75.4753 83.8161L79.9605 81.1434ZM81.9903 81.992C81.5197 81.7203 80.9391 81.7243 80.4724 82.0024L75.9872 84.6752C75.8359 84.7653 75.7432 84.9285 75.7432 85.1047V85.8655C75.7432 86.0441 75.8385 86.2092 75.9932 86.2985L79.9743 88.597C80.7478 89.0436 81.7008 89.0436 82.4743 88.597L86.4554 86.2985C86.6101 86.2092 86.7054 86.0441 86.7054 85.8655V85.0029C86.7054 84.8243 86.6101 84.6592 86.4554 84.5699L81.9903 81.992Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M87.4829 88.5328C87.618 88.7736 87.5324 89.0784 87.2916 89.2136L82.4834 91.9128C81.7219 92.3404 80.7925 92.3395 80.0317 91.9106L75.2478 89.2131C75.0073 89.0775 74.9222 88.7726 75.0578 88.532C75.1935 88.2915 75.4984 88.2064 75.739 88.3421L80.5229 91.0395C80.9793 91.2968 81.537 91.2974 81.9939 91.0409L86.8021 88.3416C87.0429 88.2064 87.3477 88.292 87.4829 88.5328Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M87.4829 84.2665C87.618 84.5073 87.5324 84.812 87.2916 84.9472L82.4834 87.6465C81.7219 88.074 80.7925 88.0731 80.0317 87.6442L75.2478 84.9468C75.0073 84.8111 74.9222 84.5062 75.0578 84.2657C75.1935 84.0251 75.4984 83.9401 75.739 84.0757L80.5229 86.7731C80.9793 87.0305 81.537 87.031 81.9939 86.7745L86.8021 84.0752C87.0429 83.9401 87.3477 84.0257 87.4829 84.2665Z" fill="#B0B0B0"/>
|
||||
<rect x="286.793" y="108.25" width="31.5" height="31.5" rx="4.75" fill="#191D1E"/>
|
||||
<rect x="286.793" y="108.25" width="31.5" height="31.5" rx="4.75" stroke="#172021" stroke-width="0.5"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M306.276 123.845C306.414 123.606 306.72 123.524 306.959 123.662L308.244 124.404C308.709 124.672 308.994 125.167 308.994 125.703V126.566C308.994 127.102 308.709 127.597 308.244 127.865L304.263 130.163C303.18 130.788 301.846 130.788 300.763 130.163L296.782 127.865C296.318 127.597 296.032 127.102 296.032 126.566V125.805C296.032 125.276 296.31 124.787 296.764 124.516L298.192 123.665C298.429 123.524 298.736 123.602 298.878 123.839C299.019 124.076 298.941 124.383 298.704 124.524L297.276 125.375C297.125 125.465 297.032 125.629 297.032 125.805V126.566C297.032 126.744 297.128 126.909 297.282 126.999L301.263 129.297C302.037 129.744 302.99 129.744 303.763 129.297L307.744 126.999C307.899 126.909 307.994 126.744 307.994 126.566V125.703C307.994 125.524 307.899 125.359 307.744 125.27L306.459 124.528C306.22 124.39 306.138 124.084 306.276 123.845Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M301.25 117.577C302.027 117.113 302.995 117.107 303.779 117.56L308.244 120.137C308.709 120.405 308.994 120.901 308.994 121.437V122.299C308.994 122.835 308.709 123.33 308.244 123.598L304.263 125.897C303.18 126.522 301.846 126.522 300.763 125.897L296.782 123.598C296.318 123.33 296.032 122.835 296.032 122.299V121.538C296.032 121.01 296.31 120.52 296.764 120.25L301.25 117.577ZM303.279 118.426C302.809 118.154 302.228 118.158 301.761 118.436L297.276 121.109C297.125 121.199 297.032 121.362 297.032 121.538V122.299C297.032 122.478 297.128 122.643 297.282 122.732L301.263 125.031C302.037 125.477 302.99 125.477 303.763 125.031L307.744 122.732C307.899 122.643 307.994 122.478 307.994 122.299V121.437C307.994 121.258 307.899 121.093 307.744 121.003L303.279 118.426Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M308.772 124.966C308.907 125.207 308.821 125.512 308.581 125.647L303.772 128.346C303.011 128.774 302.082 128.773 301.321 128.344L296.537 125.647C296.296 125.511 296.211 125.206 296.347 124.966C296.483 124.725 296.787 124.64 297.028 124.776L301.812 127.473C302.268 127.73 302.826 127.731 303.283 127.474L308.091 124.775C308.332 124.64 308.637 124.726 308.772 124.966Z" fill="#B0B0B0"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M308.772 120.7C308.907 120.941 308.821 121.246 308.581 121.381L303.772 124.08C303.011 124.508 302.082 124.507 301.321 124.078L296.537 121.38C296.296 121.245 296.211 120.94 296.347 120.699C296.483 120.459 296.787 120.374 297.028 120.509L301.812 123.207C302.268 123.464 302.826 123.465 303.283 123.208L308.091 120.509C308.332 120.374 308.637 120.459 308.772 120.7Z" fill="#B0B0B0"/>
|
||||
<path d="M189.422 60.4883V45.1572" stroke="white" stroke-width="0.5" stroke-dasharray="0.5 1"/>
|
||||
<path d="M80.9844 118.897V103.566" stroke="white" stroke-width="0.5" stroke-dasharray="0.5 1"/>
|
||||
<path d="M302.273 155.331V140" stroke="white" stroke-width="0.5" stroke-dasharray="0.5 1"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_1058_7510" x1="201.255" y1="63.6494" x2="173.418" y2="86.7122" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_1058_7510" x1="169.742" y1="69.2593" x2="83.9571" y2="139.414" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_1058_7510" x1="189.422" y1="58.9359" x2="178.852" y2="34.5087" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_1058_7510" x1="188.754" y1="19.5474" x2="104.202" y2="24.0624" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_1058_7510" x1="189.873" y1="87.0908" x2="149.41" y2="169.152" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear_1058_7510" x1="221.254" y1="102.435" x2="230.933" y2="174.108" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white" stop-opacity="0.51"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint6_linear_1058_7510" x1="271.597" y1="150.299" x2="305.525" y2="161.981" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="white"/>
|
||||
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_1058_7510">
|
||||
<rect width="349" height="174" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 19 KiB |
@@ -5,9 +5,30 @@
|
||||
<link>https://supabase.com</link>
|
||||
<description>Latest news from Supabase</description>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Wed, 13 Dec 2023 23:00:00 GMT</lastBuildDate>
|
||||
<lastBuildDate>Thu, 14 Dec 2023 23:00:00 GMT</lastBuildDate>
|
||||
<atom:link href="https://supabase.com/rss.xml" rel="self" type="application/rss+xml"/>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/introducing-read-replicas</guid>
|
||||
<title>Introducing Read Replicas</title>
|
||||
<link>https://supabase.com/blog/introducing-read-replicas</link>
|
||||
<description>We are launching support for database Read Replicas</description>
|
||||
<pubDate>Thu, 14 Dec 2023 23:00:00 GMT</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/client-libraries-v2</guid>
|
||||
<title>Supabase Libraries V2: Python, Swift, Kotlin, Flutter, and Typescript</title>
|
||||
<link>https://supabase.com/blog/client-libraries-v2</link>
|
||||
<description>Swift, Kotlin, C#, and Python are now stable and moving to the v2 API.</description>
|
||||
<pubDate>Thu, 14 Dec 2023 23:00:00 GMT</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/postgres-on-fly-by-supabase</guid>
|
||||
<title>Fly Postgres, managed by Supabase</title>
|
||||
<link>https://supabase.com/blog/postgres-on-fly-by-supabase</link>
|
||||
<description>A managed Postgres offering developed by Supabase and Fly.io</description>
|
||||
<pubDate>Thu, 14 Dec 2023 23:00:00 GMT</pubDate>
|
||||
</item>
|
||||
<item>
|
||||
<guid>https://supabase.com/blog/supabase-auth-identity-linking-hooks</guid>
|
||||
<title>Supabase Auth: Identity Linking, Hooks, and HaveIBeenPwned integration</title>
|
||||
<link>https://supabase.com/blog/supabase-auth-identity-linking-hooks</link>
|
||||
|
||||
@@ -3,8 +3,6 @@ import Link from 'next/link'
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Button, cn } from 'ui'
|
||||
import { LOCAL_STORAGE_KEYS } from 'common'
|
||||
import announcement from '../../layout/banners/data/Announcement.json'
|
||||
import CountdownComponent from '../CountdownWidget/Countdown'
|
||||
import PromoBg from './PromoBg'
|
||||
|
||||
const LWXLogo =
|
||||
@@ -44,12 +42,12 @@ const PromoToast = () => {
|
||||
<p>Launch Week</p>
|
||||
<Image src={LWXLogo} alt="Supabase Launch Week X Logo" width={14} height={14} />
|
||||
</div>
|
||||
<span className="text-sm leading-4 mt-2">Day 4: Supabase Auth Day</span>
|
||||
<span className="text-sm leading-4 mt-2">Day 5: introducing Read Replicas</span>
|
||||
</div>
|
||||
|
||||
<div className="relative z-10 flex items-center space-x-2">
|
||||
<Button asChild type="secondary">
|
||||
<Link target="_blank" rel="noreferrer" href="https://supabase.com/launch-week#day-4">
|
||||
<Link target="_blank" rel="noreferrer" href="https://supabase.com/launch-week#day-5">
|
||||
Go to Launch Week
|
||||
</Link>
|
||||
</Button>
|
||||
|
||||
@@ -18,7 +18,7 @@ export const ThemeImage = ({ src, ...props }: any) => {
|
||||
return (
|
||||
<span className="next-image--dynamic-fill">
|
||||
<Image
|
||||
sizes="(max-width: 768px) 120vw, (max-width: 1200px) 100vw, 1200px"
|
||||
sizes="(max-width: 768px) 120vw, (max-width: 1200px) 100vw, 2000px"
|
||||
{...props}
|
||||
className={cn('border border-muted rounded-md', props.className)}
|
||||
src={
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
import { useRouter } from 'next/router'
|
||||
import announcement from '../data/Announcement.json'
|
||||
import Countdown from './Countdown'
|
||||
import Image from 'next/image'
|
||||
import { Button } from 'ui'
|
||||
|
||||
@@ -35,7 +33,7 @@ export function LWXCountdownBanner() {
|
||||
className="filter contrast-0 dark:contrast-100"
|
||||
/>
|
||||
</div>
|
||||
<div className="hidden sm:block">Day 4: Supabase Auth Day</div>
|
||||
<div className="hidden sm:block">Day 5: introducing Read Replicas</div>
|
||||
<Button
|
||||
onClick={() => null}
|
||||
size="tiny"
|
||||
|
||||