最近我把本地高性能主机上的 CLIProxyAPI 通过一台有公网 IP 的阿里云 ECS 暴露到了公网,整体方案比“直接开放本地端口”稳妥很多,也更适合长期维护。 这篇文章就按实际落地过程,完整记录一下 Caddy + FRP + CLIProxyAPI 的部署思路和操作步骤。 一、整体目标 我当前有两台机器: A:阿里云 ECS 有公网 IP 负责域名入口、HTTPS 证书、反向代理 B:本地高性能主机 没有公网 IP 负责真正运行 CLIProxyAPI 最终链路如下: 12345用户 / Claude Code / 浏览器 ↓ HTTPS阿里云 ECS A(Caddy + frps) ↓ FRP 隧道本地服务器 B(frpc + CLIProxyAPI) 最终对外访问地址: 1https://ai.YOUR_DOMAIN 二、为什么不用直接暴露本地服务 如果把本地服务器直接发布到公网,通常会遇到几个问题: 本地机器没有公网 IP 家宽、校园网、办公网往往都在 NAT 后面 HTTPS 证书、域名解析和端口映射维护麻烦 直接暴露本地服 ...
最近为了让 Linux 主机能够更稳定地访问 GitHub 和部分外部服务,我重新整理了一套 Mihomo + pon / poff 的本机代理方案。 这套方案的重点不是“给全局网络开代理”,而是:只让 Linux 主机自己按需走代理,并且尽量不影响其他本地服务。 一、这篇文章要解决什么问题 我的目标比较明确: Mihomo 常驻运行 只监听本机回环地址 不对局域网其他设备开放代理 需要时一键打开当前 shell 代理 不需要时一键关闭代理 最终效果如下: 1234命令行程序(git / curl / apt 等) -> 127.0.0.1:7890 -> Mihomo -> 代理节点 也就是说,这套方案主要服务于: git curl apt 终端里的其他联网程序 而不会主动影响: 局域网其他设备 本机对内服务 不需要走代理的日常网络访问 二、准备条件 开始之前,需要具备这些前提: Linux 主机已经可以正常执行 Linux 命令 已经拿到一份可用的 Clash / Mihomo 配置 已经下载好 Mihomo 二进制,或者准备上传到 ...
最近为了让远程控制链路更稳定,也为了摆脱对公共中继服务的依赖,我把 RustDesk Server OSS 单独部署到了自己的阿里云 ECS 上。 这篇文章按实际操作过程,完整记录一下 RustDesk 服务端手动部署 的步骤。整套方案不依赖 Docker,也不使用 Pro 安装脚本,更适合自己长期维护和排查问题。 一、这篇文章适合什么场景 如果你符合下面这些情况,这篇文章应该会比较有参考价值: 手里有一台公网 Linux 服务器 想搭建自己的 RustDesk 服务端 不想依赖官方公共服务器 希望通过自己的域名接入客户端 更偏好“原生二进制 + systemd”的部署方式 本文采用的是 RustDesk Server OSS 原生二进制手动部署。 二、整体架构 最终架构比较简单: 1234RustDesk 客户端 -> rustdesk.YOUR_DOMAIN -> 阿里云服务器 -> hbbs + hbbr 其中: hbbs:负责 ID / rendezvous hbbr:负责 relay 三、为什么选择手动部署 我一开始尝试过其他方式,比如: ...
大模型研习
未读随着2022年底 ChatGPT 刷新 NLP 的能力上限,大语言模型开始接替传统的预训练语言模型(Pre-trained Language Model,PLM) 成为 NLP 的主流方向,基于 LLM 的全新研究范式正刷新被 BERT 发扬光大的预训练-微调范式,NLP 迎来又一次翻天覆地的变化。 究竟什么是 LLM,LLM 和传统的 PLM 的核心差异在哪里,又是什么令研究者对 LLM 抱有如此高的热情与期待呢? 在本文中,将深入分析 LLM 的定义、特点及其能力,揭示 LLM 与传统深度学习模型的核心差异,展示LLM 的实际三阶段训练过程。 LLM的定义 LLM(Large Language Model,大语言模型),是一种相较传统语言模型参数量更多、在更大规模语料上进行预训练的语言模型。 LLM 使用与传统预训练语言模型相似的架构与预训练任务(如 Decoder-Only 架构与 CLM 预训练任务),但拥有更庞大的参数、在更海量的语料上进行预训练,从而展现出与传统预训练语言模型截然不同的能力。 随着 LLM 研究的不断深入,多参数尺寸的 LLM 逐渐丰富,广义 LLM 一 ...
大模型研习
未读预训练语言模型 Encoder-only PLM Transformer 结构主要由 Encoder、Decoder 两个部分组成,两个部分分别有不一样的结构和输入输出。 针对 Encoder、Decoder 的特点,引入 ELMo 的预训练思路,开始出现不同的、对 Transformer 进行优化的思路。例如: Google 选择了 Encoder 层,通过将 Encoder 层进行堆叠,提出不同的预训练任务-掩码语言模型(Masked Language Model,MLM),打造了自然语言理解(Natural Language Understanding,NLU)任务的代表模型——BERT。 OpenAI 则选择了 Decoder 层,使用原有的语言模型(Language Model,LM)任务,通过不断增加模型参数和预训练语料,打造了在自然语言生成(Natural Language Generation,NLG)任务上的 GPT 系列模型。 Google 发布的 T5 模型同时保留 Encoder 与 Decoder,打造预训练的 Transformer 模型。 在本小节 ...
算法学习
未读字符串 字符串刷题记录,基于代码随想录整理。 快速索引方法分组 344 反转字符串(双指针) 541 反转字符串 II(分段处理) 模拟 替换数字(遍历构造) 151 反转字符串中的单词(去空格 + 整体反转 + 单词反转) 右旋 右旋字符串(整体反转) 28 找出字符串中第一个匹配项的下标(KMP) 459 重复的子字符串(KMP) 双指针:344、151 模拟分段处理:541、替换数字、右旋字符串 KMP:28、459 344. 反转字符串 问题描述 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1: 12输入:s = ["h","e","l","l","o"]输出:["o","l","l","e","h"] 示例 2: ...
算法学习
未读哈希表 242. 有效的字母异位词 问题描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。 示例 1: 12输入: s = "anagram", t = "nagaram"输出: true 示例 2: 12输入: s = "rat", t = "car"输出: false 提示: 1 <= s.length, t.length <= 5 * 104 s 和 t 仅包含小写字母 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? 思路 数组其实就是一个简单哈希表,且这道题目中字符串只有小写字符,那么就可以定义一个大小为 26 的数组(字符a到字符z的ASCII是26个连续的数值),记录字符串s里字符出现的次数。 遍历字符串 s 时,将 s[i] - ‘a’ 所在的元素做+1 操作即可; 同样遍历字符串 t 时,将 t[i] - ‘a’ 所在的元素做-1 操作即可; 数组若存在元素不为0,说明字符串s和 ...
解决 vscode 连接服务器无法正常使用代理(codex插件) 起因:在服务器配置了代理,但是无法正常使用codex,一致显示连接超时 本地终端配置 在本地终端中输入 1ssh -R 9999:localhost:7890 用户名@主机IP 输入密码后实现与服务器的连接 服务器端配置 vscode 连接服务器后,在 /home/username/.bashrc 最后添加: 12345678910111213cat >> ~/.bashrc <<'EOF'vpn() { export http_proxy=http://192.168.1.23:9999 export https_proxy=http://192.168.1.23:9999 echo "Proxy has been set to 192.168.1.23:9999"}unvpn() { unset http_proxy https_proxy echo "Proxy has been disabled& ...
Encoder-Decoder Seq2Seq模型 Seq2Seq 模型输入的是一个自然语言序列 input=(x1,x2,x3...xn)input = (x_1, x_2, x_3...x_n)input=(x1,x2,x3...xn) ,输出的是一个可能不等长的自然语言序列 output=(y1,y2,y3...ym)output = (y_1, y_2, y_3...y_m)output=(y1,y2,y3...ym), Transformer 是一个典型的 Seq2Seq 模型,序列进入 Encoder 进行编码,到 Encoder Layer 的最顶层再将编码结果输出给 Decoder Layer 的每一层,通过 Decoder 解码后就可以得到输出目标序列了。 编码:将输入的自然语言序列通过隐藏层编码成复杂的词向量表示。 解码:对输入的自然语言序列编码得到的向量通过隐藏层输出,再解码成对应的自然语言目标序列。 几乎所有的 NLP 任务都可以视为 Seq2Seq 任务。例如文本分类任务,可以视为输出长度为 1 的目标序列(如在上式中 mmm ...
生活札记
未读“export http_proxy=http://127.0.0.1:xxx” 是什么意思? **事情起因:**今天给学校集群服务器配置代理的时候,发现总是要输入这些命令,但是平时都是只知道敲命令而不懂原理,就很好奇这些究竟是什么意思❓ export 是什么? 在 Linux 系统里,export 的意思是**“声明/导出环境变量”**。 可以把它想象成在当前的终端里贴了一张 “全局通告”。只要是在这个终端里运行的任何程序(不管是 curl、pip、git 还是 Python 脚本),在启动时都会先抬头看一眼这些通告。 http_proxy 和 https_proxy 是什么? 这两个是 Linux 软件世界里约定俗成的两个**“路标变量名”**。 http_proxy 管的是普通的、不加密的网页请求。 当你访问一个以 http:// 开头的网址时,你发出的请求和收到的数据都是明文的。 举例:这就好比你写了一张没有任何遮挡的明信片寄出去。邮递员、转运中心的大爷、甚至是你学校机房的网络管理员,只要他们愿意,低头就能把你明信片上写的字(比如你的账号、密码、你在看什么网页)看得一清 ...










