MoreRSS

site iconEin Verne修改

软件工程师,开源爱好者,Linux用户和vimer开发者。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Ein Verne的 RSS 预览

简洁高效的开源网络终端 Next Terminal

2025-06-23 13:00:00

我个人一直都是使用本地的 SSH Config 来管理我的 SSH 连接,虽然这个方案有自身的优点,就是安全,易配置,我所有的连接都只允许使用 SSH Key 访问,关闭了用户名密码,另外所有的配置都通过 assh 一键配置,我给所有的节点都配置了昵称,所以我只需要输入 ssh alias 就可以连接到任何我想连接的机器。

但这个方案有一个缺点,就是我必须在我经常使用的机器旁,我才能访问我的服务器,一旦我离开了我的电脑,那么任何设备我都无法连接上。但是前段时间我发现了一款基于浏览器的远程连接管理工具 Next Terminal。在我看来 Next Terminal 更像是一个堡垒机,可以在一个中心化的节点上来管理 SSH,Telnet 等等连接,还提供了安全审计等功能。

Next Terminal 是一款使用 Golang 和 React 开发的 HTML5 远程桌面网关,具有小巧、易安装、易使用、资源占用小的特点,支持多种远程协议如 RDP、SSH、VNC 和 Telnet 的连接和管理。作为一个开源的交互审计系统,它为用户提供了一种高效且安全的方式来管理远程连接,特别强调了易用性和安全性。Next Terminal 虽然定位轻量堡垒机,但是支持RDP、SSH、VNC、Telnet、Kubernetes协议超多协议。

核心功能

Next Terminal 拥有众多实用功能,使其成为运维和安全团队的理想选择:

  • 多协议支持:在一套系统中访问 RDP、SSH、VNC、TELNET 等协议资产,无需插件,只需一个浏览器即可。
  • 实时监控:随时查看当前活跃的会话,进行监控和阻断。对于字符协议,甚至可以限制禁止某些命令的执行和记录。
  • 事后审计:观察并记录所有环境中的每个在线资源、连接、交互会话和其他安全事件,这些事件被记录在结构化的审计日志中。
  • 授权凭证管理:集中管理用户的授权凭证,确保安全访问。
  • 批量执行命令:支持批量执行命令,提高操作效率。
  • 双因素认证:增强系统的安全性,确保用户身份的可靠性。
  • 资产标签和授权:为资产打标签,方便分类和管理,同时精确控制资产的授权。
  • 多用户与用户分组:支持多用户和用户分组,方便权限管理。

商业化

目前 Next Terminal 已经开始进行商业化的尝试,可以在官网 购置专业版以及商业版的授权。

Installation

参考官方文档

version: '3.3'
services:
  guacd:
    image: dushixiang/guacd:latest
    volumes:
      - ./data:/usr/local/next-terminal/data
    restart: always
  next-terminal:
    image: dushixiang/next-terminal:latest
    environment:
      DB: sqlite
      GUACD_HOSTNAME: guacd
      GUACD_PORT: 4822
    ports:
      - "8088:8088"
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data:/usr/local/next-terminal/data
    restart: always

安全建议

Next Terminal 提供了便捷的远程访问能力,但是服务器的安全性依然是首要考虑的因素。建议安装之后立即修改复杂的管理员密码,并开启双因素认证。

尽量避免将 Next Terminal 直接暴露到公网环境,合理配置授权策略,遵循最小权限原则。

最后

Next Terminal 相较于其他的开源堡垒机项目,更轻量,简单,被管理资产透明,适合个人和小型团队使用。JumpServer 功能全面,但是非常笨重,适合大型企业。Teleport 安全性相对较好,但是需要在被管理资产上进行额外的操作,适合对安全性要求较高的场景。

related

  • [[teleport]]
  • [[JumpServer]]

ChatWise 本地多模型支持的 AI 客户端

2025-06-20 13:00:00

在我之前的视频里面当时介绍了三款不同的本地 AI 客户端,[[Cherry Studio]],[[Chatbox]],ChatWise,每个客户端都有自身的优缺点,前两款也还是开源的,但是今天要介绍的 ChatWise 是一款更轻量的,更强大的 AI 客户端,包括一些个人觉得非常好用的功能,比如本地联网搜索,MCP 支持,Artifacts 等等使用起来都非常方便。

我最早是因为本地使用 DeepSeek 才想要下载用一个本地的客户端,因为平时基本上都使用在线网页版本 [[Perplexity]],ChatGPT,Claude 等,但是知道了 ChatWise 之后发现原来本地的客户端使用体验也可以非常不错。

多模型支持

ChatWise 支持几乎所有主流的大模型模型,包括

  • OpenAI 的 GPT-4,GPT-4o
  • Anthropic, Claude
  • Google Gemini
  • 通过 Ollama 支持 Llama,Mistral,Qwen,DeepSeek 等开源模型

