标签 docker 下的文章

前言

当主流云盘频繁亮起容量限制、限速通知,甚至出现文件被莫名屏蔽的状况时,“数据不由己”的焦虑感总会让人束手束脚。

Cloudreve 私人云盘正是终结这种被动的理想解决方案。它不仅提供拖拽上传、多格式预览、链接加密分享等全套实用功能,更核心的优势在于:您可以将其部署在您的专属服务器上,从根源上避开第三方平台的种种限制,真正实现数据自由。

借助 Docker 部署的便捷性,整个搭建过程无需复杂配置,只需短短几分钟,您就能拥有一个数据完全由自己掌控的私人云盘。从此,文件存储不必再看平台“脸色”,数据安全与使用自由,将牢牢掌握在您手中。

一:操作步骤

在部署 Cloudreve 项目之前,记得先开放5212端口,方便后续操作。

Push and Deploy

1.新建 Cloudreve 文件夹

mkdir cloudreve

2.进入 Cloudreve 文件夹

cd cloudreve

3.下载 Cloudreve 源文件包

wget https://github.com/cloudreve/Cloudreve/releases/download/3.8.3/cloudreve_3.8.3_linux_amd64.tar.gz

4.解压 Cloudreve 源文件包

tar -zxvf cloudreve_3.8.3_linux_amd64.tar.gz

5.赋予 Cloudreve 源文件包权限

`chmod +x ./cloudreve
`

6.启动 Cloudreve 项目

./cloudreve

Admin user name: 初始用户名
Admin password: 初始密码

运行成功后,不要关闭该命令行窗口,在新的浏览器页面地址输入:http://<服务器IP地址>:5212,即可访问 Cloudreve 服务。

初始密码忘记怎么办?在 Cloudreve 目录下执行以下命令,即可重置初始密码

./cloudreve --database-script ResetAdminPassword

二:持久化运行

运行成功后,不能关闭该命令行窗口,如果一不小心关掉了, Cloudreve 项目也就报错了,怎么办?在 Cloudreve 目录下执行以下操作,即可解决该问题:

1.先安装 screen(若未安装):

sudo apt update && sudo apt install screen -y

2.创建并进入一个新的 screen 会话:

`screen -S cloudreve
`

3.在新会话中重新启动 Cloudreve:

./cloudreve

按下 Ctrl + A 再按 D(或直接关闭该命令行窗口),即可脱离会话并关闭命令行窗口,程序仍在后台运行。

单容器部署

如果你觉得以上步骤过于繁琐,觉得麻烦,你也可以使用最简单的方法来部署 Cloudreve ,在自定义路径的 Cloudreve 根目录下,打开命令行终端复制以下命令,直接运行即可:

1.部署与上述操作版本保持一致(3.8.3版本):

docker run -d \
  --name cloudreve \
  -p 5212:5212 \
  -v ./data:/cloudreve/data \
  cloudreve/cloudreve:3.8.3

2.部署 Cloudreve 最新版本:

docker run -d \
  --name cloudreve \
  -p 5212:5212 \
  -v ./data:/cloudreve/data \
  cloudreve/cloudreve:latest

运行成功后,在浏览器地址输入:http://<服务器IP地址>:5212,即可访问 Cloudreve 服务。首次登录,先注册一个登录账号即可(即管理员账号)

端口占用

1.查询端口异常占用情况

netstat -tuln | grep :5212

netstat -tuln | grep :这里是要查询是否被占用的端口号 ,如果命令行有输出,则代表该端口已被占用;若命令行没有输出,直接返回 root@:/ cloudreve#,则没有没占用。

2.查询占用该端口的进程:

`lsof -i :5212
`

lsof -i :[查看占用5212端口的进程] ,如果命令行有输出,则显示占用该端口的进程PID;反之。

3.释放占用端口的进程

找到进程PID后,使用以下命令强制终止该进程,释放该端口:

kill -9 [进程ID]

总结

这就是博主今天分享的全部内容了,这只是博主在日常使用中总结的,如有不足之处欢迎大家了指点一二。
本文原发于我的博客:landonVPS

原贴

前些天看到大佬发了个开源的 outlook 管理工具,个人还是更喜欢使用 docker,所以在大佬的基础上加了 docker 的部署方式,功能和原版一致


📌 转载信息
原作者:
lenoa
转载时间:
2026/1/21 22:19:56

最近反代很火,所以不少人都买了或者白嫖了服务器,作为反代使用,给服务器只用来做反代肯定有很多的冗余,所以我考虑利用服务器的公网 ip,做成 vpn 使用,下面就是一个详细的教程

此方案重点是:

  • 只对公网开放 VPN 端口(UDP 51820),管理后台不暴露公网,更安全。
  • web 管理,方便多设备统一管理并导入


总体原理

  • WireGuard 是 VPN,本质是服务器上开一个虚拟网卡 wg0,客户端连上后拿到一个虚拟 IP(如 10.66.66.2)。
  • “全局走 VPN / 分流” 主要由客户端配置里的 AllowedIPs 决定:
    • 全局:0.0.0.0/0
    • 分流:只填你想走 VPN 的网段(如 10.66.66.0/24 或你家的内网段)
  • wg-easy = WireGuard + Web 管理界面:让你一键创建多个设备配置、二维码导入。


A. 部署前检查(确认 Docker/Compose 可用)

在服务器执行:

docker --version
docker compose version

如果 docker compose version 报错,安装 compose 插件:

sudo apt update
sudo apt install -y docker-compose-plugin

确认 Docker 在运行:

sudo systemctl enable --now docker


B. 开启 IPv4 转发(否则连上 VPN 也可能无法上网)

执行:

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wg.conf
sudo sysctl --system

解释:
VPN 客户端的流量要 “经过服务器转发到公网”,Linux 默认可能不转发,所以要打开 ip_forward


C. 云安全组 / 防火墙:放行端口

你需要在云厂商控制台安全组放行:

  • 入站 UDP 51820(WireGuard 连接端口,必须)
  • 管理后台端口 51821 不需要放行(我们会只让它监听 127.0.0.1)

解释:
如果 UDP 51820 没放行,客户端永远握手不上(handshake 失败),这是最常见原因。


D. 使用 Docker Compose 部署 wg-easy(安全版:后台不对公网开放)

1)创建目录

sudo mkdir -p /opt/wg-easy
cd /opt/wg-easy

2)创建 docker-compose.yml

把下面两处改掉:

  • WG_HOST=你的服务器公网IP或域名
  • PASSWORD_HASH=改成密码的hash值

生成 bcrypt 密码哈希,并写入 PASSWORD_HASH

在服务器安装生成工具:

apt update
apt install -y apache2-utils

生成 bcrypt(示例密码用 123,实际请用强密码):

<BASH>
htpasswd -bnBC 10 "" "123" | tr -d ':\n' 

会输出类似:

$2y$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

关键细节:Compose 里必须把 $ 写成 $$

Docker Compose 会把 $VAR 当变量替换,所以 bcrypt 中的 $ 必须转义。

例如哈希是:

$2y$10$ABC...

写入 compose 时必须变成:

$$2y$$10$$ABC...

然后执行创建文件:

sudo tee /opt/wg-easy/docker-compose.yml >/dev/null <<'EOF'
services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:latest
    container_name: wg-easy
    restart: unless-stopped
    environment:
      # 你的服务器公网 IP 或域名(客户端连接时用)
      - WG_HOST=159.223.37.240

      # 管理后台密码(务必设置强密码) # 这里切记(新版不可使用PASSDWORD,需要使用PASSWORD_HASH)
      - PASSWORD_HASH= 这里填写你密码生成的hash# WireGuard 端口(UDP)
      - WG_PORT=51820

      # Web 管理后台端口(TCP)
      - PORT=51821

      # 给客户端分配的 VPN 网段
      - WG_DEFAULT_ADDRESS=10.66.66.x

      # 客户端默认 DNS(全局模式时通常需要)
      - WG_DEFAULT_DNS=1.1.1.1

      # 默认“全局走 VPN”(你优先全局,所以这里这样设)
      - WG_ALLOWED_IPS=0.0.0.0/0

    volumes:
      # 配置与密钥会保存在宿主机这个目录,容器重建也不丢
      - /opt/wg-easy:/etc/wireguard
      # 让容器能使用宿主机内核模块
      - /lib/modules:/lib/modules:ro

    ports:
      # 对公网开放 WireGuard
      - "51820:51820/udp" # 管理后台只监听本机回环地址,不对公网开放(更安全)
      - "127.0.0.1:51821:51821/tcp"

    cap_add:
      - NET_ADMIN
      - SYS_MODULE

    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
