环境配置:Github GPG签名
1. 安装 GPG 工具(适配 Apple 芯片)12345678910111213141516# 安装核心工具:gnupg(GPG主程序)+ pinentry-mac(Mac友好的密码输入弹窗)brew install gnupg pinentry-mac# 创建GPG配置目录(权限必须700,否则GPG会报错)mkdir -m 700 -p ~/.gnupg# 配置pinentry-mac为默认密码输入程序(Apple Silicon路径固定为/opt/homebrew)echo "pinentry-program /opt/homebrew/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf# 配置环境变量(确保GPG Agent正常工作,zsh是Mac默认终端)echo 'export GPG_TTY=$(tty)' >> ~/.zshrcecho 'gpgconf --launch gpg-agent' >> ~/.zshrcsource...
服务器:自定义域名配置CNAME解析
配置 CNAME 的通用步骤这篇笔记整理了任何云服务场景下(CDN、OSS、云服务器等)配置 CNAME 的通用流程。核心分为四部分: 前置准备 获取目标 CNAME 值 在 DNS 解析中添加 CNAME 记录 验证是否生效 以下的例子假设你已经注册了 example.com 域名, 并想要通过配置 CNAME, 来自定义域名 wwww.example.com 提供的服务 一、前置准备:确认核心前提 域名所有权确保你拥有需要配置 CNAME 的域名(如 www.example.com)的管理权限,能够登录到域名注册商或云解析控制台,修改 DNS 记录。 清理冲突记录CNAME 记录与同名的 A / AAAA / MX 记录互斥,不能共存。在添加 CNAME 之前,先删除该主机记录下已经存在的: A 记录 AAAA 记录 MX 记录 二、获取 CNAME从对应服务提供商处获取需要指向的 CNAME 地址,例如: CDN 提供的调度域名 OSS/对象存储的专属访问域名 第三方服务(如邮件、监控、验证服务)提供的别名域名 三、配置 DN...
服务器:Ollama本地部署大模型与公网服务器内网穿透
概览Windows 机使用 ollama 本地部署 qwen,云服务器使用内网穿透与 Windows 机连接,实现其他机器(如 Mac)远程调用 Windows 运行的大模型服务。 ollama 本地部署大模型安装与验证 在 ollama 官网 下载对应操作系统版本 本地 cmd 输入 ollama,检测是否安装成功 1ollama 拉取与运行模型 拉取模型到本地,以 qwen2.5:3b-instruct 为例: 1ollama pull qwen2.5:3b-instruct 拉取完成后,运行模型,检查模型是否正常输出,检查本地 GPU 是否有资源占用(防止模型使用 CPU 运行,降低运行效率): 1ollama run qwen2.5:3b-instruct 测试 直接使用命令行交互式测试,或使用 curl 命令调用 API 测试: 1234curl http://localhost:11434/api/generate -d '{ "model": "qwen2.5:3b-instruct", ...
服务器:流量端口转发与代理
概览实现 SSH 免密登录,并让云服务器流量转发到本地端口,通过代理再返回。 免密登录打开 ~/.ssh/config,写入: 1234Host <server ip> HostName <server ip> User root # 默认为 root 用户 Port 22 # SSH 默认端口 打开 Cursor 的 Remote Explorer,会看到多了 <server ip> 这个选项。 现在配置免密 本机生成密钥 1ssh-keygen -t ed25519 # 随便取一个文件名 公钥写入服务器 1ssh-copy-id ~/.ssh/id_ed25519.pub <user>@<server-ip> 验证免密登录 打开 Cursor 的 Remote Explorer,直接点击配置的 <server ip>;也可以使用命令行: 1ssh <user>@<server-ip> 端口转发与代理原理建...
FastGPT实习:系统插件项目构建与插件生态贡献
系统插件项目构建通过三个机制实现插件项目快速构建 1. 零配置机制两个核心机制: 约定优于配置 自动发现机制 实现细节: 系统启动: 系统启动时调用initTools, 包含initBuiltInTools和refreshUploadedTools两部分 自动发现: 判断是开发环境还是生产环境, 扫描对应的路径目录, 得到工具目录数组, 对于工具目录数组的每一个元素(工具目录), 调用LoadToolsByFilename, Filename即目录名称 动态加载: 动态导入插件, 识别是工具还是工具集, 约定默认toolId和icon, 加载工具(或副工具集下的所有子工具) 自动注册: 将加载的工具添加到全局插件列表, 实现插件自动可用, 无需手动配置 2. 脚本一键生成模板 使用nodejs全局变量: __dirname, process 提前创建好工具和工具集模板 copyTemplate函数: 如果是文件夹则递归调用, 如果是文件则复制, 这样就把模板变成能实际开发的代码结构 3. 插件热插拔系统插件分为内置插件和用户自定义插件两部分, 插件热插拔针对的是用户自定...
FastGPT实习:工作流运行机制与调试模式
工作流基本数据结构 节点 Node: 工作流的基本执行单元,包含输入、输出、执行逻辑 边 Edge: 连接节点的有向边,三种状态: active: 激活状态,表示数据流经此边 skipped: 跳过状态,表示此边被跳过 waiting: 等待状态,表示等待上游节点执行完成 连接点 Handle: 节点上的输入输出连接点,一个节点可能有多个handle 活跃节点队列 activeRunQueue: 存储准备执行的节点ID集合 跳过节点队列 skipNodeQueue: 存储需要跳过的节点及其子节点映射 调试数据结构: debugNextStepRunNodes: 调试模式下存储下一步要执行的节点 debugNodeResponses: 调试模式下记录每个节点的执行结果 补充概念入口节点 (Entry Node) 工作流的起始执行点 通过 isEntry 属性标识 调试模式下,每次步骤的入口节点由前端动态设置 交互节点 (Interactive Node) (代码逻辑上:判断节点时单独判断,处理交互节点) 需要用户输入的节点(如用户选择、表单输入等) 执行后会暂停工作流,...
FastGPT实习:AI流式响应全链路分析
需求背景在AI应用中,实现向AI模型请求提问并返回流式响应,最终呈现打字机输出效果。这种交互方式能够提升用户体验,让AI的回答更加自然流畅。 技术架构分析整体流程概览整个流式响应系统涉及6个关键环节: 前端发起SSE连接 后端接收请求并调用AI模型 AI模型流式响应给后端 后端设置SSE响应头并流式发送 前端流式接收数据 渲染组件实现打字机效果 详细技术实现1. 前端发起SSE连接前端使用Server-Sent Events技术建立与后端的持久连接,为后续的流式数据传输做准备。 2. 后端接收请求并调用AI模型后端接收前端的请求后,调用AI模型API获取响应。 3. AI模型流式响应处理核心机制:异步迭代器 AI模型返回一个异步迭代器给后端,而不是完整的响应数据。异步迭代器就像一个数据管道,让后端可以通过for await循环实时获取AI生成的数据。 数据内容包含: 元数据信息 标签数据 推理内容 回答内容 处理流程: 持续接收数据直到用户手动退出或AI模型生成完毕 数据分批次到达,需要特殊处理机制 4. 函数工厂模式实现状态管理设计原理:由于流式处理中数据分批次到达...
FastGPT实习:双Token验证实现CSRF防御
双Token验证实现CSRF防御需求分析:在 FastGPT 平台发现安全漏洞,发送markdown渲染的img标签,如果src属性为”删除api”的路径(如:/api/core/dataset/delete),则会将用户的知识库自动删除 通过实现双Token验证机制,有效防御CSRF(跨站请求伪造)攻击 保护用户数据安全,防止恶意站点利用用户身份执行敏感操作 问题分析漏洞描述发送markdown渲染的img标签,如果src属性为”删除api”的路径(如:/api/core/dataset/delete),则会将用户的知识库自动删除 问题本质由于前端请求自动携带浏览器cookie作为请求头,后端校验通过后,执行图片中的路径,造成CSRF恶意攻击 攻击原理 用户已登录平台,浏览器中存储cookie信息 恶意站点的某些表单、图片等请求指向平台的敏感接口 当用户被诱导访问后,浏览器会在请求中自动添加cookie 仅凭Cookie做鉴权的服务端误以为是用户本人操作,执行敏感动作 解决方案技术方案:双Token验证实现步骤 前端Token获取: 前端发送请求前,检测本地存储中没有c...
FastGPT实习:从渲染和请求的时序中学习React设计哲学
从渲染和请求的时序中学习React设计哲学需求分析:在 FastGPT 平台开发过程中,遇到组件渲染与异步请求时序问题 通过解决组件渲染空数组的问题,深入理解 React 的异步渲染机制和设计哲学 学习如何优雅地处理异步数据加载与组件渲染的协调 问题描述打开一个modal时, 网络请求已经获取到了数据, 但是modal没有渲染出数据 核心问题组件渲染和API请求是异步进行的,导致组件优先渲染了变量的初值(空数组) 当异步请求获取到数据,填充到数组中时,组件已经渲染完毕了 最终结果就是渲染了空数组 问题影响 用户看到空白或加载状态 数据更新后界面不会自动刷新 用户体验不佳 解决方案技术方案使用 useMemo 来缓存数组,并将请求的数据变量作为依赖项 请求成功,依赖项变化,更新数组,进而重新渲染组件 解决渲染空数组的问题 实现原理 组件初始渲染时显示空数组 异步请求开始执行 请求完成后,依赖项更新 useMemo 检测到依赖变化,重新计算 组件重新渲染,显示实际数据 方案优点性能优化不会因为某一个数组在加载中,而阻塞渲染,让整个组件树等待,提升使用体验 可以让多个数据源同...
FastGPT实习:扫描二维码实现自动兑换积分
扫描二维码实现自动兑换积分的完整流程需求分析:在 FastGPT 平台实现用户扫描二维码自动兑换积分功能 用户扫描包含兑换码信息的二维码,自动跳转到门户网站登录页,登录成功后,自动兑换兑换码,增加账号积分 实现用户无需手动输入兑换码,提升用户体验 需求分析二维码的本质二维码的本质是用二维图形存储二进制数据的信息载体 扫描一次二维码的本质是通过光学识别将图形转化为二进制数据,再解码出二维码中包含的数据,并执行 二维码需要包含的信息 重定向地址 兑换码 兑换码是否被使用 实现登录后自动兑换的方案方案A:携带查询参数到登录页扫描二维码后, 会重定向到登录页, 同时url中会携带兑换码信息作为查询参数 登录接口会接收查询参数中的兑换码信息, 并在登录成功后再传递给兑换接口 兑换接口在收到兑换码信息后执行, 即可兑换积分 方案B:使用本地存储扫码跳转登录页后,将兑换码存储在本地存储 登录后检测本地存储,符合条件则执行兑换API,并删除存储 具体实现技术选型选择方案B 原因: 登录接口有多种, 微信登录, 账密登录等等, 选择方案A的话每个接口都需要修改 修改底层登录接口这种行为, ...