Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品

news/2024/12/26 12:03:08/文章来源:https://www.cnblogs.com/ryanyangcs/p/18632447

随着技术的成熟和 AI 的崛起,很多原本需要团队协作才能完成的工作现在都可以通过自动化和智能化的方式完成。于是乎,单个开发者的能力得到了极大的提升 - 借助各种工具,一个人就可以完成开发、测试、运维等整条链路上的工作,渡劫飞升成为真正的 “全干工程师”。

之前我们分享过一些入门级的 Hello World 教程。今天,我想通过一个实际的业务案例来展示 Devbox 并非只能开发玩具,而是一个真正的生产力工具。

Sealos 平台上有很多应用,其中很多管控层面的应用都是使用 Cursor + Go + Next.js 开发的。我们的开发环境直接使用 Sealos Devbox,上线也是通过 Devbox 一键完成。这种开发模式让我们团队拥有了非常高效的作战能力 - 大部分重复性工作都通过自动化或 AI 完成,让开发者可以专注于核心业务逻辑

以 Sealos 中的 AI Proxy 应用为例,这是一个典型的前后端分离架构的应用,主要由两部分组成:

  1. 基于 Next.js 开发的前端应用和 BFF 层。BFF 层负责用户鉴权,并将经过验证的请求转发给后端服务。
  2. 使用 Golang 开发的后端服务,负责核心业务逻辑,包括 token 存储、日志记录和请求转发等功能。

接下来,我将详细介绍如何高效地开发这样一个生产级别的系统

Golang 后端

创建开发环境

首先在 Sealos Cloud 中打开 Debox 应用,创建一个新项目,选择 Go 作为运行环境,选择 1.23 版本。

Devbox 为开发者提供了几个非常实用的功能:

  • 灵活的资源配置:可以根据项目需求自由调整 CPU 和内存,选择合适配置既保证性能又能控制成本。
  • 一键启用 HTTPS:系统自动分配安全域名,再也不用为配置 SSL 证书发愁。
  • 全自动域名管理:从开发到测试环境,域名配置全程由系统处理,开发者可以专注于代码本身。

创建完成后,几秒钟即可启动开发环境。

环境准备好后,我们直接用 Cursor 连接开发环境。在操作选项中选择使用 Cursor 连接:

首次打开会提示安装 Devbox 插件,安装后即可自动连接开发环境。

导入项目到 Cursor

首先 Fork Sealos 源码到自己的仓库,然后再将你自己的仓库克隆到 Devbox 开发环境:

测试环境开发

在 Cursor 的面板中切换到 “Databse” 标签页,然后点击箭头指向的按钮,在浏览器中打开 Sealos 的数据库应用:

然后创建 PostgreSQL 和 Redis 实例。

回到 Cursor 面板的 “Database” 标签页,点击刷新即可看到刚创建的数据库实例,点击可复制连接信息:

在终端中启动服务:

export ADMIN_KEY=sealos-admin
export SQL_DSN=<复制的pgsql连接串>/postgres
export REDIS_CONN_STRING=<复制的redis连接串>
go run . --port 8080

提示 server stared 即为启动成功

在 Cursor 面板的 “Network” 标签页中,点击地址栏右侧的 🌐 按钮,然后在弹窗中选择 “Copy”,将地址复制到自己电脑上使用 curl 进行测试:

curl https://mmznjndvzdrv.sealoshzh.site/api/status -H "Authorization: sealos-admin"

接口返回没有问题。

优化数据库设计

在开发过程中,我们发现数据库中 Group 和 Token 之间的外键约束增加了系统维护的复杂度。为了简化这一关系,我们可以将外键约束改为程序层面的显式调用,这样可以让代码逻辑更加清晰和可控。

首先切换到 fix-aiproxy 分支:

sealos/service/aiproxy/model/group.go 文件中,我们需要将 Group 结构体中一个外键约束改成在程序内显示调用更新和删除来降低维护心智。

这里我选择使用 Cursor 的 Chat 功能让 AI 自己写代码,最后生成的结果如下:

这种实现方式的优势在于:当删除 Group 时,相关的 Token 删除操作会在同一个事务中完成。由于是在事务内进行,我们不需要担心删除失败或系统宕机导致的数据不一致问题。

我们可以通过一系列测试来验证这个优化是否达到预期效果。首先编译并运行服务:

go build . && ./aiproxy --port 8080

然后通过以下 API 调用来测试完整的 Group 和 Token 生命周期:

