Supabase 是一个开源的后端即服务(Backend-as-a-Service,BaaS)平台,提供了实时数据库和身份验证等功能。虽然其官方也提供了在线的 supabase 服务,并且在国内也是可以直接访问,但是部署地域只能选择韩国,日本,新加坡,印度等亚洲地区。而且后续如果需要对内置功能进行扩展,或者嵌入自己的后端服务的场景时可能会存在问题。因此我们可以在自己的服务器上进行私有化部署,从而保证更好的可维护性。
1,获取项目
(1)首先我们通过 git 命令将 Supabase 项目 clone 到本地:
(2)进入其中的 docker 文件夹:
(3)我们直接使用默认提供的环境配置:
注意:如果我们需要修改数据库默认的密码,请参考文章最下方的附三内容提前进行修改。否则部署后再次修改比较麻烦。
2,启动服务
(1)执行如下命令拉去所有需要的镜像:
(2)拉取后执行如下命令启动容器:
(3)查看各容器是否均正常启动:
注意:我这里部署时发现有时 supabase-studio 为 unhealthy,但是不影响使用。
(4)各个容器服务的功能介绍如下:
Kong 是一个云原生 API 网关。
GoTrue 是一个基于 JWT 的 API,用于管理用户和发放 JWT 令牌。
PostgREST 是一个 Web 服务器,可将我们的 PostgreSQL 数据库直接转换为 RESTful API。
Realtime 是一个 Elixir 服务器,允许我们通过 Websockets 监听 PostgreSQL 的插入、更新和删除操作。实时使用 Postgres 内置的复制功能轮询数据库更改,将更改转换为 JSON,然后通过 Websockets 广播 JSON 给授权的客户端。
Storage 提供一个 RESTful 接口,用于管理存储在 S3 中的文件,并使用 Postgres 管理权限。
postgres-meta 是一个用于管理您的 Postgres 的 RESTful API,允许我们获取表、添加角色和运行查询等。
PostgreSQL 是一个具有超过 30 年积极开发历史的面向对象关系数据库系统,以其可靠性、功能强大和性能而赢得了强大的声誉。
3,访问 Supabase
(1)容器启动后,我们可以通过 8000 端口上的 API 网关访问 Supabase Dashboard 页面。例如宿主机 IP 为 121.40.205.237, 那么地址则为 http://121.40.205.237:8000/
API 网关提供的服务接口:
REST:http://<your-ip>:8000/rest/v1/
Auth:http://<your-domain>:8000/auth/v1/
Storage:http://<your-domain>:8000/storage/v1/
Realtime:http://<your-domain>:8000/realtime/v1/
(2)访问时系统会提示我们输入用户名和密码,系统默认的用户密码分别如下:
用户名:supabase
密码:this_password_is_insecure_and_should_be_updated
(3)登录后,显示的 Supabase Dashboard 主页面如下,至此整个服务已经部署成功。
附一:修改 Supabase Dashboard 的登录密码
(1)在生产中使用 Supabase 我们必须修改默认用户和密码以确保系统安全,编辑 .env 文件:
(2)修改其中的 DASHBOARD_USERNAME和DASHBOARD_PASSWORD 属性值:
(3)修改并保存后执行如下命令重启服务即可
附二:修改 API 密钥
(1)在生产环境中,我们可以修改系统默认的 API 密钥,确保系统更加安全。我们可以访问 Supabase网关自动生成密钥(点击访问),其中 JWT Secret 每次打开页面都不一样,我们可以直接使用,也可以自定义一个。然后点击“Generate JWT”按钮生成 ANON_KEY,记下它:
(2)然后将“Preconfigured Payload”下拉框切换成“SERVICE_KEY”,然后点击“Generate JWT”按钮生成 SERVICE_KEY,记下它:
(3)编辑 .env 文件:
(4)修改其中的 JWT_SECRET、ANON_KEY 和 SERVICE_ROLE_KEY 属性值:
(5)修改并保存后执行如下命令重启服务即可
附三、修改 PostgreSQL 数据库密码
(1)在宿主机上,我们可以使用如下命令连接访问 Postgres 数据库:
注意:如果提示找不到 psql 命令,可以执行如下命令进行安装。
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install postgresql12
(2)数据库默认的密码如下:
(3)要修改默认密码,我们需要编辑 .env 文件:
(4)将其中 POSTGRES_PASSWORD 属性值修改成新密码即可:
(5)密码修改后重启服务会发现服务无法正常启动,这是由于数据库已经用我们之前的密码初始化完成了,只该配置文件服务是服务连上数据库的。我们可以直接把项目 docker 文件夹下的数据库的持久化文件删除:
注意:删除持久化文件会造成数据库数据全部丢失,记得提前备份必要的数据。
(6)然后重启部署服务即可
附四、修改配置文件中服务器 IP,解决新增用户报错问题
(1)如果我们从外部通过浏览器访问 Supabase Dashboard 页面,创建一个用户并提交时,会报“Failed to create user: An error has occurred: Failed to fetch”错误。
(2)这是由于默认配置文件中的服务地址都是 localhost,我们编辑 .env 文件,将其改成实际的 IP 地址即可:
(3)修改并保存后执行如下命令重启服务即可
附五:配置邮箱 SMTP 协议
1,注册确认功能
Supabase 提供用户注册功能,即将要注册的邮箱和需要设置的密码发送给客户端接口进行注册,Supabase 服务会发送一封确认邮件给该用户邮箱进行激活。为了确保激活邮件的正常发出,我们需要进行 SMTP 相关配置。
(1)假设我们使用 QQ 邮箱进行激活邮件发送。首先,登录我们的 QQ 邮箱,然后进入设置,找到 IMAP/SMTP 服务相关设置:
(2)获取授权码:
(3)编辑 .env 文件,配置 SMTP 相关的环境变量:
(4)修改并保存后执行如下命令重启服务即可
(5)这样用户注册后就会收到激活邮件,点击激活链接后账号即可生效。
2,自动激活
(1)如果需要注册时自动激活,而不需要邮件进行二次确认,可以将配置文件中的 ENABLE_EMAIL_AUTOCONFIRM 设置为 true。
(2)修改并保存后执行如下命令重启服务即可