符合国情的supabase私有化部署(0)

news2024/12/24 9:05:18

Image

符合国情的supabase私有化部署(0)

  • 符合国情的supabase私有化部署(0)
    • 前言
    • 开源 BaaS 解决方案
    • 快速开始
      • 获取部署文件
      • 服务明细
    • 容器启动后
    • 创建一个前端app
    • 注册邮箱SMTP协议
    • jwt token和kong网关配置并应用
    • 更改数据库密码
    • k8s 部署参考
    • 尾言
    • 常见问题
      • name resolution failed
      • Invalid authentication credentials
    • 参考链接

前言

关注技术前沿的我们,想必对BaaS 都不陌生。从 Firebase 横空出世,再到2014年的一声炮响。它已经给全世界开发者,带来了大量便捷的,开箱即用的开发运维环境,加上它优秀的开发体验。这让我们程序员们能够以很少的人力成本,做出功能丰富的应用。

然而出于众所周知的原因,它在我们国内是无法使用的。

于是利用这信息不对称的效果:国内一批独立的公司还有一些大厂,对 Firebase 这个产品进行"借鉴" 从而做出了自己的 XXbase。比如某里云的XXX,某讯云的XXX,还有xxCloud的XXX,等等

然而笔者在比较深度使用国内这些后,发现开发体验不佳。而且很多功能,由于服务的不完善,功能开发不出来,需要额外的服务器去部署功能容器作为辅助。这显然背离了使用 BaaS 的初衷。于是我们这批开发者将眼光投向了开源 BaaS解决方案.

开源 BaaS 解决方案

笔者主要研究的开源 BaaS 解决方案主要有2个,一个是 supabase ,另外一个是 appwrite,当然除此之外还有 amplication 和国人的项目 laf(向优秀的开源人致敬!)

为什么选择supabaseappwrite 呢?因为它们功能成熟,社区稳定,私有化部署便捷,更重要的是它们背后有资本的扶持,比较商业化,不会因为一些莫名其妙的变故,突然跑路,导致项目太监。

另外在线的supabase服务,虽然在中国可用,但是部署地域只能选择韩国,日本,新加坡,印度等亚洲地区。部署后浅尝辄止地用一下看似可行。一旦深入使用,遇到那些需要对内置功能进行扩展,或者要在里面嵌入自己的后端服务的场景时,一个一个坑就会接踵而至。所以为了避免这些因为网络原因导致的issue,我们选择私有化部署。

本篇文章就来教你如何一步一步,把 supabase 部署到自己的服务器上。

快速开始

本篇文章以 Linux (ubuntu 22) 服务器为基础平台,假如你是本机测试部署,记得先安装 docker 和 git

获取部署文件

supabase 官方为我们提供了 docker compose 私有化部署的配置目录,就在 github/supabase master分支的 docker 目录下。

让我们获取它!

# Get the code
git clone --depth 1 https://github.com/supabase/supabase

# Go to the docker folder
cd supabase/docker

# Copy the fake env vars
cp .env.example .env

# Start 直接使用默认配置
docker compose up -d

假如因为网络原因,拉镜像太慢或者失败,记得提前配置好 dockerhub 的国内源,比如 网易源,百度源,腾讯源,阿里源 等等,具体配置方法网上一搜就有。

然后 docker 就跑去拉镜像去了,利用这段时间我们可以先看看 docker-compose.yml 里面到底配置了哪些服务。

服务明细

从配置中,我们可以看到它有这些服务,以及对应的那些镜像:

// docker-compose.yml
const serviceMap = {
    // supabase 后台管理系统
    studio: 'supabase/studio',
    // 大名鼎鼎的云原生网关
    kong: 'kong',
    // gotrue 原先是 netlify 的项目,主要用来做认证的,目前已经失去维护
    // 所以 supabase 自个fork了一份,自己维护了,主要用来管理和校验 jwt token
    // 除此之外台还有邮件,手机验证码的发送校验等等许多的功能
    auth: 'supabase/gotrue',
    // 为 postgres 生成 restful api 来进行常规的 crud 操作
    rest: 'postgrest/postgrest',
    // 基于 postgres 的 websocket 全双工通信服务
    realtime: 'supabase/realtime',
    // S3 文件存储服务,同时存储元数据进 postgres
    // 个人建议。私有化部署不要用这个服务,因为这不符合国情
    // 作为代替,可以使用阿里云/腾讯云的 oss/cos服务
    storage: 'supabase/storage-api',
    // 图片处理鉴权服务
    imgproxy: 'darthsim/imgproxy',
    // 为 postgres 生成一套 restful api 来对数据库进行管理,执行命令等等
    meta: 'supabase/postgres-meta',
    // serverless 函数计算服务,基于 Deno runtime,不是 nodejs 哦
    functions: 'supabase/edge-runtime',
    // postgres database,核心,强依赖,supabase很多功能依赖这个数据库,换其他的不行
    db: 'supabase/postgres'
}
// 另外如果你要开启日志,你还需要同时 apply docker-compose-logging.yml
// docker-compose-logging.yml
// 相比默认额外加了2个服务
const loggingServiceMap = {
    // 日志服务
    // logflare 被 supabase 收购了
    analytics: 'supabase/logflare',
    // 高性能的数据日志收集,转化,路由和事件触发服务
    // 可以把自己生成的日志转化成,其他云平台需要的格式
    vector: 'timberio/vector'
}

