普通视图

Received today — 2025年8月6日Solitudes

使用 LiteLLM 自建 Claude Code 中转服务

2025年8月5日 20:27

最近 A 站大规模封号,导致之前的号商的中转大都歇菜了,另外加上国内用户在使用 Claude Code 时常常面临网络限制、账号注册门槛等难题。如何绕过这些障碍,稳定、高效地使用 Claude Code?答案是:自建 Claude Code 中转服务!

今天,我们将介绍如何利用开源工具 LiteLLM 自建 Claude Code 中转服务,不仅能规避官方限制,还能灵活调用多种语言模型(如 OpenAI、Vertex AI、xAI 等),实现成本优化和高效开发。无论你是个人开发者还是团队用户,这篇保姆级教程都能帮你快速上手。

LiteLLM 是什么

LiteLLM 是一个轻量级的开源代理工具,支持将 Claude Code 的 API 请求转换为多种语言模型的格式,兼容 Anthropic、OpenAI、Vertex AI 等主流模型。通过 LiteLLM,你可以:

  • 绕过地域限制:无需海外账号,国内也能流畅使用 Claude Code
  • 灵活切换模型:支持多种模型(如 Claude Sonnet、GPT-4o、Gemini),按需分配任务以优化成本
  • 本地部署:数据隐私更有保障,适合对安全性要求高的项目
  • 开源免费:完全开源,社区活跃,易于扩展和维护

实操

litellm 主要使用 python 编写,部署途径有两种,我这里方便操作使用镜像方式

  • ghcr.io/berriai/litellm:main-latest
  • 国内镜像 ccr.ccs.tencentyun.com/k7scn/litellm:main-latest

使用 compose 部署

  • docker-compose.yaml
services:
  litellm:
    image: ccr.ccs.tencentyun.com/k7scn/litellm:main-latest
    container_name: litellm
    command: --config /app/config.yaml --detailed_debug
    environment:
      - OPENAI_API_KEY=sk-PpJVj1N7Btoken
      - OPENAI_API_URL=https://api.example.ai
      - LITELLM_MASTER_KEY=sk-nb666
    volumes:
      - '/data/litellm/config.yaml:/app/config.yaml'
    ports:
      - '4000:4000'
    restart: always

本文示例使用的是某中转 claude 服务商

  • /data/litellm/config.yaml
litellm_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

model_list:
  # Responses API models
  - model_name: claude-sonnet-4-20250514
    litellm_params:
      model: anthropic/claude-sonnet-4-20250514
      api_key: os.environ/OPENAI_API_KEY
      api_base: os.environ/OPENAI_API_URL
      cache_control_injection_points:
        - location: message
          role: system

启动完成后,在环境里配置

export ANTHROPIC_BASE_URL=http://127.0.0.1:4000
export ANTHROPIC_AUTH_TOKEN=sk-nb666
claude --model claude-sonnet-4-20250514
# 或者在claude里使用/model设置

一分钱一分货,真是贵的可怕。

后续高级玩法

  • 多模型协同:通过 LiteLLM 的路由功能,为不同任务分配不同模型。例如:
  • 代码生成:Claude-3-5-Sonnet
  • 语法检查:GPT-4o-mini
  • 复杂架构分析:Gemini-1.5-Pro

在配置文件中添加更多模型和提供商

总结

通过 LiteLLM 自建 Claude Code 中转服务,你不仅能绕过地域和账号限制,还能灵活调用多种模型,兼顾性能与 成本。这种方式特别适合国内开发者,既省钱又高效!无论你是想快速生成代码、优化开发流程,还是探索 AI 编程的更多可能,这套方案都能让你事半功倍。

其他

本文主要参考两个文档

  •  
Received before yesterdaySolitudes

安利神器:Claude Code Router

2025年8月3日 21:43

在如今的 AI 开发浪潮中,编码辅助工具层出不穷,但能真正提升效率、灵活适配多种模型的却不多。今天,我要给大家强烈安利一个开源项目——Claude Code Router!这个基于 Claude Code 开发的智能路由器*,不仅能让你更灵活地使用 AI 编码能力,还能无缝切换多种模型,堪称开发者的小助手

主要是体验国内大模型不是

什么是 Claude Code Router

Claude Code Router(后续简称 CCR)是一个开源项目,基于 Anthropic 的 Claude Code 打造,旨在为开发者提供一个灵活的编码基础设施。它就像一个智能路由器,可以将你的编码请求分发到不同的 AI 模型(如 DeepSeek、Ollama 等),并支持高度自定义的配置,让你根据任务需求选择最合适的模型。简单来说,CCR 让你在享受 Claude Code 强大编码能力的同时,还能灵活适配其他模型,省时省力又省钱

一句话总结:CCR 是一个让开发者自由掌控 AI 编码能力的超级工具, 你的省钱小能手

为什么需要 Claude Code Router

灵活的模型切换,打破 API 限制

我们都知道,Anthropic 的 Claude 系列模型在编码任务上表现优异,但它的 API 有时会受到限制,比如封号风险或高昂的 Token 费用。CCR 通过启动一个本地服务,将 Claude Code 的 API 请求转发到任何支持 OpenAI 格式的 API 接口,完美规避了这些问题。你可以用 DeepSeek、Gemini 等其他模型的 API 来驱动 Claude Code,灵活又高效!

高度自定义,适配多样化需求

CCR 支持通过 Providers 数组和 Transformer 机制自定义模型和 API 交互方式。你可以为不同模型设置全局或特定的转换器(Transformer),确保请求和响应的兼容性。比如,AnthropicTransformer 可以实现 Claude 与 OpenAI 格式的双向转换,而 GeminiTransformer 则处理 Gemini 与 OpenAI 格式的转换。这种"混搭"能力让多个模型无缝协作,简直是国内开发者的福音

自动化任务,节省成本

CCR 支持通过 GitHub Actions 实现自动化任务。例如,你可以在非高峰时段运行编码任务,降低 API 调用成本。它的配置简单,配合 GitHub Actions 可以轻松实现触发式自动化,比如当 Issue 评论中包含 @claude 时自动启动编码任务。省时又省钱,效率拉满!

开源免费

CCR 是完全开源的,托管在 GitHub,你可以自由下载、修改和贡献代码

项目地址: musistudio/claude-code-router

核心功能

  • 多模型支持
  • Transformer 机制, 核心功能。它能将不同模型的请求和响应统一到 OpenAI 格式,确保兼容性。
  • 支持本地化
  • Tool Mode,智能任务处理。借鉴了 Claude Code 的 Plan Mode,CCR 为 DeepSeek 等模型实现了 Tool Mode。当启用时,模型会主动选择最合适的工具来完成任务,极大提升编码效, 具体可以参考 Tool Mode

快速上手

  • 本地运行(个人推荐)
  • docker 部署(任意地方)

本地运行

本文示例对接魔搭的 qwen3 最新模型。

环境要求

安装依赖:确保 Node.js 版本 ≥18.0.0,使用 bun 或 npm 安装所需包

安装

  1. 安装 Claude Code
npm install -g @anthropic-ai/claude-code
  1. 安装 CCR
npm install -g @musistudio/claude-code-router

配置

默认配置文件 ~/.claude-code-router/config.json

{
  "LOG": true,
  "CLAUDE_PATH": "",
  "HOST": "127.0.0.1",
  "PORT": 3456,
  "APIKEY": "",
  "API_TIMEOUT_MS": "600000",
  "transformers": [],
  "Providers": [
    {
      "name": "modelscope",
      "api_base_url": "https://api-inference.modelscope.cn/v1/chat/completions",
      "api_key": "不要ms-的token",
      "models": [
        "Qwen/Qwen3-Coder-480B-A35B-Instruct"
      ],
      "transformer": {
        "use": [
          [
            "maxtoken",
            {
              "max_tokens": 65536
            }
          ]
        ]
      }
    }
  ],
  "Router": {
    "default": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "background": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "think": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "longContext": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "longContextThreshold": 60000,
    "webSearch": ""
  }
}

启动

ccr code

容器版部署(非编译版)

容器部署可以从源码编译,也可以像本地一样 npm 安装

  • Dockerfile
FROM node:lts
WORKDIR /app
RUN npm install -g @musistudio/claude-code-router
CMD ["ccr","start"]

基于上面的构建出一个镜像

  • docker-compose.yaml
version: "3.8"

services:
  ccr:
    build: .
    container_name: ccr
    ports:
      - "3456:3456"
    volumes:
      - ./:/root/.claude-code-router
    restart: unless-stopped

配置 config.json 区别, 仅列出调整的

"APIKEY": "xxxxxx", // 必须要有
"HOST": "0.0.0.0", // 以及这里

在本地的配置~/.claude/settings.json,和配置 Claude Code 一样

{
    "env": {
        "ANTHROPIC_BASE_URL": "https://xxxxxxx",
        "ANTHROPIC_AUTH_TOKEN": "123"
    }
}

然后 claude 开始你的编码

总结

潜力已经显而易见, 未来可期哈哈。如果正在为 Claude 的高成本和限制头疼,国内开发者还是值得试一试,当然如果能直接用 Claude Code,还是推荐用 Claude Code

  •  

解锁知识管理新体验:安利 AI 驱动的 Wiki 知识库 PandaWiki

2025年7月29日 22:35

解锁知识管理新体验:安利 AI 驱动的 Wiki 知识库 PandaWiki

在信息爆炸的时代,如何高效地整理、存储和利用知识成为了企业和个人的共同需求。传统的 Wiki 系统虽然功能强大,但在智能化和易用性上往往稍显不足。今天,我要向大家强烈安利一款由 AI 大模型驱动的开源知识库搭建系统 PandaWiki,它不仅继承了传统 Wiki 的文档管理能力,还通过 AI 的加持,为用户带来了前所未有的智能体验。

什么是 PandaWiki?

PandaWiki 是一款由长亭科技开发的开源知识库系统,融合了强大的 AI 大模型能力,旨在帮助用户快速构建智能化的产品文档技术文档FAQ、博客系统等。它不仅能满足企业级的知识管理需求,还适合个人用户打造个性化的知识库。简单来说,PandaWiki 是一个兼具传统 Wiki 功能和 AI 智能化的下一代知识管理工具。

通过 AI 驱动,PandaWiki 提供了 AI 辅助创作AI 智能问答AI 语义搜索等核心功能,让知识的创建、查询和共享变得更加高效和便捷。无论是企业用于构建产品手册、帮助中心,还是个人用于记录学习笔记、整理生活经验,PandaWiki 都能轻松胜任。

PandaWiki 的核心亮点

AI 驱动的智能化体验

PandaWiki 的最大特色在于其深度集成了 AI 大模型能力,为用户提供了以下智能功能:

  • AI 智能问答:基于知识库中的内容,用户可以通过自然语言提问,系统能够快速理解并返回精准答案。想象一下,客户或团队成员无需翻阅冗长的文档,只需一句提问就能获得所需信息!

智能问答

  • AI 语义搜索:传统的关键字搜索常常不够智能,而 PandaWiki 的语义搜索能够理解用户意图,检索出最相关的文档或答案,极大提升信息查找效率。

AI 语义搜索

  • AI 辅助创作:无需从零开始编写文档,AI 可以根据你的需求生成初稿或优化内容,大幅提升创作效率。无论是技术文档还是博客文章,PandaWiki 都能帮你快速产出高质量内容(目前开源版创作这里体现不是很明显, 写完本文发现了,没有凸显出来 😂)

AI 辅助创作

这些 AI 功能依赖于接入的 Chat 模型、Embedding 模型和 Reranker 模型

  • Chat 模型:又称为对话模型, 常见的 chatGPT4、Deepseek-r1、Deepseek-v3 等可以聊天的模型都属于 Chat 模型
  • Embedding 模型:又称为嵌入模型,可以将文档转化为向量,为 PandaWiki 提供了智能搜索和内容关联的能力
  • Reranker 模型:又称为重排模型,通过对初始结果进行二次排序,实现快速召回 + 精准排序,是提升检索系统质量的关键技术

强大的富文本编辑能力

这个是基本功能吧,目前导出的格式支持有限,如果支持 PDF 导出就更好了。

PandaWiki 支持 Markdown 和 HTML 两种格式的富文本编辑,满足不同用户的使用习惯。你可以轻松创建结构清晰、格式美观的文档,并支持将文档导出为 HTML 或 Markdown 两种格式,方便分享和存档。无论是撰写复杂的技术文档还是简单的笔记,PandaWiki 都能提供流畅的编辑体验。

灵活的第三方集成

PandaWiki 的设计非常注重开放性和兼容性。它支持与多种第三方应用无缝集成,例如:

  • 网页挂件:可以将 PandaWiki 嵌入其他网站,方便用户在不同平台访问知识库。
  • 聊天机器人:支持集成到钉钉、飞书、企业微信等平台,打造智能化的问答机器人,助力企业提升客户服务效率

这种灵活性让 PandaWiki 能够轻松融入现有的工作流,适配各种使用场景。 只不过暂时还不支持问答机器人 API

多样化的内容导入方式

PandaWiki 支持从多种来源导入内容,极大简化了知识库的搭建过程。你可以通过以下方式快速填充知识库:

  • 网页 URL 导入:直接抓取网页内容,快速生成文档
  • Sitemap 导入:从网站站点地图批量导入内容
  • RSS 订阅:自动获取订阅源的最新内容
  • 离线文件导入:支持上传本地文件,轻松整合现有文档
  • 飞书文档
  • Confluence 文档

导入方式

更多细节可以参考官方文档 导入现有文档到 PandaWiki

简单高效的部署体验

实测 1c1g 也可以轻松部署

PandaWiki 的安装过程非常友好,只需一台支持 Docker 20.x 以上版本的 Linux 系统,就能通过一键安装脚本快速部署。安装完成后,系统会自动输出管理面板的登录方式,默认账号密码随机生成,确保安全性。整个过程仅需几分钟,即使是技术小白也能轻松上手。

使用场景:从企业到个人,PandaWiki 无所不能

PandaWiki 的应用场景非常广泛,以下是一些典型用法:

  • 企业产品文档管理:快速创建产品手册、技术规格、用户指南,结合 AI 问答功能提升客户支持效率。
  • 智能 FAQ 系统:整理常见问题,客户通过自然语言提问即可获得答案,减轻客服压力。
  • 团队知识共享平台:团队成员可以记录项目经验、技术笔记,形成知识库,促进团队协作。
  • 个人知识管理:记录学习笔记、工作心得、生活经验,打造专属的智能化知识库。

一个有趣的例子是,开发者曾用 PandaWiki 创建了一个名为“PandaWiki 品三国”的知识库,将《三国演义》小说导入后,系统能够基于小说内容回答相关问题,展现了其强大的智能化能力。

为什么选择 PandaWiki?

相比传统的 Wiki 系统(如 Confluence 等),PandaWiki 在以下方面具有明显优势:

  • 智能化:AI 驱动的创作、问答和搜索功能,极大提升效率。
  • 易用性:一键安装、简单配置,技术门槛低。
  • 灵活性:支持多知识库管理、多种内容导入方式和第三方集成。
  • 开源免费

项目地址

https://github.com/chaitin/PandaWiki

如何快速上手 PandaWiki?

搭建一个智能化的 PandaWiki 知识库只需三步:

  1. ssh 到目标机器
  2. 执行安装脚本
  3. 选择动作类型安装
bash -c "$(curl -fsSLk https://release.baizhi.cloud/panda-wiki/manager.sh)"

安装完成后,根据提示访问对应的 URL 进入管理面板。
如果你是内网环境,使用内网地址; 使用腾讯云等云服务商,使用公网地址(记得防火墙放行对应端口)

登录完成后安装引导操作即可。

使用过程中的注意事项

所有改动操作都不要保存

  1. 只需要配置 Chat 模型即可测试,根据自己实际情况填写,我这里是第三方中转商

配置通用格式

  1. 内网测试域名, 影响 web 挂件生成

sslip

  1. 配置 web 挂件

配置挂件

  1. 效果

配置挂件

不足之处

  • 图片、附件支持效果不太好
  • 部分导入方式失败率较高
  • 仅支持单知识库
  • 没法查看或者回滚历史版本
  • 不知道为啥我测试老是遇到未发布情况,都没编辑

未发布

写在最后

PandaWiki 是一款真正将 AI 技术与知识管理结合的创新工具,它不仅功能强大、简单易用,还完全开源,适合各种规模的团队和个人用户。如果你正在寻找一款能够提升知识管理效率的工具,或者想体验 AI 驱动的智能文档系统,PandaWiki 绝对值得一试!

  •  

Code Agent初体验:Kilo Code + Qwen3-Coder

2025年7月28日 20:20

Code Agent 初体验:Kilo Code + Qwen3-Coder

在 AI 编程领域,国产大模型正在强势崛起!2025 年 7 月,阿里通义千问团队重磅开源了 Qwen3-Coder,这款号称性能比肩 Claude 4 的代码生成模型,凭借 480B 参数、35B 激活参数的 MoE 架构,以及强大的 Agentic Coding 能力,迅速成为开发者关注的焦点。与此同时,Kilo Code 作为一款高效的编程 Agent 工具,与 Qwen3-Coder 的结合更是如虎添翼,为开发者提供了前所未有的编程体验。本文将带你一探 Kilo Code + Qwen3-Coder 的初体验,分享实际使用感受与技术亮点!

ModelScope 社区给所有用户赠送了每天 2k 次 API 调用的额度,我们可以把它接入到 Kilo Code 插件中使用

获取 API Key

访问 ModelScope 并登录,页面右侧的查看代码范例中可以复制自己的 api_key

查看 api_key

