Docker - 后端即服务平台Supabase的私有化部署教程
作者:hangge | 2024-02-22 08:53
Supabase 是一个开源的后端即服务(Backend-as-a-Service,BaaS)平台,提供了实时数据库和身份验证等功能。虽然其官方也提供了在线的 supabase 服务,并且在国内也是可以直接访问,但是部署地域只能选择韩国,日本,新加坡,印度等亚洲地区。而且后续如果需要对内置功能进行扩展,或者嵌入自己的后端服务的场景时可能会存在问题。因此我们可以在自己的服务器上进行私有化部署,从而保证更好的可维护性。
1,获取项目
(1)首先我们通过 git 命令将 Supabase 项目 clone 到本地:
git clone --depth 1 https://github.com/supabase/supabase
(2)进入其中的 docker 文件夹:
cd supabase/docker
(3)我们直接使用默认提供的环境配置:
注意:如果我们需要修改数据库默认的密码,请参考文章最下方的附三内容提前进行修改。否则部署后再次修改比较麻烦。
cp .env.example .env
2,启动服务
(1)执行如下命令拉去所有需要的镜像:
docker compose pull
(2)拉取后执行如下命令启动容器:
docker compose up -d
(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 文件:
vi .env
(2)修改其中的 DASHBOARD_USERNAME和DASHBOARD_PASSWORD 属性值:
(3)修改并保存后执行如下命令重启服务即可
docker compose stop docker compose up -d
附二:修改 API 密钥
(1)在生产环境中,我们可以修改系统默认的 API 密钥,确保系统更加安全。我们可以访问 Supabase 网关自动生成密钥(点击访问),其中 JWT Secret 每次打开页面都不一样,我们可以直接使用,也可以自定义一个。然后点击“Generate JWT”按钮生成 ANON_KEY,记下它:
(2)然后将“Preconfigured Payload”下拉框切换成“SERVICE_KEY”,然后点击“Generate JWT”按钮生成 SERVICE_KEY,记下它:
vi .env
(4)修改其中的 JWT_SECRET、ANON_KEY 和 SERVICE_ROLE_KEY 属性值:
(5)修改并保存后执行如下命令重启服务即可
docker compose stop docker compose up -d
附三、修改 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
psql -h 127.0.0.1 -p 5432 -d postgres -U postgres
(2)数据库默认的密码如下:
your-super-secret-and-long-postgres-password
(3)要修改默认密码,我们需要编辑 .env 文件:
vi .env
(4)将其中 POSTGRES_PASSWORD 属性值修改成新密码即可:
(5)密码修改后重启服务会发现服务无法正常启动,这是由于数据库已经用我们之前的密码初始化完成了,只该配置文件服务是服务连上数据库的。我们可以直接把项目 docker 文件夹下的数据库的持久化文件删除:
注意:删除持久化文件会造成数据库数据全部丢失,记得提前备份必要的数据。
rm -rf volumes/db/data
(6)然后重启部署服务即可
docker compose down docker compose up -d
附四、修改配置文件中服务器 IP,解决新增用户报错问题
(1)如果我们从外部通过浏览器访问 Supabase Dashboard 页面,创建一个用户并提交时,会报“Failed to create user: An error has occurred: Failed to fetch”错误。
(2)这是由于默认配置文件中的服务地址都是 localhost,我们编辑 .env 文件,将其改成实际的 IP 地址即可:
(3)修改并保存后执行如下命令重启服务即可
docker compose stop docker compose up -d
附五:配置邮箱 SMTP 协议
1,注册确认功能
Supabase 提供用户注册功能,即将要注册的邮箱和需要设置的密码发送给客户端接口进行注册,Supabase 服务会发送一封确认邮件给该用户邮箱进行激活。为了确保激活邮件的正常发出,我们需要进行 SMTP 相关配置。
(1)假设我们使用 QQ 邮箱进行激活邮件发送。首先,登录我们的 QQ 邮箱,然后进入设置,找到 IMAP/SMTP 服务相关设置:
(2)获取授权码:
(2)获取授权码:
(3)编辑 .env 文件,配置 SMTP 相关的环境变量:
## Email auth # 你的邮箱 SMTP_ADMIN_EMAIL=123456789@qq.com # 固定的 SMTP_HOST=smtp.qq.com # 固定的 SMTP_PORT=465 # 你的邮箱 SMTP_USER=123456789@qq.com # 刚刚获取的授权码 SMTP_PASS=mhbkedkqloodpwx # 发信人姓名 SMTP_SENDER_NAME=hangge
(4)修改并保存后执行如下命令重启服务即可
docker compose stop docker compose up -d
(5)这样用户注册后就会收到激活邮件,点击激活链接后账号即可生效。
2,自动激活
(1)如果需要注册时自动激活,而不需要邮件进行二次确认,可以将配置文件中的 ENABLE_EMAIL_AUTOCONFIRM 设置为 true。
(2)修改并保存后执行如下命令重启服务即可
docker compose stop docker compose up -d
全部评论(0)