不过日志服务依赖 Google CloudBigQuery 功能,看到 Google 这个关键字,你就明白在国内你是用不了的,

所以不要开启内置日志服务,应该自己处理后接入 阿里云/腾讯云 日志系统。

容器启动后

看到这,现在你的所有镜像应该已经下载完成,并且启动好了吧。

现在直接使用的是 .env.example 里带的默认配置,访问 http://localhost:3000 进入 Supabase Studio

检测一下各项功能是否运转良好,log功能应该是500的,因为没有开启。

创建一个前端app

接下来我们创建一个前端app, 这里我们快速创建一个 vite 应用。

然后安装 @supabase/supabase-js 并初始化:

import { createClient } from '@supabase/supabase-js'
// 你的服务器+端口: http://xxx.xxx.xxx.xxx:8000
// 自建服务时候,记得要新建入方向规则安全策略组哦,不然服务器默认只能被访问到 80/443/22 等等端口
// 具体怎么建,你需要看看你的服务商操作文档
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY

const supabase = createClient(supabaseUrl, supabaseAnonKey)

接着快速写一个使用邮箱登录页面,然后就能实现登录/注册功能了:

const email = ''
const { error } = await supabase.auth.signInWithOtp({
  email
})

然后点击按钮,你就会发现,报错了,为什么注册不了呢?原因在于我们没有配置真实的邮箱配置。

注册邮箱SMTP协议

首先我们找到 .envEmail auth 配置,发现需要配置许多的 SMTP_*配置

这里以大家都有的 QQ邮箱 为例,来把你的 QQ邮箱 作为你这个 supabase实例发送邮件的邮箱。

首先登录你的 QQ邮箱,然后右上角你的头像,点击设置:

Image

然后获取授权码,保存好:

Image

接下来就可以这样配置环境变量:

## Email auth
SMTP_ADMIN_EMAIL=icebreaker99@qq.com # 你的邮箱
SMTP_HOST=smtp.qq.com # 固定的
SMTP_PORT=465 # 固定的
SMTP_USER=icebreaker99@qq.com # 你的邮箱
SMTP_PASS=xxxxx # 这里就是你刚刚获取的授权码
SMTP_SENDER_NAME=icebreaker # 发信人

配置好之后,docker compose up -d 重启服务

邮件登录和注册就好了,默认长这样,当然你也可以自定义邮件模板:
Image
Image

是不是特别简单,当然一般正式环境,我们会更换正式的企业邮箱。

jwt token和kong网关配置并应用

我们需要生成和配置自己的秘钥,所以我们利用加密算法生成符合要求的 JWT_SECRET 后,我们可以在 api-keys#Generate JWT 生成相应的 ANON_KEYSERVICE_ROLE_KEY.

然后同时去修改:

  • .env
    • ANON_KEY
    • SERVICE_ROLE_KEY
  • volumes/api/kong.yml
    • anon
    • service_role

秘钥一定要匹配,不然会报错,然后重启容器应用即可。

更改数据库密码

我们之前一直使用的默认的密码,现在我们要换成自己的密码,然后更换之后,你会开心的发现服务挂了。

这是为什么呢?原因在于数据库已经用你之前的密码初始化完成了,这时候其他服务用了新的密码去连接原先的数据库自然就会挂掉,然后被不断的重启。

那怎么办?实际上也很简单:

还记得 volumes 挂载目录下有很多的脚本吗?其中有一个 volumes/db/roles.sql,里面就是把新的环境变量设置成密码的脚本

docker exec -it <container_name/id> sh 然后 su postgres ,psql 执行一下搞定。

当然你也可以使用真男人喜欢用的方式:

rm -rf docker/volumes/db/data

k8s 部署参考

目前官方维护的主要是 docker compose 的部署方式,那我们要用 k8s 部署,应该怎么办呢?

社区给我们 2 种解决方案:

  1. supabase-kubernetes
  2. kompose

详情可以点击链接阅读文档