VD-juwHjfw

多模态功能

ChatWise 支持多种形式的输入输出,除了最普通的文本,还支持

  • 图像理解和分析,对于一些模型可以生成
  • PDF 文件处理
  • 部分模型支持音频文件处理
  • 支持文本转语音 TTS 输出

本地联网搜索

在聊天界面只要点击地球图标就可以启用搜索。

GaXx-0uZlB

在设置中,也有单独的 Web Search 的选项。默认情况下使用本地的 Google 搜索。

hglAhrA4Xj

在设置中还可以使用 Tavily 搜索 API,让用户获取实时的搜索结果。

SD-ZdggCJf

Artifacts 渲染

支持 HTML,React,图表,文档等内容。还支持 mermaid 流程图。

如果对话过程中有代码相关的内容,可以启用 Artifacts 那么在右侧就可以看到预览的效果。

MCP 协议

ChatWise 支持 [[Model Context Protocol]] MCP 协议,MCP 是 Anthropic 推出的一个让模型访问外部资源的协议。开发者可以根据 MCP 规范实现一些服务,让 AI 可以通过协议获取额外的资源和上下文,比如 ChatWise 可以连接到 Notion,Google Sheets 等等外部工具,在和 AI 聊天的过程中可以调用这些 MCP 来实现更好的回答。

模型可以通过两种方式访问 MCP

  • 命令行输入输出(stdio),适用于本地服务,比如需要访问本地文件、操控本地应用
  • SSE 请求(SSE),远程服务

在 ChatWise 的 Tools(工具) 中可以使用加号添加 MCP 服务。

oUHGcDhpqt

官方的 MCP 仓库

related

Alist 风波以及在 K3s 中部署 OpenList

2025-06-19 13:00:00

在我的待办事项和视频评论下方很多人提到过 Alist,虽然我自己也有搭建一个 Alist,但实际上并没没有真正使用起来,所以待办事项中的「编写一篇文章介绍一下 Alist」 也就一直延误了,我个人似乎并没有太多 Alist 使用的强需求,虽然 Alist 可以用来挂在很多的网盘,但是如果看过我之前的文章,我现在越来越多的避免将大量的数据存储到云端,也不再大量的使用网盘,所以很多人用 Alist 来挂在网盘并接入 VidHub,Plex,Emby 等来观看高清视频的需求其实我本地一台 Ubuntu(NAS) USB 挂在一块大硬盘,局域网 SMB 共享给 Apple TV 就已经解决我了 99% 的使用场景。

但是现在再来编写一篇文章介绍 Alist(OpenList)的原因就是想聊聊开源社区,以及开源社区商业化这件事情,怎么就演变成现在这样的口碑。

Alist 风波

Alist 本来是一个开源的可以用来聚合多个网盘,云存储将其变成可阅览在线目录的项目。但是前段时间 Alist 项目被出售,并移交给了新团队。在新团队的维护中,添加了未经用户同意或明确告知的遥测(telemetry)代码,悄悄收集用户的使用数据。这一行为严重地削弱了这个开源项目的信任度。另外官方的一系列操作更加剧了社区分裂,官方文档中的二进制下载链接被修改,项目踢出了原来的核心贡献者,等等这一系列让人看不懂的操作加剧了这个项目走向终点的步伐。

OpenList 是什么

为了应对 Alist 项目带来的「信任危机」,部分 Alist 项目的核心贡献者创建了一个名叫 OpenList 的分支。OpenList 定位是 Alist 的继承者和开源代替,目标是确保文件列表的自由和可信任。希望通过开源,透明,可审查的代码来防止用户隐私的侵入。

OpenList 和 Alist 一样支持广泛的存储提供商,包括但不限于本地存储,阿里云盘,OneDrive,百度网盘,天翼云盘,Google Drive,123pan,PikPak,FTP/SFTP,S3,WebDAV,115 网盘,夸克网盘,迅雷网盘,蓝奏云等。

  • OpenList 支持文件的预览,包括视频音频图片文档等,支持代码文件预览和语法高亮,支持 Office 文档预览。
  • 支持安全和访问控制,可以添加密码保护
  • 支持单点登录 SSO
  • 支持多种身份验证方式

相关链接

搭建 OpenList

通过 Docker 快速安装

docker run -d \
  --name=openlist \
  -p 5244:5244 \
  openlistteam/openlist:latest

如果需要使用 ffmpeg, aria2 等应用,可以在镜像标签后使用 tag :beta-aio 或者 :latest-aria2 等。具体可以参考docker hub

首次运行会输出管理员初始密码,默认监听 5244 端口。

k3s 中安装

因为我维护了一个自用的 k3s ,可以直接使用如下的配置安装

