当前位置: 首页 > news >正文

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

随着技术的成熟和 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 后端专注于核心业务逻辑,不需要关心认证等基础设施,从而提高了代码的灵活性和可移植性。

相关文章:

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

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

pthread.h互斥锁与原子操作

一&#xff1a;互斥锁 pthread.h 是 POSIX 线程库的头文件&#xff0c;它提供了多线程编程所需的各种功能。其中&#xff0c;互斥锁&#xff08;mutex&#xff09;的实现涉及多个底层机制&#xff1a; 1. 互斥锁的基本结构 在 POSIX 线程库中&#xff0c;互斥锁通常包含以下…...

网络基础入门到深入(3):网络协议-HTTP/S

目录 一、HTTP和HTTPS协议简介 1.HTTP协议 .HTTP 协议 作用&#xff1a; 特点&#xff1a; 2.HTTPS协议 作用&#xff1a; 实现方式&#xff1a; 特点&#xff1a; 二.HTTP的请求与响应结构 1.HTTP请求结构 1.请求行:描述操作和资源 2.请求头: 3.请求体 : 2.HTTP…...

Git的.gitignore文件详解与常见用法

诸神缄默不语-个人CSDN博文目录 在日常使用 Git 进行版本控制时&#xff0c;我们经常会遇到一些不需要被提交到远程仓库的文件&#xff08;例如日志文件、临时配置文件、环境变量文件等&#xff09;。为了忽略这些文件的提交&#xff0c;Git 提供了一个非常有用的功能&#xf…...

UniApp 组件的深度运用

一、引言 在当今的移动应用开发领域&#xff0c;跨平台开发已成为主流趋势&#xff0c;而 UniApp 作为其中的佼佼者&#xff0c;备受开发者青睐。UniApp 的强大之处很大程度上源于其丰富且功能多样的组件体系&#xff0c;这些组件宛如精巧的积木&#xff0c;能够帮助开发者快速…...

k8s部署nginx+sshd实现文件上传下载

要通过 nginx 和 sshd 实现文件的上传和下载&#xff0c;通常的做法是结合 SSH 协议和 HTTP 协议&#xff0c;使用 nginx 提供 Web 服务器功能&#xff0c;同时使用 sshd&#xff08;即 SSH 服务&#xff09;来处理通过 SSH 协议进行的文件传输。 SSH 实现文件的上传和下载&…...

Spring-Mybatis 2.0

前言&#xff1a; 第一点&#xff1a;过于依赖代码生成器或AI&#xff0c;导致基于mybaits的CRUD通通忘了&#xff0c;所以为了找回遗忘的记忆&#xff0c;有了该系列内容。 第二点&#xff1a;通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能…...

Linux 的历史与发展:从诞生到未来

Linux 的历史与发展&#xff1a;从诞生到未来 1. 起源之前&#xff1a;操作系统的历史背景 在 Linux 问世之前&#xff0c;操作系统的发展经历了多个重要阶段&#xff0c;这些阶段为 Linux 的诞生奠定了基础&#xff1a; 1940-1950 年代&#xff1a;计算机初期 早期计算机如 [[…...

SQL Server实现将分组的其他字段数据拼接成一条数据

在 SQL Server 中&#xff0c;可以使用 STRING_AGG 函数&#xff08;SQL Server 2017 及更高版本支持&#xff09;将分组的其他字段数据拼接成一条数据。以下是示例代码&#xff1a; 假设有一个表 Orders&#xff0c;结构如下&#xff1a; OrderIDCustomerIDProduct1C001Appl…...

学习笔记 --C#基础其他知识点(同步和异步)

C#中的同步和异步《一》 以下理解借鉴博客&#xff1a;借鉴博客地址1 异步编程&#xff08;Asynchronous&#xff09; 允许任务在后台执行&#xff0c;而不会阻塞调用线程。C#使用async和await关键字 async Task AsynchronousMethod() {// 等待异步操作完成await Task.Dela…...