尾言

通过这种方式,你就可以快速在服务器上部署自己的 supabase 应用,看似很美,不过你访问 studio 的时候会发现,相比在线版本少了很多的功能。毕竟人家是商业项目,给我们用用大部分功能已经很不错了,所以接下来我们就需要自己写一套后端,来接入这套机制,从而自己去开发一些定制化的功能。

不过文章写到这也太长了,一般到这能完整的部署一套的也比较少了,就让我挖个坑下期再见吧。

常见问题

name resolution failed

这是由于你 kong 网关里转发的某些服务没有正常启动,报的错误,你可以 docker ps -f name=supa 看看哪些服务是异常的,并使用 docker logs 查看异常容器里的日志进行处理。

password authentication failed for user \"authenticator\"\n","hint":null,"message":"Database connection error. Retrying the connection."}
{"level":"info","msg":"Go runtime metrics collection started"}
{"args":[0.018145916],"component":"pop","level":"info","msg":"%.4f seconds"}
{"level":"fatal","msg":"running db migrations: Migrator: problem creating schema migrations: couldn't start a new transaction: could not create new transaction: failed to connect to `host=db user=supabase_auth_admin database=postgres`: failed SASL auth (FATAL: password authentication failed for user \"supabase_auth_admin\" (SQLSTATE 28P01))"}

Invalid authentication credentials

由于更改了数据库的用户密码,导致 authrest 这些服务因为数据库授权原因,挂了,一直在重启

这是由于你没有同时在 .envvolumes/api/kong.yml 里配置同样的 anonservice Key,配置好了之后重启一下容器/重启一下 kong

参考链接

https://supabase.com/docs/guides/self-hosting

https://github.com/supabase-community/supabase-kubernetes

https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/

https://supabase.com/docs/reference/self-hosting-analytics/introduction

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/592665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python:Python编程:从入门到实践__超清版:Python标准库

Python标准库 1. OrderedDict2. threading三级目录 Python标准库是一组模块&#xff0c;按照的Python都包含了它&#xff0c;我们只需要在程序开头包含一条简单的 import 语句&#xff0c;就可以使用标准库中的任何函数和类。 下面我介绍几个重点 标准库 os : 提供一些与操作系…

Word控件Aspose.Words教程:使用 Java 处理 SXC 和 FODS 文件

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…

NUC980编译错误,multiple target patterns(多个目标匹配)

1&#xff1a;问题&#xff1a; 昨天环境编译的还是没问题的&#xff0c;今天就出错了 &#xff1a; Makefile:133: *** multiple target patterns. Stop 此时&#xff1a;make make clean make disclean 都不可以使用了&#xff0c;报一样的错误。 2&#xff1a;解决办法&…

二叉搜索树的操作、模拟实现、应用以及性能的介绍

一、二叉搜索树 1. 性质 &#xff08;1&#xff09;如果左子树不是空&#xff0c;那么左子树上的所有节点的值都小于根节点的值 &#xff08;2&#xff09;如果右子树不是空&#xff0c;那么右子树上的所有节点的值都大于根节点的值 &#xff08;3&#xff09;左右子树也分别为…

Redis的网络模型

计算机硬件包括CPU&#xff0c;内存&#xff0c;网卡 为了避免用户应用和操作系统内核产生冲突乃至内核崩溃&#xff0c;用户应用和内核是隔离开的 1)进程的寻址空间会被划分成两部分&#xff0c;内核空间和用户空间&#xff0c;内核和用户应用都无法直接访问物理内存&#xff…

【Linux】在Ubuntu上部署web项目(Ubuntu版本为16.04.7,jdk1.8、mysql5.7、tomcat9.0.48)

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

河道水位监测:河道水位监测用什么设备

中国地形复杂&#xff0c;气候多样&#xff0c;导致水资源分布不均&#xff0c;洪涝和干旱等问题时有发生。同时&#xff0c;人类活动也对水资源造成了很大压力&#xff0c;工业和农业用水增加&#xff0c;河道水位下降&#xff0c;生态环境受到威胁。因此&#xff0c;对河道水…

【面向对象三大特性之继承】

目录 1.什么是继承2.父类成员访问2.1 子类访问父类的成员变量2.1.1 子类和父类不存在同名成员变量2.1.2 子类和父类存在同名成员变量 2.2子类中访问父类的成员方法2.2.1. 成员方法名字不同2.2.22. 成员方法名字相同 3.super关键字4.子类构造方法5.super和this的异同点6.代码块的…

可视化探索开源项目的 contributor 关系

