请注意,本文正在进行中。请在评论中留下任何建议或问题。

相关材料:

  • https://supabase.io/docs/guides/self-hosting#configuring-each-service

什么是 Supabase?

Supbase 是一个基于 Postgres 的开源数据库解决方案。它包括 Postgres 的所有标准功能以及一些杀手级附加功能,例如实时流和 REST API。这些都得到了强大的库的支持。

自托管的优缺点

您可能想自托管 Supabase 的原因有很多:

  • 更多数据库空间 - 通过使用您自己的 VPS,您可以拥有一个比通过 Supabase 托管平台(当前)可用的数据库大很多倍的数据库

  • 完全的基础设施控制 - 你可以控制一切,所以如果你需要做出改变,你可以选择

还有一些原因,您可能希望让 Supbase 托管您的数据库而不是自托管:

  • 已经设置 - 您无需具备高水平的技术知识即可在其平台上设置 Supbase 实例

  • 费用 - 他们提供免费计划,可能足以满足您的需求

这篇文章是给谁看的?

这篇文章是为那些想要自托管 Supabase 但可能迷失了自托管指南的人而写的。请注意,目前,自托管选项不包括仪表板。如果这对您来说是一个交易破坏者,那么本指南不适合您。

为了充分利用本文,强烈建议您具备以下方面的基本经验:

  • Nginx - 配置端点/代理

  • Docker - 部署、配置 Dockerfiles

即使您缺乏这些技能,我也已尽力解释关键部分以及您需要更改的文件。

我们将使用 Portainer 来管理我们的 Docker 容器。我们还将在 Cloudflare 背后使用我们的服务。为此,我们将使用db.example.com作为我们的域名。这将在后面的 Nginx 配置部分提到。

开始设置

您应该做的第一件事是在某个地方设置托管。我个人推荐 DigitalOcean,因为几乎所有事情都可以从 Web 仪表板完成。就本文而言,如果您看到“Droplet”一词,这只是指将托管我们的 Supabase 实例的 VPS。

Supabase 为多个平台提供了一些一键式部署,但我们不会使用它们,因为它们不包含完整的 Supabase 体验。

相反,我们将安装 Docker。一些 VPS 提供商已经“准备好部署”Docker 实例。我建议使用一个,因为与手动设置 Docker 相比,这可以为您节省大量时间。

假设你已经设置了一个运行 Docker 的 Droplet / VPS,首先要做的是安装 Portainer。为此,请按照https://documentation.porttainer.io/v2.0/deploy/ceinstalldocker/处的指南进行操作。在撰写本文时,安装 Portainer 只需要 3 个步骤:

  1. SSH 进入你的 VPS

2.运行docker volume create portainer_data

3.运行docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

接下来,您需要为 Portainer 执行一些基本配置。在您的网络浏览器中,转到http://<ip-of-your-vps>:9000并按照屏幕上的说明进行操作。

接下来,我们需要设置 Nginx。幸运的是,使用 Portainer 很容易做到这一点。

继续之前的可选提示: 设置 2 个卷,nginx-confignginx-data,然后在设置 Nginx 时使用volumes选项卡中的那些。

从 Portainer 仪表板的左侧菜单中,选择“应用程序模板”,然后从列表中选择“Nginx”,然后按照说明进行操作。

通过 Portainer 部署

如果您最初阅读本指南,我建议创建一个 supbase 存储库的分支。这不再是我推荐的方法,因为可以使用更好、更精简的方法。

返回 Portainer Web 仪表板,从左侧菜单中选择“堆栈”,然后单击“添加堆栈”。