一维、线性卡尔曼滤波的例程(MATLAB)

这段 MATLAB 代码实现了一维线性卡尔曼滤波器的基本功能,用于估计在存在噪声的情况下目标状态的真实值 文章目录 一维线性卡尔曼滤波代码运行代码介绍1. **初始化部分**2. **数据生成**3. **卡尔曼滤波器实现**4. **结果可视化**5. **统计输出**源代码总结一维线性卡尔曼滤波 …...

极品飞车6的游戏手柄设置

极品飞车&#xff0c;既可以用键盘来控制车辆的前进、后退、左转、右转、加速与减速&#xff0c;也可以使用游戏手柄来操作车辆的运行。需要注意的是&#xff0c;极品飞车虽然支持手柄&#xff0c;但是仅支持常见的北通、罗技还有部分Xbox系列的手柄&#xff0c;至于其他的PS4手…...

FreeRTOS Lwip Socket APi TCP Server 1对多

源文件 /********************************************************************************* file lwip_tcp_driver.cpp* brief TCP Server implementation using LwIP******************************************************************************* at…...

逆袭之路(11)——python网络爬虫:原理、应用、风险与应对策略

困厄铸剑心&#xff0c;逆袭展锋芒。 寒苦凝壮志&#xff0c;腾跃绘华章。 我要逆袭。 目录 一、引言 二、网络爬虫的基本原理 &#xff08;一&#xff09;网络请求与响应 &#xff08;二&#xff09;网页解析 &#xff08;三&#xff09;爬行策略 三、网络爬虫的应用领…...

KOI技术-事件驱动编程(Sping后端)

1 “你日渐平庸&#xff0c;甘于平庸&#xff0c;将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的&#xff0c;那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人&#xff0c;和他们斗了那么久&#xff0c;最终却要变得和他们一样&#xff0c;…...

LVS 负载均衡原理 | 配置示例

注&#xff1a;本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时&#xff0c;可以看看原理实现。 未整理去重。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写&#xff0c;翻…...

Hive分区再分桶表

在Hive中&#xff0c;数据通常是根据分区&#xff08;partition&#xff09;来组织的&#xff0c;但是对于大数据集&#xff0c;单层分区可能不够用&#xff0c;因此可以进一步细分为桶&#xff08;bucket&#xff09;。桶可以用于提供额外的并行处理和优化查询性能。在这种情况…...

从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)

前言 本文记录使用 Coding (以 Jenkinsfile 为核心) 和 Docker 部署 Springboot 项目的过程&#xff0c;分享设置细节和一些注意问题。 1. 配置服务器环境 在实施此过程前&#xff0c;确保服务器已配置好 Docker、MySQL 和 Redis&#xff0c;可参考下列链接进行操作&#xff1…...

Linux官文转载-- Linux 内核代码风格

Warning 此文件的目的是为让中文读者更容易阅读和理解&#xff0c;而不是作为一个分支。 因此&#xff0c; 如果您对此文件有任何意见或更新&#xff0c;请先尝试更新原始英文文件。 这是一个简短的文档&#xff0c;描述了 linux 内核的首选代码风格。代码风格是因人而异的&a…...

Qt监控系统放大招/历经十几年迭代完善/多屏幕辅屏预览/多层级设备树/网络登录和回放

一、前言说明 近期对视频监控系统做了比较大的更新升级&#xff0c;主要就是三点&#xff0c;第一点就是增加了辅屏预览&#xff0c;这个也是好多个客户需要的功能&#xff0c;海康的iVMS-4200客户端就有这个功能&#xff0c;方便在多个屏幕打开不同的视频进行查看&#xff0c…...

告别字体授权困局:思源宋体CN开源解决方案的全场景应用指南

告别字体授权困局&#xff1a;思源宋体CN开源解决方案的全场景应用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字化创作领域&#xff0c;中文字体选择长期面临"三重困…...

从NetworkManager冲突到配置文件错误:一步步教你排查Linux网络服务故障

从NetworkManager冲突到配置文件错误&#xff1a;一步步教你排查Linux网络服务故障 当你深夜加班部署服务器时&#xff0c;突然发现网络服务无法启动&#xff0c;屏幕上跳出那行熟悉的Job for network.service failed错误提示&#xff0c;是不是瞬间血压飙升&#xff1f;作为L…...

IntelliJ IDEA 2019安装教程及下载

软件介绍&#xff1a; IntelliJ IDEA 是捷克 JetBrains 公司研发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主打 Java 和 Kotlin 开发&#xff0c;被誉为 “最佳 Java IDE”&#xff0c;适配不同层级开发者需求&#xff1b;它具备智能代码补全、静态分析、一键重…...

别再手动算坐标了!用Python的coord-convert库5分钟搞定高德/百度/WGS84互转

别再手动算坐标了&#xff01;用Python的coord-convert库5分钟搞定高德/百度/WGS84互转 你是否曾在处理地理数据时&#xff0c;被不同地图平台的坐标系搞得焦头烂额&#xff1f;GPS设备采集的WGS84坐标无法直接在高德地图上显示&#xff0c;百度地图的坐标又和微信小程序不兼容…...

SDMatte抠图效果实测:半透明容器边缘锐度、发丝细节、背景分离精度展示

SDMatte抠图效果实测&#xff1a;半透明容器边缘锐度、发丝细节、背景分离精度展示 1. 效果概览 SDMatte作为一款专业级AI抠图工具&#xff0c;在复杂边缘处理和透明物体提取方面表现出色。本次实测将重点展示三个核心能力&#xff1a; 半透明容器边缘锐度&#xff1a;玻璃杯…...

7个专家级策略:MVP.css长期项目维护完全指南

7个专家级策略&#xff1a;MVP.css长期项目维护完全指南 【免费下载链接】mvp MVP.css — Minimalist classless CSS stylesheet for HTML elements 项目地址: https://gitcode.com/gh_mirrors/mv/mvp MVP.css是一款极简主义的无类CSS样式表&#xff0c;为HTML元素提供开…...

React on Rails 终极集成指南:React 18/19 与 Rails 7/8 的未来展望

React on Rails 终极集成指南&#xff1a;React 18/19 与 Rails 7/8 的未来展望 【免费下载链接】react_on_rails Integration of React Webpack Rails including server-side rendering of React, enabling a better developer experience and faster client performance. …...

Facebook广告细分定位新功能解析

Facebook广告细分定位新功能的本质&#xff0c;是广告受众定位正式进入了“自然语言”时代。简单来说&#xff0c;就是把过去从庞大的标签库里找词&#xff0c;变成了直接用日常语言描述你想要触达的目标人群。这背后&#xff0c;是Meta全新的 “Andromeda”&#xff08;仙女座…...

EVA-01实战案例:高校实验室用EVA-01分析显微图像+生成科研记录与假设建议

EVA-01实战案例&#xff1a;高校实验室用EVA-01分析显微图像生成科研记录与假设建议 1. 引言&#xff1a;当科研遇上“初号机” 想象一下这个场景&#xff1a;生物实验室的研究生小李&#xff0c;正对着电脑屏幕上密密麻麻的细胞显微图像发愁。他需要从上百张图片里&#xff…...

从GD32F103到F407升级指南:除了以太网和摄像头,这些‘隐性’升级点更值得关注

GD32F103到F407升级实战&#xff1a;揭秘那些数据手册没告诉你的关键差异 当项目需求从简单的控制逻辑升级到需要处理以太网通信、图像采集或复杂算法时&#xff0c;许多工程师会自然地将目光投向GD32F407系列。表面上看&#xff0c;F407相比F103最直观的变化是主频从108MHz提升…...