注意,我们需要的 api_key 是一个 36 位的字符串,形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。如果你看到的 key 有 ms- 前缀,需要去掉它。

使用限制

总结版,具体可以阅读官方文档使用限制

  • 个人使用没问题(以保障开发者单并发正常使用为目标)
  • 需要绑定阿里云账号才能使用免费额度 2k

配置信息备用

地址: https://api-inference.modelscope.cn/v1/
Key: ms-****
模型: Qwen/Qwen3-Coder-480B-A35B-Instruct

安装并配置 Kilo Code

在 Cursor/VSCode 中下载 Kilo Code 插件,选择 Use my own API key,并进行如下配置:

仅需要配置上面圈出来的配置即可。

高级选项中配置 temperature 为 0.7,这是 Qwen 官方推荐的参数

查看已使用额度

在 ModelScope 网站右上角点自己头像,能看到用量。根据我周末的测试 2k 额度完全足够日常开发使用了。

Kilo 代码库索引

个人使用经验,完全可以使用本地模型可以处理。

Ollama 模型

下载相关 embed 模型,这里推荐 nomic-embed-text

Qdrant

可以使用 docker 部署一个

  • docker-compose.yaml
services:
  qdrant:
    image: qdrant/qdrant:latest
    container_name: qdrant
    ports:
      - '6333:6333'
    restart: always

配置图

使用体验

还是挺不错的,干点简单的没啥问题,稍微复杂的准确率或者成功率就大大降低了,胜在免费不要钱。

附录

主要参考如下:

  •  

Kite+魔改版Kubernetes Dashboard安利,足够轻量个性化

2025年7月7日 21:03

最好的版本了,虽然有错字

今天,我要给大家种草一款超赞的开源工具 Kite+,一个现代化、轻量级的 Kubernetes Dashboard,让你的集群管理变得高效又优雅!

没错,就是之前介绍过的探索 Kite:现代化轻量级 Kubernetes Dashboard,助力 DevOps 高效管理集群

这个项目确实很不错,主要是这个 UI 我很喜欢,再搭配上霞鹜文楷,简直善心悦目。

魔改版特点

暂时只列出目前已经支持的特性。这也是为啥我要魔改的原因而不是上游 PR

  • 只支持单集群(主要针对折腾小鸡的用户,如跨云跨网组集群的朋友,k3s 之友)
  • 较完整的中文支持,争取达到全面的中文界面(工作量有些,只能根据使用频率的优先级改动)
  • 突出集群维度的资源(偏向日常使用最多,如节点信息等)
  • 集成 OpenKruise - 更加强大的工作负载管理和运维支持(例如 cloneset 原地升级机制SidecarSet 日志收集神器ImagePullJob 镜像预热)
  • 支持 Tailscale - 可视化管理 Tailscale 集成,重点是 Connectors子网连接器(容器网络打通)、ProxyClasses(主要应用场景是 LoadBalancer, 生成负载均衡 IP)
  • 支持 Traefik,支持 IngressRoute 和相关中间件
  • 支持 System Upgrade 任务管理,可视化管理 k3s 和系统升级任务(目前还没支持,本周会安排上)
  • 版本更新提示(粗略支持版本)

后续版本计划

  • 支持 System Upgrade 任务管理
  • 精简 Traefik 资源管理,只支持 IngressRoute 和中间件,其他资源可浏览
  • 自动检测集群是否已经安装 Prometheus
  • 支持智能巡检

部署

目前仅提高 yaml 部署方式,一键部署。

kubectl apply -f https://raw.githubusercontent.com/ysicing/kite/refs/heads/main/deploy/install.yaml

可直接替换官方镜像

  • ghcr.io/ysicing/kite
  • ghcr.kcds.ysicing.net/ysicing/kite(可能会稍微滞后一点)

还有官方原来镜像拉取策略是 imagePullPolicy: IfNotPresent, 需要调整为 Always,那么每次升级你可以直接重启 Deploy 就行了。

部分截图

迭代过程中的截图,不代表最新结果

集群维度资源

节点资源

  • 精简模式
  • 详情模式,查看节点资源使用情况,后面可能会添加一个简单的预警功能。

OpenKruise

这里以 OpenKruise 为例,集群维度只显示了大概。如果你未安装默认显示安装引导,且左边导航会隐藏 OpenKruise 子菜单。

Tailscale 连接器

打通 Tailscale 网络访问 k3s service 能力

Tailscale 代理类

我的使用场景主要有两大类,节点选择和负载均衡能力

apiVersion: tailscale.com/v1alpha1
kind: ProxyClass
metadata:
  name: bj
  namespace: tailscale
spec:
  statefulSet:
    pod:
      nodeSelector:
        node-role.kubernetes.io/bj: "true"
      tolerations:
        - operator: "Exists"

致谢

联系方式

写在最后

欢迎试用体验。有更好的想法可以告诉我哈。


关注我的微信公众号,更多技术吐槽和干货!

  •  

发现轻量写作新宠:Ech0,记录灵感的最佳选择

2025年7月2日 21:26

在快节奏的现代生活中,随时记录灵感、想法或随手笔记变得越来越重要。如果你正在寻找一款轻量、开源、自托管的笔记工具,那么今天我要向大家安利一个宝藏项目 Ech0!它不仅简洁高效,还能让你完全掌控自己的数据。与此同时,也会把它与另一款热门开源笔记工具 Memos 做个对比,看看它们各自的亮点在哪里!

对 Memos 感兴趣的,也可以看看部署轻量私有化备忘录 memos

Ech0 是什么?为什么值得一试?

Ech0 是一款开源自托管轻量级发布平台,专为快速记录和分享个人想法、文字和链接而设计。它的核心理念是简洁、自由和隐私至上,让你专注于内容的创作,而无需被复杂的界面或繁琐的功能干扰。

Ech0 的核心亮点

  • 极简体验,专注创作,Ech0 提供了一个干净直观的界面,写作时几乎没有干扰。你可以快速输入文字、插入链接或上传一张图片,随时捕捉灵感。它的设计初衷是轻量分享,更像是一个简化的朋友圈或微博客
  • 完全开源,数据自控,Ech0 遵循 MIT 协议,完全免费,无广告、无追踪、无订阅。它使用本地 SQLite 数据库存储数据,部署后所有内容都保存在你的服务器上,隐私和安全有保障。备份和恢复也超级简单
  • RSS 支持
  • Docker 部署支持,(基本特性了,如果不支持的话, 就不会考虑了)
  • 轻量设计,性能友好, 相比较而言 Memos,真是好多了

与 Memos 的对比

仅从 Memos v0.18.2 版本为例,后续版本我觉得都是破坏性更新。本文主要从我个人角度简单对比一下

设计理念与使用场景

  • Ech0:更像是一个轻量级的微博客平台,适合快速记录和分享简短的想法、链接或灵感。它的界面极简,强调即时性和轻量分享,类似朋友圈的体验,适合喜欢快速发布内容的用户
  • Memos:定位为全面的知识管理和笔记工具,适合需要系统化整理笔记、支持复杂 Markdown 格式的用户。它更适合长期的知识积累,比如技术笔记、项目管理或个人知识库

功能丰富度

  • Ech0:功能精简,专注于文字、链接和单张图片的快速分享。RSS 支持让内容分发更便捷,但目前只有管理员可以发布内容,适合个人或小范围使用
  • Memos:功能更全面,支持丰富的 Markdown 语法、图片和嵌入内容,甚至包括 API 集成和多数据库支持(SQLite、PostgreSQL、MySQL)。它还提供标签、过滤器等功能,适合需要复杂笔记管理的用户

数据与隐私/部署与维护

两者都一样开源,且都支持 Docker

社区与扩展性

  • Ech0:社区较小,项目主要由作者维护(但是我觉得还是很有前景的)
  • Memos:社区活跃,功能更新频繁

谁更适合你?

  • 选择 Ech0:如果你想要一款极简、轻量的工具,专注于快速记录和分享灵感,或者希望搭建一个类似朋友圈的个人内容平台,Ech0 是绝佳选择。它的低学习曲线和极简设计特别适合个人用户或小团队
  • 选择 Memos:如果你需要一个功能更丰富、支持复杂笔记管理的工具,或者计划长期维护一个知识库,Memos 会更适合你。它的 API 和多平台支持也更适合技术爱好者或需要集成其他工具的用户

对于我而言,短时间内 Ech0 还没放替代我的 Memos,数据迁移令人头大。但是期待 Echo 干翻 Memos,支持从 Memos 导入、支持 OIDC 等等。

项目

项目地址: https://github.com/lin-snow/Ech0
Demo 地址: https://memo.vaaat.com/

值得一提的是,Ech0 还有一个二次开发版本 Ech0 Noise(高度完善的轻量说说笔记系统及 memos 的开源替代品),它在原版基础上增加了更现代化的 UI 设计(例如毛玻璃背景)和一键数据备份/恢复功能,视觉和体验上更像一个精致的社交平台。如果你喜欢更美观的界面,可以尝试这个版本。

听说还支持从 Memos 导入到 Noise, 没实操过

项目地址: https://github.com/rcy1314/echo-noise
Demo 地址: https://note.noisework.cn/

如何开始使用 Ech0

原版部署

  • docker-compose.yaml
services:
  ech0:
    image: sn0wl1n/ech0:latest
    # image: ccr.ccs.tencentyun.com/k7scn/ech0
    container_name: ech0
    ports:
      - '6277:6277'
    volumes:
      - ./ech0/data:/app/data
    environment:
      - JWT_SECRET="Ooghooch1Oojanguz5dei1ahw0IPoh9d" 
    restart: always
  • 启动完成后,访问 ip:6277 即可使用,首次使用注册的账号会被设置为管理员(目前仅管理员支持发布内容)
  • JWT_SECRET 推荐修改为随机字符串 pwgen 32 1
  • 支持自定义配置文件,需要挂载到 /app/data/config/config.yaml, 具体可以参考官方示例

Noise 二开版本部署

  • docker-compose.yaml
services:
  noise:
    image: noise233/echo-noise
    # image: ccr.ccs.tencentyun.com/k7scn/echo-noise
    container_name: noise
    ports:
      - '1314:1314'
    volumes:
      - ./noise/data:/app/data
    restart: always
  • 启动完成后,访问 ip:1314 即可使用,默认账号信息 admin/admin
  • 应该也是支持自定义配置文件, 具体可以参考官方示例

PS: demo 没跑起来, 提示账号密码错误 😂

截图

原版

发布

魔改

写在最后

无论你是想快速记录生活中的灵感,还是需要一个完全属于自己的内容分享平台,Ech0 都能以它的简洁和高效打动你。相比功能更全面的 Memos,Ech0 更像是一个轻盈的创作小助手,让你专注于思想的流动。如果你追求极简和隐私,Ech0 绝对值得一试!快去部署你的 Ech0,记录下你的每一个灵感火花吧! 你更喜欢 Ech0 的轻量分享,还是 Memos 的全面管理?欢迎在评论区分享你的想法!

最近感冒了状态不是很好, 没太多精力去看,7 月争取恢复一下节奏,给大家带来更多更好玩的开源软件。


关注我的微信公众号,更多技术吐槽和干货!

  •  

探索 Kite:现代化轻量级 Kubernetes Dashboard,助力 DevOps 高效管理集群

2025年6月26日 23:12

在 Kubernetes 的世界里,集群管理是一项复杂而关键的任务。随着容器化技术的普及,越来越多的团队依赖 Kubernetes 进行大规模分布式系统的部署与管理。然而,Kubernetes 原生的管理工具(如 kubectl 或 Kubernetes Dashboard)要么需要较高的学习成本,要么界面复杂不够直观。今天,我们来聊聊一款现代化、轻量级的 Kubernetes 仪表板 Kite,它以优雅的设计和强大的功能,为 DevOps 工程师带来全新的集群管理体验!

有群友说是好多开发转运维了么?感觉现在人手一个 k8s dashboard, 上次介绍了解锁 Kubernetes 高效管理神器——k8m,让集群运维更简单,有兴趣可以看看

项目地址:https://github.com/zxh326/kite

什么是 Kite?

Kite 是一个开源的 Kubernetes Dashboard,旨在提供轻量、直观、现代化的集群管理解决方案。它通过简洁的界面和强大的功能,帮助用户实时监控集群状态、管理资源并简化操作流程。相比传统的 Kubernetes Dashboard,Kite 不仅更美观,还更注重用户体验和性能优化,特别适合希望快速上手、专注于核心任务的 DevOps 团队

Kite 的核心亮点

  • 轻量级设计:资源占用低,运行流畅,适合各种规模的集群
  • 实时监控:集成 Prometheus,提供 CPU、内存、网络等实时指标
  • 直观界面:现代化 UI 设计,操作简便,降低学习曲线
  • 强大的资源管理:支持资源创建、更新、删除、扩展及重启
  • 灵活的扩展性:支持自定义资源定义(CRD),满足复杂业务需求

Kite 的核心功能

Kite 的功能设计围绕 Kubernetes 用户的实际需求,提供了从集群概览到精细化管理的全方位支持。以下是几个令人印象深刻的功能:

集群概览与实时监控

Kite 提供了一个直观的集群健康状态仪表板,展示实时的资源使用情况(如 CPU、内存、网络)。通过与 Prometheus 的集成,用户可以轻松查看关键指标,快速定位性能瓶颈

资源关系可视化

Kite 能够以图形化方式展示 Kubernetes 资源之间的关联(如 Deployment → Pods),帮助用户更清晰地理解集群的拓扑结构,简化排查问题的工作

便捷的资源操作

通过 Kite 的界面,用户可以直接执行资源管理操作,包括创建、更新、删除、扩展和重启资源。无论是调整副本数还是重启 Pod,都能一键完成

Web 终端

Kite 内置 Web 终端确实是一大亮点

安全认证支持

Kite 支持 GitHub OAuth 和自定义 OAuth 认证,同时提供简单的用户名/密码认证方式,确保访问安全可控

为什么选择 Kite

在众多 Kubernetes 管理工具中,Kite 凭借以下优势脱颖而出:

  • 现代化设计:采用 Maple Mono 字体和简洁的 UI 风格,视觉效果清新,操作体验流畅
  • 轻量高效:相比官方 Kubernetes Dashboard,Kite 的资源占用更低,适合资源敏感的环境
  • 易于部署
  • 开源免费:Kite 是完全开源的,社区驱动,允许用户自由定制和贡献代码

此外,Kite 默认不收集任何分析数据,但用户可通过设置 ENABLE_ANALYTICS=true 启用匿名数据收集,帮助开发者改进产品

快速上手 Kite

一键快速上手,默认使用官方镜像,也可以手动编辑使用 ccr.ccs.tencentyun.com/k7scn/kite

kubectl apply -f https://raw.githubusercontent.com/zxh326/kite/refs/heads/main/deploy/install.yaml

默认情况下,没有用户验证的,可以通过配置环境开启密码认证或者 OAuth 验证

  • KITE_USERNAME/KITE_PASSWORD
  • OAuth 可以参考 OAUTH_SETUP

等 Pod 启动完成,访问 svc 的 80 端口即可。

如果没有使用 tailscale 打通网络的话,可以 NodePort 或者 Ingress 方式访问

除了 InCluster 方式,也可以本地使用 docker 方式

docker run --rm -p 8080:8080 -v ~/.kube/config:/home/nonroot/.kube/config ghcr.io/zxh326/kite:latest

打开浏览器,访问 http://localhost:8080,即可进入 Kite 的管理界面

适用场景

Kite 适用于以下场景:

  • 中小型团队:希望快速部署一个轻量级的 Kubernetes 管理工具
  • 开发与测试环境:需要直观的界面来调试和监控集群
  • 学习 Kubernetes:新手用户可以通过 Kite 的简洁界面快速熟悉 Kubernetes 的核心概念。
  • 对 CRD 要求不高,只使用基础资源对象很适合

后续 Kite 团队计划进一步增强与 Prometheus 和 Grafana 的集成,优化多集群管理功能,并支持更多的认证方式

总结

Kite 是一个现代化、轻量级的 Kubernetes Dashboard,以其直观的界面、强大的功能和高效的性能,为 DevOps 工程师提供了一个优秀的集群管理解决方案。无论是新手还是资深从业者,Kite 都能帮助你更轻松地管理 Kubernetes 集群,专注于核心业务开发。

个人觉得 UI 设计确实很令人舒服,但是对于我这种重度依赖 CRD 来说,略显鸡肋


关注我的微信公众号,更多技术吐槽和干货!

  •  

解锁Kubernetes高效管理神器——k8m,让集群运维更简单

2025年6月19日 22:23

如果你是一名开发者或运维工程师,正在为 Kubernetes 集群的复杂管理而头疼,那么今天我要给你安利一款超好用的神器——k8m!这是一款轻量级AI 驱动Mini Kubernetes AI Dashboard,专为简化集群管理而生,功能强大又易上手,堪称 Kubernetes 管理界的“效率担当”!

k8m 是什么?

k8m 是一款跨平台的 Kubernetes 管理工具,集成了大模型、AI 智能体和 MCP(Model Context Protocol)支持,旨在通过智能化和轻量化的设计,让开发者与运维人员轻松驾驭 Kubernetes 集群。它的核心理念是 “AI 驱动,轻便高效,化繁为简”,不仅功能全面,还支持单文件部署,跨 Linux、macOS、Windows 等多平台,真正做到开箱即用!

k8m 的硬核功能,一次性 Get!

k8m 的亮点多到数不过来,这里为你精选几个“真香”功能,让你感受它的强大:

AI 驱动,智能管理