apiVersion: v1
kind: Namespace
metadata:
  name: openlist

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: openlist-pvc
  namespace: openlist
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: longhorn

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: openlist
  namespace: openlist
spec:
  replicas: 1
  selector:
    matchLabels:
      app: openlist
  template:
    metadata:
      labels:
        app: openlist
    spec:
      containers:
        - name: openlist
          image: openlistteam/openlist:latest
          ports:
            - containerPort: 5244
          env:
            - name: PUID
              value: "0"
            - name: PGID
              value: "0"
            - name: UMASK
              value: "022"
            - name: TZ
              value: "Asia/Shanghai"
            - name: RUN_ARIA2
              value: "true"
          volumeMounts:
            - mountPath: /opt/openlist/data
              name: data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: openlist-pvc

---
apiVersion: v1
kind: Service
metadata:
  name: openlist-svc
  namespace: openlist
spec:
  type: ClusterIP
  ports:
    - port: 5244
      targetPort: 5244
  selector:
    app: openlist

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: openlist-ingress
  namespace: openlist
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  rules:
    - host: openlist.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: openlist-svc
                port:
                  number: 5244
  tls:
    - hosts:
        - openlist.example.com
      secretName: openlist-tls

可以自行修改其中的部分内容,比如域名,配置 pvc 大小等。

安装部署成功之后运行如下的代码查看初始化密码。

kubectl logs -f -n openlist openlist-7c5fd58b97-xxx

默认的用户名是 admin,初始化密码在日志中。

利用 SpecStory 记录每一次和 AI 的对话

2025-06-17 13:00:00

今天想给大家介绍一款特别有意思的插件叫做 SpecStory,我们现在会在 VS Code, Cursor 编辑器中使用各种类型的代码辅助工具,也会利用 Cursor 等集成的 IDE 来 vibe coding,但是如果我们每一次都重头开始描述我们想要做的事情,或者每一次都新开一个聊天窗口,AI 大模型大概率会前后表现不一致,虽然我们也可以利用 Cursor Rules 等工具来给 AI 提供一些系统级别的提示词,但是 AI 在回复的过程中也可能跑偏。

SpecStory 这款插件恰好解决了这些问题。SpecStory 的核心功能是帮助开发者在编程过程中建立和维护一个持久的、可追溯的情境描述,它会记录下所有和 AI 的聊天记录。

功能

SpecStory 能够自动保存、组织并以结构化 Markdown 格式呈现所有 AI 聊天记录,确保每一次与 AI 的对话都成为可检索的资产。SpecStory 为 AI 提供丰富且准确的上下文信息,使得 AI 能够更好地理解你的意图,从而提供更精准的建议或生成代码。这种方式最大限度地减少了 AI 偏离主题或给出不相关建议的可能性,也避免了重复输入大量背景信息的问题。

  • 对话自动保存
    SpecStory 安装后会在专案根目录生成 .specstory 文件夹,将所有与 AI 的交互以 Markdown 档案形式记录。
  • 灵活导出与分享
    使用命令面板执行「SpecStory: Save Composer and Chat History」即可手动导出指定会话;「SpecStory: Share Composer and Chat History」则能生成匿名分享链接,支持 Markdown 及图片格式。
  • 历史检索 由于所有对话都存为 Markdown,开发者可透过专案内建搜寻或外部工具快速查找过去的 prompt 及回应内容,提升重用与团队协作效率。
  • 规则与提示生成
    SpecStory 可根据聊天历史自动产生 Cursor 规则或 Copilot 指令,帮助 AI 更好地延续上下文并优化开发流程。

安装

以下是如何安装和使用 SpecStory 的简单说明

安装步骤

确保你的编辑器兼容 SpecStory:目前 SpecStory 支持 GitHub Copilot、Cursor 编辑器。

编辑器 步骤 备注
VS Code 扩展市场搜寻「SpecStory」,点击安装 支持 GitHub Copilot 及 Cursor
Cursor Cursor 编辑器内部扩展面板 (Ctrl/Cmd+Shift-X) 搜索「SpecStory」并安装 如从 Marketplace 网站安装,需另行在 Cursor 端安装
VSIX 安装 下载 specstory-vscode-latest.vsix,于命令面板选择「Extensions: Install from VSIX…」 适用于无法从扩展市场直接安装的场景

打开命令面板 (Ctrl/Cmd+Shift-P),输入 SpecStory,若能看到相关命令列表即表示安装成功。

使用

  1. 自动保存:启用 SpecStory 后,执行任何 AI 对话都会自动记录于 .specstory/history/ 下的 Markdown 档案中。
  2. 手动导出:在命令面板执行「SpecStory: Save…」选择并合并所需会话,并另存为 Markdown。
  3. 分享历史:透过「SpecStory: Share…」生成可匿名访问的分享链接,便于团队同步。