引语&#xff1a;作为国内外最大的代码托管平台&#xff0c;根据最新的 GitHub 数据&#xff0c;它拥有超 372,000,000 个仓库&#xff0c;其中有 28,000,000 是公开仓。分布式图数据库 NebulaGraph 便是其中之一&#xff0c;同其他开源项目一样&#xff0c;NebulaGrpah 也有自…

用arcgis for javascript 开发一个三维地图(入门案例)

效果如图&#xff1a; 详细的步骤就不啰嗦介绍了&#xff0c;大家可以参考上一篇文章二维地图入门案例&#xff0c;这里只是改了一点引用和属性而已。 核心代码&#xff1a; SceneView 用于创建三维地图 require([“esri/Map”, “esri/views/SceneView”] 这里提一句有两种…

vue项目中的环境变量的应用

vue项目中的环境变量的应用 在Vue项目中使用环境变量可以方便地在开发、测试、生产等不同环境中进行配置&#xff0c;而无需修改代码。 项目根目录下创建一个.env文件或者.env.[mode]文件&#xff0c;其中mode表示开发、测试、生产等不同的环境&#xff0c;文件名的后缀部分指…

Python的分布式网络爬虫

分布式爬虫其实就是指利用多台计算机分布式地从互联网上采集数据的一种爬虫。它可以把大规模的任务分解成若干小规模的&#xff0c;由多台计算机并行进行处理&#xff0c;大大提高了效率和速度。 分布式爬虫有很多优势&#xff1a;解决单机爬虫效率低的问题&#xff0c;分布式…

【UR3系统升级到CB3.12附带URcap1.05】

【UR3系统升级到CB3.12附带URcap1.05】 1. 前言1.1 Polyscope 3.12更新须知1.2 更新步骤 2. 对 PSU 电压进行控制的步骤2.1 启动机器人电源2.2 启动机器人程序2.3 查看PSU 电压 3. Polyscope 3.12 软件下载3.1 CB 系列机器人3.2 下载软件包URUP 4. CB3 软件安装的指导4.1 连接示…

Kohl‘s百货的EDI需求详解

Kohls是一家美国的连锁百货公司&#xff0c;成立于1962年&#xff0c;总部位于美国威斯康星州的门多西。该公司经营各种商品&#xff0c;包括服装、鞋子、家居用品、电子产品、化妆品等&#xff0c;并拥有超过1,100家门店&#xff0c;分布在美国各地。本文将为大家介绍Kohls的E…

SDK接口远程调试【内网穿透】

文章目录 1.测试环境2.本地配置3. 内网穿透3.1 下载安装cpolar内网穿透3.2 创建隧道 4. 测试公网访问5. 配置固定二级子域名5.1 保留一个二级子域名5.2 配置二级子域名 6. 使用固定二级子域名进行访问 转发自cpolar内网穿透的文章&#xff1a;Java支付宝沙箱环境支付&#xff0…

stable diffusion使用入门

目录 1、stable diffusion简要说明 2、安装stable-diffusion-webui &#xff08;1&#xff09;下载地址 &#xff08;2&#xff09;执行启动命令 3、Lora模型介绍 4、模型下载 &#xff08;1&#xff09;Lora模型使用 &#xff08;2&#xff09;底座模型使用 1、stable…

初识开源接口测试工具——Postcat

Postcat 是一个强大的开源、跨平台&#xff08;Windows、Mac、Linux、Browsers...&#xff09;的 API 开发测试工具&#xff0c;支持 REST、Websocket 等协议&#xff08;即将支持 GraphQL、gRPC、TCP、UDP&#xff09;&#xff0c;帮助你加速完成 API 开发和测试工作。 它适合…

OLAP和OLTP

1&#xff1a;OLAP和OLTP对比 数据库系统可以在广义上分为联机事务处理&#xff08;Online Transaction Process&#xff0c;OLTP&#xff09;和联机分析处理&#xff08;Online Analyze Process&#xff0c;OLAP&#xff09;两种面向不同领域的数据库&#xff0c;OLAP数据库也…

vue-cli的使用

什么是单页面应用程序? ​ 单页面应用程序(Single Page Application)简称SPA。指的是一个web网站中只有唯一的一个html页面,所有的功能与交互都在这个唯一的页面内完成。 什么是vue-cli? ​ vue-cli是Vue.js开发的标准工具。它简化了基于webpack创建工程化的vue项目过程。…

刷题常用算法模板(持续更新)

目录 1、二分查找2、线段树3、树状数组4、差分数组5、前缀树6、并查集7、AC自动机8、Morris遍历9、二叉树非递归遍历10、KMP11、Manacher12、快速选择 bfprt13、滑动窗口14、加强堆15、有序表16、单调栈 1、二分查找 需求&#xff1a;在一个有序数组中&#xff0c;快速查询某一…