新手真的很适合本地学习,简单又快捷

  • 划词解释:不认识 Kubernetes 术语?选中单词,AI 秒速给出解释!
  • YAML 翻译:复杂的 YAML 文件?k8m 自动解析并翻译字段含义,省去查文档的烦恼
  • 日志诊断:日志堆里找问题?AI 帮你快速定位错误并给出解决方案。
  • 命令推荐:只需描述需求,k8m 就能生成适合的 kubectl 命令,效率 up up up!

多集群管理,轻松切换

支持多集群统一管理,界面直观,集群切换一键搞定。无论是 Kind、MiniKube 还是生产环境的大集群,k8m 都能无缝接入,管理得井井有条。另外也支持多集群权限管理。支持对用户、用户组进行授权,可按集群授权,包括集群只读、Exec 命令、集群管理员三种权限。对用户组授权后,组内用户均获得相应授权。支持设置命名空间黑白名单

单文件部署,跨平台兼容

  • 下载最新版本,运行./k8m,访问 http://127.0.0.1:3618 即可使用,无需复杂配置
  • 支持 Linux、macOS、Windows,兼容多种架构(amd64/arm64),还可以通过 Docker 或 Kubernetes 一键部署,灵活到飞起!

Pod 操作神器

  • 实时查看 Pod 日志、支持日志下载,甚至直接在 Pod 内执行 Shell 命令
  • Pod 文件管理功能让你像操作本地文件一样浏览、编辑、上传、下载 Pod 内的文件,运维效率直接拉满!

Helm 市场支持

一键安装和管理 Helm 应用,快速部署常用工具,省时省力。

事件与异常智能分析

内置 AI 诊断功能,点击事件旁的“AI 解读”按钮,秒速分析异常原因,提供详细修复建议,排查问题 so easy!

开源免费,社区活跃

k8m 遵循 MIT 协议,完全开源,允许自由定制和商用,更新频率高,bug 修复快

k8m 的独特优势

  • 轻量高效:后端基于 Golang,前端采用百度 AMIS 框架,资源占用低,响应速度快
  • AI 加持:内置 Qwen2.5-Coder-7B 模型,支持私有化大模型接入(如 ChatGPT、Ollama),智能化管理更贴合需求
  • 用户友好:直观的 UI 设计,即使是 Kubernetes 新手也能快速上手
  • 多场景适用:从个人学习到企业级运维,k8m 都能完美适配。

如何快速上手 k8m?

下载与运行

从 GitHub 下载最新版本:https://github.com/weibaohui/k8m
运行命令:./k8m,然后访问 http://127.0.0.1:3618
想用 Docker?直接用 docker-compose 启动,配置文件参考 GitHub 文档

k8s 部署完整指南

---
apiVersion: v1
kind: Namespace
metadata:
  name: k8m
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app: k8m
  name: k8m
  namespace: k8m
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    app: k8m
  name: k8m
  namespace: k8m
rules:
  - verbs:
      - "*"
    apiGroups:
      - "*"
    resources:
      - "*"
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    app: k8m
  name: k8m
rules:
  - verbs:
      - "*"
    apiGroups:
      - "*"
    resources:
      - "*"
  - verbs:
      - "*"
    nonResourceURLs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app: k8m
  name: k8m
  namespace: k8m
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: k8m
subjects:
  - kind: ServiceAccount
    name: k8m
    namespace: k8m
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: k8m
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: k8m
subjects:
  - kind: ServiceAccount
    name: k8m
    namespace: k8m
---
apiVersion: v1
kind: Service
metadata:
  name: k8m
  namespace: k8m
  labels:
    app: k8m
spec:
  ports:
    - name: http-k8m
      protocol: TCP
      port: 3618
      targetPort: 3618
  selector:
    app: k8m
  type: ClusterIP
  # type: LoadBalancer
  # loadBalancerClass: tailscale
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: k8m-pvc
  namespace: k8m
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
---
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  name: k8m
  namespace: k8m
  labels:
    app: k8m
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8m
  template:
    metadata:
      labels:
        app: k8m
    spec:
      containers:
        - name: k8m
          # image: docker.io/weibh/k8m:v0.0.130
          # image: ghcr.io/weibaohui/k8m:v0.0.130
          image: registry.cn-hangzhou.aliyuncs.com/minik8m/k8m:v0.0.130
          env:
            # 是否开启debug模式
            - name: DEBUG
              value: "false"
            # log输出日志级别,同klog用法
            - name: LOG_V
              value: "2"
            # 监听的端口号
            - name: PORT
              value: "3618"
            # 开启AI功能,默认开启
            - name: ENABLE_AI
              value: "true"
            # # 是否启用临时管理员账户配置,默认关闭
            - name: ENABLE_TEMP_ADMIN
              value: "false"
            # kubectl shell镜像地址
            - name: KUBECTL_SHELL_IMAGE
              value: "bitnami/kubectl:latest"
            # Node shell镜像地址
            - name: NODE_SHELL_IMAGE
              value: "alpine:latest"
            # 持久化数据库地址
            - name: SQLITE_PATH
              value: "/app/data/k8m.db"
            # 启动程序后,是否自动连接发现的集群,默认关闭
            - name: CONNECT_CLUSTER
              value: "true"
            # 是否自动注册纳管宿主集群,默认启用
            - name: IN_CLUSTER
              value: "true"
            # 是否打印配置信息
            - name: PRINT_CONFIG
              value: "false"
          ports:
            - containerPort: 3618
              protocol: TCP
              name: http-k8m
          livenessProbe:
            httpGet:
              path: /healthz
              port: 3618
            initialDelaySeconds: 30
            periodSeconds: 10
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: k8m-data
              mountPath: /app/data
      restartPolicy: Always
      serviceAccountName: k8m
      volumes:
        - name: k8m-data
          persistentVolumeClaim:
            claimName: k8m-pvc
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  labels:
    app: k8m
  name: k8m
  namespace: k8m
spec:
  rules:
  - host: k8m.i.ysicing.net
    http:
      paths:
      - backend:
          service:
            name: k8m
            port:
              name: http-k8m
        path: /
        pathType: ImplementationSpecific

将上面的 yaml 保存为 k8m.yaml

kubectl apply -f k8m.yaml

等待服务启动完成后访问ingress 域名,默认用户:k8m,默认密码 k8m

预览

用户管理

登录后第一件事就是新建新的管理员账号,开启 MFA,删除默认管理员(只有删除功能没法禁用)

支持 OIDC,其实就能对接很多 OAUTH 服务了,具体 OIDC 使用说明

配置 AI 模型

内置模型其实也还行,当然也可以自己的模型

AI 智检

划词翻译

效果还是很不错的

想了解更多?可以直接访问 k8m 的 GitHub 仓库:https://github.com/weibaohui/k8m

k8s 资源

简单贴一下,更多细节可以使用 Demo 用户名密码 demo/demo

进阶玩法

通过 MCP 协议集成到 Cursor、Claude Desktop 等工具,解锁更多 AI 交互场景。 目前 k8m 内置 k8s 多集群 MCP 工具 49 种,可组合实现超百种集群操作,可作为 MCP Server 供其他大模型软件使用。轻松实现大模型管理 k8s,可详细记录每一次 MCP 调用,安全使用,无后顾之忧,避免操作越权。

总结

在 Kubernetes 管理工具层出不穷的今天,k8m 凭借轻量、AI 驱动、易用的特点脱颖而出。无论是个人开发者学习 Kubernetes,还是企业团队优化运维流程,k8m 都能为你节省时间、提升效率。更重要的是,它完全免费、开源,背后还有活跃的社区支持,未来发展值得期待!

PS: 作者修复 BUG 速度特别快。


关注我的微信公众号,更多技术吐槽和干货!

  •  

轻松部署 Artifactory(不推荐款)

2025年6月7日 14:50

在 DevOps 实践中,软件包管理是不可或缺的一环。JFrog Artifactory 作为一款强大的制品管理工具,广泛应用于存储和管理二进制文件。本文简单介绍如何部署 Artifactory 开源版。

主要有客户需要部署这个,简单研究一下,上次用这个还是 4 年前了,新版本部署坑有点多,没老版本丝滑。简单说不如 Nexus,有兴趣的可以看看我之前写的私有化部署 Nexus3 镜像源

镜像

镜像有点点大

docker pull releases-docker.jfrog.io/jfrog/artifactory-oss:7.111.8
# 国内
docker pull ccr.ccs.tencentyun.com/k7scn/artifactory-oss:7.111.8

部署

  • docker-compose.yaml
services:
  traefik:
    image: traefik:v3.4
    container_name: traefik
    networks:
      - ysicing-net
    command:
      - "--api=true"
      - "--api.insecure=true"
      - "--api.dashboard=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.http.address=:80"
      - "--providers.docker.network=ysicing-net"
      - "--log.level=INFO"
      - "--accesslog=true"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-dashboard.entrypoints=http"
      - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.192.168.23.16.sslip.io`)"
      - "traefik.http.routers.traefik-dashboard.service=dashboard@internal"
      - "traefik.http.routers.traefik-dashboard-api.entrypoints=http"
      - "traefik.http.routers.traefik-dashboard-api.rule=Host(`traefik.192.168.23.16.sslip.io`) && PathPrefix(`/api`)"
      - "traefik.http.routers.traefik-dashboard-api.service=api@internal"
      - "traefik.http.middlewares.gzip.compress=true"
      - "traefik.http.routers.traefik-dashboard.middlewares=gzip@docker"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always

  artifactorydb:
    image: docker.io/bitnami/postgresql:15
    # image: ccr.ccs.tencentyun.com/k7scn/postgresql:15
    container_name: artifactorydb
    restart: always
    networks:
      - ysicing-net
    volumes:
      - './postgresql:/bitnami/postgresql'
    environment:
      - POSTGRESQL_USERNAME=bn_artifactory
      - POSTGRESQL_DATABASE=bitnami_artifactory
      - POSTGRESQL_PASSWORD=bitnami

  artifactory:
    image: releases-docker.jfrog.io/jfrog/artifactory-oss:7.111.8
    # image: ccr.ccs.tencentyun.com/k7scn/artifactory-oss:7.111.8
    container_name: artifactory
    depends_on:
      - artifactorydb
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.artifactory.rule=Host(`artifactory.192.168.23.16.sslip.io`)"
      - "traefik.http.routers.artifactory.service=artifactory"
      - "traefik.http.services.artifactory.loadbalancer.server.port=8081"
      - "traefik.http.routers.artifactory-ui.service=artifactory-ui"
      - "traefik.http.routers.artifactory-ui.rule=Host(`artifactory-ui.192.168.23.16.sslip.io`)"
      - "traefik.http.services.artifactory-ui.loadbalancer.server.port=8082"
    networks:
      - ysicing-net
    environment:
      - EXTRA_JAVA_OPTIONS=-Dartifactory.home=/var/opt/jfrog/artifactory
      - JF_ROUTER_ENTRYPOINTS_EXTERNALPORT=8082
    # ports:
    #   - 8082:8082 # for router communication
    #   - 8081:8081 # for artifactory communication
    volumes:
      - artifactory_data:/var/opt/jfrog/artifactory
      - /etc/localtime:/etc/localtime:ro
      - ./system.yaml:/opt/jfrog/artifactory/var/etc/system.yaml
    restart: always
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "10"
    ulimits:
      nproc: 65535
      nofile:
        soft: 32000
        hard: 40000

volumes:
  artifactory_data:
    driver: local

networks:
  ysicing-net:
    name: ysicing-net
    driver: bridge

默认使用 pg 数据库,方便些

创建配置文件 system.yaml

touch system.yaml

创建完配置文件,生成相关配置

shared:
    database:
        type: postgresql
        driver: org.postgresql.Driver
        url: jdbc:postgresql://artifactorydb:5432/bitnami_artifactory
        username: bn_artifactory
        password: bitnami

修改文件权限

chown -R 1030:1030 system.yaml
chmod 644  system.yaml

运行启动

服务非常吃资源,机器配置太低不推荐。

docker compose up -d

访问 Artifactory

地址:artifactory-ui.192.168.23.16.sslip.io
默认的账号密码 | 默认用户名 admin,默认密码 password

总结

没有特殊要求,不推荐。


欢迎关注我的微信公众号,可以看看我郑再打工每天都在折腾什么。

  •  

轻松部署 Artifactory(不推荐款)

2025年6月6日 19:24

在 DevOps 实践中,软件包管理是不可或缺的一环。JFrog Artifactory 作为一款强大的制品管理工具,广泛应用于存储和管理二进制文件。本文简单介绍如何部署 Artifactory 开源版。

主要有客户需要部署这个,简单研究一下,上次用这个还是 4 年前了,新版本部署坑有点多,没老版本丝滑。简单说不如 Nexus,有兴趣的可以看看我之前写的私有化部署 Nexus3 镜像源

镜像

镜像有点点大

docker pull releases-docker.jfrog.io/jfrog/artifactory-oss:7.111.8
# 国内
docker pull ccr.ccs.tencentyun.com/k7scn/artifactory-oss:7.111.8

部署

  • docker-compose.yaml
services:
  traefik:
    image: traefik:v3.4
    container_name: traefik
    networks:
      - ysicing-net
    command:
      - "--api=true"
      - "--api.insecure=true"
      - "--api.dashboard=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.http.address=:80"
      - "--providers.docker.network=ysicing-net"
      - "--log.level=INFO"
      - "--accesslog=true"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-dashboard.entrypoints=http"
      - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.192.168.23.16.sslip.io`)"
      - "traefik.http.routers.traefik-dashboard.service=dashboard@internal"
      - "traefik.http.routers.traefik-dashboard-api.entrypoints=http"
      - "traefik.http.routers.traefik-dashboard-api.rule=Host(`traefik.192.168.23.16.sslip.io`) && PathPrefix(`/api`)"
      - "traefik.http.routers.traefik-dashboard-api.service=api@internal"
      - "traefik.http.middlewares.gzip.compress=true"
      - "traefik.http.routers.traefik-dashboard.middlewares=gzip@docker"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always

  artifactorydb:
    image: docker.io/bitnami/postgresql:15
    # image: ccr.ccs.tencentyun.com/k7scn/postgresql:15
    container_name: artifactorydb
    restart: always
    networks:
      - ysicing-net
    volumes:
      - './postgresql:/bitnami/postgresql'
    environment:
      - POSTGRESQL_USERNAME=bn_artifactory
      - POSTGRESQL_DATABASE=bitnami_artifactory
      - POSTGRESQL_PASSWORD=bitnami

  artifactory:
    image: releases-docker.jfrog.io/jfrog/artifactory-oss:7.111.8
    # image: ccr.ccs.tencentyun.com/k7scn/artifactory-oss:7.111.8
    container_name: artifactory
    depends_on:
      - artifactorydb
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.artifactory.rule=Host(`artifactory.192.168.23.16.sslip.io`)"
      - "traefik.http.routers.artifactory.service=artifactory"
      - "traefik.http.services.artifactory.loadbalancer.server.port=8081"
      - "traefik.http.routers.artifactory-ui.service=artifactory-ui"
      - "traefik.http.routers.artifactory-ui.rule=Host(`artifactory-ui.192.168.23.16.sslip.io`)"
      - "traefik.http.services.artifactory-ui.loadbalancer.server.port=8082"
    networks:
      - ysicing-net
    environment:
      - EXTRA_JAVA_OPTIONS=-Dartifactory.home=/var/opt/jfrog/artifactory
      - JF_ROUTER_ENTRYPOINTS_EXTERNALPORT=8082
    # ports:
    #   - 8082:8082 # for router communication
    #   - 8081:8081 # for artifactory communication
    volumes:
      - artifactory_data:/var/opt/jfrog/artifactory
      - /etc/localtime:/etc/localtime:ro
      - ./system.yaml:/opt/jfrog/artifactory/var/etc/system.yaml
    restart: always
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "10"
    ulimits:
      nproc: 65535
      nofile:
        soft: 32000
        hard: 40000

volumes:
  artifactory_data:
    driver: local

networks:
  ysicing-net:
    name: ysicing-net
    driver: bridge

默认使用 pg 数据库,方便些

创建配置文件 system.yaml

touch system.yaml

创建完配置文件,生成相关配置

shared:
    database:
        type: postgresql
        driver: org.postgresql.Driver
        url: jdbc:postgresql://artifactorydb:5432/bitnami_artifactory
        username: bn_artifactory
        password: bitnami

修改文件权限

chown -R 1030:1030 system.yaml
chmod 644  system.yaml

运行启动

服务非常吃资源,机器配置太低不推荐。

docker compose up -d

访问 Artifactory

地址:artifactory-ui.192.168.23.16.sslip.io
默认的账号密码 | 默认用户名 admin,默认密码 password

总结

没有特殊要求,不推荐。


欢迎关注我的微信公众号,可以看看我郑再打工每天都在折腾什么。

  •  

FFmpeg常用命令备份

2025年6月5日 22:13

FFmpeg 是一个强大的开源多媒体处理工具,广泛应用于音视频的转换、裁剪、合并、提取等操作。无论是开发、剪辑还是日常处理,掌握 FFmpeg 的常用命令都能极大提升效率。本文整理了一些高频使用的 FFmpeg 命令,方便你快速上手或作为备忘录收藏!

临时需要处理一些上次到群晖 MinIO 的视频,写个流水线自动化处理。温故一下相关命令。

FFmpeg 简介

Fmpeg 是一个跨平台的音视频处理框架,支持几乎所有格式的音视频文件。它功能强大、命令灵活,堪称“音视频处理瑞士军刀”。以下是常见操作的命令合集,建议收藏备用!

常用命令速查