# 创建一个group
curl https://gawavirgsomu.sealosbja.site/api/group/ -H "Authorization: sealos-admin" -d '{"id": "ns-admin"
}'# 创建一个token
curl https://gawavirgsomu.sealosbja.site/api/token/ns-admin -H "Authorization: sealos-admin" -d '{"name": "token 1"
}'# 查询token
curl https://gawavirgsomu.sealosbja.site/api/tokens/ -H "Authorization: sealos-admin"# 删除group
curl https://gawavirgsomu.sealosbja.site/api/group/ns-admin -H "Authorization: sealos-admin" -X DELETE# 再次查询token
curl https://gawavirgsomu.sealosbja.site/api/tokens/ -H "Authorization: sealos-admin"

测试结果符合预期,确认优化方案可行。接下来我们就可以提交这些更改并创建 Pull Request 了。

上线到生产环境

首先在 Cursor 目录顶层的 endpoint.sh 中设置启动命令,在文件中添加以下启动配置:

cd sealos/service/aiproxy
export ADMIN_KEY=sealos-admin
# 可以再创建一个单独的生产环境数据库,与开发环境隔离
export SQL_DSN=<复制的pgsql连接串>/postgres
export REDIS_CONN_STRING=<复制的redis连接串>
# 使用编译好的二进制文件
./aiproxy --port 8080

然后来到 Devbox 发布页面发布版本:

点击发布按钮后,等待发布流程完成。发布成功后,点击 “上线” 按钮进入部署页面,然后点击 “部署应用” 即可:

部署完成后,进入应用的详情页面,等待应用变成 running 状态,然后复制公网地址:

这个公网地址就是生产环境的域名,我们可以使用生产环境的域名进行测试:

# 这里使用的是生产环境的域名
curl https://jpesudzryuhp.sealosbja.site/api/tokens/ -H "Authorization: sealos-admin"

完美!

Next.js 前端

前端项目搭建

前端环境的搭建与后端类似,具体步骤如下:

  1. 在 Devbox 中创建一个 Node.js 环境,版本选择 20,端口改成 3000。由于 pnpm 安装依赖比较消耗资源,建议选择 4c 16G 的配置。然后克隆你自己 Fork 的 Sealos 仓库:git clone https://github.com/xxx/sealos.git。AI Proxy 的前端代码位于 sealos/frontend/providers/aiproxy 目录。

  2. 切换到 sealos/frontend 目录,首先修改 sealos/frontend/package.josn 文件,去除 node 版本限制,直接删除 "node": "20.4.0""pnpm": "8.9.0" 这两行即可,这一步很重要,不然代码构建依赖会不成功

  3. 执行命令 pnpm i 安装依赖。

  4. 执行命令 pnpm -r --filter ./packages/client-sdk run build 构建 client-sdk 包。

  5. 为了让 Cursor 的 i18n 插件正常工作,我们需要将项目根目录切换到 sealos/frontend/providers/aiproxy

    切换目录后,建议安装所有 @recommended 插件以获得最佳的开发体验:

  6. 之前只是构建出了 Sealos Desktop SDK,并没有安装 aiproxy 的依赖,aiproxy 的依赖需要在 aiproxy 工作目录下 sealos/frontend/providers/aiproxy 进行安装。直接执行命令 pnpm i 安装即可:

对接后端环境

项目搭建完成后,我们需要配置环境变量来对接后端服务。在项目根目录创建一个 .env 文件,需要配置以下几个关键变量:

NEXT_PUBLIC_MOCK_USER=""
AI_PROXY_BACKEND_KEY=""
APP_TOKEN_JWT_KEY="test123"
AI_PROXY_BACKEND=""
AI_PROXY_BACKEND_INTERNAL=""
ADMIN_NAMESPACES=""
  • NEXT_PUBLIC_MOCK_USER:由于 AI Proxy 是 Sealos Desktop 的一部分,用户认证通过 JWT Token 实现,AI Proxy 只做解析 Token,JWT Token 的签发由 Sealos Desktop 完成。在开发阶段,我们需要 mock 一个 JWT Token。NEXT_PUBLIC_MOCK_USER 的值就是 mock 出来的 JWT Token。可以使用在线工具 https://www.lddgo.net/encrypt/jwt-generate 生成。

    mock 数据如下:

    {"workspaceId" : "test"
    }
    

  • APP_TOKEN_JWT_KEY:JWT Token 的密钥 (随便写)

  • AI_PROXY_BACKEND_KEY:后端 API 的访问密钥 (也就是后端项目的 ADMIN_KEY)

  • AI_PROXY_BACKEND:后端服务的公网地址

  • AI_PROXY_BACKEND_INTERNAL:后端服务的内网地址 (开发测试阶段可以不填)

  • ADMIN_NAMESPACES:管理员用户名,开发时填 test 就行,和 token 中的 “workspaceId”:“test” 保持一致

环境变量配置完成后,运行 pnpm dev 即可启动开发服务器。项目的发布和部署流程与前面介绍的后端开发流程完全一致。

总结

Sealos AI Proxy 前端项目采用了经典的 Next.js App Router 架构,其中 app/[lng] 目录用于页面路由,app/api 目录则用于后端 API 路由。