为您的堆栈命名,然后选择“Git 存储库”。对于存储库 URL,输入 supabase 存储库的完整 URL (https://github.com/supabase/supabase)。

在“编写路径”字段中,输入/docker/docker-compose.yml

将 .env 文件(https://github.com/supabase/supabase/blob/master/docker/.env.example)的内容复制到一个空白文件,并使用有效的详细信息更新以下值:

OPERATOR_TOKEN=your-super-secret-operator-token

JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long

POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password

# some SMTP server to send your auth-mails with
SMTP_HOST=mail.example.com
SMTP_PORT=
SMTP_USER=
SMTP_PASS=

进入全屏模式 退出全屏模式

在“环境变量”下单击“高级模式”,然后复制并粘贴.env文件的内容。

最后,单击底部的“部署堆栈”。此过程可能需要几分钟才能完成。完成后,从 Portainer 菜单中单击“容器”。您可能会注意到 supbase-auth 最初并未运行。只需选择它,然后单击“开始”。然后它应该运行没有任何问题。

本节的最后一步是为每个 Supabase 服务配置主机名。从 Portainers 仪表板的容器菜单项中,选择每个 Supabase 容器。单击页面顶部附近的“复制/编辑”。然后,滚动到页面底部,选择“高级容器设置”下的“网络”选项卡。在“主机名”字段中,输入服务的名称。例如,对于supabase-rest容器,将主机名设置为rest。您可以将其设置为您喜欢的任何内容,但我建议保持它与容器相关。最后,单击“部署此容器”。它会警告您已经存在同名的容器 - 单击“确定”。片刻之后,将使用新主机名重新部署容器。对每个 Supabase 容器重复这些步骤。

通过这样做,它将帮助 Nginx 连接到容器并使其更容易在基础设施的其他部分中识别。

关于 supbase-auth 容器的一个非常重要的注意事项: 默认情况下,DATABASE_URL将包含sslmode=disable。此值中的等号可能会导致错误。例如,如果您尝试从 supbase-js 库中调用.signUp()方法,您可能会收到错误 500。原因是它会尝试连接到disable而不是postgres://<db_user>:<password>@db:<db_port>/postgres?sslmode=disable

解决方案是确保从 URL 中删除sslmode=disable和任何其他查询参数。

配置Nginx

为了设置 Nginx 以支持 Supabase 所需的各种服务,我们需要修改 Nginx 配置。

为此,您需要通过 SSH 连接到服务器,然后以cd的方式访问存储 Nginx 配置的卷。如果您如上所述设置nginx-config卷,则该卷(通常)位于/var/lib/docker/volumes/nginx-config/_data

从这里开始,我们需要修改 2 个文件。第一个是nginx.conf

http部分中,添加以下内容:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream websocket {
    server realtime:4000;
}

进入全屏模式 退出全屏模式

我们需要修改的另一个文件是conf.d/default.conf。有很多方法可以配置 Nginx,但为了简单起见,我们将把它保存到一个文件中。

conf.d/default.conf中,将整个内容替换为以下内容:

server {
    listen 443 ssl;
    server_name db.example.com;

    # REST
    location ~ ^/rest/v1/(.*)$ {
        proxy_set_header Host $host;
        proxy_pass http://kong:8000;
        proxy_redirect off;
    }

    # AUTH
    location ~ ^/auth/v1/(.*)$ {
        proxy_set_header Host $host;
        proxy_pass http://kong:8000;
        proxy_redirect off;
    }

    # REALTIME
    location ~ ^/realtime/v1/(.*)$ {
        proxy_redirect off;
        proxy_pass http://kong:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
    }
}

进入全屏模式 退出全屏模式

让我解释一下这里发生了什么。

首先,我们的 REST 处理程序正在侦听发送到/rest/v1路径的所有请求,以及在该路径部分之后添加的任何内容。然后将其路由到 Supabase Kong 服务器,默认情况下可在http://kong:8000内部访问该服务器。

同样,我们的身份验证处理程序正在侦听对/auth/v1的请求,并将它们也路由到 Kong。

最后,实时订阅由/realtime/v1路由处理。同样,这条路线通往孔。

如果您在最初编写本指南时阅读了本指南,我告诉您将请求路由到每个单独的服务。经过进一步调查,似乎路由到 Kong 是更好的解决方案。

我们执行此代理的原因是它允许我们确保来自 Supabase 库(例如@supabase/supabase-js)的请求能够正确路由到堆栈中的不同服务。

Kong 将根据 URL 将每个请求路由到相应的服务,而 Nginx 提供了一种在单个 URL 下公开这些端点的方法。

进行更改后,保存文件,然后从 Portainer 仪表板重新启动 Nginx 容器。为确保一切按预期工作,请选择 Nginx 容器,然后选择“查看日志”。它应该表明一切都按预期运行。

最后,从 Nginx 容器(在 Portainer 仪表板中),将其连接到supabase_default网络 - 执行此操作的选项位于仪表板中该页面的底部。

必要的Kong配置

在 Portainer 中,从“卷”菜单选项创建一个新卷。将新卷命名为kong-data

然后,返回“容器”,选择“supabase-kong”容器。点击顶部的“复制/编辑”。

滚动到页面底部,然后单击“卷”。单击“映射附加卷”。在标有“容器”的字段中,输入/var/lib/kong。然后单击其右侧的“音量”按钮。

从下方的下拉字段中,选择您刚才创建的“kong-data”卷。然后单击“部署此容器”。

GoTrue/auth 环境变量

默认情况下,每个容器的环境变量应该可以正常工作,但 GoTrue / auth 容器可能需要一些额外的配置。

为简单起见,这里有一个示例环境配置,您可以在 supabase-auth 容器中使用 - 编辑它以满足您的需要:

GOTRUE_OPERATOR_TOKEN=your-super-secret-operator-token
GOTRUE_JWT_DEFAULT_GROUP_NAME=authenticated

# Make sure this JWT secret matches what was configured during setup
GOTRUE_JWT_SECRET=your-super-secret-jwt-token-with-at-least-32-characters-long

# How long should JWT tokens be valid for?
GOTRUE_JWT_EXP=3600

# Since Supabase is based on Postgres, you shouldn't need to change this
GOTRUE_DB_DRIVER=postgres

# What schema should requests be routed to?
# There should be no reason to change this
DB_NAMESPACE=auth

# Where is our auth/GoTrue located
# You shouldn't need to change these unless the ports are mapped differently
GOTRUE_API_HOST=0.0.0.0
PORT=9999

# Email settings
# You must set these if you want to be able to send emails
GOTRUE_SMTP_HOST=smtp.your-email-host.com
GOTRUE_SMTP_PORT=465
GOTRUE_SMTP_USER=your-smtp-user
GOTRUE_SMTP_PASS=your-smtp-password

# Should users be required to confirm their email address before they can log in?
# If set to false, users won't have to confirm their registration
# If set to true, users will have to click the link in their email to confirm
GOTRUE_MAILER_AUTOCONFIRM=false

# What is the 'from' address that emails are sent from?
GOTRUE_SMTP_ADMIN_EMAIL=noreply@example.com

# Remove this if you don't want debug logs
GOTRUE_LOG_LEVEL=debug

# The connection string for your database
# `@db` says we're looking for the container called 'db' on our docker network
DATABASE_URL=postgres://postgres:your-super-secret-and-long-postgres-password@db:5432/postgres

# Email templates
# Invite user - provide a URL to a HTML or Text template
GOTRUE_MAILER_TEMPLATES_INVITE=https://example.com/path/to/your/invite/template.html

# Confirm registration - provide a URL to a HTML or Text template
GOTRUE_MAILER_TEMPLATES_CONFIRMATION=https://example.com/path/to/your/confirmation/template.html

# Password recovery - provide a URL to a HTML or Text template
GOTRUE_MAILER_TEMPLATES_RECOVERY=https://example.com/path/to/your/password_reset/template.HTML

# Magic link - provide a URL to a HTML or Text template
GOTRUE_MAILER_TEMPLATES_MAGIC_LINK=https://example.com/path/to/your/magic_link/template.html

# GoTrue URLs
# These are appended after the API_EXTERNAL_URL
# You shouldn't need to change these
GOTRUE_MAILER_URLPATHS_CONFIRMATION=/auth/v1/verify
GOTRUE_MAILER_URLPATHS_INVITE=/auth/v1/verify
GOTRUE_MAILER_URLPATHS_CONFIRMATION=/auth/v1/verify
GOTRUE_MAILER_URLPATHS_RECOVERY=/auth/v1/verify

# Site URLs
# This is where the user will be redirected to after clicking a link in an email and after oAuth
GOTRUE_SITE_URL=https://example.com/redirect_to_here
GOTRUE_URI_ALLOW_LIST=https://example.com/redirect_to_here

# This is the URL where your supabase stack is accessible
# i.e. this is the endpoint URL you would pass into a `createClient()` call in the supabase-js library
API_EXTERNAL_URL=https://database.example.com/

# Set this to true if you want to prevent signing up with email and password
GOTRUE_DISABLE_SIGNUP=true

# oAuth
# If you are not using oAuth to login (e.g. Login with Facebook), you can ignore the below
# If you want to disable oAuth for a specific provider, set the `GOTRUE_EXTERNAL_<provider>_ENABLED` to false
# Github oAuth
GOTRUE_EXTERNAL_GITHUB_CLIENT_ID=your_github_client_id
GOTRUE_EXTERNAL_GITHUB_SECRET=your_github_client_secret
GOTRUE_EXTERNAL_GITHUB_ENABLED=true

# Google oAuth
GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com
GOTRUE_EXTERNAL_GOOGLE_SECRET=your-google-secret
GOTRUE_EXTERNAL_GOOGLE_ENABLED=true

# Facebook oAuth
GOTRUE_EXTERNAL_FACEBOOK_CLIENT_ID=your-facebook-client-id
GOTRUE_EXTERNAL_FACEBOOK_SECRET=your-facebook-app-secret
GOTRUE_EXTERNAL_FACEBOOK_ENABLED=true

# Add other oAuth provider details below

进入全屏模式 退出全屏模式

最终检查

此时,一切都应该按预期运行。

您应该能够使用您的 VPS IP 地址、端口 5432 并使用您在环境变量中设置的用户名postgres和 postgres 密码连接到您的 Postgres 服务器。

结束语

如前所述,本文正在进行中。我仍在研究为自托管配置 Supabase 堆栈的一些更精细的细节。文章中可能缺少一些东西 - 发表评论让我知道,我会考虑添加它。

为自托管设置 Supabase 绝不是一项快速的任务,而且仍有改进的余地。希望本文能帮助您加快流程并让您踏上旅程。

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