格式转换

将文件从一种格式转换为另一种格式,例如将 MP4 转为 AVI:

ffmpeg -i input.mp4 output.avi

-i:指定输入文件

提示:FFmpeg 会根据输出文件名自动推断目标格式

提取音频

从视频中提取音频,例如提取 MP3

ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3
  • -vn:禁用视频流。
  • -acodec mp3:指定音频编码为 MP3

歌曲

截取视频片段

裁剪视频的指定时间段,例如从第 10 秒到第 30 秒:

ffmpeg -i input.mp4 -ss 10 -t 20 output.mp4
# 通常搭配如下
ffmpeg -i input.mp4 -ss 10 -t 20 -c copy output.mp4
  • -ss:起始时间(秒或 hh:mm:ss)
  • -t:裁剪时长(秒或 hh:mm:ss)
  • -c copy:直接复制流,避免重新编码,速度更快

视频截图

ffmpeg -ss 00:20:00 -i "input.mp4" -vframes 1 "01.jpg"

视频压缩

压缩视频文件大小,调整比特率:

ffmpeg -i input.mp4 -vcodec libx264 -b:v 1000k output.mp4
  • -b:v:设置视频比特率,值越低压缩越高,但画质可能下降

调整视频分辨率

将视频缩放到指定分辨率,例如 1280x720:

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
  • -vf scale:设置缩放参数

转换帧率

更改视频帧率,例如从 60fps 转为 24fps:

ffmpeg -i input.mp4 -r 24 output.mp4
  • -r:设置目标帧率

例如 h264 编码无损转换至 h265 编码

ffmpeg -c:v h264_cuvid -i input.mp4 -c:v hevc_nvenc -r 24 -c:a copy -x265-params lossless=1 output.mp4;

提取视频帧

将视频转为图片序列,例如每秒提取一帧:

ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
  • %04d:生成文件名递增,如 frame_0001.png

查看文件信息

快速查看音视频文件的详细信息:

ffmpeg -i input.mp4

输出包含编码格式、分辨率、时长等详细信息

通常如下所用一键输出视频的编码、帧率、码率

codec=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4)
r_frame_rate=$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4)
bit_rate=$(ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4)
echo -e "$codec\t$r_frame_rate\t$bit_rate\tinput.mp4"

视频合并

将多个视频文件合并为一个(需确保分辨率、编码一致):

# 创建文件列表 mv.txt
echo "file 'input1.mp4'" > mv.txt
echo "file 'input2.mp4'" >> mv.txt
ffmpeg -f concat -i mv.txt -c copy output.mp4

这个没用过,仅供参考

实用技巧与注意事项

  • Linux:apt install ffmpeg(Debian)
  • macOS:brew install ffmpeg

我仅在这两个环境实操过,其他环境可以参考官方文档,类似文档很详细了

另外结合脚本语言很方便,例如 bash

写在最后

FFmpeg 的功能远不止这些,熟练使用后,你可以轻松应对音视频处理的各种场。对于我而言,掌握基本功能从视频中导出音频文件使用就行(大部分还用不上,因为还有一些第三方工具帮你自动一键搞定)


欢迎关注我的微信公众号。

  •  

MinIO最新社区版砍掉 Web 管理功能

2025年6月3日 22:14

近日,MinIO 社区版迎来重大更新,删除了 11 万行代码,彻底移除 Web 管理控制台功能,官方称此举为“精简代码,专注核心存储功能”。这一决定引发社区热议,对用户体验和项目生态造成显著影响。本文将深入剖析这一变化的细节、影响及社区反应。

Web 管理功能移除的影响

MinIO 作为一款高性能分布式对象存储系统,因其 S3 协议兼容性和易用性深受开发者喜爱。其 Web 管理控制台是社区版的核心功能,支持存储桶管理、文件浏览和权限配置,极大降低了操作门槛,尤其适合:

  • 非技术用户:通过直观界面快速上手,减少对命令行的依赖
  • 团队协作:便捷管理存储资源,提升效率
  • 实时监控:查看文件列表、使用量等存储状态

然而,新版本将 Web 控制台的核心管理功能(包括用户账户管理、访问策略配置、存储桶管理和系统配置)全部移除,官方推荐使用 mc 命令行工具替代。相比可视化界面,mc 命令行工具对新手不够友好,且在快速调试和监控场景下效率较低。

新老控制台对比

2025.4.22

2025.5.24

被移除的具体功能

此次更新几乎清空了 Web 管理控制台的功能,仅保留基本的对象浏览能力。以下是主要受影响的模块:

  • 账户与策略管理
    • 移除用户账户创建、访问密钥管理和策略设置功能
    • OIDC 单点登录等高级认证功能被砍,用户只能使用管理员初始账户登录,无法通过界面创建新访问密钥
  • 配置与集群管理
    • 无法通过界面查看或修改服务器配置、后端存储设置及集群状态
    • 所有实例调整和服务监控需依赖命令行或 API
  • 存储桶管理
    • 删除新建存储桶、设置策略、版本控制和生命周期规则的界面功能
    • Web 界面退化为纯对象浏览器,仅支持列出存储桶及文件
  • 其他功能
    • 服务器信息仪表盘、多节点集群视图、日志和通知配置等管理功能全部移除

简言之,新版 Web 界面已不再是管理控制台,而是一个功能极简的文件浏览器。用户被迫转向 mc 命令行工具完成所有管理任务,操作门槛显著提高

受影响的版本

  • 2025.4.22 版本是最后一个保留完整控制台功能的版本, 可用镜像 ccr.ccs.tencentyun.com/k7scn/minio:2025.4.22
  • 2025.5.24 版本则包含了删除控制台功能的改动(MinIO 官方在发布说明的 “重要事项” 中明确提到嵌入式 Web 控制台(Console)已被弃用,并移至独立的 object-browser 项目)

社区反应与讨论

MinIO 官方称,删除 11 万行代码旨在优化性能、聚焦核心存储功能。然而,Web 控制台资源占用较低,维护成本有限,社区对这一理由普遍质疑。相比之下,MinIO 商用版保留了完整的 Web 管理功能,功能更强大,引发了“社区版精简是为了推销商用版”的猜测

X 平台和 Reddit 等社区反馈显示,开发者认为这是开源项目商业化的常见策略:通过削减免费版功能,引导用户转向付费版本。部分用户甚至称此次更新为特洛伊木马式更新,批评官方未提供过渡方案,给中小团队带来额外适配成本

作为回应,社区迅速行动:

  • 启动 OpenMaxIO 分支项目,试图恢复被移除的功能
  • SeaweedFS 和 Garage 等替代方案获得更多关注

结语

MinIO 社区版移除 Web 管理功能的决定,削弱了其易用性和吸引力。开源项目的核心在于平衡社区需求与商业利益,MinIO 的后续决策将直接影响其在对象存储领域的地位。对于依赖 Web 控制台的团队,建议暂时停留在 2025.4.22 版本,或探索其他替代方案。


欢迎关注,可以看看我郑再打工每天都在折腾什么。

  •  

值得入手的Steam模拟类神作:缺氧(Oxygen Not Included)

2025年5月31日 23:07

各位小伙伴!今天给大家安利一款超硬核、超上头的模拟经营类游戏——缺氧(Oxygen Not Included)! 如果你喜欢挑战脑力、沉浸式体验和无限可能的建造乐趣,这款游戏绝对不容错过!

缺氧是由 Klei Entertainment(饥荒开发商)打造的一款生存模拟类游戏。玩家需要在一个地下星球中管理一群可爱的小人(复制人),通过建造基地、分配资源、应对环境危机,让他们在缺氧、缺食、缺电的恶劣环境中存活下来!

特点

  • 超高自由度的建造体验
    在游戏中,你可以自由规划地下基地,设计复杂的管道、电力和氧气系统。想建一个自给自足的生态圈?还是一个高科技的自动化基地?全看你的脑洞!从简单的茅厕到复杂的核反应堆,建造过程既烧脑又满足
  • 硬核的资源管理
    氧气、食物、水、能源、温度……每一项资源都需要你精打细算。稍有不慎,小人可能会因为缺氧窒息、食物中毒,甚至被高温烫伤
  • 随机生成的挑战
    每次开局的地图和资源分布都不相同,随机事件(如陨石雨、火山喷发)让每一局都充满新鲜感。你需要根据环境灵活调整策略,永远不会觉得无聊
  • 丰富的 MOD 支持
    社区 MOD 丰富多样,从增加新建筑到优化游戏体验,应有尽有!无论你是想降低难度还是挑战极限,都能找到适合自己的玩法

我的玩法开局看水和铜多不多,不多重开

适合人群

  • 喜欢模拟经营
  • 热衷挑战的硬核玩家:喜欢烧脑、追求极限生存
  • 创意玩家:想打造独一无二的地下乌托邦

当然耐心很重要, 同时要有自我控制能力,因为很容易肝上头

入手性价比

推荐直接购买缺氧完整包, 我上个月入手大概不到 90CNY。

缺氧完整包

推荐购买正版,请勿相信廉价购买,谨防虚假入库,导致游戏和钱两失。

新手建议

  • 前期多关注氧气和食物,善用“暂停”功能规划基地
  • 游戏上手稍有难度,但官方有中文支持,社区教程也超多,入门后根本停不下来
  • 多在 B 站搜搜相关教程
  • 早期多重开几次就会玩了。

官方介绍节选

  • 建立广阔的基地以及探索生存所需的资源:
    从挖掘、资源分配到管道、电力系统,太空殖民地的一切都在你的掌控之下。然而,资源会从你第一次呼吸开始被消耗 ,所以如果你想生存下来的话,就一定要确保你探索得够快。
  • 伴随着压力模拟的精神状态问题
    给你的殖民地提供娱乐休闲活动、优越的住宿条件和更好的食物,来保证生存不会受到精神状态的影响。每个复制人之间都有差异,会对压力做出不同的潜在破坏性反应。 所以不管付出什么代价,一定要确保他们拥有愉悦的心情
  • 用复杂的气体和液体模拟系统来提高效率
    建立一个连锁的管道系统,可以迅速的将燃料和液体输送到基地的关键区域。优质的规划以及获得的加成可以让你的殖民地转变成一个运转良好的不朽机器
  • 通过电网模拟系统来获得电力:
    你可以通过众多不同的能源来获得电力,包括煤,氢,天然气或者仅仅是朴实老旧的油脂。修复电力流失,电路过载和崩溃问题以保持你殖民地的顺利运行

欢迎关注,可以看看我郑再打工每天都在折腾什么。

  •  

轻松管理K3s集群服务:System Upgrade Controller 的超实用指南

2025年5月30日 21:20

K3s 作为轻量级 Kubernetes 发行版,以其高效、简洁的特性深受开发者与运维人员喜爱。但手动升级 K3s 集群可能是个繁琐的任务,幸好有 System Upgrade Controller!这个工具能让你的 K3s 集群实现自动化、无宕机升级,省时又省心。本文将带你了解 System Upgrade Controller 的魅力,并提供简洁的部署步骤,让你的集群管理更轻松!

主要用于升级 k3s 集群节点上的服务,不仅仅局限于 k3s 服务本身。

简介

System Upgrade Controller 是 Rancher 开发的一个自动化升级工具。它通过 Kubernetes 原生资源(如 Plan)管理节点和 K3s 版本的升级,核心优势包括:

  • 自动化:一键配置,自动完成 K3s 版本升级
  • 零宕机:逐节点升级,确保服务不中断
  • 灵活性:支持自定义升级策略,适配各种集群规模
  • 轻量高效:与 K3s 的低资源占用理念完美契合

如果你想让 K3s 集群保持最新或者减少运维负担,绝对值得一试!

项目地址:

在 K3s 上部署

以下是快速部署 System Upgrade Controller 的步骤,简单易上手

kubectl apply -f https://raw.githubusercontent.com/rancher/system-upgrade-controller/master/manifests/system-upgrade-controller.yaml

或者

kubectl apply -k github.com/rancher/system-upgrade-controller

服务控制器默认会部署到 system-upgrade 命名空间下

kubectl get deploy -n system-upgrade
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
system-upgrade-controller   1/1     1            1           335d

使用场景

常见使用如下,由于权限极高,操作时需要确保重复执行没影响。

  • 升级 k3s 本身
  • 升级 k3s 集群节点服务

升级 k3s 服务

由于我现在的环境特殊,只有一个 master 节点,每次跨版本升级 master 节点都是先手动升级到最新版本,然后在使用下面的命令升级计算节点。(保障至少 1 个控制节点版本是最新的)

---
apiVersion: v1
kind: Secret
metadata:
  name: k3s1306
  namespace: system-upgrade
type: Opaque
stringData:
  upgrade.sh: |
    #!/bin/bash

    set -x

    binfile=$(command -v k3s)

    $binfile -v | grep "v1.30.6" && (
      echo "done"
      exit 0
    ) || (
      wget https://c.ysicing.net/oss/tiga/linux/amd64/k3s
      chmod +x k3s
      mv k3s $binfile && systemctl restart k3s
    )
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: k3s1306
  namespace: system-upgrade
spec:
  concurrency: 3
  nodeSelector:
    matchExpressions:
      - {key: kubernetes.io/os, operator: Exists}
  tolerations:
  - {operator: Exists}
  serviceAccountName: system-upgrade
  secrets:
    - name: k3s1306
      path: /host/run/system-upgrade/secrets/k3s1306
  cordon: false
  version: latest
  upgrade:
    image: hub.ysicing.net/ysicing/debian-upgrade:20230909
    command: ["chroot", "/host"]
    args: ["sh", "/run/system-upgrade/secrets/k3s1306/upgrade.sh"]

想了解更多官方的姿势,可以参考

升级集群服务

  • 升级 tailscale 服务
---
apiVersion: v1
kind: Secret
metadata:
  name: ts-script
  namespace: system-upgrade
type: Opaque
stringData:
  upgrade.sh: |
    #!/bin/bash

    set -x
    if tailscale version 2>/dev/null | grep -q "1.82.5"; then
        echo "Tailscale 1.82.5 already installed"
        exit 0
    fi
    export DEBIAN_FRONTEND=noninteractive
    apt-get update -qq
    apt-get install -y --no-install-recommends tailscale
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: ts1825
  namespace: system-upgrade
spec:
  concurrency: 1
  nodeSelector:
    matchExpressions:
      - {key: kubernetes.io/os, operator: Exists}
  tolerations:
  - {operator: Exists}
  serviceAccountName: system-upgrade
  secrets:
    - name: ts-script
      path: /host/run/system-upgrade/secrets/ts-script
  cordon: false
  version: latest
  upgrade:
    image: hub.ysicing.net/ysicing/debian-upgrade:20230909
    command: ["chroot", "/host"]
    args: ["sh", "/run/system-upgrade/secrets/ts-script/upgrade.sh"]
  • 升级 easytier
---
apiVersion: v1
kind: Secret
metadata:
  name: debian
  namespace: system-upgrade
type: Opaque
stringData:
  upgrade.sh: |
    #!/bin/sh
    set -e
    if easytier-core -V 2>/dev/null | grep -q "2.2.4"; then
        echo "easytier 2.2.4 already installed"
        exit 0
    fi
    apt-get --assume-yes update
    DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade --assume-yes
    curl https://c.ysicing.net/oss/scripts/easytier.sh | bash
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
  name: debian-25021514
  namespace: system-upgrade
spec:
  concurrency: 3
  nodeSelector:
    matchExpressions:
      - {key: kubernetes.io/os, operator: Exists}
  tolerations:
  - {operator: Exists}
  serviceAccountName: system-upgrade
  secrets:
    - name: debian
      path: /host/run/system-upgrade/secrets/debian
  cordon: false
  version: latest
  upgrade:
    image: ysicing/debian
    command: ["chroot", "/host"]
    args: ["sh", "/run/system-upgrade/secrets/debian/upgrade.sh"]

通过上面 3 个例子,其实就是帮你去每个节点执行相关脚本,如果你有大量类似的重复的工作,System Upgrade Controller 就是个绝佳的运维工具,它让版本管理变得简单、高效、无忧,显著提升你的运维体验。


欢迎关注,可以看看我郑再打工每天都在折腾什么。

  •  

Raphael AI图片生成器:释放创意,零门槛打造惊艳视觉盛宴

2025年5月23日 19:53

在 AI 技术席卷全球的今天,图像生成工具正成为内容创作者、设计师和营销人员的得力助手。Raphael AI 作为全球首款完全免费无限制无需注册登录的 AI 图像生成器,以其强大的功能和便捷的操作,迅速在创意圈掀起热潮。

今天偶然看到的,有免费额度的 AI 图片生成器。适合生成配图或者插图,用来生成封面感觉还差点意思,和即梦效果差不多。

Raphael AI 是什么?

Raphael AI 是一款基于先进的 FLUX.1-Dev 模型打造的 AI 图像生成工具,用户只需输入文字描述(提示词),即可在几秒钟内生成高质量、多风格的图像。它的核心优势在于:

  • 完全免费, 零成本创作:无使用次数限制,无需注册或登录,打开网页即可创作
  • 多样化风格:支持写实摄影、动漫、油画、数字艺术等多种艺术风格
  • 快速生成:优化的推理管道确保几秒内出图,效率惊人
  • 隐私保护:零数据保留政策,提示词和生成图像不存储于服务器,保障用户隐私
  • 商业用途:生成图像无水印,可自由用于个人或商业项目
  • 一定质量保障:由 FLUX.1-Dev 模型驱动,提供具有卓越细节和艺术风格控制的照片级逼真图像;高级文本理解