在这个项目中,Next.js 的后端实际上是一个中间层,它主要负责用户认证相关的业务逻辑,并将经过认证的请求转发给真正的 Golang 后端服务。这种分层设计可以让 Golang 后端专注于核心业务逻辑,不需要关心认证等基础设施,从而提高了代码的灵活性和可移植性。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【详解】低功耗低成本的Open开发方案

Open开发应用需求,有没有低功耗、低成本方案? 今天我们一起来聊聊Air780EP模组。 一、Air780EP核心信息描述 运营商支持: Air780EP模组面向国内的全网通模组,支持移动、电信、联通三大运营商。 仅比Air700E系列相对大一些: Air700ECQ/Air700EAQ/Air700EMQ; 与Air780E系列…

01现代计算机视觉入门之:什么是图片

## 系列文章目录 ## 01现代计算机视觉入门之:什么是图片(6700字/25图) 02现代计算机视觉入门之:什么是视频 03现代计算机视觉入门之:什么是图片特征编码 04现代计算机视觉入门之:什么是图片分类 05现代计算机视觉入门之:什么是目标检测 06现代计算机视觉入门之:什么是图…

微信小程序中supabase在线数据库使用指南

在微信小程序中使用supabase在线数据库可以无需后端和服务器完成个人小项目的开发。本文记录我的使用过程,在阅读本文前,建议您先满足以下条件:持有可用于开发的微信小程序 了解kexue上网第一步 注册与简单使用 首先,我们到https://supabase.com/注册一个账户,并创建一个您…

USB上网快速入门:RNDIS网卡,手把手教你!

本文将带你使用RNDIS的方式,搭配Linux主控终端,快速实现USB上网。 RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡,从而使Linux可以通过USB设备连接网络。 一、Linux驱动配置 1. 虚拟串口 通过串口…

2024.12.26 os lab3

2024.12.26 os lab3 原代码 地址:https://github.com/BUPT-OS/easy_lab/tree/lab3 运行未修改的代码,并且注释掉cout时发生错误: malloc(): corrupted top size如果不注释cout,可以正常运行1.不注释 cout 时堆内存的详细分析 1. 程序启动阶段在程序启动时,堆的初始状态为空…

编译型语言的痛!但无文件落地我可以!!!

再不进来看,哭了我就不管你了!!!声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。 @目录python 等脚本语言示例演示golang 等静态编译型语言内存文件系统memfd_create 使用…

WPF TabControl 去掉鼠标悬浮效果

1.资源<Window.Resources><Style x:Key="TabStyle" TargetType="TabItem"><Setter Property="TextBlock.FontSize" Value="12" /><Setter Property="Template"><Setter.Value><ControlTem…

Clion创建项目sqlite数据库

1.创建工程并运行 (1)新建——project,选择工程文件夹,创建工程(2)进入界面,等待项目启动,显示main.cpp主文件(3)配置编译环境默认生成了main.cpp文件,但是我们不能运行。我们缺少编译环境,点击Setting打开设置,搜索工具链,发现Clion提供的编译环境有几种MinGW,Cy…

营销相关笔记2:电力营销的业务办理和计量计费

电力营销的业务办理和计量计费 转:电力知识图谱:电力营销(下) - 知乎 一.业务办理 电力营销是和客户打交道的最前线,两大业务:一是市场销售,二是客户需求受理和交付,即业务办理。在一些市场化主导的售电公司里,市场部和营销部可能会分开。但在电网公司,都是统一的营销…

FMC子卡设计原理图:FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡 中低频信号采集

一、板卡概述本子卡基于FMC连接器实现4路125M采样率AD输出,两路1G采样率DA输出子卡,板卡默认由FMC连接器+12V供电,支持外参考时钟,外输入时钟,外触发。 二、性能指标三、应用领域 中低频信号采集

【安全就业】2024年网络安全技术技能人才职业能力图谱+电子数据取证

电子数据取证,是指利用科学和法律方法对电子设备中的数据进行搜集、分析、保存和报告的过程,以确保这些信息在法律程序中能够作为线索或证据使用。电子数据取证工作,一般需要取证人员具备电子数据提取、电子数据恢复、数据库系统取证、电子数据治理、程序功能分析、现场勘查…

HuntBack(反击狩猎):用于攻防演练中,防守方对恶意ip进行web指纹扫描与识别

#溯源 #攻防演练 HuntBack(反击狩猎),用于攻防演练中,防守方对恶意ip进行web指纹扫描与识别 应用场景 在蓝队职守中,安全设备爆出恶意攻击ip地址,如果对方使用的是自己的服务器,并且搭建了一些安全业务,可使用本工具对目前已知工具进行探测。 功能 1.红队指纹识别 2.ipwh…