Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
454 changes: 454 additions & 0 deletions apps/docs/content/guides/database/joins-and-nesting.mdx

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ Projects must meet these requirements to use Read Replicas:
1. Running on AWS.
2. Running on at least a [Small compute add-on](/docs/guides/platform/compute-add-ons).

- Read Replicas are started on the same compute instance as the Primary to keep up with changes.
- Read Replicas are started on the same compute instance as the Primary to keep up with changes.

3. Running on Postgres 15+.

- For projects running on older versions of Postgres, you need to [upgrade to the latest platform version](/docs/guides/platform/migrating-and-upgrading-projects#pgupgrade).
- For projects running on older versions of Postgres, you need to [upgrade to the latest platform version](/docs/guides/platform/migrating-and-upgrading-projects#pgupgrade).

4. Not using [legacy logical backups](/docs/guides/platform/backups#point-in-time-recovery)

- Physical backups are automatically enabled if using [Point in time recovery (PITR)](/docs/guides/platform/backups#point-in-time-recovery)
- Physical backups are automatically enabled if using [Point in time recovery (PITR)](/docs/guides/platform/backups#point-in-time-recovery)

## Creating a Read Replica

Expand Down
16 changes: 10 additions & 6 deletions apps/docs/content/guides/self-hosting/copy-from-platform-s3.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ You need:
- A working self-hosted Supabase instance with the S3 protocol endpoint enabled - see [Configure S3 Storage](/docs/guides/self-hosting/self-hosted-s3#enable-the-s3-protocol-endpoint)
- Your platform project's S3 credentials - generated from the [S3 Configuration](/dashboard/project/_/storage/s3) page
- Matching buckets created on your self-hosted instance
{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
- [rclone](https://rclone.org/install/) installed on the machine running the copy

## Step 1: Get platform S3 credentials
Expand Down Expand Up @@ -50,22 +50,24 @@ If you already restored your platform database to self-hosted using the [restore
To list your platform buckets, connect to your platform database and run:

```sql
SELECT id, name, public FROM storage.buckets ORDER BY name;
select id, name, public from storage.buckets order by name;
```

Then create matching buckets on your self-hosted instance. Connect to your self-hosted database and run:

```sql
INSERT INTO storage.buckets (id, name, public)
VALUES
insert into storage.buckets (id, name, public)
values
('your-storage-bucket', 'your-storage-bucket', false)
ON CONFLICT (id) DO NOTHING;
on conflict (id) do nothing;
```

Repeat for each bucket, setting `public` to `true` or `false` as appropriate.

{/* supa-mdx-lint-disable-next-line Rule003Spelling */}

## Step 3: Configure rclone

{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
Create or edit your rclone configuration file (`~/.config/rclone/rclone.conf`):

Expand Down Expand Up @@ -139,14 +141,16 @@ Open Studio on your self-hosted instance and browse the storage buckets to confi
If you see `SignatureDoesNotMatch` when connecting to either remote:

- **Platform**: Regenerate S3 access keys from your project's Storage Settings. Ensure the endpoint URL includes `/storage/v1/s3`.
{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
- **Self-hosted**: Verify that `REGION`, `S3_PROTOCOL_ACCESS_KEY_ID` and `S3_PROTOCOL_ACCESS_KEY_SECRET` in `.env` file match your rclone config.

### Bucket not found

{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
If rclone reports that a bucket doesn't exist on the self-hosted side, create it first - see [Step 2](#step-2-create-buckets-on-self-hosted). The S3 protocol does not auto-create buckets on copy.

### Timeouts on large files

{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
For very large files, increase rclone's timeout:

Expand Down
11 changes: 9 additions & 2 deletions apps/docs/content/guides/self-hosting/self-hosted-s3.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ subtitle: 'Enable S3-compatible client endpoint and set up an S3 backend for sel

Self-hosted Supabase Storage has two independent S3-related features:
{/* supa-mdx-lint-disable-next-line Rule003Spelling */}

- **S3 protocol endpoint** - an S3-compatible API that Storage exposes at `/storage/v1/s3`. This allows standard S3 tools like `rclone` and the AWS CLI to interact with your Storage instance.
{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
- **S3 backend** - where Storage keeps data. By default, files are stored on the local filesystem. You can switch to an S3-compatible service (AWS S3, MinIO, etc.) for durability, scalability, or to use existing infrastructure.

You can configure either feature independently. For example, you can enable the S3 protocol endpoint to use `rclone` while keeping the default file-based storage, or switch to an S3 backend without enabling the S3 protocol endpoint.
Expand Down Expand Up @@ -42,7 +43,9 @@ s3://your-storage-bucket )
```

{/* supa-mdx-lint-disable-next-line Rule003Spelling */}

### Test with rclone

```bash
( set -a && \
source .env > /dev/null 2>&1 && \
Expand Down Expand Up @@ -70,7 +73,7 @@ storage:
GLOBAL_S3_BUCKET: your-s3-bucket-or-dirname
GLOBAL_S3_ENDPOINT: https://your-s3-endpoint
GLOBAL_S3_PROTOCOL: https
GLOBAL_S3_FORCE_PATH_STYLE: "true"
GLOBAL_S3_FORCE_PATH_STYLE: 'true'
AWS_ACCESS_KEY_ID: your-access-key-id
AWS_SECRET_ACCESS_KEY: your-secret-access-key
REGION: your-region
Expand All @@ -81,7 +84,9 @@ Depending on your setup, you may need to adjust these values - for example, to u

{/* supa-mdx-lint-disable-next-line Rule001HeadingCase */}
{/* supa-mdx-lint-disable-next-line Rule003Spelling */}

### Using MinIO

{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
An overlay `docker-compose.s3.yml` configuration can be added to enable MinIO container and provide an S3-compatible API for Storage backend:

Expand Down Expand Up @@ -109,6 +114,7 @@ storage:
For AWS S3, you do not need `GLOBAL_S3_ENDPOINT` or `GLOBAL_S3_FORCE_PATH_STYLE` - the Storage S3 client automatically resolves the endpoint from the region and uses virtual-hosted-style URLs, which is what AWS S3 expects. These variables are only needed for non-AWS S3-compatible providers.

### S3-compatible providers

{/* supa-mdx-lint-disable-next-line Rule003Spelling */}
Use the same configuration as MinIO, but point to your provider's endpoint, e.g.:

Expand All @@ -124,6 +130,7 @@ storage:
## Verify

{/* supa-mdx-lint-disable-next-line Rule003Spelling */}

- Open Studio and upload a file to a bucket. List the file using the AWS CLI or `rclone` to confirm the S3 endpoint works.
- If using an S3 backend: confirm the file appears in your S3 provider's console.

Expand Down
1 change: 0 additions & 1 deletion apps/docs/content/guides/telemetry/log-drains.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,6 @@ Ensure the AWS account tied to the Access Key ID has permissions to write to the

</Admonition>


## OpenTelemetry protocol (OTLP)

Logs are sent to any OTLP-compatible endpoint using the OpenTelemetry Protocol over HTTP with Protocol Buffers encoding.
Expand Down
170 changes: 109 additions & 61 deletions apps/studio/.github/eslint-rule-baselines.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
"import/no-anonymous-default-export": 57,
"@tanstack/query/exhaustive-deps": 13,
"@typescript-eslint/no-explicit-any": 1215,
"no-restricted-exports": 301,
"no-restricted-imports": 59
"no-restricted-imports": 59,
"no-restricted-exports": 300,
"react/no-unstable-nested-components": 69
},
"ruleFiles": {
"react-hooks/exhaustive-deps": {
Expand Down Expand Up @@ -737,6 +738,65 @@
"types/next.ts": 2,
"types/ui.ts": 2
},
"no-restricted-imports": {
"components/grid/SupabaseGrid.tsx": 1,
"components/grid/SupabaseGrid.utils.ts": 1,
"components/grid/components/common/Shortcuts.tsx": 1,
"components/grid/components/editor/BooleanEditor.tsx": 1,
"components/grid/components/editor/DateTimeEditor.tsx": 1,
"components/grid/components/editor/JsonEditor.tsx": 1,
"components/grid/components/editor/NumberEditor.tsx": 1,
"components/grid/components/editor/SelectEditor.tsx": 1,
"components/grid/components/editor/TextEditor.tsx": 1,
"components/grid/components/editor/TimeEditor.tsx": 1,
"components/grid/components/formatter/BinaryFormatter.tsx": 1,
"components/grid/components/formatter/BooleanFormatter.tsx": 1,
"components/grid/components/formatter/DefaultFormatter.tsx": 1,
"components/grid/components/formatter/ForeignKeyFormatter.tsx": 1,
"components/grid/components/formatter/JsonFormatter.tsx": 1,
"components/grid/components/formatter/ReferenceRecordPeek.tsx": 1,
"components/grid/components/grid/AddColumn.tsx": 1,
"components/grid/components/grid/Grid.tsx": 1,
"components/grid/components/grid/Grid.utils.tsx": 1,
"components/grid/components/grid/RowRenderer.tsx": 2,
"components/grid/components/grid/SelectColumn.tsx": 1,
"components/grid/components/menu/ColumnMenu.tsx": 1,
"components/grid/components/menu/RowContextMenu.tsx": 1,
"components/grid/types/base.ts": 1,
"components/grid/utils/column.ts": 1,
"components/grid/utils/gridColumns.tsx": 1,
"components/interfaces/Auth/Users/Users.utils.tsx": 1,
"components/interfaces/Auth/Users/UsersGridComponents.tsx": 1,
"components/interfaces/Auth/Users/UsersV2.tsx": 1,
"components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx": 1,
"components/interfaces/Integrations/CronJobs/CronJobsTab.DataGrid.tsx": 1,
"components/interfaces/Integrations/CronJobs/PreviousRunsTab.tsx": 1,
"components/interfaces/Integrations/Queues/Queues.utils.tsx": 1,
"components/interfaces/Integrations/Queues/QueuesTab.tsx": 1,
"components/interfaces/Integrations/Queues/SingleQueue/QueueDataGrid.tsx": 1,
"components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx": 1,
"components/interfaces/Integrations/Vault/Secrets/SecretsManagement.tsx": 1,
"components/interfaces/Linter/LinterDataGrid.tsx": 1,
"components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx": 1,
"components/interfaces/Realtime/Inspector/MessagesTable.tsx": 1,
"components/interfaces/Realtime/Inspector/RealtimeMessageColumnRenderer.tsx": 1,
"components/interfaces/SQLEditor/UtilityPanel/Results.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/AuthColumnRenderer.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/DatabaseApiColumnRender.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/DatabasePostgresColumnRender.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/DefaultPreviewColumnRenderer.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/FunctionsEdgeColumnRender.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/FunctionsLogsColumnRender.tsx": 1,
"components/interfaces/Settings/Logs/LogTable.tsx": 2,
"components/interfaces/Storage/StorageExplorer/ColumnContextMenu.tsx": 1,
"components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx": 1,
"components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx": 1,
"components/interfaces/Storage/StorageExplorer/FolderContextMenu.tsx": 1,
"components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx": 1,
"components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/SelectorGrid.tsx": 1,
"components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetPreviewGrid.tsx": 1,
"state/table-editor-table.tsx": 1
},
"no-restricted-exports": {
"__mocks__/hooks/analytics/useFillTimeseriesSorted.ts": 1,
"__mocks__/hooks/analytics/useLogsQuery.ts": 1,
Expand Down Expand Up @@ -1037,67 +1097,55 @@
"hooks/misc/useLatest.ts": 1,
"lib/api/apiWrapper.ts": 1,
"lib/pingPostgrest.ts": 1,
"scripts/codegen.ts": 1,
"vitest.config.ts": 1
"scripts/codegen.ts": 1
},
"no-restricted-imports": {
"components/grid/SupabaseGrid.tsx": 1,
"components/grid/SupabaseGrid.utils.ts": 1,
"components/grid/components/common/Shortcuts.tsx": 1,
"components/grid/components/editor/BooleanEditor.tsx": 1,
"components/grid/components/editor/DateTimeEditor.tsx": 1,
"components/grid/components/editor/JsonEditor.tsx": 1,
"components/grid/components/editor/NumberEditor.tsx": 1,
"components/grid/components/editor/SelectEditor.tsx": 1,
"components/grid/components/editor/TextEditor.tsx": 1,
"components/grid/components/editor/TimeEditor.tsx": 1,
"components/grid/components/formatter/BinaryFormatter.tsx": 1,
"components/grid/components/formatter/BooleanFormatter.tsx": 1,
"components/grid/components/formatter/DefaultFormatter.tsx": 1,
"components/grid/components/formatter/ForeignKeyFormatter.tsx": 1,
"components/grid/components/formatter/JsonFormatter.tsx": 1,
"components/grid/components/formatter/ReferenceRecordPeek.tsx": 1,
"components/grid/components/grid/AddColumn.tsx": 1,
"components/grid/components/grid/Grid.tsx": 1,
"components/grid/components/grid/Grid.utils.tsx": 1,
"components/grid/components/grid/RowRenderer.tsx": 2,
"components/grid/components/grid/SelectColumn.tsx": 1,
"components/grid/components/menu/ColumnMenu.tsx": 1,
"components/grid/components/menu/RowContextMenu.tsx": 1,
"components/grid/types/base.ts": 1,
"components/grid/utils/column.ts": 1,
"components/grid/utils/gridColumns.tsx": 1,
"components/interfaces/Auth/Users/Users.utils.tsx": 1,
"components/interfaces/Auth/Users/UsersGridComponents.tsx": 1,
"components/interfaces/Auth/Users/UsersV2.tsx": 1,
"components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx": 1,
"components/interfaces/Integrations/CronJobs/CronJobsTab.DataGrid.tsx": 1,
"components/interfaces/Integrations/CronJobs/PreviousRunsTab.tsx": 1,
"components/interfaces/Integrations/Queues/Queues.utils.tsx": 1,
"components/interfaces/Integrations/Queues/QueuesTab.tsx": 1,
"components/interfaces/Integrations/Queues/SingleQueue/QueueDataGrid.tsx": 1,
"components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx": 1,
"components/interfaces/Integrations/Vault/Secrets/SecretsManagement.tsx": 1,
"components/interfaces/Linter/LinterDataGrid.tsx": 1,
"components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx": 1,
"components/interfaces/Realtime/Inspector/MessagesTable.tsx": 1,
"components/interfaces/Realtime/Inspector/RealtimeMessageColumnRenderer.tsx": 1,
"components/interfaces/SQLEditor/UtilityPanel/Results.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/AuthColumnRenderer.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/DatabaseApiColumnRender.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/DatabasePostgresColumnRender.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/DefaultPreviewColumnRenderer.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/FunctionsEdgeColumnRender.tsx": 1,
"components/interfaces/Settings/Logs/LogColumnRenderers/FunctionsLogsColumnRender.tsx": 1,
"components/interfaces/Settings/Logs/LogTable.tsx": 2,
"components/interfaces/Storage/StorageExplorer/ColumnContextMenu.tsx": 1,
"react/no-unstable-nested-components": {
"components/grid/components/header/filter/FilterPopoverNew.tsx": 1,
"components/interfaces/Account/Preferences/ThemeSettings.tsx": 1,
"components/interfaces/App/CommandMenu/ContextSearchResults.shared.tsx": 1,
"components/interfaces/Auth/AuthProvidersForm/FormField.tsx": 1,
"components/interfaces/Connect/ConnectTabContent.tsx": 1,
"components/interfaces/ConnectSheet/ConnectStepsSection.tsx": 1,
"components/interfaces/Database/Migrations/MigrationsEmptyState.tsx": 3,
"components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx": 1,
"components/interfaces/Functions/TerminalInstructions.tsx": 3,
"components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx": 1,
"components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx": 1,
"components/interfaces/Integrations/Wrappers/WrapperTableEditor.tsx": 2,
"components/interfaces/Linter/LintPageTabs.tsx": 1,
"components/interfaces/Linter/LinterDataGrid.tsx": 3,
"components/interfaces/Markdown.tsx": 3,
"components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx": 1,
"components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx": 1,
"components/interfaces/Organization/Usage/UsageBarChart.tsx": 1,
"components/interfaces/ProjectAPIDocs/FirstLevelNav.tsx": 1,
"components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx": 1,
"components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DeployNewReplicaPanel.tsx": 1,
"components/interfaces/Settings/Logs/LogSelection.tsx": 1,
"components/interfaces/Settings/Logs/LogTable.tsx": 3,
"components/interfaces/Settings/Logs/LogsFormatters.tsx": 2,
"components/interfaces/Settings/Logs/PreviewFilterPanelWithUniversal.tsx": 1,
"components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx": 1,
"components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx": 1,
"components/interfaces/Storage/StorageExplorer/FolderContextMenu.tsx": 1,
"components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx": 1,
"components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/SelectorGrid.tsx": 1,
"components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetPreviewGrid.tsx": 1,
"state/table-editor-table.tsx": 1
"components/interfaces/Storage/StoragePolicies/StoragePoliciesEditPolicyModal.tsx": 1,
"components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.tsx": 2,
"components/interfaces/UnifiedLogs/components/LogTypeIcon.tsx": 5,
"components/layouts/ProjectLayout/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx": 1,
"components/layouts/ProjectLayout/NavigationBar/NavigationIconLink.tsx": 1,
"components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx": 3,
"components/layouts/SQLEditorLayout/SQLEditorNavV2/SearchList.tsx": 1,
"components/ui/AIAssistantPanel/MessageMarkdown.tsx": 1,
"components/ui/CardButton.tsx": 1,
"components/ui/Charts/AreaChart.tsx": 1,
"components/ui/Charts/BarChart.tsx": 1,
"components/ui/Charts/ComposedChart.tsx": 2,
"components/ui/Charts/ComposedChart.utils.tsx": 3,
"components/ui/ErrorBoundary/ErrorBoundary.tsx": 1,
"components/ui/FileExplorerAndEditor/index.tsx": 1,
"components/ui/NoPermission.tsx": 1,
"components/ui/SqlEditor.tsx": 1,
"pages/integrations/vercel/[slug]/deploy-button/new-project.tsx": 1,
"pages/project/[ref]/integrations/index.tsx": 2,
"pages/project/[ref]/observability/database.tsx": 1
}
}
}
Loading
Loading