对比国内大模型,我觉得是优势功能的都标注了。为啥说一定质量保障,因为高质量需要订阅才行 😄

测试

英文提示词

Humorous and funny style, preferably with a purple-haired Japanese anime girl holding a sign that says, "I need 66 more followers to reach 1000, please subscribe."

选择一个,其他都略微有些瑕疵

中文提示词

幽默搞笑风, 最好有个紫色头发日漫妹子举牌子,牌子上写着「我还有 66 个粉丝才满 1000,请求订阅」》

总结

官方建议: 请用英文输入提示词以获得最佳效果

经过实操,确实英文提示词要比中文好多了,可能我问的方式仅在 ChatGPT 上实验良好。

官方也提供了一些灵感示例提示词,点击相关图片就可以查看其他人的提示词

再次实操一下,发现生成 SB 比缘生更简单哈哈哈

生成: Cute chubby Pikachu on the grass, surrounded by small white flowers, with the two Chinese characters "SB" written on Pikachu's belly, soft pastel anime style

官网


  •  

Google新AI产品无法使用解决指南

2025年5月22日 18:21

今天看到这个消息推送,之前也遇到过这种情况,这个简单写下如何解决,当个精神美国佬

背景

受限于某些特殊环境或者边缘因素影响,国内是没法正常使用 Google AI 相关的产品的。(默认你已经可以访问 Google AI 等产品了)

接下来给的几种方式,都可以尝试

修改浏览器默认语言

这个跟之前 Github 默认禁止中文用户访问类似,检查你的请求头 accept-language 信息

示例修改 Edge 默认首选语言为英语即可,生效后随便访问一个网站开发者工具查看请求头或者支持切换语言的网站打开是否为英文

如果你的账号没问题了,通常打开那些网站就可以正常使用了。如果还不行,可能就是账号问题了

当然也会带来一些问题,你打开所有支持多语言的网站都会默认使用英文,影响也不大

申请谷歌账号地区修改

有可能,你很早之前就注册了谷歌账号,地区选的中国

查看账号绑定的地区 https://policies.google.com/terms

换区操作

找对入口,其实也很简单,通常我们都选择美区,精神美国佬,社会大学生, 部分 AI 功能暂时只对美区开发。

换区入口 https://policies.google.com/country-association-form

理由选择其他原因,听劝

好了,其他就是基本要求了,自行准备就行。

对了,这两个我港区的小号也是可以正常访问的。

PS: 大佬们都买了 Google One Ultra 没?


  •  

Drawnix:无限画布上的开源白板工具

2025年5月21日 20:40

这个项目很早之前就关注过, 那时还没提供 Dockerfile😁

简介

Drawnix 是一款基于 Plait 框架打造的免费开源白板工具,提供思维导图、流程图和自由绘画等功能。依托插件化架构,用户能够随需扩展多种交互组件。每一次操作都能实时保存至浏览器缓存,确保内容不丢失

核心特性

  • 多样化绘图模式
    • 支持思维导图、流程图与自由画笔,满足不同场景需求
    • 可插入图片,通过简单拖拽丰富画面
  • 高效编辑体验
    • 撤销、重做、复制与粘贴操作流畅
    • 自动保存功能避免意外丢失(浏览器缓存)
  • 无限画布与导出能力
    • 通过缩放与滚动打造无边界创作空间
    • 可将画布导出为 PNG 或 JSON(.drawnix) 文件
  • 插件机制与兼容性
    • 插件架构支持 Angular、React 等多种 UI 框架
    • 自带 Slate 富文本扩展,后续可接入更多文本编辑插件
    • 未来可通过社区插件实现更多应用场景

项目

名称灵感

Drawnix ,源于绘画( Draw )与凤凰( Phoenix )的灵感交织。
凤凰象征着生生不息的创造力,而 Draw 代表着人类最原始的表达方式。在这里,每一次创作都是一次艺术的涅槃,每一笔绘画都是灵感的重生。
创意如同凤凰,浴火方能重生,而 Drawnix 要做技术与创意之火的守护者。
Draw Beyond, Rise Above.

与 Plait 框架的深度结合

Drawnix 底层依托作者公司开源的 Plait 画图框架,这是知识库产品的重要技术沉淀。两者紧密结合让开发者享受“一键开箱即用”的便捷,同时还能在业务分层中灵活装载自定义插件。

这款工具不仅是面向个人创作者,同样适用于团队协作与在线教学。无限画布中,每一次涂抹都让构思变得更生动、更立体,技术与想象力在此汇合,带来前所未有的白板体验。

私有化部署

作者已经提供了 Dockerfile,基于此 Dockerfile,我构建了一个镜像, 默认监听 80 端口,除此外无特殊配置

  • ccr.ccs.tencentyun.com/k7scn/drawnix 基于此97ab1d4构建完成

compose 部署

  • docker-compose.yaml
services:
  drawnix:
    image: ccr.ccs.tencentyun.com/k7scn/drawnix
    container_name: drawnix
    ports:
      - '100.90.80.15:8088:80'
    restart: always

然后配置 caddy 代理即可。

k3s 部署

我主要使用 k3s 部署,对外访问使用 cft

  • drawnix.yaml
---
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  labels:
    app: drawnix
  name: drawnix
  namespace: kc-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: drawnix
  updateStrategy:
    type: InPlaceIfPossible
  template:
    metadata:
      labels:
        app: drawnix
    spec:
      tolerations:
      - operator: Exists
      nodeSelector:
        node-role.kubernetes.io/kc: "true"
      containers:
      - image: tcr.china.12306.work/github/drawnix
        imagePullPolicy: Always
        name: drawnix
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: drawnix
  name: drawnix
  namespace: kc-system
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: drawnix
  type: ClusterIP

apply 之后,在 cfd tunnel 管理页添加公共主机名

演示站

欢迎自建,不保证 SLA,暂时不知道开源版与官方演示有什么区别。


欢迎订阅我的微信公众号,同步更新 😁

  •  

解锁高效开发利器——Gitness,助力你的DevOps之旅

2025年5月18日 22:19

在快节奏的软件开发世界中,高效的代码托管和自动化部署是每个开发团队的追求。你是否曾为繁琐的 CI/CD 流程而头疼?是否希望有一个简单易用、功能强大的平台来管理你的代码和流水线?今天,我们为你介绍一款开源神器——Gitness,它将彻底改变你的开发体验。

作为 Drone 和 Gitness 深度定制用户,我还值得很推荐的。

什么是 Gitness

Gitness 是一个集代码托管与自动化 DevOps 流水线于一体的开源开发平台。作为 Drone CI 的下一代产品,Gitness 不仅保留了强大的持续集成(CI)功能,还新增了源代码托管能力,支持本地部署和 Docker 容器化运行。无论是个人开发者还是小型团队,Gitness 都能提供灵活、高效的解决方案。

核心亮点

  • 一体化平台:代码托管 + CI/CD 流水线 + 制品库
  • 用户友好:提供直观的 UI 界面、REST API,满足不同开发者的使用习惯
  • 灵活部署:支持私有化本地部署
  • 开源免费:完全开源,社区驱动,适合预算有限的团队(非常适合个人用户)

对比 Drone、Woodpecker

  • 目前支持 Runner 有限,仅支持 docker
  • 新增的制品库支持的种类相对比较少,常见的 Docker、Helm 是没问题的
  • 目前数据库仅支持 PG、Sqlite3
  • 流水线
    • 日志相比较 v2 仅支持存储到数据库,暂不支持存储到对象存储
    • 不支持重复执行(如定时、失败重试)
    • 流水线语法变更,相比较 Drone、Woodpecker 等 v2 版本的语法,功能缺少较多,但是满足基本使用
  • 代码仓库功能完善,日常使用是没问题

部署

环境变量配置

目前官方文档未提供,需要参考官方文档 harness/harness#config.go

部署

镜像:

  • harness/harness:unstable
  • 国内镜像 ccr.ccs.tencentyun.com/k7scn/harness:unstable
  • docker-compose.yaml
services:

  gitness:
    image: harness/harness:unstable
    container_name: gitness
    restart: always
    ports:
      - "3000:3000"
      - "3022:3022"
    volumes:
      - /data/gitness:/data
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - GITNESS_DEBUG=true
      - GITNESS_TRACE=true
      - GITNESS_GIT_TRACE=true
      - GITNESS_GIT_DEFAULTBRANCH=master
      - GITNESS_WEBHOOK_ALLOW_LOOPBACK=true
      - GITNESS_WEBHOOK_ALLOW_PRIVATE_NETWORK=true
      - GITNESS_METRIC_ENABLED=false
      - GITNESS_PRINCIPAL_ADMIN_UID=ysicing
      - GITNESS_PRINCIPAL_ADMIN_DISPLAY_NAME=ysicing
      - GITNESS_PRINCIPAL_ADMIN_EMAIL=ysicing@12306.work
      - GITNESS_PRINCIPAL_ADMIN_PASSWORD=ysicing
#     - GITNESS_SMTP_HOST=
#     - GITNESS_SMTP_PORT
#     - GITNESS_SMTP_USERNAME
#     - GITNESS_SMTP_PASSWORD
#     - GITNESS_SMTP_FROM_MAIL
#     - GITNESS_SMTP_INSECURE
      - GITNESS_GITSPACE_DEFAULT_BASE_IMAGE=ccr.ccs.tencentyun.com/k7scn/base:dev-ubuntu-24.04
      - GITNESS_UI_SHOW_PLUGIN=true
      - GITNESS_URL_GIT=http://192.168.23.16:3000/git
      - GITNESS_URL_UI=http://192.168.23.16:3000
      - GITNESS_URL_API=http://192.168.23.16:3000/api
      - GITNESS_URL_GIT_SSH=ssh://192.168.23.16
      - GITNESS_SSH_ENABLE=true
#      - GITFOX_SSH_PORT=3022
#      - GITNESS_CI_PARALLEL_WORKERS=2
#      - GITNESS_GIT_ROOT
      - GITNESS_CI_PLUGINS_ZIP_URL=https://c.ysicing.net/oss/offline/master.zip

部署完成,使用 IP:3000 访问. 账号密码需要使用设置的 GITNESS_PRINCIPAL_ADMIN_UIDGITNESS_PRINCIPAL_ADMIN_PASSWORD

目前配置参数过多,稍微配置不对还可能有 bug。针对这个

  • 我司会开源 GitFox,基于 Gitness 定制的 fork 版本,一些额外特性功能的补充(企业、与禅道的联动)
  • 我个人也维护了一套 Gitness 的魔改版本 Gitless,在上游的版本增加了个人开发者常用的特性(仅从我个人使用)

使用说明

这里简单过一些,后面会专门写一些文章介绍一下。

创建组织

对应其他 Git 服务的组织(ORG/GROUP)

创建仓库

流水线

执行流水线,目前支持部分 drone 插件,基本可以拿来就用如果熟悉 drone 和 gitness 的流水线语法的话

制品仓库

目前支持如下,感觉是借鉴了 Nexus,基本已经覆盖了日常使用。

WebIDE

总结

Gitness 不仅是一款工具,更是开发者高效协作的伙伴。无论你是追求极致效率的个人开发者,还是需要稳定流水线的小型企业团队,Gitness 都能满足你的需求。不过有一说一,目前 Gitness 还是处于快速发展阶段,有 Bug 是正常不过的事,但是基本功能还是没啥问题的。其次他们开源版本支持力度不是那么紧急,更多的还是服务他们的 SAAS 产品。


  •  

私有化部署Nexus3镜像源

2025年5月17日 09:19

昨天升级 Nexus3 翻车了,准备基于 PG 重新搭建 Nexus3 源,并移除一些不用的软件源, 新版软件源支持如下

环境要求

  • 机器配置至少 2C4G
  • 网络要好,推荐境外机器部署
  • 大硬盘可选(不代理 py 等还好)

部署

nexus 服务

使用 compose 或者 k8s,原理差不多,我的环境使用 k3s。

  • docker-compose.yaml
services:
  nexus3:
    image: sonatype/nexus3:latest
    container_name: nexus3
    restart: always
    ports:
      - "8081:8081"
    environment:
      - INSTALL4J_ADD_VM_PARAMS=-Xms2703m -Xmx4G -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=/nexus-data/javaprefs
      - NEXUS_DATASTORE_ENABLED=true
      - NEXUS_DATASTORE_NEXUS_JDBCURL=jdbc:postgresql://postgres:5432/nexus3
      - NEXUS_DATASTORE_NEXUS_USERNAME=oup44Fai4ta
      - NEXUS_DATASTORE_NEXUS_PASSWORD=ienah9eiquah7GeiMaengeitie5aeq66
    volumes:
      - /data/nexus/nexusdata:/nexus-data
    depends_on:
      - postgres

  postgres:
    image: bitnami/postgresql:17
    container_name: postgres
    environment:
      - POSTGRESQL_DATABASE=nexus3
      - POSTGRESQL_USERNAME=oup44Fai4ta
      - POSTGRESQL_PASSWORD=ienah9eiquah7GeiMaengeitie5aeq66
    volumes:
      - /data/nexus/postgres:/bitnami/postgresql
    restart: always

在启动前,先创建好目录,并给予权限

mkdir -p /data/nexus/postgres /data/nexus/nexusdata
chmod 777 /data/nexus -R

然后启动, 访问 ip:8081 即可

docker compose up -d

配置 caddy

mirrors.china.12306.work {
	import LOG "/var/log/caddy/mirrors.log"
	@rootOrIndex {
		path /
		path /index.html
		path /mirror.css
		path /.help*
	}

	handle @rootOrIndex {
		file_server {
			hide .git
			root /etc/caddy/pages/mirrors
		}
	}
	reverse_proxy http://100.90.80.3:8081
}

样式我从网易镜像源借鉴来的

目前支持的软件

本文档由 ysicing 收集整理, 希望能对国内开源软件用户有所帮助.

仅列出部分核心软件包:

  • tailscale
  • caddy
  • docker-ce
  • postgresql
  • trivy

为什么没有我用的软件包?因为我暂时用不上, 有好的想法可以联系我.


  •  

Nexus3 容器部署3.70.x升级实践-非成功案例

2025年5月16日 21:09

docker 从 3.70.x 及以下版本升级 3.71.x 及以上版本出现旧数据库不支持错误

官方也很细心给了一份升级文档 upgrading-to-nexus-repository-3-71-0-and-beyond

由于我使用的也是官方镜像,社区也有人给出了解决方案 sonatype/nexus-public#51

友情提示,操作前需要备份持久化数据,避免升级失败,建议先阅读文尾后再参考我的升级

创建 nexus 备份文件

  • 设置-系统-任务-创建任务

  • 搜索 Backup,选择它

  • 创建一下手动触发的任务,备份路径 /nexus-data/backup 就行

  • 创建完任务后,点击 backup 任务运行

  • 触发备份

  • 等待备份完成

不放心,也可以进容器内,看一下:

19:56 ➜  ~ kubectl exec -it pods/nexus3-859bb76886-mc29s -n nat -- bash
bash-4.4$ ls
nexus  sonatype-work  start-nexus-repository-manager.sh
bash-4.4$ cd /nexus-data/
bash-4.4$ ls
backup	blobs  cache  db  elasticsearch  etc  generated-bundles  instances  javaprefs  kar  karaf.pid  keystores  lock	log  orient  port  restore-from-backup	tmp
bash-4.4$ cd backup/
bash-4.4$ ls
analytics-2025-05-16-11-56-22-3.70.1-02.bak  component-2025-05-16-11-56-22-3.70.1-02.bak  config-2025-05-16-11-56-22-3.70.1-02.bak  security-2025-05-16-11-56-22-3.70.1-02.bak
bash-4.4$ exit

示例是 k8s 方式,docker 部署也是类似。

数据迁移

查询对应 nexus-db-migrator 迁移工具

需要下载和你 Nexus 版本匹配的 nexus-db-migrator 工具, 最新版本下载 nexus-db-migrator, 目前最新版本是 3.70.4-02

大概格式如下:

https://download.sonatype.com/nexus/nxrm3-migrator/nexus-db-migrator-<version版本号>.jar

由于我的版本是 3.70.1-02, 选择下载

https://sonatype-download.global.ssl.fastly.net/repository/downloads-prod-group/nxrm3-migrator/nexus-db-migrator-3.70.1-03.jar

可能你对应的版本不存在,可以尝试改 patch 版本,实在不行你就先升级到 3.70.4 最新版本

再次提醒版本一定要匹配上

操作

进入容器内部操作,方便起见, 确保在 /nexus-data/backup 目录下

bash-4.4$ pwd
/nexus-data/backup

下载迁移工具,或者同步到容器内也行(网络不好的情况下)

curl -s -L -O https://sonatype-download.global.ssl.fastly.net/repository/downloads-prod-group/nxrm3-migrator/nexus-db-migrator-3.70.1-03.jar

停 nexus 服务

/opt/sonatype/nexus/bin/nexus stop

执行迁移操作,将数据迁移到 H2 数据库,根据数据量和配置灵活调整 -Xmx4G -Xms4G 值,这里条件有限默认 4G, 执行完成如下图

java -Xmx4G -Xms4G -XX:+UseG1GC -XX:MaxDirectMemorySize=28672M -jar nexus-db-migrator-3.70.1-03.jar --migration_type=h2

再次停 nexus 服务

bash-4.4$ /opt/sonatype/nexus/bin/nexus stop
Shutting down nexus
nexus is not running.

查看迁移的数据

bash-4.4$ ls -ahl nexus.mv.db
-rw-r--r-- 1 nexus nexus 320K May 16 12:19 nexus.mv.db

将迁移的数据文件复制到 db 文件夹中