所有对话记录均保存在本地专案中,不会自动上传云端,并提供匿名分享选项,无需注册,即可掌控分享内容。

让 AI 来编写 Git 提交变更信息

2025-06-17 13:00:00

很早之前就看到了 GitHub Copilot 可以在 VS Code 中提交 Git 时自动编写提交 Message,但是实际上我一直没有用起来。正好现在对 Git Message 做一个完整的学习,顺便也了解一下当前的 AI Commits 方案。

之前其实看到过一个对于 Commit message 的规范 Conventional Commits,之前的一些提交提交历史也是按照 feat, fix 等等方式来进行的,但是其实理解和书写起来也没完全按照这个模式,只借鉴了其中关于提交类型的部分。所以这次调研才看到对于内容部分更详细的说明,现在很多 AI 来产生提交历史的时候,更能看出来区别。

Git 历史的重要性

Git 历史记录讲述了项目文件的演进过程,包括了什么被修改了,为什么被修改,所有团队中的成员都可以有效地审查变更,通过查看 Git 变更历史可以非常容易地查明 bug 以及破坏性更改的来源。但是往往开发者在花了数小时编写代码之后,却在 Git Message 提交的时候忽略了其重要性,导致 Git 历史非常难以定位和排查。所以本文就来总结一下目前比较好用的 AI 提交 Git message 的方法。

lumen

lumen 是一个使用 Rust 编写的命令行工具,可以将 AI 结合到 git 工作流中,用来生成 Git 提交历史。

安装

brew install jnsahaj/lumen/lumen

可以利用 lumen draft 来生成提交历史,在运行这一行命令之前记得将代码 git add 到暂存区中。

默认情况下 lumen 会调用 Phind 这一个模型来生成,但是如果自己想配置 OpenAI,或者 Claude 也可以指定

AI Commits

AI Commits 是一个基于命令行的工具,使用 TypeScript 编写,可以调用大语言模型帮助我们提交 Git 信息。

使用 AI Commits 需要设置 OpenAI 的 API Key。

npm install -g aicommits
aicommits config set OPENAI_KEY=XXX
aicommits
aicommits --type conventional

AI Commits 可以生成符合 Conventional Commits 规范的提交信息。

JetBrains IntelliJ IDEA

我个人使用 IntelliJ IDEA 比较多,所以在 IDEA 中也找到了一款 AI Commits 的插件。

8zyg

安装之后打开设置,就可以配置调用的模型,以及系统的 Prompt。

8Z7w

Uptime Kuma 清理 SQLite 数据库历史数据

2025-06-16 13:00:00

大概两年前我自己部署了 Uptime Kuma 来监控我的各项服务在线情况,这两年内一直工作非常稳定,除了偶尔的网络波动带来的误报,基本上没有其他大问题。

但是用了超过两年,最近访问后台加载起来越来越慢,经常需要好久才能将监控的列表加载出来。对于使用上的问题,对我的影响越来越不能忽视, 所以今天来讲一下如何优化 Uptime Kuma 的数据库。

原因

Uptime Kuma 在 1.x 版本中需要对整个 heartbeat 表进行扫描来执行一些操作,数据库中存在大量数据时,会导致显著的性能下降。根据开发者的说明,性能限制依赖于硬件配置,超过 500 个监控或者数据库大小超过 1.5 GB 左右时会有明显的性能问题。1

于是我检查了一下我本地的 SQLite 数据库,竟然达到了 2.6 GB。

8dOy

改善性能

降低数据保留期限

可以在 Kuma 的设置 /settings/monitor-history 中设置数据保留期限,然后手动执行清理。

增加检查间隔

因为在 v1 版本中 Kuma 使用 heartbeat 心跳表来记录检查,如果频繁的进行检查,并记录,可能导致 heartbeat 表快速膨胀,可以根据自己的情况适当地降低检查频率。

清理历史数据

在 Uptime Kuma 的 SQLite 数据库中,历史数据主要存储在心跳相关的表中。

推荐在清理数据时,先将 Kuma 服务暂停。

推荐备份一下 kuma.db 数据库

cp kuma.db kuma-2025xxxx.db

然后使用 sqlite3 连接数据库,并执行删除语句。

DELETE FROM heartbeat WHERE time < datetime('now', '-30 days');

清理特定监控器的历史数据

-- 查看监控器ID
SELECT id, name FROM monitor;

-- 删除特定监控器的历史数据
DELETE FROM heartbeat WHERE monitor_id = [监控器ID];

数据清理之后,可以对数据库优化释放空间

VACUUM;
-- 重建索引
REINDEX;

未来

Uptime Kuma 的维护团队正在开发 v2 版本,希望通过引入外部的 MariaDB 数据库来改善性能,等未来 v2 版本稳定之后,可以考虑升级,但是目前看官方的进度还在 beta 阶段。