EOF

解释关键点:

  • WG_HOST:客户端配置里的 Endpoint 会用它,填错会导致连接不上。
  • 127.0.0.1:51821:51821/tcp:保证管理后台只能本机访问,公网扫不到。
  • /opt/wg-easy:/etc/wireguard:把配置落地到宿主机,防止容器更新 / 重建后丢配置。

3)启动

cd /opt/wg-easy
sudo docker compose up -d

查看是否启动成功:

sudo docker ps
sudo docker logs --tail=200 wg-easy


E. 访问管理后台(通过 SSH 隧道)

因为我们没对公网开放 51821,所以用 SSH 隧道从你电脑访问:

在你自己的电脑(Windows/macOS/Linux 都可以)执行:

ssh -L 51821:127.0.0.1:51821 root@你的服务器公网IP

然后浏览器打开:

输入你设置的 PASSWORD 登录。

解释:
SSH 隧道相当于 “把服务器的本地端口映射到你本机”,外网无法直接访问后台,但你能安全管理。


F. 创建客户端(你的每台设备一个)

在 wg-easy 管理页面:

  1. New Client
  2. 给设备起名(如 phone, laptop, ipad
  3. 直接:
    • 扫二维码(手机 WireGuard App)
    • 或下载配置文件(电脑 WireGuard 客户端导入)

建议:一台设备对应一个 client,方便你单独禁用 / 删除。


G. 连接测试(确认全局模式生效)

客户端连上后:

  1. 访问 https://ipinfo.iohttps://ifconfig.me
    看显示的出口 IP 是否变成你的服务器公网 IP(全局模式应当变为服务器 IP)

  2. 如果你能 SSH 到服务器,也可以在服务器看握手:

    sudo docker exec -it wg-easy wg show
    


H. 分流怎么实现

你现在默认是全局(WG_ALLOWED_IPS=0.0.0.0/0)。
如果某些设备想分流:在该设备的配置里把 AllowedIPs 改成你需要的网段即可,例如:

  • 只走 VPN 内网(仅访问 VPN 内部资源,不代理全网):

    • AllowedIPs = 10.66.66.0/24
  • 只访问你家 / 公司内网(举例 192.168.1.0/24):

    • AllowedIPs = 192.168.1.0/24, 10.66.66.0/24

做法:你可以在 wg-easy 里把该设备配置下载下来后手动改,或在客户端里编辑配置。


I. 结语

大家新手一般都是只有一台服务器,wg-easy 很适合作为第一站:先把 VPN 跑起来、把设备接入跑通;等你对需求更明确后,再决定是留在 wg-easy 继续精细化配置,还是迁移到原生 WireGuard、Headscale 这类更强的组网架构。


📌 转载信息
转载时间:
2026/1/21 22:13:08

Docker 配置 vcs

因为项目在 docker 环境中,在本机 ubuntu22.04 已安装 vcs, 并且 verilator 仿真较慢的情况下,选择
在 docker 中挂载 vcs 以达到方便,节省空间的目的。本文采用 vscode 进行 docker 连接。

1. 本机配置 vcs

参考 记一次在 Ubuntu18 虚拟机上安装 VCS 等 - TooyamaYuuouji - 博客园

2. 在 docker 中挂载 vcs

在 vscode 中选择 Dev Containers 扩展下载并安装。

接着新建目录.devcontainer, 并在其中新建文件 devcontainer.json, 内容如下:

{ "name": "chipyard + VCS", "image": "chipyard-vcs-base:first", "remoteUser": "root", "workspaceFolder": "/root/chipyard", "mounts": [ "source=/home/mingzhenjia/Downloads/vcs,target=/opt/vcs,type=bind" ], "containerEnv": { "SNPSLMD_LICENSE_FILE": "27000@172.17.0.1", "LM_LICENSE_FILE": "27000@172.17.0.1" }, "runArgs": [ "--net=bridge" ] } 

整体项目结构如图

接着 Ctrl+Shift+P, 选择 Dev Containers: Reopen in Container, 即可连接到 docker 容器中。

3. 在 docker 中配置环境变量

接着在 docker 中打开.bashrc, 添加如下内容:

# ===== Synopsys VCS / Verdi in Docker ===== export PATH=/usr/bin:$PATH #防止conda或其他地方的gcc干扰 export VCS_TARGET_ARCH=amd64
export NPI_PLATFORM=LINUX64_GNU_472

# VCS/Verdi paths (inside container) export VCS_HOME=/opt/vcs/vcs/vcs/O-2018.09-SP2
export DVE_HOME=$VCS_HOME/gui/dve
export VERDI_HOME=/opt/vcs/verdi/verdi/Verdi_O-2018.09-SP2
export NOVAS_HOME=$VERDI_HOME export NOVAS_INST_DIR=$VERDI_HOME export VERDI_DIR=$VERDI_HOME # PATH export PATH=$VCS_HOME/bin:$DVE_HOME/bin:$VERDI_HOME/bin:$PATH export PATH=/opt/vcs/scl/scl/2018.06/linux64/bin:$PATH # Libraries export LD_LIBRARY_PATH=$VERDI_HOME/share/PLI/lib/LINUX64:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$NOVAS_INST_DIR/share/NPI/lib/LINUX64_GNU_520:$LD_LIBRARY_PATH # License: use host license server export SNPSLMD_LICENSE_FILE=27000@172.17.0.1
export LM_LICENSE_FILE=27000@172.17.0.1

# Aliases alias vcs64="vcs -full64" alias dve="dve -full64 &" alias verdi="verdi -full64 &" 

接下来输入 vcs 即可调用。

4. 引用


📌 转载信息
原作者:
lycx
转载时间:
2026/1/21 21:39:42

Centos虽然已经停止维护了,而且内核也非常低,耐不住国内大环境很多公司还是一直在用它。时不时见到有人想要在centos上面部署k8s1.23版本,本文将以centos 7为例,从0开始搭建k8s+ks集群。

1.说明

关于kt

kt是基于kk二次开发的产物,具备kk的所有功能。二开主要为适配信创国产化环境、简化arm部署过程和国产化环境离线部署。支持arm64amd64架构国产操作系统,已适配芯片+操作系统 如下。

kt新增功能点

  • 适配arm架构harbor和支持,部署体验与X86一样简单。
  • 离线环境部署增强。常用国际和国产操作系统依赖,内置到安装包中。已适配芯片和操作系统如下

    • ./kt init-os 一条命令完成操作系统依赖安装和初始化操作。
    • CPU:鲲鹏、飞腾、海光、兆芯、intel、amd等。
    • OS:Centos、Rocky Linux、Ubuntu、Debian、银河麒麟V10、麒麟V11、麒麟国防版、麒麟信安、中标麒麟V7、统信UOS、华为欧拉、移动大云、阿里龙蜥、TencenOS等。
  • 支持开启防火墙,只暴露30000-32767端口,其他k8s端口添加到节点白名单。

    • ./kt firewall 一条命令自动获取节点信息开白名单和防火墙。

kt版本更新和下载地址

  • kt:kt
  • 关注我不迷路

2.环境准备

服务器基本信息

主机名架构OS配置IP
all-in-onex86_64Centos 74核8G192.168.85.164

2.1 上传离线制品

操作系统不需要安装docker,不需要设置selinux,swap等操作,全新的操作系统即可。

将离线制品、配置文件、kt和sh脚本上传至服务器其中一个节点(本文以master为例),后续在该节点操作创建集群。本文使用kt:3.1.12-centos版本

2.2 修改配置文件

根据实际服务器信息,配置到生成的config-sample.yaml

kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - {name: node1, address: 192.168.85.164, internalAddress: 192.168.85.164, user: root, password: "123123"}
  roleGroups:
    etcd:
    - node1
    control-plane:
    - node1
    worker:
    - node1
    # 如需使用 kk 自动部署镜像仓库,请设置该主机组 (建议仓库与集群分离部署,减少相互影响)
    # 如果需要部署 harbor 并且 containerManager 为 containerd 时,由于部署 harbor 依赖 docker,建议单独节点部署 harbor
    registry:
    - node1
  controlPlaneEndpoint:
    ## Internal loadbalancer for apiservers 
    internalLoadbalancer: haproxy

    domain: lb.kubesphere.local
    address: ""
    port: 6443
  kubernetes:
    version: v1.23.17
    clusterName: cluster.local
    autoRenewCerts: true
    containerManager: docker
  etcd:
    type: kubekey
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
    ## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
    multusCNI:
      enabled: false
  registry:
    type: harbor
    registryMirrors: []
    insecureRegistries: []
    privateRegistry: "dockerhub.kubekey.local"
    namespaceOverride: "kubesphereio"
    auths: # if docker add by `docker login`, if containerd append to `/etc/containerd/config.toml`
      "dockerhub.kubekey.local":
        username: "admin"
        password: Harbor@123 # 此处可自定义,kk3.1.8新特性
        skipTLSVerify: true # Allow contacting registries over HTTPS with failed TLS verification.
        plainHTTP: false # Allow contacting registries over HTTP.
        certsPath: "/etc/docker/certs.d/dockerhub.kubekey.local"
  addons: []
  ---

2.3 系统初始化

解压kt-centos.tar.gz文件后执行./kt init-os -f config-sample.yaml 已适配操作系统和架构见1.说明

该命令kt会根据配置文件自动判断操作系统和架构以完成所有节点的初始化配置和依赖安装。

3 创建 Harbor私有仓库

3.1 创建镜像仓库

./kt init registry -f config-sample.yaml -a artifact-x86-k8s12317-ks3.4.1.tar.gz

此命令会在harbor节点自动安装dockerdocker-compose

3.2 创建harbor项目

<font style="background-color:rgb(255,245,235);">说明:</font>

<font style="background-color:rgb(255,245,235);">Harbor 管理员账号:</font><font style="background-color:rgb(255,245,235);">admin</font><font style="background-color:rgb(255,245,235);">,密码:</font><font style="background-color:rgb(255,245,235);">Harbor@123</font><font style="background-color:rgb(255,245,235);">。密码同步使用配置文件中的对应password</font>

<font style="background-color:rgb(255,245,235);">harbor 安装文件在 </font><font style="background-color:rgb(255,245,235);">/opt/harbor</font><font style="background-color:rgb(255,245,235);"> 目录下,可在该目录下对 harbor 进行运维。</font>

创建 Harbor 项目

chmod +x create_project_harbor.sh && ./create_project_harbor.sh

4 创建k8s和KubeSphere

./kt create cluster -f config-sample.yaml -a artifact-x86-k8s12317-ks3.4.1.tar.gz

此命令kt会自动将离线制品中的镜像推送到harbor 私有仓库

执行后会有如下提示,输入yes/y继续执行

等待一段时间,直至出现熟悉的等待安装完成的小箭头>>--->

期间可以另开一个窗口用以下命令查看部署日志

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

继续等待一段时间最终可以看到安装成功的消息

5 验证

登录页面

集群管理

监控告警

配置文件默认只安装了监控,如果需要安装其他组件,可以自行在自定义资源中开启

图片云上传 IMG-CLOUD-UPDATE

项目介绍

在写博客的场景下,不可避免上传一些图片。作为博客文章插图。

我都是直接上传到我阿里云的 oss 里面。但是阿里云自带的工具太重了,每次打开等半天,而且复制 url 还得点好几下。

我花了一周做了一个快速上传图片到阿里云 OSS ,并且直接生成 makedown 格式的图片链接,方便你写博客或文章的时候快速上传并插入。

下面是正经的介绍:


图片云上传是一款前端使用 vue3+element-plus ,后端使用 go+gin+bbolt 的图片上传项目。使用该项目可以让你更快的把本地图片传到远程图片云仓库。当前版本支持阿里云 oss 。不用担心你的 access_key_id 会泄露,本系统保存到本地二进制数据库,不做任何远程传输。

本项目也适合初学者学习参考,内有大量的注释,对于学习 golang 和 VUE 都有比较大的帮助。

已支持:

  • 阿里云 oss
  • 自定义路径
  • 自定义/自动修改名称
  • 自动添加 markdown 格式
  • 支持设置密码/默认安装页面

未支持

  • 显示多层文件列表
  • aws/腾讯云/七牛等更多远程仓库

截图


https://imgur.com/1kA2Bav

https://imgur.com/gIbloDS

依赖组件:

1. 前端:

  1. vue3
  2. element-plus
  3. pinia
  4. axios
  5. vue-router

2. 后端:

  1. go
  2. gin
  3. bbolt

安装

  1. docker 编译安装

直接执行 make 即可,会先编译 web 端,再编译 server 端。再打包容器镜像。最后 docker 运行镜像。

参考项目:

使用前提:
有域名,1panel 面板,debian 系统

我是小主机安装的 debian,想实现局域网内访问和外网使用泛域名访问
因为自带的映射一次只能设置一个 ip,而且 1panel 自带的防火墙和 DOCKER-USER 链平级,无法直接在 1panel 里设置防火墙影响容器端口的开放

教程开始:
前置 配置泛域名的方法

这两天在更新

第一步 查询当前 docker 使用 iptables 版本

echo "------ 账本 A: iptables-legacy (旧版) ------"
iptables-legacy -t nat -S DOCKER 2>/dev/null || echo "Legacy 中没有 DOCKER 链" echo "" echo "------ 账本 B: iptables-nft (新版/默认) ------"
iptables-nft -t nat -S DOCKER 2>/dev/null || echo "NFT 中没有 DOCKER 链" 

需要 debian 系统和 docker 使用同一版本,debian 新版基本上是 nft

第二步 添加 ipv6 和 ipv4 规程
局域网网段请自行更改
1panel 面板自带的反向代理是容器运行,所以需要额外开放 80 和 443
ipv4:

# 清空现有规则,重新排列
iptables -F DOCKER-USER

# 1. 基础规则:允许已建立连接、本机、局域网
iptables -A DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A DOCKER-USER -i lo -j ACCEPT
iptables -A DOCKER-USER -s 192.168.5.0/24 -j ACCEPT

# 2. 【新增】特赦反向代理端口 (允许外网访问 Docker 的 80443)
# 只有这样,外网流量才能到达你的 Nginx 容器
iptables -A DOCKER-USER -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A DOCKER-USER -p tcp -m tcp --dport 443 -j ACCEPT

# 3. 拒绝外网网卡的其他所有流量
# (把 enp1s0 换成你的实际网卡名,如果不确定就用 ! -i lo 表示非回环)
iptables -A DOCKER-USER -i enp1s0 -j DROP

# 4. 默认返回
iptables -A DOCKER-USER -j RETURN

ipv6:

ip6tables -F DOCKER-USER

# 1. 基础规则
ip6tables -A DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A DOCKER-USER -i lo -j ACCEPT
ip6tables -A DOCKER-USER -s fe80::/10 -j ACCEPT

# 2. 【新增】特赦 IPv6 下的 80443
ip6tables -A DOCKER-USER -p tcp -m tcp --dport 80 -j ACCEPT
ip6tables -A DOCKER-USER -p tcp -m tcp --dport 443 -j ACCEPT

# 3. 拒绝外网网卡的其他 IPv6 流量
ip6tables -A DOCKER-USER -i enp1s0 -j DROP

# 4. 默认返回
ip6tables -A DOCKER-USER -j RETURN 

完成后再次测试即可


📌 转载信息
原作者:
ak7876
转载时间:
2026/1/20 17:39:49

上篇搭了个 HTTPS 入口,这篇继续部署 CLIProxyAPI 作为 API 网关,让 Claude Code 能用上更多模型。

架构

走 Cloudflare 橙云代理,源站跑 Docker。

部署

写了个一键脚本:CLIProxyAPI AWS EC2 一键部署脚本・GitHub

准备工作:

  • EC2 能 SSH、有 sudo

  • Cloudflare DNS A 记录指向 EC2 IP,开橙云

  • 安全组放行 2096

执行:

 # 下载脚本 mkdir -p ~/cli-proxy && cd ~/cli-proxy

curl -fsSLO https://gist.githubusercontent.com/xrf9268-hue/18c81e1c5225aa2e6541a52deeabbe82/raw/cli-proxy-setup.sh

curl -fsSLO https://gist.githubusercontent.com/xrf9268-hue/18c81e1c5225aa2e6541a52deeabbe82/raw/cli-proxy-config.yaml

curl -fsSLO https://gist.githubusercontent.com/xrf9268-hue/18c81e1c5225aa2e6541a52deeabbe82/raw/cli-proxy-docker-compose.yml

# 执行安装 chmod +x cli-proxy-setup.sh

./cli-proxy-setup.sh install --domain your.domain.com

脚本会自动装 Docker、生成自签证书、随机 API Key、拉镜像起服务。Key 会打印在屏幕上,记一下。

Provider 登录

部分 Provider 需要 OAuth 登录。回调端口只绑 127.0.0.1,得用 SSH 通道。

 # 开通道(保持不关)

ssh -L 51121:127.0.0.1:51121 <user>@<host>

# 在通道里执行登录(以 antigravity 为例) sudo docker compose -f ~/CLIProxyAPI/docker-compose.yml exec cli-proxy-api ./CLIProxyAPI --antigravity-login --no-browser

会输出授权链接,本地浏览器打开、登录、授权完成。

Claude Code 配置

 export ANTHROPIC_BASE_URL="https://your.domain.com:2096" export ANTHROPIC_AUTH_TOKEN="你的key" export ANTHROPIC_DEFAULT_OPUS_MODEL="gemini-claude-opus-4-5-thinking" export ANTHROPIC_DEFAULT_SONNET_MODEL="gemini-claude-sonnet-4-5-thinking" export ANTHROPIC_DEFAULT_HAIKU_MODEL="gemini-claude-sonnet-4-5" 

测试:

 # 用 jq 格式化

curl "https://your.domain.com:2096/v1/models" -H "Authorization: Bearer 你的key" | jq

# 或用 python

curl "https://your.domain.com:2096/v1/models" -H "Authorization: Bearer 你的key" | python3 -m json.tool

能返回模型列表就成了。


📌 转载信息
转载时间:
2026/1/20 17:38:37

小安装青龙面板并配置 iKuu 自动签到

今晚买了个 42 的小鸡,不知道该咋玩,哈基米说可以搞个自动签到。于是就有了这篇文章,写下来是为了记录一下,万一有谁也需要呢?

购买小鸡的情况:1c0.5G

安装 Docker

# 1. 安装基础依赖
apt update && apt install -y curl

# 2. 使用官方脚本安装 Docker
curl -fsSL https://get.docker.com | bash -s docker

# 3. 启动 Docker 并查看状态
systemctl enable --now docker
docker ps

部署青龙面板

因为内存很小,且没办法添加交换分区,所以这是哈基米给我的命令:

docker run -dit \
  -v $PWD/ql/data:/ql/data \
  -p 5700:5700 \
  --name qinglong \
  --hostname qinglong \
  --restart always \
  --memory=300m \
  whyour/qinglong:latest

添加端口规则

添加一条规则:

  • 内网端口5700
  • 外网端口:随便填一个(比如 15700),或者面板会自动给你分配一个。
  • 协议:TCP。

完成后,你在浏览器访问:http://主机的公网IP:分配给你的外网端口

确认容器状态

# 查看状态
docker ps -a

# 查看日志
docker logs -f qinglong

到此基本就可以正常访问青龙面板了

那么如何配置自动签到脚本呢?可以参考 https://blog.uptoz.cn/archives/vVNl4laL

需要注意的是

脚本里面使用到了 requests、beautifulsoup4。青龙面板虽然有 python,但是这些包没有安装,你可以在终端手动安装:

# 进入青龙容器内部安装
docker exec -it qinglong pip3 install requests beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple

尝试

接下来就可以在面板-定时任务 运行一下看看啦

纯纯纯纯纯新手,大家还有什么好玩的东西或者脚本可以介绍一下嘛

📌 转载信息
原作者:
JackyLiii
转载时间:
2026/1/20 10:20:33

点赞 + 关注 + 收藏 = 学会了

整理了一个NAS小专栏,有兴趣的工友可以关注一下 👉 《NAS邪修》

Reubah 是一款基于网页的工具,具备图片格式转换、优化、批量处理(背景移除即将推出)和多种文档格式转换功能,支持暗黑模式与 API,无文件存储且自动清理,可通过 Docker 或本地部署,界面简洁易用。

本次使用的是群晖 NAS 部署 Reubah,其他品牌的 NAS 操作步骤类似。

首先在“File Station”里找到“docker”文件夹,在“docker”文件夹里创建“reubah”文件夹。

打开“Container Manager”,新增一个项目。

项目名称填 reubah

路径选择刚刚在“docker”文件夹里创建的“reubah”。

来源选择“创建 docker-mompose.yml”。

然后填入以下代码(需要注意代码格式,空格和换行这些)。

services:
  reubah:
    image: ghcr.io/dendianugerah/reubah:latest
    container_name: reubah
    ports:
      - "8081:8081"
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    restart: unless-stopped

8081:8081 这句,冒号左侧的数字是可以改的,右侧那个不能改。

输入完代码后点击“下一步”。

勾选“通过 Web Station 设置网页门户”,然后点击“下一步”,等待 docker 下载相关代码。

最后一步是打开“Web Station”(没有这个工具就去“套件中心”下载)。

新增一个网络门户,参考下图选项。

需要注意,端口要输入一个和其他项目不冲突的数字,我这里输入的是 2347

完成上面所有操作后,在浏览器打开 NAS的IP + reubah端口号 就可以访问 Rebuah 了。

比如我的是 http://192.168.31.85:2347

在图片格式转换这边,还支持 iPhone 的实况照片格式(HEIC)转换。

常见的 jpeg、png、webp、gif、bmp 以及将图片转换成 pdf 都是支持的。

文件格式这边包含常见的pdf、docx、doc、odt、txt 和 rtf。

切换到 Batch Processing 面板还可以做批量处理。


以上就是本文的全部内容啦,想了解更多NAS玩法可以关注《NAS邪修》

点赞 + 关注 + 收藏 = 学会了

然后就发现了问题,用 github 托管镜像的话,国内的服务器拉取镜像速度太慢,各厂商镜像服务又有相应限制,在服务器上挂代理又有一定的风险

故而迁移一份仓库到腾讯新出的平台 CNB 上

提高国内服务器的访问速度,依旧自动更新和构建

(不过感觉腾讯给的免费对象存储额度不太够)

忘了给链接了


📌 转载信息
原作者:
AliverAnme
转载时间:
2026/1/16 12:46:09

最近开发了一个服务器部署管理工具 Senate,今天正式上线,来跟大家分享一下~

🔗 官网: https://senate.sh

🤔 为什么做这个?

相信很多开发者都有这样的经历:

  • 需要同时管理多台服务器
  • 手工 SSH 部署服务,每次都要敲一堆命令
  • Docker Swarm/Kubernetes/Harbor 配置繁琐
  • 需要手动管理 Nginx/Caddy 反向代理

Senate 的目标就是:让服务器管理与应用部署变得简单。

⚡ 一键安装

sh -c "$(curl -sSL https://get.senate.sh)"

更多信息可以参考文档

✨ 核心功能

🚀 一键部署

  • 支持 Docker 镜像 / Git 仓库一键部署到服务器
  • 内置零停机部署,更新不中断服务
  • Webhook 部署,push 代码自动上线

🖥️ 多服务器管理

  • 一个面板统一管理多台服务器
  • 实时日志查看
  • 实时资源监控( CPU / 内存 / 磁盘)
  • 异常报警通知

🔒 自动 HTTPS

  • 内置 Caddy ,自动申请和续期 SSL 证书
  • 支持自定义路由规则

以及

  • Docker Compose 、服务器终端、服务器文件管理、容器管理、Docker 镜像管理、Docker 缓存自动清理、自定义 Caddy 路由、Webhook 部署、多用户权限管理、一键生成 SSH Key 、GitHub Token 认证、...

截图

🎁 福利

v2ex 专属 Pro 版 100% 折扣码,限 10 次,先到先得~

V2EX100OFF


欢迎体验和反馈~

交流群@senate_paas

各中转站对 RPM 有限制,同时禁止分发,本教程只给出自用模式

看到群里不少佬友想在 newapi 中对接中转站,恰好我在用 RightCode,所以以 rightcode 为例,写(水)一篇教程吧。

前者要求

  • git (用于克隆仓库)
  • windows docker desktop 或者 linux docker (建议有足够的内存 + 硬盘存储)
  • 配置好 docker compose

windows docker desktop 建议选择 wsl2 作为 backend

安装部署

克隆仓库 & 启动

先克隆仓库

git clone https://github.com/QuantumNous/new-api.git

修改 docker-compose.yml

本教程采用 postgresql

```diff
version: '3.4' # For compatibility with older Docker versions

services:
  new-api:
    image: calciumion/new-api:latest
    container_name: new-api
    restart: always
    command: --log-dir /app/logs
    ports:
-     - "3000:3000" +     - "3003:3000"
    volumes:
      - ./data:/data
      - ./logs:/app/logs
    environment:
-     - SQL_DSN=postgresql://root:123456@postgres:5432/new-api # ⚠️ IMPORTANT: Change the password in production! +     - SQL_DSN=postgresql://root:idkpassword@postgres:5432/new-api # ⚠️ IMPORTANT: Change the password in production!
#       - SQL_DSN=root:123456@tcp(mysql:3306)/new-api  # Point to the mysql service, uncomment if using MySQL
      - REDIS_CONN_STRING=redis://redis
      - TZ=Asia/Shanghai
      - ERROR_LOG_ENABLED=true # 是否启用错误日志记录 (Whether to enable error log recording)
      - BATCH_UPDATE_ENABLED=true  # 是否启用批量更新 (Whether to enable batch update)

    depends_on:
      - redis
      - postgres
    healthcheck:
      test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis:
    image: redis:latest
    container_name: redis
    restart: always

  postgres:
    image: postgres:15
    container_name: postgres
    restart: always
    environment:
      POSTGRES_USER: root
-     POSTGRES_PASSWORD: 123456  # ⚠️ IMPORTANT: Change this password in production! +     POSTGRES_PASSWORD: idkpassword  # ⚠️ IMPORTANT: Change this password in production!
      POSTGRES_DB: new-api
    volumes:
      - pg_data:/var/lib/postgresql/data

volumes:
  pg_data:
#  mysql_data:

编辑完保存,继续执行命令

docker compose up -d

等待 n 秒(取决于你的网速~)

出现以下字样,拉去镜像和启动成功

[+] Running 5/5
 ✔ Network new-api_default   Created                                                                                                                   0.1s
 ✔ Volume "new-api_pg_data"  Created                                                                                                                   0.0s
 ✔ Container redis           Started                                                                                                                   0.7s
 ✔ Container postgres        Started                                                                                                                   0.7s
 ✔ Container new-api         Started                                                                                                                   1.0s

NewAPI 配置

打开浏览器,输入 http://localhost:3003/ 后,会出现配置页

如果你的数据库检查没有错误,继续下一步,填写管理员账号和密码

下一步,选择使用模式

最后 初始化系统 即可

配置渠道

打开 控制台

依次点击 渠道管理 添加渠道,并填入 类型 / 名称 / 密钥

填入 API 地址为 https://www.right.codes/codex

因为 rightcode 支持了模型列表接口,点获取模型列表即可获取可用的模型

随后确定,并提交即可

模型管理

按照图中的内容,切换刀模型管理,依次点击 同步 → 下一步 → 确定

配合 CC Switch 使用

现在 控制台 -> 令牌管理 生成令牌,并填入刀 cc switch 中

最终的 config.toml

model_provider = "custom" model = "gpt-5.2" model_reasoning_effort = "xhigh" disable_response_storage = true [model_providers.custom] name = "custom" wire_api = "responses" requires_openai_auth = false base_url = "http://localhost:3003/v1" 

保存好以后,切换供应商,可以开始 coding 了


📌 转载信息
原作者:
unsafe
转载时间:
2026/1/15 18:30:28

如果你不想看废话,请直接滚动到最后面,有两个 Pure 直接使用的方案。

Kiro 是什么

Kiro 是亚马逊云科技于 2025 年 7 月 16 日推出的专为 AI Agent 设计的集成开发环境(agentic IDE)。

新注册账号有 500 积分可以使用高级模型。

原理

把 kiro 账号 添加到 KiroGate ,转为 标准的 API,配置到 CodeSwitch , 可以在 claude codex 使用

前置准备

各软件配置

Kiro Account Manager 的配置

为什么要这个软件》》》》》最主要的原因是自动刷新 token,免得账号过期。

支持多种方式添加账号

  • 添加账号

KiroGate 配置

安装

GitHub - aliom-v/KiroGate: OpenAI & Anthropic 兼容的 Kiro IDE API 代理网关,支持 Claude Code CLI

  docker run -d -p 8000:8000
  -v kirogate_data:/app/data
  -e PROXY_API_KEY=
  -e ADMIN_PASSWORD="aadf5beb"
  -e USER_SESSION_SECRET=
  -e ADMIN_SECRET_KEY=
  --name kirogate  ghcr.io/awei84/kirogate:main

配置 Kirogate

注册普通用户

因为只有普通用户才能添加自己的 token


访问后台,审核账号

注意 管理员的密码 是 启动容器使用配置的 ADMIN_PASSWORD

KirGate 提供的是隐藏的管理后台,需要手动输入路由进入

比如:http://127.0.0.1:8000/admin/login

/admin/login  → 登录页面
/admin        → 管理面板(需登录)
/admin/logout → 退出登录

切换普通账号,添加 token

imageimage

这个 token 可以在 Kiro Account Manager 复制

添加 token 的时候 可以选择公开或者私有

使用

创建 API key

配置到 CodeSwitch

Kiro 的服务地址:ip:8000/v1/chat/completions

直接配置到 Claude 或者 codex

# OpenAI 格式
curl http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer sk-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "你好"}]}'

# Anthropic 格式
curl http://localhost:8000/v1/messages \
  -H "x-api-key: sk-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-5", "max_tokens": 1024, "messages": [{"role": "user", "content": "你好"}]}' 

号池是啥

你家一个 token 我家一个 token,就变成了 token 池子了

如何获取账号

  • 方法一:google 直接登录
  • 方法二:github 直接登录
  • 方法三:qq 注册 github,然后继续方法二

偷懒方案 1

可以用下面两个现成的。

偷懒方案 2

安装这个软件 GitHub - awei84/KiroGate: issues pr 请去上游仓库

🔐
获取 Refresh Token
🌐 方式一:浏览器获取(推荐)

1打开 https://app.kiro.dev/account/usage 并登录 2F12 打开开发者工具
3点击 应用/Application → 存储/Storage  Cookie 4选择 https://app.kiro.dev 5复制 RefreshToken 的值

🛠️ 方式二:Kiro Account Manager

使用 Kiro Account Manager 可以轻松管理多个账号的 Refresh Token 

参考


📌 转载信息
原作者:
dream_bugless
转载时间:
2026/1/15 18:28:31

我把 swarm 端口改成 4002 是因为 Planet 抢占了 4001 端口。


这脚本大概这么干活:

  1. 先瞅一眼:看看 Docker 装了没,别忙活半天白干。再检查一下有没有叫 ipfs_host 的老容器赖着不走,有的话就报错开溜,坚决不给自己留烂摊子。
  2. 搭俩小窝:在当前目录下建 ipfs_stagingipfs_data 两个文件夹,给 IPFS 的数据找个地方住。
  3. 门户大开(但换了号):因为 4001 被占了,咱就让 swarm 走 4002。API 端口是 8080,网关端口是 5001,按你的习惯随便改。
  4. 拉起来跑:用最新的 ipfs/kubo 镜像把容器跑起来,把刚才设的端口和文件夹都挂载好。
  5. 直接开门迎客:跑起来没问题的话,自动帮你打开浏览器,跳到 http://localhost:5001/webui 这个管理页面。接下来传点猫图试试手呗。


怎么用?

简单到不行:

复制
# 1. 给脚本加个执行权限
chmod +x deployment.sh

# 2. 运行它
./deployment.sh

脚本跑完没报错,你的浏览器就会蹦出 IPFS 的 Web 界面了。


脚本在这儿 (deployment.sh)

复制
#!/bin/bash

# 检查 Docker 是否安装
if ! [ -x "$(command -v docker)" ]; then
  echo 'Error: Docker is not installed.' >&2
  exit 1
fi
echo 'Docker is installed.'

# 检查是否有正在运行的 IPFS 容器
if [ "$(docker ps -q -f name=ipfs_host)" ]; then
  echo 'Error: An IPFS container is already running.' >&2
  exit 1
fi
echo 'No running IPFS container found.'

# 检查是否有同名的停止状态的 IPFS 容器
if [ "$(docker ps -aq -f status=exited -f name=ipfs_host)" ]; then
  echo 'Error: A stopped IPFS container with the same name already exists.' >&2
  exit 1
fi
echo 'No stopped IPFS container with the same name found.'

echo 'Proceeding with deployment...'
# 创建存储目录
current_dir=$(pwd)
cd $current_dir
mkdir -p ./ipfs_staging
mkdir -p ./ipfs_data

echo 'Storage directories created.'

# 设置环境变量
export ipfs_staging=./ipfs_staging
export ipfs_data=./ipfs_data
export ipfs_swarm_port=4002
export ipfs_api_port=8080
export ipfs_gateway_port=5001

echo "IPFS staging directory: ${ipfs_staging}"
echo "IPFS data directory: ${ipfs_data}"
echo "IPFS swarm port: ${ipfs_swarm_port}"
echo "IPFS API port: ${ipfs_api_port}"
echo "IPFS gateway port: ${ipfs_gateway_port}"

# 运行 IPFS 容器
docker run -d --name ipfs_host -v ${ipfs_staging}:/export -v ${ipfs_data}:/data/ipfs -p ${ipfs_swarm_port}:4001 -p ${ipfs_api_port}:8080 -p ${ipfs_gateway_port}:5001 ipfs/kubo:latest
if [ $? -ne 0 ]; then
  docker rm -f ipfs_host 2>/dev/null
  rm -rf ./ipfs_staging
  rm -rf ./ipfs_data
  echo 'Error: Failed to start the IPFS container.' >&2
  exit 1
fi
echo 'IPFS container started successfully.'

open "http://localhost:${ipfs_gateway_port}/webui"


说实话, AI 润色的确实不咋地 😂

看了很多佬们对 gemini business 的注册和 2api 的开发。但是始终没有发现一个能够同时满足标题全部需求的东东。
于是乎我选择把下面各位大佬的东西直接缝合起来弄成一个平台:
【Gemini-Business2api】支持多账户轮询、账户监控日志、画图(返回 url)、HuggingFace 部署
Gemini Business 注册机

合并实现了以下功能:

  • 自动批量注册 gemini business 账号

  • 定时轮询自动刷新 gemini 凭证
  • 接入 cloudflare_temp_email 自动接码,支持多个域名邮箱配置。
  • 多账号 2API 使用
  • 可使用 docker 部署,接入了 Xvfb 显示规避无头浏览器的注册审查

邮箱配置需要额外使用 GitHub - dreamhunter2333/cloudflare_temp_email: CloudFlare free temp domain email 免费收发 临时域名邮箱 支持附件 IMAP SMTP TelegramBot
需要配置 AI 提取验证码、ADMIN 凭证来提取邮箱密码。

关于部署,目前还没有测试过能否在 huggingface 来部署,因为包含了 chrome 的镜像略大不确定能不能布上去。

项目地址:

最后的最后,再次感谢各位大佬提供的方案和思路:CooooooKKSnapSheep


📌 转载信息
原作者:
linlee
转载时间:
2026/1/14 18:35:16

相信很多人都知道反重力 opus4.5 是怎么用的

条件1:准备chrome会员账号,可以到闲鱼上购买

条件2: 下载 [反重力客户端](https://github.com/lbjlaq/Antigravity-Manager)

这边我不过多的介绍,大家自行搜索 + AI 研究

今天我要介绍的是一个高级玩法

cch 反代 Antigravity 的反代,下载后自行用 AI 研究下。

大家可以看到我发的 gemini 3 pro 也能用,这是怎么做到的尼

先看配置:

Antigravity 暴露的端口是 8045,我们用 docker 部署 claude-code-hub 后正常是访问不到电脑上 8045 端口的,必须把电脑上的 8045 端口暴露给 docker(这里不过多介绍,大家自行用 ai 研究)

然后看到我的截图中供应商类型是 Gemini (Google Gemini API), 这一步很关键,我们的 Gemini 的用法 不是在 gemini cli 之中使用的,而是通过 api 转发,转发给 opencode 使用的,opencode 是一款开源的类似 claude code cli 的脚手架,链接贴进来了,大家自行用 ai 研究一下,当然还可以用 oh my opencode 强化一下你的 cli

然后,更改一下配置

code ~/.config/opencode/opencode.json

provider 属性下新增

"google": { "options": { "baseURL": "http://127.0.0.1:13000", "apiKey": "your api key (在 http://localhost:23000/zh-CN/dashboard/users 新增用户后获取)" }, "models": { "antigravity-gemini-3-pro-high": { "name": "Gemini 3 Pro High (Antigravity)", "limit": { "context": 1048576, "output": 65535 }, "modalities": { "input": [ "text", "image", "pdf" ], "output": [ "text" ] } }, "antigravity-gemini-3-flash": { "name": "Gemini 3 Flash (Antigravity)", "limit": { "context": 1048576, "output": 65536 }, "modalities": { "input": [ "text", "image", "pdf" ], "output": [ "text" ] } } } } 

然后我们运行 opencode 输入 /models,将模型切到如下

最后看下效果


📌 转载信息
原作者:
carve
转载时间:
2026/1/14 10:59:17

前言

之前薅了某为云的 2c2g 鸡,一直吃着灰,反观我的另一台 1c1g 鸡跑了好几个服务,是时候迁移了,顺便也来试试传说中的 GitOps,做个步骤记录,欢迎佬们提提建议

迁移

首先在所有鸡上都安装上 docker

随后先是 Portainer 的迁移。

  1. 在旧机器上:

    • 登录 Portainer Web 界面。

    • 进入 SettingsBackup

    • 选择 Download backup file

    • 设置个密码(可选),点击 Download。你会得到一个 .tar.gz 文件。

  2. 在新机器上:

    • ssh 上去,拉起一个新的、空的 Portainer。

    • 第一次访问登录页面时,不要创建新管理员,点击下方的 Restore from file

    • 上传刚才下载的备份文件,然后配置都回来了

然后是 docker 的容器部分。首先确认卷名,找到你真正需要的数据卷

docker volume ls # 找到后停掉
docker stop <容器ID>

打包

sudo -i
# 进入 Docker 卷目录 cd /var/lib/docker/volumes/ 
# 把你需要迁移的卷打包
tar -czvf /root/migration.tar.gz gpt_load-data newapi-data sub-store_data
# 直接 scp 扔过去 # 这里我尝试了 Termius 的 SFTP,估计是走本机中转,速度只有几十 k
scp /root/migration.tar.gz root@<IP>:/var/lib/docker/volumes/
# 在另一台机子上 sudo -i
cd /var/lib/docker/volumes/
tar -xzvf migration.tar.gz
# 让 docker 认出来
docker volume create gpt_load-data 
docker volume create newapi-data 
docker volume create sub-store_data

仓库配置

你需要把你的所有 docker-compose 文件组织起来,初始化 Git 仓库里并上传,这里以上传到 GitHub 为例。

文件结构仅供参考:

│  renovate.json
│          
├─ai
│      docker-compose.yml
│      
├─cloudflare-imgbed
│      docker-compose.yml
│      wrangler.toml
│      
├─network
│  │  docker-compose.yml
│  │  
│  ├─conf
│  │      Caddyfile
│  │      
│  └─site
├─nezha-dashboard
│      docker-compose.yml
│      
├─portainer
│      docker-compose.yml
│      
└─sub-store
        docker-compose.yml

接下来所有的容器相关操作都来到 Portainer 里面进行。

Portainer 配置

去 Portainer 创建 stack,Build method 选择到仓库类型,照着填就行

注意,如果你的 compose 文件里还依赖于仓库里的其他文件,比如 .env,那么得把下图中最下面的 Enable relative path volumes 勾上,Portainer 会从你填写的目录里把你的整个仓库拉下来再执行 compose 命令。

Re-pull image 这里我没有测试未勾选的效果,Force redeployment 的效果是每次 Webhook 触发时都会让容器重新部署,我这里没有勾选。

然后我们来到 GitHub 仓库里,填入对应 Webhook 地址,Payload URL 填 Portainer 给的, Content type 两种都可以。

完成后点 Update 就可以了。如果你之前给 Portainer 配置过 ZeroTrust,测试不通可能是 cf 那里没有配置 bypass 策略,得加个策略放行一下。

Note

如果后续要给 Portainer 配置多节点,记得在 cf 那里还要放行一个 api/endpoints

不出意外的话就可以了。

一些可能的报错

ErrorFailureCould not get the contents of the file '**/docker-compose.yml
检查 compose 文件是否有误,比如是否写了正确的镜像名

Renovate 配置

现在我们只是实现了代码即基础设施,上了一辆定制的电动车,但是不踩油门不动,每个镜像都要手动改镜像版本再 git push,太麻烦了。接下来我们将引入Renovate 机器人,实现自动更新镜像。

Warning

我也没用过 WatchTower,几种方法也没有孰好孰坏之分,这里不展开讨论

首先我们来把机器人安装到我们的仓库里,直达链接。添加到新仓库后会跳转到新页面来配置。这里没有许可证,选第二个免费版。

下一步,选择 Scan and Alert,这样子就会自动提 PR 了。

配置完成会跳转到个人主页,这里还能看到对应仓库的每一次触发日志

等一会仓库会自动收到一条来自机器人的 PR,类似于下图:

这条 PR 里会列出你的所有 compose 文件以及更新提示,可以直接 Merge,也可以顺手直接用下面配置覆盖。合并之后会多出一个 Dependency Dashboard 的 issue,可以在这里进行快速操作。

关于 renovate 的配置,建议仔细阅读一遍官方文档,这里放几个可能会用到的

两条路

这里我让 Gemini 和 Claude 改了 2 份 renovate.json,第一份让机器人来管理合并的事,挂了快一周,实测小版本更新自动 commit 没有问题;第二份中 "platformAutomerge" 不填,默认为 true,托管给 GitHub 来管理自动合并。但是 GitHub 私人仓库的 AutoMerge 功能只对 Pro 用户开放,而且我死活调不出来,一个 PR 挂在那里一天了都没有触发自动合并,等一位大佬来帮我看看

作用是上游镜像推了个小更新,就自动 commit 掉,大版本更新提 PR 手动批准

可用配置

{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:recommended" ], "timezone": "Asia/Shanghai", "schedule": ["at any time"], "platformAutomerge": false, "automergeSchedule": ["at any time"], "ignoreTests": true, "packageRules": [ { "matchDatasources": ["docker"], "matchUpdateTypes": ["minor", "patch", "digest"], "automerge": true, "automergeType": "branch", "groupName": "all non-major docker updates" }, { "matchDatasources": ["docker"], "matchUpdateTypes": ["major"], "automerge": false, "addLabels": ["major-update-warning"] } ] } 

[未成功] GitHub Pro 用户配置

需要打开仓库设置里的 Allow auto-merge

在我这里未生效,仅供参考

{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:recommended" ], "timezone": "Asia/Shanghai", "schedule": ["at any time"], "packageRules": [ { "matchDatasources": ["docker"], "matchUpdateTypes": ["minor", "patch", "digest"], "automerge": true, "groupName": "all non-major docker updates" }, { "matchDatasources": ["docker"], "matchUpdateTypes": ["major"], "automerge": false, "addLabels": ["major-update-warning"] } ] } 

后记

修改完文件记得跑一下下方的检查命令:

npx --yes --package renovate -- renovate-config-validator renovate.json 

实测 bunx 不可用:

"err": { "code": "MODULE_NOT_FOUND", 

如果忘了也没关系,机器人会在 issue 里报错

要是没啥问题,机器人就能自动干活了:


📌 转载信息
转载时间:
2026/1/14 10:58:07

用了 openwebui 大半年了。从一开始的毛胚房到现在的精装修。踩了很多坑,也一步步的看着 openwebui 更强大更好用。我把我理解的各项功能的好用配置分享给大家交流一下

安装

我是在群晖上通过 docker 方式安装的

docker image prune
docker pull ghcr.io/open-webui/open-webui:main
docker pull ghcr.io/open-webui/mcpo:main

除了端口设置外就只有一个文件夹挂载,这是所有用户数据了。我更新的方式都是通过重置这个容器来升级。

本来是没有第一行的。直到我 200G 系统盘因此被占满 ……

添加模型服务器

通过管理员设置 - 外部链接 - 加号 - 把供应商的域名和 apikey 填进来就可以了

他默认会把所有的模型都以私有的方式给你添加到 owu 来。你可以选择禁用某些用不到的模型,让他们不在可选列表里面出现(比如 rag 相关的重拍、向量化模型),也可以用过将私有转公开的方式让其他用户可以使用该模型。最简单也可以通过环境变量 BYPASS_MODEL_ACCESS_CONTROL=True 来放开所有模型,不用单独设置。

我比较喜欢我的小房子 我去 cherrystudio 偷了一些图标美化我的小房子~

可以在管理员设置 - 模型 - 编辑单个模型去上传图标。

函数

我本地的函数比较简单。就配置了联网搜索以及本地事件的补充,告诉 ai 当前时间

当前时间的话如下。

Message Date And Time 函数代码
"""
title: Message Date And Time
author: benasraudys
author_url: https://github.com/benasraudys
funding_url: https://github.com/benasraudys
description: Gives model current date and time context for each message. Don't forget to adjust the timezone in the settings.
version: 0.1.1
required_open_webui_version: 0.6.4
"""

import datetime
import os
from pydantic import BaseModel, Field
from typing import Callable, Awaitable, Any, Optional


class Filter:
    class Valves(BaseModel):
        timezone_hours: int = Field(
            default=0,
            description="Timezone offset hours (e.g., 5 for UTC+5:30, -4 for UTC-4:00)",
        )
        timezone_minutes: int = Field(
            default=0,
            description="Timezone offset minutes (e.g., 30 for UTC+5:30, 45 for UTC-4:45)",
        )
        southern_hemisphere: bool = Field(
            default=False,
            description="Enable if you're in the Southern Hemisphere (Australia, South America, etc.)",
        )

    def __init__(self):
        self.valves = self.Valves(
            **{
                "timezone_hours": int(os.getenv("DATETIME_TIMEZONE_HOURS", "0")),
                "timezone_minutes": int(os.getenv("DATETIME_TIMEZONE_MINUTES", "0")),
                "southern_hemisphere": os.getenv(
                    "DATETIME_SOUTHERN_HEMISPHERE", "false"
                ).lower()
                == "true",
            }
        )

    def get_season(self, month, southern_hemisphere=False):
        if not southern_hemisphere:
            if 3 <= month <= 5:
                return "Spring"
            elif 6 <= month <= 8:
                return "Summer"
            elif 9 <= month <= 11:
                return "Autumn"
            else:
                return "Winter"
        else:
            if 3 <= month <= 5:
                return "Autumn"
            elif 6 <= month <= 8:
                return "Winter"
            elif 9 <= month <= 11:
                return "Spring"
            else:
                return "Summer"

    def get_time_of_day(self, hour):
        if 5 <= hour < 12:
            return "Morning"
        elif 12 <= hour < 17:
            return "Afternoon"
        elif 17 <= hour < 21:
            return "Evening"
        else:
            return "Night"

    async def inlet(
        self,
        body: dict,
        __event_emitter__: Callable[[Any], Awaitable[None]],
        __request__: Any,
        __user__: Optional[dict] = None,
        __model__: Optional[dict] = None,
    ) -> dict:
        now_utc = datetime.datetime.utcnow()

        timezone_hours = self.valves.timezone_hours
        timezone_minutes = self.valves.timezone_minutes
        total_offset_minutes = (timezone_hours * 60) + timezone_minutes

        now = now_utc + datetime.timedelta(minutes=total_offset_minutes)

        month = now.month
        hour = now.hour

        formatted_date = now.strftime("%B %d, %Y")
        formatted_time = now.strftime("%H:%M:%S")
        day_of_week = now.strftime("%A")

        hours_offset = abs(total_offset_minutes) // 60
        minutes_offset = abs(total_offset_minutes) % 60

        if minutes_offset == 0:
            if total_offset_minutes >= 0:
                timezone_str = f"UTC+{hours_offset}"
            else:
                timezone_str = f"UTC-{hours_offset}"
        else:
            if total_offset_minutes >= 0:
                timezone_str = f"UTC+{hours_offset}:{minutes_offset:02d}"
            else:
                timezone_str = f"UTC-{hours_offset}:{minutes_offset:02d}"

        season = self.get_season(month, self.valves.southern_hemisphere)
        time_of_day = self.get_time_of_day(hour)

        context = f"Current date is {day_of_week}, {formatted_date}, {season}, {time_of_day}, the user time is {formatted_time} {timezone_str}"

        datetime_message = {
            "role": "system",
            "content": f"Time context: {context}. ",
        }

        if "messages" in body and isinstance(body["messages"], list):
            body["messages"].insert(0, datetime_message)
        else:
            body["messages"] = [datetime_message]

        return body

联网搜索的话主要是基于各家模型自己的能力(大概也就是在消息接口参数里面注入模型对应的工具,但是一般都要额外付费,所以我现在基本不用了) 我了解到的,gemini 有这样的函数配置,以及 openai 流式接口也有。这个可以站内查对应工具直接使用。函数认准方块佬就对了。加个方块,搜索更快!

两个工具结合就能达到以下示例的效果

外部工具

这里主要是提供 mcp 的能力 说实话挺难用的。但是我刚好联网搜索走其他方式都有些不好用。我目前是通过 mcp 的方式来实现的。

部署 mcpo

我通过在本地 docker 部署 mcpo,镜像地址在一开始应该已经准备好了。

我群晖这边的部署操作主要是配置了端口为 38000 以及启动命令

mcpo --config /app/mcp-config.json --hot-reload

然后通过文件挂载 /app/mcp-config.json 这个配置文件

文件内容可以参考下面这个

{
    "mcpServers": {
      "grok-search": {
	      "type": "stdio",
	      "command": "npx",
	      "args": ["-y", "grok-search-mcp"],
	      "env": {
	        "GROK_API_URL": "https://-----/v1",
	        "GROK_API_KEY": "-----",
	        "GROK_MODEL": "grok-4-fast",
	        "DEBUG": "true"
	      }
      }
    }
  }

然后我们就可以直接访问 38000 这个端口就可以看到 json 返回了 也能知道你哪些工具启动成功了。

我们就能去管理员设置 - 外部工具 - 加号 新增工具服务器了

在配置完成之后我们可以在对话界面去勾选这个工具 对他进行一些询问。示例如下

当然你可能觉得每一次点都好费劲,当然我们也可以到 管理员设置 - 模型 - 对应模型去默认启动某些工具或其他功能

知识库

知识库我用的其实不多。但是我觉得效果还是不错的。就是遇到这个坑导致 rag 检索不符合预期

内容提取

首先提取引擎我推荐 mistral (主要可以白嫖) 效果也不错 我用过自部署的 tika。有些中文 pdf 会乱码 这个挺好的。但是我还是建议如果可以自己转 md 把

嵌入和检索

这一块我也是跟着 ai 配的。效果还是不错的。

上传合适的文档,结果也能够图文并茂

辅助功能

在管理员设置 - 界面 - 任务这边可以配置一些异步的小任务是否使用 ai 生成

我就开了这个标题自动生成(效果图如左上角),openai 每天免费的 nano 用不完就来这边干点活吧。有标题了也方便你到时候快速查询历史的对话。

图片生成

目前我觉得 owu 做的这个功能比较死板(主要问题是只能填入一个模型)

我有个朋友部署好了 comfy,等给我之后这边估计Pro 就要从对话模型里面选了。

通过这种方式配置好的话 体验和 openai 就很像了。对话勾选一下画图。描述需求就好了


画图也踩过一些坑,比如分享一个 openwebui 中生图模型 chunk too big 问题的解决办法 。里面也有其他佬遇到的其他坑和他们的解决方式。L 站真的是我见过 ai 相关信息最快的一个站了。在站内搜不到,我估计谷歌也搜不到

结语

以上就是我的配置心得。希望我的分享能给你一些启发,也欢迎大家交流各自的 “装修方案”。


📌 转载信息
原作者:
lie5860
转载时间:
2026/1/14 10:56:16

perplexity mcp docker 一键部署(pro 账号无限额度 ai 搜索 mcp)继续讨论:

当监测到账号过期,执行 tg 推送。

  • enable 控制是否启用账号监测
  • interval 控制多久监测
  • test question: 测试连通性使用的问题
  • tg-bot-token:从 `@BotFather` 获取
  • tg-chat_id:从 @get_id_bot 获取

配置文件 token_pool_config.json 新增 heart_beat 字段控制心跳检测相关功能

{ "heart_beat": { "enable": true, "question": "现在是农历几月几号?", "interval": 6, "tg_bot_token": "12345678", "tg_chat_id": "12345678" }, "tokens": [...] } 

仓库地址:


📌 转载信息
原作者:
shan_CW
转载时间:
2026/1/14 10:45:35

开源微信推送服务

使用 Spring Boot 4.0 和 GraalVM Native

通过企业微信(WeCom),将系统消息稳定、合规地推送到用户的微信中接收。

整体消息流转路径如下:

HTTP 请求

企业微信 API

业务系统 / 服务

push-server

企业微信服务端

微信 App

最终效果是: 用户在微信中收到消息,但技术通道使用的是企业微信。

为什么选择企业微信?
相比微信公众号,企业微信具备天然的系统通知优势:

无缝触达:消息最终可到达 微信 App(需关注插件)。
主动推送:支持无限制的主动消息推送,适合通知。
稳定合规:官方允许的系统消息通道,不涉及内容风控。
简单易用:无需复杂的模板消息申请,开发接口清晰。

有什么需要的或者想法可以提,交流一下

项目地址

教程

1. 注册企业微信

谁都可以注册企业微信,无需认证,按说明注册并使用微信扫二维码完成管理员绑定

2. 微信插件

选择我的企业,点击微信插件,使用手机扫码关注

3. 添加应用

添加 logo 和应用名称以及可见范围,选择一个部门或者自己都行,创建应用

4. 配置应用

4.1 查看 Secret

创建完成后会进入当前页面,点击查看可以看 Secret

点击发送,可前往企业微信查看消息

点击查看,保存好,不要泄露,至关重要

4.2 配置可信 IP

在配置可信 IP 之前,我们需要先设置可信域名

可信域名需要校验域名,点击 申请校验域名 获得认证信息

下载文件放置到一个网站的根目录下,我这里放置到了自己在 cloudflare 的 Workers 和 Pages 博客上 https://mazepeng.com/

当文件可以访问到的时候就可以设置可信域名了


现在推送消息的服务必须有可信 IP,如何获得自己的 IP 呢

访问 https://ifconfig.me/ 或者直接百度 IP 就可以看到自己的公网 IP 了

点击应用管理,点击应用,拉倒最下面,配置可信 IP

5. 运行 push-server

支持 docker 部署和本地应用部署,这里我就介绍一下 docker 部署

5.1 docker 命令部署

  docker run -d \
  --name push-server \
  -p 8000:8000 \
  -e PUSH_AUTH_KEY="替换为自己的key" \
  -e PUSH_WECOM_APP_KEY="你的应用AppKey" \
  -e PUSH_WECOM_APP_SECRET="你的应用AppSecret" \
  -e PUSH_WECOM_AGENT_ID="1000001" \
  qingzhoudev/push-server:latest
  
#安全设置,默认值为下方值,需要修改添加环境变量修改
  docker run -d \
  --name push-server \
  -p 8000:8000 \
  -e PUSH_AUTH_KEY="替换为自己的key" \
  -e PUSH_WECOM_APP_KEY="你的应用AppKey" \
  -e PUSH_WECOM_APP_SECRET="你的应用AppSecret" \
  -e PUSH_WECOM_AGENT_ID="1000001" \
  -e PUSH_SECURITY_BLOCK_MINUTES="30" \
  -e PUSH_SECURITY_FAIL_WINDOW_MINUTES="5" \
  -e PUSH_SECURITY_MAX_FAILS="5" \
  -e PUSH_SECURITY_RATE_LIMIT_CAPACITY="10" \
  -e PUSH_SECURITY_RATE_LIMIT_QPS="1" \
  qingzhoudev/push-server:latest

  • PUSH_AUTH_KEY 请求头密钥,需要自己设置一个复杂的即可
  • PUSH_WECOM_APP_KEY 就是企业 ID
  • PUSH_WECOM_APP_SECRET 就是保存的 Secret
  • PUSH_WECOM_AGENT_ID 应用 ID

替换后直接 docker 启动

5.2 使用 Docker Compose

services: push-server:  qingzhoudev/push-server:latest container_name: push-server ports: - "8000:8000" volumes: - ./application-prod.yml:/app/config/application-prod.yml:ro restart: unless-stopped 

application-prod.yml 文件

push: auth: key: "CHANGE_ME" security: block-minutes: 30 fail-window-minutes: 5 max-fails: 5 rate-limit-capacity: 10 rate-limit-qps: 1 wecom: app-key: "CHANGE_ME" app-secret: "CHANGE_ME" agent-id: 1000001 webhook-url: server: port: 8000 

5.3 企业 ID

5.4 应用 ID

6 推送消息

和正常接收微信消息一样,没有什么区别

curl -X POST http://localhost:8000/api/v1/push \
  -H "X-API-Key: 替换为自己的key" \
  -H "Content-Type: application/json" \
  -d '{
"target": "ZhangSan|LiSi",
"type": "TEXT",
"content": "系统通知:您的任务已构建完成。"
}'
curl -X POST http://localhost:8000/api/v1/push \ -H "X-API-Key: 替换为自己的key" \ -H "Content-Type: application/json" \ -d '{
"target": "MaZePeng",
"type": "TEXT_CARD",
"title": "测试Push Server",
"content": "我是 Push Server,这是我作为服务端的第一条消息",
"url": "https://www.mazepeng.com"
}'
curl -X POST http://localhost:8000/api/v1/push \ -H "X-API-Key: 替换为自己的key" \ -H "Content-Type: application/json" \ -d '{
"target": "MaZePeng",
"type": "NEWS",
"articles": [
{
"title": "测试 Article",
"description": "我是描述",
"url": "https://www.mazepeng.com",
"picUrl": "https://mazepeng.com/img/bg/a_larger_image_of_the_homepage.jpg"
}
]
}'

类型有:

  • TEXT
  • MARKDOWN(微信不支持)
  • TEXT_CARD
  • NEWS

📌 转载信息
原作者:
mazp
转载时间:
2026/1/14 10:25:03