cp nexus.mv.db /nexus-data/db

然后退出容器

销毁容器

  • compose 部署
docker compose down nexus3
  • k8s 部署副本改成 0
kubectl scale --replicas 0 deploy/nexus3 -n nat

编辑配置文件

为啥不在容器里编辑,啥工具都没有不方便,而且这个配置持久化了

  • 默认配置如下 old
root@nat3:/data/k8s/local/nexus3/etc# cat nexus.properties
# Jetty section
# application-port=8081
# application-host=0.0.0.0
# nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
# nexus-context-path=/${NEXUS_CONTEXT}

# Nexus section
# nexus-edition=nexus-pro-edition
# nexus-features=\
#  nexus-pro-feature

# nexus.hazelcast.discovery.isEnabled=true
  • 新增 nexus.datastore.enabled=true, 新配置如下
root@nat3:/data/k8s/local/nexus3/etc# cat nexus.properties
# Jetty section
# application-port=8081
# application-host=0.0.0.0
# nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
# nexus-context-path=/${NEXUS_CONTEXT}

# Nexus section
# nexus-edition=nexus-pro-edition
# nexus-features=\
#  nexus-pro-feature

# nexus.hazelcast.discovery.isEnabled=true
nexus.datastore.enabled=true

启动老服务,验证数据库切换成功

  • compose 部署
docker compose up -d
  • k8s 部署副本改成 0
kubectl scale --replicas 1 deploy/nexus3 -n nat

观察日志,搜索 H2

2025-05-16 12:33:15,378+0000 INFO  [FelixStartLevel] *SYSTEM org.sonatype.nexus.datastore.DataStoreConfigurationDefaultSource - Loaded 'nexus' data store configuration defaults (Embedded H2)
2025-05-16 12:33:15,710+0000 INFO  [FelixStartLevel] *SYSTEM com.zaxxer.hikari.HikariDataSource - nexus - Starting...
2025-05-16 12:33:16,018+0000 INFO  [FelixStartLevel] *SYSTEM com.zaxxer.hikari.HikariDataSource - nexus - Start completed.
2025-05-16 12:33:16,020+0000 INFO  [FelixStartLevel] *SYSTEM org.sonatype.nexus.datastore.mybatis.MyBatisDataStore - nexus - Loading MyBatis configuration from /opt/sonatype/nexus/etc/fabric/mybatis.xml
2025-05-16 12:33:16,147+0000 INFO  [FelixStartLevel] *SYSTEM org.sonatype.nexus.datastore.mybatis.MyBatisDataStore - nexus - MyBatis databaseId: H2
2025-05-16 12:33:16,346+0000 INFO  [FelixStartLevel] *SYSTEM org.sonatype.nexus.datastore.mybatis.MyBatisDataStore - nexus - Creating schema for UpgradeTaskDAO

升级版本失败

直接替换镜像升级就完成了,然后我的数据就没了 😂, 严格按照官方文档来的哇 😂

后续

  • 云缘生镜像站暂停营业几天
  • 虽然有备份数据,但是不想回滚了,重新部署,数据存储使用 PG 吧

  •  

Caddy拦截响应处理小记

2025年5月15日 20:34

简单小记,分享一下,主要还是针对 MinIO 异常的处理,其他服务应该也类似

之前配置 MinIO:

xxxx {
        import ERR
        import LOG "/var/log/caddy/minio.log"
        @rootPath {
                path /
        }
        handle @rootPath {
                respond "EdgeONE 403 Forbidden" 403
        }
        reverse_proxy 127.0.0.1:9000
}

仅禁止访问/,且有问题使用 import ERR 兜底

(ERR) {
	handle_errors {
		redir https://dxgw-{err.status_code}.external.ysicing.net
	}
}

之前没太注意,之前这种情况下,如果 MinIO 放回 400 的话是没法拦截的。这时候需要响应匹配器来干活了

域名 {
		import LOG "/var/log/caddy/minio.log"
	    import ERR
        @rootPath {
                path /
        }
        handle @rootPath {
                respond "EdgeONE 403 Forbidden" 403
        }
        reverse_proxy 127.0.0.1::9000 {
	     		@error status 4xx
	     		handle_response @error {
 						respond "EdgeONE 451 Forbidden" 451
				}
		}
}

handle_response 块内,可以使用任何其他指令,功能还挺强大的


  •  

CodeBuddy腾讯云代码助手初体验

2025年5月13日 19:52

本文算个安利吧,目前比 trae 实在,至少不是老是排队,暂时免费使用。

CodeBuddy 是什么

腾讯云出品的代码助手插件, 支持 VSCodeJetBrains微信开发者工具

对比 Cursor

对比我用的 cursor,目前有两大优势

  • 暂时免费(Craft 对话限制 50 次/月,很容易用完的)
  • Craft 支持从用户需求转到研发需求,最后拆分成迭代执行(很早之前,就跟同事讨论过这个问题,这个应该是未来发展的趋势)

安装

插件安装教程, 安装完成后,扫码登录

使用

简单演示,空仓库如何写一个 caddy 插件

mkdir go/src/github.com/ysicing/caddy2-admin-ui
cd go/src/github.com/ysicing/caddy2-admin-ui
git init
go mod init

配置助手,默认全启用

  • 用户需求 - 研发需求

  • 研发需求 - 迭代执行

  • 迭代 1 - 迭代 n

可能问题

除写了"垃圾代码"外,偶尔不会重构代码外,Agent 执行命令提示没法获取结果,需要 ~/.zshrc 新增如下配置

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"

总结

用的不多,偶尔用用还行,更多的还得关注他们后续的付费计划。


  •  

ImageFlow一款更适合个人使用的图床项目

2025年5月11日 22:45

ImageFlow 是一个为现代网站和应用程序设计的高效图像服务系统。它能根据设备类型自动提供最合适的图像,并支持 WebP 和 AVIF 等现代图像格式,显著提升网站性能和用户体验。

主要特性

  • API 密钥认证:安全的 API 密钥验证机制,保护您的图片上传功能
  • 自适应图像服务:根据设备类型(桌面端/移动端)自动提供横向或纵向图片
  • 现代格式支持:自动检测浏览器兼容性并提供 WebP 或 AVIF 格式图片
  • 图片过期功能:支持设置图片过期时间,过期后自动删除(支持本地和 S3 存储)
  • 简单的 API:通过简单的 API 调用获取随机图片,支持标签过滤
  • 用户友好的上传界面:支持拖拽上传,具有暗黑模式、实时预览和标签管理功能
  • 图片管理功能:通过直观的管理界面查看、筛选和删除图片
  • 自动图像处理:上传后自动检测图像方向并转换为多种格式
  • 异步处理:图像转换在后台进行,不影响主服务
  • 高性能:优化的网络性能以减少加载时间
  • 易于部署:简单的配置和部署流程
  • 多存储支持:支持本地存储和 S3 兼容存储(如 R2, 不支持MinIO
  • Redis 支持:可选的 Redis 集成,用于元数据和标签存储,提高性能

项目地址

快速部署

使用 docker compose 快速操作

  • 镜像: soyorins/imageflow
  • 国内镜像: ccr.ccs.tencentyun.com/k7scn/imageflow
git clone https://github.com/Yuri-NagaSaki/ImageFlow && cd ImageFlow

更新配置文件

cp .env.example .env
nano .env
# 主要修改API_KEY和存储方式,想快速体验建议填写local

示例.env

API_KEY=ohji8lob1Sagoh4shizooNe9oxif9pai
STORAGE_TYPE=local
LOCAL_STORAGE_PATH=static/images
CUSTOM_DOMAIN=
MAX_UPLOAD_COUNT=20
IMAGE_QUALITY=75
WORKER_THREADS=4
SPEED=5
WORKER_POOL_SIZE=4
# Debug Mode
DEBUG_MODE=false

启动

docker compose up -d
  • 目前版本存在 panic 问题,等后续版本修复, 可以使用 soyorins/imageflow:2.1.1 版本

常见参数设置

  • API_KEY, 用于保护上传和管理接口, 推荐使用 pwgen 32 1 生成
  • IMAGE_QUALITY, WebP 转换的质量设置, 数值范围 1-100, 越高表示质量越好,文件越大
  • SPEED, 范围:0-8 0-8,0=最慢/最高质量,8=最快/最低质量

如何使用

  • 打开 IP:8686 端口 输入你在 env 设置的 API_Key

  • 上传图片, 支持选择图片的过期时间,添加标签对图片进行分类,图片会自动转换为 WebP 和 AVIF 格式

  • 当删除图片时,所有相关格式(原始、WebP、AVIF)将同时被移除

  •  

FileCodeBox:告别网盘烦恼,安全高效的文件分享神器

2025年5月9日 22:13

在日常工作生活中,处理敏感项目文件时,担心文件被第三方泄露; 使用第三方网盘时还要下载客户端(客户端有时还给你偷跑流量,美名加速),有时下载还得开会员。如果有这些问题的话,我强烈安利一款开源利器——FileCodeBox!它开源、好用、安全,完美解决文件分享的各种难题,让你轻松搞定工作和生活中的文件传输。

开源地址

  • 代码仓库 vastsa/FileCodeBox
  • 镜像地址: lanol/filecodebox
  • 国内镜像: ccr.ccs.tencentyun.com/k7scn/filecodebox

三大优势,解决分享痛点

FileCodeBox 专为文件分享的痛点设计,简单几步就能让你的分享体验焕然一新

超快传输,省时省心

速度取决于你的网络带宽

  • 无大小限制:无论是高清设计稿还是海量项目文件,统统支持,轻松上传
  • 拖拽即传:无需压缩打包,直接拖文件到页面,秒速完成上传
  • 批量分享:支持多文件同时上传和分享,项目交付、团队协作 so easy!

安全可靠,隐私无忧

  • 加密保护:分享链接全程加密,只有指定接收者才能访问,杜绝泄露风险
  • 阅后即焚:支持设置文件过期时间,自动删除,防止资料被长期留存
  • 下载控制:可限制链接使用次数或者有效期,避免文件被恶意传播,敏感资料更安心

极致便捷,随时随地

  • 无需注册:凭码取件
  • 清爽体验:界面简洁

部署简单

要求

以下任选一个就行,我推荐使用腾讯云锐驰 200M,存储使用赠送的对象存储 😄

  • 有公网 IP 的服务器
  • 内网穿透走 cloudflare tunnels

PS: FileCodeBox 也支持对象存储,这里我就不推荐 MinIO 了直接使用本地存储就行,因为这个分享服务我定位是短期临时分享或者按次永久分享。

部署

  • docker-compose.yaml
version: "3"
services:
  filecodebox:
    image: lanol/filecodebox:latest
    # image: ccr.ccs.tencentyun.com/k7scn/filecodebox
    container_name: filecodebox
    volumes:
      - /data/filecodebox:/app/data
    ports:
      - "12345:12345"
    restart: always
  • caddy
kd.012321.best {
        import LOG "/var/log/caddy/kd.log"
        reverse_proxy 10.25.123.1:12345
}

分享文件

  • 打开网页,点击"分享文件"
  • 选择或拖拽文件
  • 设置过期时间和次数
  • 获取提取码

获取文件

  • 打开网页,输入提取码
  • 点击获取
  • 下载文件或查看文本

是不是用 FileCodeBox 分享文件,简单到不可思议。整个过程无需复杂操作,接收方也不需要注册,真正“即传即得”!

管理面板

访问 /#/admin
输入管理员密码 FileCodeBox2023, 登录后请立即修改

管理文件和配置

如果需要发送私密信息,建议自建请勿使用第三方服务,避免不必要的问题

最后想说

在数据安全越来越重要的今天,FileCodeBox 不仅是一款工具,更是一种自由、安全的文件分享方式。它让分享变得高效、可控,完美适配各种场景。如果你也厌倦了网盘的限速和收费,或为敏感文件的隐私问题担忧,FileCodeBox 绝对值得一试!
快部署你的 FileCodeBox,体验前所未有的文件分享自由吧!


  •  

安利一下我最近写的两个caddy插件

2025年5月7日 22:07

我个人 Caddy 粉哈,习惯 Caddy 一梭子,从我历史博客中就可以看出来。最近写了两个 Caddy 的插件,geocngfw.

源码及镜像

源码 ysicing/dockerfiles#caddy

以下是我构建好的镜像,可以根据自己的环境拉取

  • ysicing/caddy2
  • ghcr.io/ysicing/caddy2
  • registry.cn-beijing.aliyuncs.com/k7scn/caddy2
  • ccr.ccs.tencentyun.com/k7scn/caddy2

源码构建

需要 go 环境了

go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
xcaddy build \
    --with github.com/caddyserver/jsonc-adapter \
    --with github.com/caddy-dns/cloudflare \
    --with github.com/caddy-dns/tencentcloud \
    --with github.com/caddy-dns/alidns \
    --with github.com/ysicing/caddy2-geocn \
    --with github.com/ysicing/caddy2-gfw \
    --with github.com/mholt/caddy-dynamicdns \
    --with github.com/mholt/caddy-events-exec \
    --with github.com/WeidiDeng/caddy-cloudflare-ip \
    --with github.com/xcaddyplugins/caddy-trusted-cloudfront \
    --with github.com/mholt/caddy-l4 \
    --with github.com/mholt/caddy-webdav \
    --with github.com/mholt/caddy-ratelimit

插件 geocn

  • 源码:https://github.com/ysicing/caddy2-geocn
  • 用途:识别来源 ip 是否为中国 ip,我的大部分服务都开启了这个,只针对大陆放行,甚至部分服务只针对部分省市(误判比较大,后续有需要也可以开源 😄)
@china {
		geocn 
	}
	file_server @china {
		root ./docker/example/deny
	}

上面是默认参考,正常情况下不需要调整,GeoIP 数据源来自 Hackl0us/GeoIP2-CN,支持自定义

geocn {
 georemote 你的自定义地址
}

插件 gfw

{
    order gfw before respond
}

:80 {
    gfw {
        # 基本规则配置
        block_rule ip:1.2.3.4
        block_rule url:/admin
        block_rule ua:curl
        block_rule_file /path/to/rules.txt
        ttl 24h

        # 额外安全检测(默认关闭)
        enable_extra true
    }
}

目前是所有实例共享黑名单的,命中就 1 天黑名单直接返回 403,之前想的是命中后触发 hook 执行 iptables 封禁 ip,但是容器跑的好像不太方便。

最后

大家对 Caddy 插件有什么的需求或者想法么?


  •  

轻松部署 Alist + MinIO,打造你的专属私人网盘

2025年5月6日 20:49

还在为网盘限速、空间不足而焦虑?想要一个安全、快速、完全掌控的私人网盘?今天带你一步步用 Alist 结合 MinIO,快速搭建一个高性能的私人云存储,文件管理从此自由无忧!

部署非常简单,也很适合内网私有化部署。另外这也是一个开源项目,社区灵活度特别高,对接的存储类型非常丰富,但是本文还是着重写写对接 minio。今天的音频调了几版,目前这版相关好点

什么是 Alist 和 MinIO?

  • Alist:一款开源免费的目录列表程序,支持挂载多种存储(如本地存储、云盘、对象存储等),提供简洁美观的界面,支持文件预览、下载、分享等功能。简单来说,它是你文件管理的“超级中枢”。
  • MinIO:一个高性能、分布式的对象存储服务,兼容 S3 协议,适合搭建私有云存储。相比第三方网盘,MinIO 让你完全掌控数据,安全又高效。

通过 Alist + MinIO 的组合,你可以轻松打造一个私有网盘,享受无限存储空间和极速访问体验!

Alist + MinIO 的优势

  • 多存储支持:Alist 支持 MinIO、本地存储、OneDrive、阿里云盘等多种存储方式,灵活扩展。
  • 简洁易用:Alist 界面美观直观,操作简单。
  • 高性能:MinIO 提供企业级的对象存储性能,适合大文件存储和高速访问。
  • 安全可靠:数据存储在你自己的服务器上,隐私有保障。
  • 开源免费:Alist 和 MinIO 均为开源项目,自由使用,社区活跃。

部署步骤:Alist + MinIO 一键搞定

以下以 Docker 部署为例,带你快速搭建 Alist 和 MinIO 的组合。这里就跳过 MinIO 部署相关了,之前也讲过,可以查看我之前写的文章:

准备工作

  • 准备好 MinIO 的账号即可,有存储视频资源最好不过

镜像

根据实际情况来,默认 aio 镜像已经包含本地存储缩略图 ffmpeg 和离线下载 aria2, 后面需要用的上

  • xhofe/alist:main-aio
  • 国内镜像 ccr.ccs.tencentyun.com/k7scn/alist:main-aio

创建 docker compose 文件

  • docker-compose.yml
services:
  alist:
    image: xhofe/alist:main-aio
    # image: ccr.ccs.tencentyun.com/k7scn/alist:main-aio
    container_name: alist
    ports:
      - "5244:5244"
    volumes:
      - /data/alist:/opt/alist/data # 应用程序持久化数据
      - /data/share:/opt/share # 本地存储,可选
    environment:
      - TZ=Asia/Shanghai
      - ALIST_ADMIN_PASSWORD=goxee7dieXeihu9uochoo6iquaighail
    restart: always

ALIST_ADMIN_PASSWORD 支持自定义密码,很早之前我提交的 PR😂,估计也就我一个人这么用。

启动容器

docker compose up -d

配置 caddy

caddy 配置比较简单

alist.ysicing.eu.org {
  reverse_proxy 100.90.80.2:5244
}

访问 alist

访问 Alist:在浏览器输入 http://你的服务器IP:5244 或者 caddy域名,进入 Alist 界面。

默认用户名是 admin, 密码是你配置的 ALIST_ADMIN_PASSWORD 值信息

挂载 MinIO 存储

登录 Alist,点击 管理 > 存储 > 添加

选择存储类型为对象存储

填写以下信息:

  • 挂载路径:自定义,例如 /minio。
  • Endpoint:http://minio 域名地址:9000。
  • Bucket:填写你在 MinIO 创建的存储桶名称,例如 ja。
  • Access Key 和 Secret Key:填入 MinIO 控制台生成的密钥。
  • 强制路径样式:默认勾选
  • 地区:默认留空

保存配置后,返回 Alist 主页,即可看到挂载的 MinIO 存储

可以上面的操作后就可以通过 Alist 浏览、分享 MinIO 中的文件,支持在线预览、下载等功能。

其他

官方文档

总结

通过 Alist 和 MinIO 的组合,你可以轻松搭建一个功能强大、安全可靠的私人网盘,告别存储焦虑!无论是个人文件管理还是团队协作,这个方案都能满足你的需求。快动手试试吧!


  •  

私有化部署无名杀卡牌游戏

2025年5月5日 19:52

部署非常简单,非常适合收藏,内网私有化部署。另外这是一个开源项目,灵活度比较高。

项目地址

https://github.com/libnoname/noname

镜像

可以根据自己的网络情况选择对应的镜像下载,镜像比较大, 大概 3.5G 左右。

  • hsiaoshun/noname
  • ccr.ccs.tencentyun.com/k7scn/noname

部署 compose

services:
  noname:
    image: hsiaoshun/noname
    # image: ccr.ccs.tencentyun.com/k7scn/noname
    container_name: noname
    ports:
      - '6080:80'
    restart: always

端口配置

  • 80 游戏本体网页版入口
  • 8080 WS 协议,联机大厅服务(客户端使用)

caddy 代理

示例,不建议公网跑,对带宽有点要求

sgs.ysicing.eu.org {
reverse_proxy 100.90.80.2:6080
}

联机大厅配置说明

目前只支持 windows 和安卓

注意: 结尾的/不能省略, 如果没有证书就是 ws,有证书就是 wss

其他

如果有更多兴趣的话,可以看看无名杀懒人包。


  •  

Debian常用初始化流程

2025年5月5日 14:50


在搭建 k3s 轻量级 Kubernetes 集群时,Debian 系统因其稳定性和灵活性成为首选。然而,Debian 默认配置可能无法满足 k3s 的需求,需要通过初始化优化系统设置。本文将分享一套针对 k3s 环境的 Debian 初始化方案,涵盖基础包安装、系统配置和防火墙规则,仅供参考。

安装基础包

以下命令安装 k3s 集群所需的基础工具,保持系统轻量:

export DEBIAN_FRONTEND=noninteractive
apt update -qq
apt remove -y -qq ufw lxd lxd-client lxcfs lxc-common
apt install --no-install-recommends --no-install-suggests -y -qq nfs-common iptables conntrack jq socat bash-completion open-iscsi rsync ipset ipvsadm htop net-tools wget psmisc git curl nload ebtables ethtool procps

配置系统

配置 ssh

修改 ssh 端口,设置密钥登录,禁用密码登录。这些比较常见,这里就不细说了。

更新内核

之前好像也写过,通常我都是使用最新内核,仅供参考.(通常也会踩坑比较多)

curl https://c.ysicing.net/oss/scripts/debian-upcore.sh | bash
# 或者
apt install -t bookworm-backports linux-image-amd64 -y

配置 system 相关

调整 Systemd 的资源限制和日志设置

mkdir -pv /etc/systemd/system.conf.d
cat > /etc/systemd/system.conf.d/30-k8s-ulimits.conf <<EOF
[Manager]
DefaultLimitCORE=infinity
DefaultLimitNOFILE=100000
DefaultLimitNPROC=100000
EOF

mkdir -pv /etc/systemd/journald.conf.d /var/log/journal

cat > /etc/systemd/journald.conf.d/95-k3s-journald.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 最大占用空间 2G
SystemMaxUse=2G
# 单日志文件最大 100M
SystemMaxFileSize=100M
# 日志保存时间 1 周
MaxRetentionSec=1week
# 禁止转发
ForwardToSyslog=no
ForwardToWall=no
EOF

systemctl daemon-reload
systemctl restart systemd-journald

cat > /etc/modules-load.d/10-k3s-modules.conf <<EOF
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

systemctl daemon-reload
systemctl restart systemd-modules-load

配置防火墙规则

提示:8.8.8.8 为示例白名单 IP,请替换为实际 IP,搭配rc.local

  • /data/scripts/iprule.sh
#!/bin/bash
iptables -I INPUT -s 8.8.8.8 -j ACCEPT
iptables -I INPUT -p udp -j ACCEPT
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -i tailscale0 -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -I INPUT -s 172.16.0.0/12 -j ACCEPT
iptables -I INPUT -s 192.168.0.0/16 -j ACCEPT
iptables -I INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -j ACCEPT
iptables -A INPUT -j DROP

防火墙规则没考虑使用 iptables-save 等保存恢复,而是每次开启时重新配置。

总结

通过以上步骤,我们完成了一套针对 k3s 环境的 Debian 系统初始化,优化了网络、资源限制和安全性。你可以直接使用以下脚本一键初始化

curl https://c.ysicing.net/oss/scripts/init.sh

  •  

Debian 双栈网络时开启 IPv4 优先(音频版)

2025年5月3日 23:32

PS: 用 AI 生成的图老是不合法微信封面的比例,放到文尾。本文也提供音频版, 欢迎订阅我的微信公众号。

在如今的网络世界,IPv6 正在逐渐普及,但 IPv4 依然是许多场景的“老大哥”。如果你用的是 Debian 系统,并且身处 IPv4 和 IPv6 共存的双栈网络环境,可能会发现系统默认优先使用 IPv6——这在某些情况下并不理想,比如某些服务只支持 IPv4,或者 IPv6 连接不稳定。今天,我们就来聊聊如何在 Debian 上实现 IPv4 优先,甚至在需要时完全禁用 IPv6。跟着这篇教程,轻松搞定网络配置!

为什么需要调整网络优先级?

先来点背景知识:双栈网络指的是设备同时支持 IPv4 和 IPv6 协议栈。现代操作系统(如 Debian)和浏览器通常默认优先使用 IPv6,只有当 IPv6 连接失败时才会“退而求其次”用 IPv4。这听起来很智能,但在实际场景中可能会遇到问题:

  • 服务兼容性:某些老旧服务或内网应用只支持 IPv4,IPv6 优先可能导致连接失败
  • 网络性能:部分网络环境下,IPv6 的延迟或稳定性不如 IPv4
  • 特殊需求:比如开发测试时,你可能希望强制使用某一种协议

所以学会调整 IPv4 和 IPv6 的优先级,或者在极端情况下禁用 IPv6,是每个 Debian 用户的“进阶技能”。下面,我们一步步教你搞定!

让 IPv4 优先:修改 gai.conf 文件

Debian 系统中,/etc/gai.conf 文件控制了 getaddrinfo 函数的行为,这个函数决定了系统如何选择 IPv4 或 IPv6 地址。默认情况下,IPv6 优先,但我们可以通过简单修改让 IPv4 站到“C 位”。

修改步骤

打开终端,输入以下命令编辑 /etc/gai.conf

#precedence ::ffff:0:0/96  100

去掉 # 号,修改为:

precedence ::ffff:0:0/96  100

保存并退出。

懒人福利:如果你不想手动编辑,可以直接用这条命令一键搞定:
bash

sed -i 's/#precedence ::ffff:0:0\/96  100/precedence ::ffff:0:0\/96  100/' /etc/gai.conf

测试效果

配置完成后,用 curl 命令测试一下:

curl ip.sb

也可以使用

# 查询本机外网IPv4地址
curl 4.ipw.cn

# 查询本机外网IPv6地址
curl 6.ipw.cn

# 测试网络是IPv4还是IPv6访问优先(访问IPv4/IPv6双栈站点,如果返回IPv6地址,则IPv6访问优先)
curl test.ipw.cn

如果返回的是类似 6.6.6.6 的 IPv4 地址,恭喜你,IPv4 优先已生效!如果返回的是类似 2001:db8::2 的 IPv6 地址,检查是否正确保存了配置。

原理

::ffff:0:0/96 是 IPv4 地址在 IPv6 协议中的映射范围,设置其优先级为 100(高于默认 IPv6 的优先级),系统就会优先选择 IPv4 地址。

特殊场景:强制 IPv6 优先

有些朋友可能有“奇特”需求,比如测试 IPv6 环境或某些服务明确要求 IPv6 优先。别担心,我们也可以反向操作!

同样编辑 /etc/gai.conf, 在文件末尾添加以下两行:

label 2002::/16    1
label 2001:0::/32   1

保存退出,或者用命令一键添加:
bash

echo -e "label 2002::/16    1\nlabel 2001:0::/32   1" | sudo tee -a /etc/gai.conf

原理

2002::/162001:0::/32 是常见的 IPv6 地址段,设置它们的 label 优先级为 1,确保系统优先选择这些 IPv6 地址。IANA 目前分配的公网 IPv6 地址还未覆盖到 3000:0000::/4,所以这招基本万无一失

(这个未测试过,仅供参考)

极端情况:完全禁用 IPv6

如果你的网络环境压根不需要 IPv6,或者 IPv6 总给你添乱,可以直接禁用它。以下是禁用 IPv6 的方法,适合“断舍离”爱好者。
编辑 /etc/sysctl.conf 文件:

net.ipv6.conf.all.disable_ipv6 = 1
# 禁用eth0的ipv6
net.ipv6.conf.eth0.disable_ipv6 = 1

结语

通过简单的配置文件调整,你就可以在 Debian 双栈网络中自由掌控 IPv4 和 IPv6 的优先级,甚至彻底禁用 IPv6。无论是提升网络兼容性、优化性能,还是满足特定需求,这些技巧都能让你事半功倍!


  •  

Debian 12 解决 /etc/rc.local 开机启动问题

2025年5月3日 06:59

在 Debian 12(以及 Debian 9 及以上版本)中,/etc/rc.local 是配置开机自启动脚本的传统方式,但默认未启用,导致自定义脚本无法自动运行。本文将详细指导你在 Debian 12 上启用和配置 /etc/rc.local,步骤同样适用于 Debian 9 Stretch、10 Buster 和 11 Bullseye

问题背景:rc.local 为什么不生效?

Debian 9 起采用 systemd 作为初始化系统,传统的 /etc/rc.local 默认不生效。尽管系统内置了 rc-local,但默认处于禁用状态:

root@debian:~$ systemctl status rc-local.service
○ rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/lib/systemd/system/rc-local.service; static)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: inactive (dead)
       Docs: man:systemd-rc-local-generator(8)

以下是默认的 rc-local.service 配置,表明它会在 /etc/rc.local 可执行时自动拉起:

root@docker:~$ systemctl cat rc-local.service
# /lib/systemd/system/rc-local.service
#  SPDX-License-Identifier: LGPL-2.1-or-later
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

# /usr/lib/systemd/system/rc-local.service.d/debian.conf
[Unit]
# not specified by LSB, but has been behaving that way in Debian under SysV
# init and upstart
After=network-online.target

# Often contains status messages which users expect to see on the console
# during boot
[Service]
StandardOutput=journal+console
StandardError=journal+console

解决步骤:启用 /etc/rc.local

以下步骤助你快速启用 /etc/rc.local,实现开机脚本自动运行

创建 /etc/rc.local 文件

默认没有 /etc/rc.local,我们需要手工添加一个 /etc/rc.local 文件:

cat <<EOF >/etc/rc.local
#!/bin/bash
# 这是一个示例 rc.local 文件
# 在这里添加你的开机执行命令
# 示例:启动一个自定义脚本
# /path/to/your/script.sh
exit 0
EOF

设置可执行权限

确保文件具有可执行权限

chmod +x /etc/rc.local

启用并立即启动 rc-local 服务

启动 rc-local 服务,此时可能会弹出警告,可直接忽略

systemctl enable --now rc-local

检查服务状态, 状态显示 active (exited) 表示服务已运行

root@docker:~$ systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility
     Loaded: loaded (/lib/systemd/system/rc-local.service; static)
    Drop-In: /usr/lib/systemd/system/rc-local.service.d
             └─debian.conf
     Active: active (exited) since Fri 2025-05-02 18:21:26 EDT; 3s ago
       Docs: man:systemd-rc-local-generator(8)
    Process: 333116 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
        CPU: 4ms

May 02 18:21:26 docker systemd[1]: Starting rc-local.service - /etc/rc.local Compatibility...
May 02 18:21:26 docker systemd[1]: Started rc-local.service - /etc/rc.local Compatibility.

添加自定义开机脚本

在 /etc/rc.local 的 exit 0 前添加命令。例如:

#!/bin/sh -e
#
# rc.local
#
# By default this script does nothing.
/data/scripts/ip.sh || true
exit 0

注意:使用绝对路径(如 /data/scripts/ip.sh),确保脚本有执行权限。|| true 可防止脚本失败影响。

测试配置

重启系统

总结

通过以上步骤,你可以在 Debian 9 及以上版本快速启用 /etc/rc.local,实现开机自动运行脚本。尽管 systemd 提供更现代的方案,rc.local 仍适合简单任务


  •  

深入浅出 MinIO:身份管理与权限配置实战

2025年5月2日 01:21

前面刚刚讲了如何搭建 MinIO,本文趁热打铁手把手教你如何配置 MinIO 权限配置。对于略懂 MinIO 的用户,配置权限可能是个挑战:如何安全地让别人读取存储内容,但不能列出所有存储桶或文件列表?或者让某个存储桶的内容可以列出? 本文将深入讲解 MinIO 的身份管理和权限配置,聚焦存储桶权限(private、public、custom)的区别和 匿名访问 的应用,通过清晰的场景示例,教你实现安全分享,同时保护数据

MinIO 身份管理基础

MinIO 的身份管理负责用户认证和授权,默认使用内置身份提供者(IDP)。核心概念包括:

  1. 用户(User)
    用户通过 Access Key(用户名)和 Secret Key(密码)访问 MinIO,可用命令行工具 mc 或 Web 控制台管理。
  2. 服务账号(Service Account)
    服务账号是为应用程序设计的专用凭证,无法登录控制台,但可通过 API 访问资源,适合自动化脚本或服务集成。
  3. 策略(Policy)
    JSON 格式的策略定义用户、服务账号或匿名访问对存储桶(Bucket)和对象(Object)的权限,基于 AWS S3 语法。
  4. 匿名访问(Anonymous Access)
    允许未认证用户(无 Access Key)通过 URL 或 API 访问特定资源,需通过存储桶权限配置。

用户组:可通过 mc admin group 批量管理用户权限,本文不展开。

我们的目标是:安全地让匿名用户或服务账号读取特定内容,限制列出存储桶或文件列表,或有选择地允许列出某个存储桶的内容。

准备工作

  1. 确保 MinIO 运行:假设 MinIO 部署在 http://localhost:9000,管理员账号为 homes4,密码为 aiy0ooCheephai0ohNahmu3Aijee6eiv
  2. 安装 mc 工具:下载 MinIO 客户端(mc),用于配置权限(支持 Windows、Mac、Linux)。
  3. 配置 mc
mc alias set homes4 http://localhost:9000 homes4 aiy0ooCheephai0ohNahmu3Aijee6eiv
Added `homes4` successfully.

准备好后,我们开始配置权限!

PS:命令行方式和可视化操作效果是一样的,下文会穿插着来,但是主要还是以可视化 web 操作为主

存储桶权限:Private、Public 和 Custom

MinIO 的存储桶权限控制匿名访问行为,分为 privatepubliccustom 三种模式,可通过 mc anonymous 命令设置。以下是它们的区别

Private(私有)

  • 定义:禁止所有匿名访问,仅允许认证用户或服务账号(有 Access Key 和策略授权)访问。
  • 适用场景:保护敏感数据,如内部文档、用户数据。
  • 效果:匿名用户访问存储桶或对象时,返回 403 Forbidden
  • 配置:mc anonymous set none homes4/web

Public(公开)

注意:风险较高,容易暴露所有文件,慎用。(我个人基本不用)

  • 定义:允许匿名用户访问,权限包括:

    • download:只读(s3:GetObject)
    • upload:只写(s3:PutObject)。
    • public:读写均可。
  • 适用场景:分享公开资源,如网站静态文件、开源软件。

  • 配置(只读):mc anonymous set download homes4/web

  • 效果:匿名用户可通过 URL(如 http://localhost:9000/web/file.jpg)读取对象,可能列出文件列表(若未限制)。

Custom(自定义)

推荐用

  • 定义:通过 JSON 策略精确控制匿名访问权限,如限制特定路径或操作。
  • 适用场景:部分公开,如只分享某个文件夹,或禁止列出文件列表。
  • 配置:见下文场景示例。
  • 效果:灵活性最高,匿名用户只能执行策略允许的操作。

存储桶权限区别总结

模式 匿名访问权限 适用场景 配置命令
Private 禁止匿名访问 敏感数据 mc anonymous set none
Public 读、写或读写(看设置) 公开资源 mc anonymous set download upload/public
Custom 自定义(JSON 策略) 部分公开、精确控制 mc anonymous set-json

实战:安全分享存储内容

通过一个最常见的场景,教你如何:

  • 让匿名用户只读特定文件,禁止列出存储桶或文件列表。

此外,还会写如何用服务账号为应用程序提供类似权限。

新建存储桶

先创建一个存储桶,默认创建的存储桶都是私有权限

root@docker:~$ mc mb homes4/cli
Bucket created successfully `homes4/cli`.
root@docker:~$ mc ls homes4
[2025-05-01 11:26:11 EDT]     0B cli/
[2025-05-01 11:23:57 EDT]     0B ddd/
[2025-05-01 10:38:53 EDT]     0B homes4/
[2025-05-01 11:29:06 EDT]     0B web/

场景:只读特定文件,禁止列出存储桶或文件列表

需求:存储桶 web 包含 public/photo.jpg 和 private/secret.pdf。想让匿名用户只读 photo.jpg,但不能列出 web 桶中 的文件列表,也不能访问其他文件或存储桶

步骤:

设为 Private(默认安全)

mc anonymous set none homes4/web

创建自定义策略:只允许匿名读取 public/photo.jpg

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["s3:GetObject"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::web/public/photo.jpg"],
      "Principal": "*"
    }
  ]
}
  • s3:GetObject:允许读取对象
  • Resource:精确到 photo.jpg, 例如你想某个目录读写 arn:aws:s3:::web/public/*
  • Principal: "*":表示匿名用户
  • s3:ListBucket:禁止列出文件列表

应用策略

mc anonymous set-json custom.json homes4/web

控制台可以直接编辑存储桶的 Access Policy,改成 Custom,内容和上面一致

查看策略

root@docker:~$ mc anonymous get-json homes4/web
{
 "Statement": [
  {
   "Action": [
    "s3:GetObject"
   ],
   "Effect": "Allow",
   "Principal": {
    "AWS": [
     "*"
    ]
   },
   "Resource": [
    "arn:aws:s3:::web/public/photo.jpg"
   ]
  }
 ],
 "Version": "2012-10-17"
}

效果

  • 匿名用户可通过 http://localhost:9000/web/public/photo.jpg 下载 photo.jpg。
  • 其他访问都是 403

服务账号:为应用程序配置相同权限

需求:为应用程序(如网站后端)提供只读 public/photo.jpg 的权限,类似上述场景,但通过服务账号实现

步骤:

创建用户(服务账号需绑定到用户):

密码长度需要 8-40

mc admin user add homes4 app1user app1pass

web 可视化操作,policy 那里随便选个小权限的,后面需要调整

创建服务账号:为 app1user 生成服务账号,绑定 custom.json 策略

mc admin user svcacct add homes4 app1user --access-key svc1 --secret-key svc1pass --policy custom.json

可视化操作创建服务状态,凭证信息会随机生成,且只显示一次

策略信息只能在生成 access key 后才能编辑操作

实用技巧:兼顾安全与便利

  • 优先 Custom 模式:比 public 安全,精确控制分享内容。
  • 避免 Public 模式:除非真想完全公开,否则可能暴露所有文件。
  • 检查权限:定期用 mc anonymous get-json homes4/web 确认存储桶权限
  • 随机存储桶名:用随机名,降低被猜到风险
  • 用预签名 URL 临时分享:生成带有效期的链接,过期失效:
# 分享下载链接,下载速度限制10MB/s有效期7天
mc share download --limit-download 10MB homes4/web/private/secret.pdf

总结

MinIO 的权限配置简单而灵活,用服务账号拥有某个存储桶的只读权限就行了。


  •  

超简单!5分钟用群晖搭建 MinIO + Caddy 对象存储

2025年5月1日 18:12

对象存储和 Web 服务是开发者必备工具。MinIO 凭借高性能和 S3 兼容性成为存储领域的“顶流”,Caddy 则以自动 HTTPS 和极简配置深受开发者喜爱。结合 Docker Compose,只需 5 分钟,你就能搭建一个安全、高效的对象存储服务!本文手把手教你部署 MinIO + Caddy。

前提要求

  • 群晖/大盘鸡(大硬盘 VPS):运行 MinIO 服务。
  • 大带宽机器(如腾讯云锐驰 200):运行 Caddy,代理 MinIO 服务。
  • 组网服务(如 Tailscale/EasyTier):确保内网互联互通

我的网络环境通过组网服务实现全链路打通,家里的群晖与腾讯云锐驰无缝互联,Caddy 代理内网 MinIO 服务,借助锐驰大带宽对外提供高效访问。

为啥选择 MinIO + Caddy

  • MinIO:开源、S3 兼容、支持分布式存储,轻松应对海量数据。
  • Caddy:自动 HTTPS、配置简洁,专为高并发优化,支持丰富插件。
  • Docker Compose:一键部署多容器,省时省力。

组合优势:Caddy 为 MinIO 提供安全访问和负载均衡,Docker Compose 确保部署简单,完美适配静态文件托管、API 服务或私有云存储。

5 分钟快速部署

根据需求,可选择在同一机器上部署或分布式部署。我因跨机器需求,选择分布式部署。

部署 MinIO

群晖已支持 Docker Compose,通用配置如下:

  • docker-compose.yaml
version: "3"
services:
  minio:
    image: bitnami/minio:2025
    # image: ccr.ccs.tencentyun.com/k7scn/minio:2025
    container_name: minio
    restart: always
    environment:
      - MINIO_ROOT_USER=homes4
      - MINIO_ROOT_PASSWORD=aiy0ooCheephai0ohNahmu3Aijee6eiv
      - MINIO_DEFAULT_BUCKETS=homes4
    ports:
      - '9000:9000'
      - '9001:9001'
    volumes:
      - '/volume1/docker/minio/data:/bitnami/minio/data'

注意:可能遇到目录权限问题,可运行以下命令解决:
chmod 777 /volume1/docker/minio/data -R

访问 MinIO 管理界面

在浏览器输入 http://NAS_IP:9001http://域名:9001,进入 MinIO 登录页面,使用 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 登录。

安装客户端

提供 Linux/amd64 的 mc 客户端下载链接:

https://c.ysicing.net/oss/tiga/linux/amd64/mc

或从官网获取最新客户端 Install mc

部署 Caddy

  • docker-compose.yaml
services:
  caddy:
    image: ysicing/caddy2
    # image: ccr.ccs.tencentyun.com/k7scn/caddy2
    container_name: caddy
    restart: always
    # 可选host或者端口映射
    network_mode: host
    volumes:
      - '/data/caddy/cfg:/etc/caddy'
      - '/data/caddy/data:/data'
      - '/data/caddy/config:/config'
      - '/data/caddy/log:/var/log/caddy'

此 Caddy 镜像为我的定制版,内置以下常用插件:

xcaddy build \
    --with github.com/caddy-dns/cloudflare \
    --with github.com/caddy-dns/tencentcloud \
    --with github.com/caddy-dns/alidns \
    --with github.com/caddy-dns/dnspod \
    --with github.com/ysicing/caddy2-geocn \
    --with github.com/mholt/caddy-l4 \
    --with github.com/mholt/caddy-ratelimit

Caddy 配置

配置文件位于 /data/caddy/cfg,目录结构如下:

/data/caddy/cfg# tree
.
├── Caddyfile
├── load.sh
└── site
    ├── cr.caddy
    ├── dev.caddy
    ├── hub.caddy
    ├── http.caddy
    └── minio.caddy

Caddyfile 示例

(LOG) {
	log {
		output file "{args[0]}" {
			roll_size 50M
			roll_uncompressed
			roll_local_time
			roll_keep 3
			roll_keep_for 7d
		}
		format json
	}
}

(COMCFG) {
	encode zstd gzip
}

(ERR) {
	handle_errors {
    	# 异常重定向
		redir https://dxgw-{err.status_code}.caddy.local
	}
}

{
	debug
	# admin off
}

(TLS) {
tls {
  dns tencentcloud {
    secret_id AKID***
    secret_key CH85***
  }
}
}

import /etc/caddy/site/*.caddy

MinIO 配置

minio.caddy

域名 {
	import ERR
    # 如果是内网域名可以设置import TLS开启dns签发证书
    # import TLS
    import LOG "/var/log/caddy/minio.log"
	@rootPath {
		path /
	}
	handle @rootPath {
		respond "EdgeONE 451 Forbidden" 451
	}
    # 内网minio地址
    reverse_proxy 100.90.80.2:9000
}

同理,minio 控制台也是一样,通常控制台不对外开放,仅限内网访问。

minio-api.caddy

域名 {
	import ERR
    # 如果是内网域名可以设置import TLS开启dns签发证书
    # import TLS
    import LOG "/var/log/caddy/minio-api.log"
    @denied not remote_ip 192.168.1.0/24
    respond @denied "Access Denied" 403
    # 内网minio api地址
    reverse_proxy 100.90.80.2:9001
}

重新加载配置

curl "http://localhost:2019/load" -H "Content-Type: text/caddyfile" --data-binary @Caddyfile

使用 MinIO

配置 MinIO 客户端(mc)以访问服务:

# 内网
mc alias set home http://100.90.80.2:9000 homes4 aiy0ooCheephai0ohNahmu3Aijee6eiv
# 外网
mc alias set home https://域名 homes4 aiy0ooCheephai0ohNahmu3Aijee6eiv

更多场景可结合 restic,rclone,下载服务

写在最后

通过 MinIO 和 Caddy 的组合,你可以快速搭建一个高性能、安全的对象存储服务。本文提供的配置仅供参考,MinIO 还有更多玩法等待探索!


  •  

五一大盘大带宽物理服务器活动推荐

2025年4月30日 09:39

之前,也有小伙伴让我推荐几家物理服务器(后面简称杜甫), 趁着五一假期有活动,推荐两家我都在用的,各有优势,但是活动期价格会有优惠。

物语云

优点

  • 工单响应速度快
  • 有 DDoS 攻击防护
  • 大带宽流量套餐/上行限速的不限流量套餐(账单日可互换)
  • 测试不满意满足条件可退款

不足

  • 多台机器暂不支持组内网
  • 暂不支持 ipv6
  • 暂时只支持国内
  • 只支持操作系统安装

目前活动

立减优惠码 Event8259

物语云计算物理机活动:双路铂金物理机600G防护399/月起。
🎉限时立减100循环优惠码:
Event8259
※优惠码使用流程:登录账号后选择对应产品,在下单处点击“我有优惠码”之后填入。

硬件配置:
物理服务器|NVMe SSD|资源完全独享|自助管理面板
CPU:双路铂金Platinum8259CL 48核96线程
内存:128G RECC DDR4
硬盘:1TB NVMe SSD

网络规格:
以下四种网络规格可选,价格相同:
 - 浙江宁波/电信/50Mbps独享/100G防护/不限流量
 - 湖北十堰/电信/50Mbps独享/600G防护/不限流量
 - 浙江宁波/移动/50Mbps独享/10G防护/不限流量
 - 浙江宁波/电信/500Mbps流量计费/100G防护/双向2TB

优惠活动:
销售价:1150/月 优惠价:499/月
活动价:399/月,循环优惠,续费同价。

※上述产品均为独享带宽,并非“峰值”、“共享”带宽,可7x24小时随时跑满,拒绝带宽竞技场!

<服务协议与退款>
云服务器产品 24 小时内上行方向使用不超过30GB流量均支持退款,
物理服务器产品 24 小时内上行方向使用不超过100GB流量均支持退款,每用户每月最多退款 1 次。

购买链接 物语云杜甫

测评

具体可以参考 https://www.nodeseek.com/post-303956-1,带宽是可以长时间跑满的。

狗云

多年资深狗云老用户了,目前我只用他们家的 KC 杜甫、重庆联通杜甫

优点

  • 相比较其他杜甫首发优惠力度很大
  • 预购活动多
  • 香港大带宽流量套餐
  • 支持多台机器组网
  • 支持 ipv6, 掩码 /64
  • 安装系统支持种类多
  • 支持快递硬盘

缺点

  • 只支持工单响应(可以 PY 德克狗老板)
  • 杜甫 VNC 需要工单才能开,且有时间限制(每次半小时,记得不太清了)
  • 重装每小时限制一次
  • 需要实名

目前活动

预售活动

预售活动力度大些,折扣也比较高, 走 aff 成功绑定后返利一半

预售地址 二代铂金服务器预售

主要说一下网络规则,支持切换每次手续费 20, 推荐优化线路,优化线路可以附加国际线路,但是不支持附加精品线路

网络规格:
以下三种网络规格可选,价格相同:
 - 精品线路 75 Mbps, 额外附加20元/个/月
 - 优化线路  750 Mbps,额外附加15元/个/月
 - 国际线路  1000 Mbps,额外附加10元/个/月
 - 额外附加高防IP200元/个/月

五一 · 劳动节促销

活动一:
折扣码“51”,新开弹性云7折,新开经典云(特价机除外)8折。
折扣码“jian100”,新开独立服务器优惠100元。

活动二:
5月1日-5月5日,单笔充值每满100元送10元。

活动三:
5月1日-5月5日,幸运大转盘每日抽取5折码,流量,余额等奖品。

活动四:
二代铂金服务器预售:https://ds.dogyun.com/server/preorder

香港-KC物理服务器邮件硬盘添加活动将在5月10日开始接收

测评 KC

具体可以参考 https://www.nodeseek.com/post-314492-1

其他 CQA

他们家的老款绝版 CQA 月付 200 还是挺不错的,稳定的很,可以收一收。

最后

祝各位老板五一假期玩的开心。


欢迎关注我的微信公众号
  •  

沉迷塔防的乐趣:推荐Kingdom Rush系列游戏

2025年4月28日 20:41

作为一名开发者,我下班后除了写写代码、折腾技术,也喜欢通过游戏放松一下。塔防类游戏是我的最爱,尤其 Ironhide Game Studio(铁皮) 的 Kingdom Rush 系。这系列塔防游戏以扎实的玩法、精致的设计和恰到好处的挑战性,俘获了无数玩家的心。今天,我想向大家安利这个系列,希望你也能爱上它的独特魅力!

Kingdom Rush 系列简介

We make the games we'd love to play!

Steam 直达

Kingdom Rush 系列始于 2011 年的 Flash 游戏《Kingdom Rush》(早期我记得叫 皇家守卫军, 现在普遍翻译为 王国保卫战),随后推出了多款续作,覆盖 PC、移动端(iOS/Android)和主机平台,核心玩法保持一致,同时不断创新。目前包括以为五代作品(衍生品不算):

-《Kingdom Rush》(2011):初代经典,奠定系列基础。
-《Kingdom Rush: 前线》(2013):地图更复杂,敌人多样。
-《Kingdom Rush: 起源》(2014):优化塔升级,精灵主题, 节奏感比较好。
-《Kingdom Rush: 复仇》(2018):扮演反派,暗黑风格暗黑风格搭配创新塔种, 我最推荐。
-《Kingdom Rush 5: 联盟》(2024):双英雄机制,通关难度适中,兼顾新老玩家。

游戏设定在一个奇幻世界,玩家扮演指挥官,通过建造防御塔、操控英雄和使用魔法,抵御兽人、巨魔、恶魔等多样化敌人的进攻。核心玩法直观易上手:沿固定路线部署防御塔,合理分配资源,阻挡敌人前进。防御塔分为弓箭塔、兵塔、魔法塔和炮塔四类,每种塔可升级并解锁独特技能,如弓箭塔的连发箭、魔法塔的闪电链,策略性极强。
此外,系列引入了英雄系统,每位英雄拥有独特技能,例如弓箭手擅长远程狙击,骑士适合近战肉搏。玩家需操控英雄移动,堵截漏网敌人或支援薄弱防线。魔法技能(如陨石雨、援军召唤)则为战斗增添变数,关键时刻往往能逆转局势。特别值得一提的是,《复仇》的凤凰能喷射烈焰清场,《联盟》的双龙组合则带来史诗级输出,令人印象深刻。

为什么推荐 Kingdom Rush?

Kingdom Rush 系列由* Ironhide Studio* 精心打造,品质始终如一。以下是我推荐它的几大理由:

难度平衡,适合各水平玩家

关卡设计用心,普通模式新手友好,挑战模式(如老兵模式,即高难度关卡)则满足硬核玩家。敌人波次与资源分配恰到好处,既不无脑也不虐心。

高可玩性,玩法丰富多样

每作包含十余主线关卡,外加挑战关和隐藏关,内容充实。防御塔与英雄的多样组合,让每关都有新鲜玩法,重复游玩也不乏味。

碎片时间友好,单机体验纯粹

游戏无需联网,随时暂停,适合忙碌的玩家抽空玩一把。单机设计无内购压力,带来纯粹的游戏乐趣。

性价比高,物超所值

游戏在 Steam 和移动端定价多在几十元,经常打折。DLC 内容丰富,诚意十足,堪称塔防游戏的良心之作。

我的个人体验

高中时,我在 4399 平台接触到初代 Kingdom Rush,被它精致的画面和紧凑的节奏深深吸引。熬夜尝试不同防御塔组合,解锁隐藏关卡的成就感让我乐此不疲。后来,系列续作不断推出,我始终保持热情。2024 年 Kingdom Rush 5: 联盟 发布后,我迫不及待挑战老兵模式。双英雄机制让战斗更灵活,但也略微降低了通关难度。相比之下,我更偏爱《复仇》的暗黑风格和高难度设计,每次通关都充满成就感,尽管偶尔会被棘手的关卡“虐”得抓狂。

写在最后

Kingdom Rush 系列适合各类型玩家,无论是喜欢策略的硬核玩家,还是想休闲娱乐的轻度玩家,都能找到乐趣。作为技术人,我欣赏它在关卡设计和技能平衡上的用心。如果你喜欢塔防,或想找款轻松耐玩的单机游戏,不妨试试 Kingdom Rush。一旦上手,可能就停不下来!


  •  
❌