标签 Docker Compose 下的文章

Matrix 首页推荐 

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。 

文章代表作者个人观点,少数派仅对标题和排版略作修改。


大家好,我是飘雷。

在这个全民刷手机的时代,我们看似阅尽天下事,实则很容易被困在信息茧房里。

各种资讯 app 每天都在争先恐后地把它们认为用户可能喜欢的内容推送给我们,久而久之,我们获得的信息难免会落入同质化,真正有价值的信息其实不多。想要解决这个问题,就要尝试从被动投喂,变成主动获取。

最近 GitHub 上大火的 TrendRadar 项目,恰好击中了这个痛点。

项目地址:https://github.com/sansan0/TrendRadar

它能根据咱们自己设置的关键词和监控策略,聚合多平台热点和 RSS 订阅,还能将 AI 分析简报直推手机,也支持接入 MCP 架构,利用AI大模型进行自然语言的对话分析、情感洞察与趋势预测。

TrendRadar 特别适合投资者、自媒体人、企业公关、关注时事等用户使用,这也使得它在 GitHub 上获得了 4.3 万的超高星收藏。

趁着这几天有空,我用手头的威联通 NAS 把这个情报雷达搭建了起来,部署和配置的过程虽然有些繁琐,但成果也是喜人的。

我们可以通过网页访问 NAS IP 来查阅自己感兴趣的新闻:

也可以让它把热点新闻自动推送到邮箱等平台:

还可以在推送信息中看到 AI 分析的简报:

这种对信息掌控感真的拉满了情绪价值,个人觉得特别好用,所以本期我就同大家分享 TrendRadar 的手把手部署配置教程。

TrendRadar 部署流程

这里我们来展示如何在威联通 NAS 上通过 Docker Compose 进行部署,用到的设备是威联通最新的八盘位旗舰新品 Qu805。

下载项目文件

解压下载的压缩包,会得到一个名为 TrendRadar-master 的文件夹:

接下来咱们将上图中这些文件和文件夹全部上传到威联通 NAS 里,这里我放在了 /Container/TrendRadar 目录内,大家可以根据自己的实际情况灵活调整,只需要记住保存位置即可。

Docker Compose 部署

TrendRadar 自带的 Docker Compose 文件是根据本机访问的默认情况配置的,不太适合 NAS 场景,所以这里我们需要进行一些改动。

登录威联通 NAS 后台,打开 Container Station 容器工作站,点击左侧的应用程序,然后点击右侧黑色创建按钮。

在弹出的代码输入框中,我们输入以下 YAML 代码。注意里面的注释部分,像推送设置之类的选项可以在 YAML 代码中提前指定,也可以通过修改文件后期进行调整,这里大家需要根据自己的实际情况进行配置:

services:
  trendradar:
    image: wantcat/trendradar:latest
    container_name: trendradar
    restart: unless-stopped
    # 左边 8848 是你访问 NAS 的端口 (http://nas-ip:8848),根据需要修改
    # 右边 8080 是容器内部端口,不要改
    ports:
      - "8848:8080"


    # 映射目录,左侧为NAS文件夹路径,这里需要根据实际情况修改,比如我是在NAS的 /share/Container/TrendRadar
    volumes:
      - /share/Container/TrendRadar/config:/app/config
      - /share/Container/TrendRadar/output:/app/output


    environment:
      - TZ=Asia/Shanghai
      # 核心配置
      - ENABLE_CRAWLER=${ENABLE_CRAWLER:-}
      - ENABLE_NOTIFICATION=${ENABLE_NOTIFICATION:-}
      - REPORT_MODE=${REPORT_MODE:-}
      - DISPLAY_MODE=${DISPLAY_MODE:-}
      # Web 服务器,True为强制启用,启用后可以通过网页访问
      - ENABLE_WEBSERVER=true
      - WEBSERVER_PORT=${WEBSERVER_PORT:-8080}
      # 通知渠道
      # 飞书
      - FEISHU_WEBHOOK_URL=${FEISHU_WEBHOOK_URL:-}
      # 电报
      - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN:-}
      - TELEGRAM_CHAT_ID=${TELEGRAM_CHAT_ID:-}
      # 钉钉
      - DINGTALK_WEBHOOK_URL=${DINGTALK_WEBHOOK_URL:-}
      # 企业微信
      - WEWORK_WEBHOOK_URL=${WEWORK_WEBHOOK_URL:-}
      - WEWORK_MSG_TYPE=${WEWORK_MSG_TYPE:-}
      # 邮件配置
      - EMAIL_FROM=${EMAIL_FROM:-}
      - EMAIL_PASSWORD=${EMAIL_PASSWORD:-}
      - EMAIL_TO=${EMAIL_TO:-}
      - EMAIL_SMTP_SERVER=${EMAIL_SMTP_SERVER:-}
      - EMAIL_SMTP_PORT=${EMAIL_SMTP_PORT:-}
      # ntfy配置
      - NTFY_SERVER_URL=${NTFY_SERVER_URL:-https://ntfy.sh}
      - NTFY_TOPIC=${NTFY_TOPIC:-}
      - NTFY_TOKEN=${NTFY_TOKEN:-}
      # Bark配置
      - BARK_URL=${BARK_URL:-}
      # Slack配置
      - SLACK_WEBHOOK_URL=${SLACK_WEBHOOK_URL:-}
      # 通用Webhook配置
      - GENERIC_WEBHOOK_URL=${GENERIC_WEBHOOK_URL:-}
      - GENERIC_WEBHOOK_TEMPLATE=${GENERIC_WEBHOOK_TEMPLATE:-}
      # AI 分析配置,如果你需要开启 AI 分析,可以在这里填,或者去config.yaml填
      - AI_ANALYSIS_ENABLED=${AI_ANALYSIS_ENABLED:-false}
      - AI_API_KEY=${AI_API_KEY:-}
      - AI_PROVIDER=${AI_PROVIDER:-}
      - AI_MODEL=${AI_MODEL:-}
      - AI_BASE_URL=${AI_BASE_URL:-}
      # 远程存储配置(S3 兼容协议)
      - S3_ENDPOINT_URL=${S3_ENDPOINT_URL:-}
      - S3_BUCKET_NAME=${S3_BUCKET_NAME:-}
      - S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID:-}
      - S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY:-}
      - S3_REGION=${S3_REGION:-}
      # 运行模式
      - CRON_SCHEDULE=${CRON_SCHEDULE:-*/30 * * * *}
      - RUN_MODE=${RUN_MODE:-cron}
      - IMMEDIATE_RUN=${IMMEDIATE_RUN:-true}


# MCP 服务:提供接口给 Claude Desktop 等客户端,用不上的话下面这些代码可以删除
  trendradar-mcp:
    image: wantcat/trendradar-mcp:latest
    container_name: trendradar-mcp
    restart: unless-stopped


    ports:
      - "3333:3333"


    # 必须挂载与上面相同的路径,否则读取不到数据
    volumes:
      - /share/Container/TrendRadar/config:/app/config:ro
      - /share/Container/TrendRadar/output:/app/output


    environment:
      - TZ=Asia/Shanghai

代码粘贴无误后,记得点击下方的验证按钮,确保 YAML 格式正确。

最后点击创建按钮,系统就会自动拉取这个非常精简的镜像并启动服务,咱们可以在概览或容器列表中看到 trendradar trendradar-mcp 两个容器正在运行,状态显示为绿色小圆点。

常用配置选项解析

TrendRadar 的作者在项目页面提供了详细的个性化配置方法,感兴趣的朋友可以去详细阅读下,这里咱们就来看看一些常用的部分。

1配置监控平台

TrendRadar 的资讯数据来源于 newsnow,默认会抓取11个平台的热点新闻,需要抓取其他平台数据的的朋友可以去 newsnow 网站里查找一下。

查询地址:https://newsnow.busiyi.world/

需要对监控平台进行修改的话,可以打开 config 文件夹下的 config.yaml 文件,修改 platforms 部分:

威联通自带文本编辑器。你可以右键点击该文件,选择「打开方式 -> Text Editor」直接在线编辑,改完保存即可,无需下载到本地再上传。

platforms:
  - id: "toutiao"
    name: "今日头条"
  - id: "baidu"
    name: "百度热搜"
  - id: "wallstreetcn-hot"
    name: "华尔街见闻"
  # 添加更多平台...

去 newsnow 添加有点麻烦,图省事儿的话可以去下面的项目复制别人整理的 config.yaml 文件。

项目地址:https://github.com/sansan0/TrendRadar/issues/95

不过需要注意,监控的平台不是越多越好,建议选择 10 到 15 个核心平台,平台过多会导致信息过载,反而降低使用体验。

配置关键词

TrendRadar 的关键词设置是决定我们每天看到的是满屏含金量的干货,还是充斥着垃圾信息的关键一步。TrendRadar 的核心过滤逻辑存放在 config 文件夹下的 frequency_words.txt 文件中,需要手动细心配置。

这里打开威联通的 File Station,定位到我们部署时映射的路径,比如我使用的是 /share/Container/TrendRadar/config/,找到名为 frequency_words.txt 的文件。

TrendRadar 对关键字的配置不仅仅是写几个词那么简单,它支持七种语法,咱们简单举例来介绍下。

# --- 核心关注区 ---
NAS
威联通
群晖
Docker
TrendRadar
DeepSeek
ChatGPT
显卡 & 降价
# --- 必须屏蔽区 (净化眼球) ---
!出轨
!离婚
!绯闻
!男星
!女星
!只有我一个人
!震惊
!拼多多 & 砍一刀
# --- 行业观察 ---
人工智能
开源项目
# --- 这里的每一行代表一个规则,系统会逐行扫描 ---

  • 基础匹配(直接写词):威联通:只要标题或内容里有「威联通」,就会被抓取。
  • 强制屏蔽(使用 ! 表示「非」);在关键字前面加上感叹号后,包含此关键字的新闻会被直接丢弃。比如不想看娱乐圈的出轨八卦破事,使用「!出轨」,任何包含出轨的新闻就不会被显示出了。
  • 组合逻辑(使用 & 表示「与」):「NAS & 教程」的意思是,只有同时包含「NAS」和「教程」的文章才会被抓取,这能帮你过滤掉单纯的NAS降价广告,只看干货。
  • 多选逻辑(使用 | 表示「或」):「DeepSeek | ChatGPT | Claude」的意思是,只要包含这三个 AI 模型中的任意一个,都抓取。
  • 短语匹配(使用英文双引号""):以"Black Myth"为例,如果你直接写 Black Myth(没引号),系统可能会分别匹配 Black 和 Myth。加上引号后,会强制匹配由于空格隔开的专有名词(如《黑神话》)。
  • 权重提升(使用 ^):「^漏洞」的意思是,给「漏洞」这个词极高的权重,一旦出现,即使它在热榜排名不高,也会被强制推送到显眼位置。
  • 正则匹配式(使用 ~,适合硬核玩家):这部分就有点复杂了,不太适合普通玩家折腾,感兴趣的硬核玩家直接去项目原网页详细研究即可。

编辑完成后,点击威联通 Text Editor 右上角的「保存」,最后别忘了,修改关键词后,需要重启容器才能生效。

热点权重新调整

很多时候我们觉得热搜没啥意思,是因为平台的算法优先推荐短时间内爆发力强的内容,比如什么某明星忘本了道歉了之类的。但很多用户往往更关注那些有持久影响力的大事,比如国家重大政策和科技突破的消息等等。

advanced:
  weight:
    rank: 0.6           # 排名权重
    frequency: 0.3      # 频次权重
    hotness: 0.1        # 热度权重

在 TrendRadar 的 config/config.yaml 文件中,有一个 advanced -> weight 模块,这里就是控制热点筛选逻辑的地方,包含 rank、frequency、hotness 三个参数,这三个数字相加必须严格等于 1.0,否则程序会报错罢工。

在修改之前,咱们需要明白这三个数字代表什么,TrendRadar 默认使用的是较为平衡的配置:

  • rank(排名权重):代表爆发力,数值越高,越倾向于抓取各大榜单前几名的内容,哪怕它只火了十分钟。
  • frequency(频次权重):代表持久力,数值越高,越倾向于抓取那些在一天内反复上榜、被不同平台多次讨论的内容。这是过滤标题党的关键。
  • hotness(热度权重):代表绝对数值,由于不同平台的热度单位不同,有的几百万,有的几万,参考价值较低,通常保持低位即可。

一般来说,追求速度和时效性的用户提高排名权重,追求深度和稳定性的用户提高频次权重。

建议每次只调整 0.1 到 0.2 的数值,调完后保存文件,并在 Container Station 中重启容器生效。

修改后观察一两天的推送效果,如果觉得信息太滞后,就稍微调高 rank;如果觉得垃圾信息还是多,就继续调高 frequency。

接下来咱们来看看两个典型的配置案例。

抓取实时热点

如果你是自媒体博主或者营销人员,不想错过任何稍纵即逝的大瓜,想快速了解当前最火话题,可以使用这个配置,把所有瞬间冲上榜首的内容都推给你:

advanced:
  weight:
    rank: 0.8       # 拉高排名权重,只要进前三,立刻抓取
    frequency: 0.1  # 稍微关注一下持续性,不太在乎
    hotness: 0.1    # 保持默认

追踪重点话题

如果想要多看一些经过时间沉淀的重大新闻,可以使用这个配置:

advanced:
  weight:
    rank: 0.4           # 降低排名权重,不迷信热度榜首
    frequency: 0.5      # 拉高频次权重,更偏向持续热度
    hotness: 0.1

推送配置

TrendRadar v5.0 版本对推送内容进行了大规模重构,现在的推送内容不再是简单的链接堆砌,而是被划分为热榜新闻、RSS 订阅、全新热点(New 标记)、独立展示区、AI 分析五大核心板块。

而在推送方式方面,TrendRadar 支持微信、飞书、钉钉、Telegram、邮件、ntfy、bark、Slack 等渠道的智能推送,并且有当日汇总、当前榜单、增量监控三种推送模式。

推送相关的配置也是通过 config/config.yaml 文件来修改,同时也可以在 Docker Compose 代码中提前写好,在部署容器时就完整设置。这里我们以邮件推送为例进行展示。

开启 HTML 格式

很多用户反馈邮件收到的是一堆乱码或者纯文本,没有任何排版,原因就是没开启 HTML 支持。

得确保 config/config.yaml,找到 storage -> formats -> html,设置为 true

storage:
  formats:
    sqlite: true
    txt: false
    html: true   # 必须启用,否则邮件推送会失败

配置 SMTP 发送服务(以 163 邮箱为例)

虽然 TrendRadar 支持多种推送方式(如飞书、钉钉),但邮件依然是阅读长文和 AI 分析报告的最佳载体。

国内网络环境下,我自己是选择使用 163 邮箱作为发送方,稳定性非常高。当然 QQ 邮箱也可以,就是容易被系统判定为垃圾邮件。

首先登录你的 163 网页版邮箱,点击顶部「设置」 -> 「POP3/SMTP/IMAP」,开启「IMAP/SMTP 服务」或「POP3/SMTP 服务」,然后新增一个授权码。

系统会让你发送短信验证,验证成功后会弹出一个只显示一次的授权码,复制这个授权码,这是我们接下来要填的密码。

接下来咱们继续编辑 config.yaml,首先找到 notification 通知总开关的位置,将 enabled 设置为 true,开启通知。

然后找到 email 相关的配置区域:

具体设置方法如下所示:

      # 邮件发送方配置 (163邮箱)
      - EMAIL_FROM=你的账号@163.com
      # 注意:这里填的是刚刚获得的【授权码】,不是邮箱登录密码!
      - EMAIL_PASSWORD=填入你刚才获取的授权码
      - EMAIL_SMTP_SERVER=smtp.163.com
      - EMAIL_SMTP_PORT=465
      
      # 邮件接收方配置
      # 接收邮箱可以是同一个163邮箱,也可以是QQ邮箱或Gmail
      - EMAIL_TO=接收通知的邮箱@qq.com

如果这里不适用 163 邮箱来推送,可以根据作者提供的表格来修改 SMTP 服务器和端口地址:

配置完成后,保存文件并重启容器。

如果配置正确,TrendRadar 运行完毕后,你会收到一封标题类似《TrendRadar 每日热点报告》的邮件。

如果还想要设置推送频率和推送模式的话,同样可以查看作者给出的详细配置说明,限于篇幅这里不赘述了。

AI 分析配置

在 5.0 版本之前,TrendRadar 只能算一个勤恳的新闻搬运工;但从 5.0 开始,作者进行了重大升级,通过接入 AI 大模型 API 来对内容进行深度分析,自动生成热点洞察。

分析的内容包括:

  • 热点趋势概述
  • 关键词热度分析
  • 跨平台关联分析
  • 潜在影响评估
  • 值得关注的信号
  • 总结与建议

这里我们以 DeepSeek 为例,展示如何进行设置。

获取 API 的过程这里不再赘述,大家去自己的 API 提供商平台上复制即可,我们主要讲讲本地设置,同样要修改 config/config.yaml 这个配置文件,找到 ai_analysis 部分:

以 DeepSeek 官方 API 为例,如下设置:

ai_analysis:
  enabled: true                     # 是否启用 AI 分析,true为开启
  provider: "deepseek"              # AI 提供商
  api_key: ""                       # API Key
  model: "deepseek-reasoner"        # 模型名称,deepseek-reasoner为深度思考模式
  base_url: ""                      # 自定义 API 端点(可选)
  timeout: 120                      # 请求超时(秒)
  push_mode: "both"                 # 推送模式,both (推送到所有渠道)
  max_news_for_analysis: 50         # 最多分析多少条新闻
  include_rss: true                 # 是否包含 RSS 内容
  prompt_file: "ai_analysis_prompt.txt"  # 提示词配置文件

另外在 config 文件夹下,还有一个名为 ai_analysis_prompt.txt 的文件。这里存放的是发给 AI 的 Prompt 提示词。

作者已经将默认的提示词写好,包含趋势概述、关键词热度、跨平台关联、潜在影响等。但如果你有特殊需求,那可以根据自己需求进行针对性修改。

配置并重启容器后,AI 模块会在每次的抓取任务结束后运行,我们能在推送消息的底部看到像这样的分析报告:

总结

经过这一番折腾,当看到自己想看的新闻躺在邮箱里时,之前所有的复杂的配置都是值得的了。

以前,我们是算法的猎物,被锁在各大平台推送算法打造的信息茧房里,免不了被标题党牵着鼻子走。

而现在借助 TrendRadar 和 AI 的深度思考,我们终于可以翻身成为信息的主人,可以更清晰的知道这个世界发生了什么,哪些是转瞬即逝的信息泡沫,哪些是真正值得关注的行业暗流。

写到这里我又想到,像 TrendRadar 这类应用,或许才是许多公司和工作室采购 NAS 的原因之一。NAS 并非只能在家用环境中保存照片、挂挂 PT,更是能通过持久稳定工作,帮助用户圈出一块清醒的自留地,把实现各种功能的主动权重新握在自己手里。

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀

    Traefik 优势与考量:本地部署的理想选择

    Traefik 是一款功能强大的云原生边缘路由器(Edge Router),它为 Docker 等容器化环境带来了显著的便利和优势:

    主要优势

    • 服务自动发现与配置: Traefik 能够自动检测容器中运行的新服务,并即时自动配置相应的反向代理(Reverse Proxy)和负载均衡规则,无需手动修改配置文件。
    • 简化的 SSL/TLS 管理: 它内置了对 Let's Encrypt 的支持,可以实现域名的 SSL 证书自动申请与自动续签,大大减轻了运维负担
    • 端口暴露最小化: 极大地提高了安全性。对于宿主机而言,Traefik 只需要对外暴露标准的 80 和 443端口,无需再为每个服务暴露额外的端口。

    局限与考量

    尽管 Traefik 优势显著,但在配置灵活性方面,它不如传统反向代理工具(如 Nginx)那样直观和强大:

    • 非容器化应用集成复杂: 对于不在 Docker 等容器中部署的传统应用,Traefik 的反向代理配置会相对复杂和繁琐。它主要面向动态的云原生环境,对静态配置的支持不如 Nginx 灵活
    • 特定配置的挑战: 在需要进行复杂、细致的反代逻辑配置时,可能会不如 Nginx 的配置文件那样灵活易读。
      在快速启动前,有必要说明一下,本教程是使用CF 作为域名ns进行申请泛域名证书,如果你想使用其他提供商,可以在 Traefik 的文档 更改 Provider Code和 Environment Variables 这两个值,当然我会在本篇配置文件有注释提醒。
      另外如果没有额外配置反代的需求(指不跑在docker的服务),需要建立config.yml 文件,当然还需要在traefik.yml 关闭注释。

    快速启动 Traefik

    请按照一下文件目录创建文件,其中acme.json只需要创建文件即可(注意必须要交建立哦,config文件根据自己需求建立即可)

    文件目录:

    |   .env    #文件配置
    |   docker-compose.yaml        # docker-compose 文件
    |
    \---data
            acme.json    # SSL 文件
            config.yml    # 额外配置文件(配置额外反代例如宿主机的)
            traefik.yml # Traefik 配置文件

    docker-compose.yaml 文件:

    services:
      traefik:  # 定义名为 traefik 的服务
        image: traefik:v3.0  # 使用 Traefik 的 v3.0 版本镜像
        container_name: traefik  # 容器名称为 traefik
        restart: unless-stopped  # 容器自动重启,除非手动停止
        security_opt:
          - no-new-privileges:true  # 增加安全性,防止提权
        networks:
          - traefik-net  # 连接到名为 proxy 的外部网络
        ports:
          - 80:80  # 映射主机的 80 端口到容器的 80 端口 (HTTP)
          - 443:443  # 映射主机的 443 端口到容器的 443 端口 (HTTPS)
          - 443:443/tcp  # 映射主机的 443 TCP 端口到容器的 443 端口 (TCP 协议)
          - 443:443/udp  # 映射主机的 443 UDP 端口到容器的 443 端口 (UDP 协议)
        environment:
          CF_DNS_API_TOKEN_FILE: ${CF_DNS_API_TOKEN}  # 设置环境变量,使用 Cloudflare API 令牌,根据Traefik文档 选择你的服务提供商的token
          TRAEFIK_DASHBOARD_CREDENTIALS: ${TRAEFIK_DASHBOARD_CREDENTIALS}  # 设置环境变量,定义 Traefik 仪表板的凭据
        env_file: .env  # 从 .env 文件中加载环境变量
        volumes:
          - /etc/localtime:/etc/localtime:ro  # 挂载主机的时间设置到容器,确保时间同步,且只读
          - /var/run/docker.sock:/var/run/docker.sock:ro  # 挂载 Docker 的 socket 文件,允许 Traefik 访问 Docker API,只读
          - ./data/traefik.yml:/traefik.yml:ro  # 挂载本地的 traefik.yml 配置文件到容器内,只读
          - ./data/acme.json:/acme.json  # 挂载本地的 acme.json 文件,存储 SSL 证书信息
          - ./data/config.yml:/config.yml:ro  # 可选的配置文件挂载路径,若需要可取消注释
        labels:  # 设置 Traefik 的相关标签,用于路由和中间件配置
          - "traefik.enable=true"  # 启用 Traefik 服务
          - "traefik.http.routers.traefik.entrypoints=http"  # 配置 HTTP 入口点
          - "traefik.http.routers.traefik.rule=Host(`${TRAEFIK_DASHBOARD_HOST}`)" # 定义 Traefik 仪表板的访问规则
          - "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_DASHBOARD_CREDENTIALS}"  # 为仪表板配置基本身份验证
          - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"  # 配置 HTTP 到 HTTPS 的重定向
          - "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https"  # 添加自定义请求头
          - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"  # 将重定向中间件应用到 HTTP 路由
          - "traefik.http.routers.traefik-secure.entrypoints=https"  # 配置 HTTPS 入口点
          - "traefik.http.routers.traefik-secure.rule=Host(`${TRAEFIK_DASHBOARD_HOST}`)" # 定义 HTTPS 路由的访问规则
          - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"  # 为 HTTPS 路由应用基本身份验证中间件
          - "traefik.http.routers.traefik-secure.tls=true"  # 启用 TLS (HTTPS)
          - "traefik.http.routers.traefik-secure.tls.certresolver=${NS_Domain}"  # 使用 DNS服务提供商 code 根据Traefik文档 选择你的服务提供商code
          - "traefik.http.routers.traefik-secure.tls.domains[0].main=${TLS_MAIN_DOMAIN}"  # 定义主域名
          - "traefik.http.routers.traefik-secure.tls.domains[0].sans=${TLS_SANS_DOMAIN}"  # 定义子域名通配符
          - "traefik.http.routers.traefik-secure.service=api@internal"  # 使用 Traefik 内部 API 服务
    
    networks:
      traefik-net:
        external: false  # 使用外部定义的名为 proxy 的网络

    .env 文件:

    
    # .env 文件
    
    # CF API
    CF_DNS_API_TOKEN=
    
    NS_Domain=cloudflare #根据你使用的DNS服务提供商 code 根据Traefik文档 选择你的服务提供商code
    # 设置环境变量,定义 Traefik 仪表板的凭据 ,默认账户名密码:admin
    TRAEFIK_DASHBOARD_CREDENTIALS=admin:$$2y$$05$$aOXINGgHfnZ//t.kUs7o9ej3faUbj2yNxc8k3WVrBybFOxxaTsLTe
    
    # Traefik Dashboard 域名
    TRAEFIK_DASHBOARD_HOST=dash.docker.localhost
    
    # TLS 主域名和子域名
    TLS_MAIN_DOMAIN=docker.localhost
    TLS_SANS_DOMAIN=*.docker.localhost

    traefik.yml 文件:

    
    api:
      dashboard: true  # 启用 Traefik 的仪表板,可以通过指定的路由访问
      debug: true  # 启用调试模式,输出更多的日志信息
    
    entryPoints:
      http:
        address: ":80"  # 定义 HTTP 入口点,监听 80 端口
        http:
          redirections:
            entryPoint:
              to: https  # 重定向 HTTP 请求到 HTTPS
              scheme: https  # 使用 HTTPS 作为重定向的目标协议
    
      https:
        address: ":443"  # 定义 HTTPS 入口点,监听 443 端口
    
    serversTransport:
      insecureSkipVerify: true  # 在与后端服务器通信时,跳过 TLS 证书验证(不推荐在生产环境中使用)
    
    providers:
      docker:
        endpoint: "unix:///var/run/docker.sock"  # 指定 Docker API 的 socket 文件路径,Traefik 使用它来检测和管理 Docker 容器
        exposedByDefault: false  # 默认情况下,Docker 容器不会自动暴露给 Traefik,必须显式指定
        watch: true
    
      file:
        filename: /config.yml  # (已注释) 可选的文件提供者配置,用于从外部文件加载配置
        watch: true  # 允许 Traefik 自动监控和加载配置文件变化
    
    
    certificatesResolvers:
      cloudflare: # 使用 DNS服务提供商 code 根据Traefik文档 选择你的服务提供商code
        acme:
          email: youremail@email.com  # 申请 ACME 证书时使用的电子邮件地址
          storage: acme.json  # 存储证书信息的文件路径
          # caServer: https://acme-v02.api.letsencrypt.org/directory # 正式环境的 Let's Encrypt 服务器 (默认)
          caServer: https://acme-staging-v02.api.letsencrypt.org/directory # 测试环境的 Let's Encrypt 服务器 (用于调试)
    
          dnsChallenge:
            provider: cloudflare  # 使用 DNS服务提供商 code 根据Traefik文档 选择你的服务提供商code 进行 DNS 验证以获取证书
            #disablePropagationCheck: true # (已注释) 如果通过 Cloudflare 获取证书有问题,可以取消注释此行以禁用传播检查
            #delayBeforeCheck: 60s # (已注释) 如果需要确保 TXT 记录准备就绪,可以取消注释此行并设置检查延迟
            resolvers:
              - "223.5.5.5:53"  # AliDNS 解析器
              - "119.29.29.29:53"  # 备用 DNS 解析器
              - "1.1.1.1" # 备用 DNS 解析器

    config.yml 文件

    可以选择配置,如果你宿主机有ng反代服务,你使用taerfik 的话会端口冲突,可以配置,但不过要把 docker-compose 和 Traefik的配置文件注释去掉即可:

    
    http:
      #region routers 
      routers:
        hexo:
          entryPoints:
            - "https"  # 指定使用 HTTPS 入口点
          rule: "Host(`hexo.docker.localhost`)"  # 当访问的主机名为 hexo.local.shellscience.top 时,触发此路由
          middlewares:
            - default-headers  # 应用默认的安全头中间件
            - https-redirectscheme  # 应用 HTTPS 重定向中间件
          tls: {}  # 启用 TLS 加密
          service: hexo  # 指定将请求转发到名为 hexo 的服务
    
      #region services
      services:
        hexo:
          loadBalancer:
            servers:
              - url: "http://127.0.0.1:5000"  # 指定 Hexo 服务的后端服务器 URL
            passHostHeader: true  # 传递原始的 Host 头信息到后端服务
      #endregion
    
      middlewares:
        https-redirectscheme:
          redirectScheme:
            scheme: https  # 将 HTTP 请求重定向为 HTTPS
            permanent: true  # 使用永久重定向(HTTP 301)
    
        default-headers:
          headers:
            frameDeny: true  # 禁止网页被嵌入到框架中,防止点击劫持攻击
            browserXssFilter: true  # 启用浏览器的 XSS 过滤器,增强安全性
            contentTypeNosniff: true  # 防止浏览器 MIME 类型嗅探
            forceSTSHeader: true  # 强制启用 HSTS(HTTP 严格传输安全)
            stsIncludeSubdomains: true  # HSTS 规则应用于所有子域
            stsPreload: true  # 允许将域名加入 HSTS 预加载列表
            stsSeconds: 15552000  # HSTS 头的有效期(秒),这里是 180 天
            customFrameOptionsValue: SAMEORIGIN  # 允许内容在同源的 iframe 中加载
            customRequestHeaders:
              X-Forwarded-Proto: https  # 设置 X-Forwarded-Proto 头为 https,用于指示原始请求协议
    
        default-whitelist:
          ipAllowList:
            sourceRange:
            - "10.0.0.0/8"  # 允许来自 10.0.0.0/8 网段的 IP 地址
            - "192.168.0.0/16"  # 允许来自 192.168.0.0/16 网段的 IP 地址
            - "172.16.0.0/12"  # 允许来自 172.16.0.0/12 网段的 IP 地址
    
        secured:
          chain:
            middlewares:
            - default-whitelist  # 应用默认的 IP 白名单中间件
            - default-headers  # 应用默认的安全头中间件

    配置完毕我们docker-compose up -d如果配置没有问题你就可以通过你配置的域名成功访问Traefik的面板。

    反代代理Dcoekr应用

    这里拿Memos的程序来举例子:

    下面是我的Memos的docker-compose.yaml 文件,我们只需要把暴露的端口删除,添加labels标签以及下面几个配置(你想访问的域名、容器的端口、开启https、使用tls证书)以及让我们的程序接入Traefik的网络就好了。

    version: "3.0"
    services:
      memos:
        image: ghcr.io/usememos/memos:latest
        container_name: memos
        volumes:
          - ./data/:/var/opt/memos
        environment:
          - driver=sqlite
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.memos.rule=Host(`memos.local.com`)"
          - "traefik.http.services.memos.loadbalancer.server.port=<程序的端口>"
          - "traefik.http.routers.memos.entrypoints=https"
          - "traefik.http.routers.memos.tls=true"
        networks:
          - traefik-net
    
    networks:
      traefik-net:
        external: true

    Traefik DNS服务提供文档:https://doc.traefik.io/traefik/https/acme/#providers

    Traefik Docker配置文档:https://doc.traefik.io/traefik/routing/providers/docker/

    总结

    这个是博主自己在搭建Traefik 时的总结与分享,当然在搭建时也去借鉴了很多的资料。

    本文原发于我的博客:landonVPS

    最近反代很火,所以不少人都买了或者白嫖了服务器,作为反代使用,给服务器只用来做反代肯定有很多的冗余,所以我考虑利用服务器的公网 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

    项目地址 GitHub - lianwusuoai/img-router

    是一个让你使用对话方式 /v1/chat/completions 进行生图和图片编辑的智能路由。

    v1.7.3~1.8.9版本升级内容
    1.新增webui设置,不用手敲配置文件,直接在webui改即可,可视化改配置
    2.新增后端模式,key少的话,直接 客户端-img-router对话即可,key多的话用newapi/gptloat管理
    3.增加AI提示词优化引擎,直接中文输出,自动翻译英文,自动扩充美化提示词,言出法随
    4.支持文字生图,图片修改(图片编辑),带上下文改图/生图的融合生图
    5.支持模型重定向,多渠道一个模型id输出
    6.图片画廊,查看生图的提示词和图片
    7.本次终于支持多图片生成(会慢,毕竟生成图片多,比较草台)
    8.一件修改端口号,点击重启docker就修改,不用去改配置了。
    9.输入图片过大自动压缩,减少生图错误。
    
    测试环境 win11+Cherry Studiov 1.7.13,使用/v1/chat/completions 
    进行中转件/后端模式进行单图/多图生成。
    

    架构图

    Docker Compose 快速安装

    git clone https://github.com/lianwusuoai/img-router.git
    cd

    老用户最好清除下缓存重建下

    docker-compose down; docker-compose build --no-cache; docker-compose up -d
    

    我觉得有 bug 按理说应该也有 bug 但是我还没遇到 bug 那就是没 bug 嘻嘻
    (有问题可以留言 / 提 issue)







    最后,开启赛博打赏
    【打赏 1 LDC】【打赏 10 LDC】【打赏 50 LDC】


    📌 转载信息
    原作者:
    lianwusuoai
    转载时间:
    2026/1/21 21:25:13

    空闲时间搓了一个可自托管的 GitHub Stars 管理工具,项目大幅使用 vibe codeing,claude opus 贡献了百分之九十五的代码,开源地址:Starflow

    Github 自带的 star 功能个人觉得并不好用,尤其是 list,整理起来非常地繁杂,同类项目很多都没有更新,或者是不喜欢这样那样的界面,故有了此项目。

    我自己在一个小鸡上也部署了这个项目,占用大致一百多 MB,地址 Starflow, 可以在线试试,登录的话默认会读取私库!,介意请勿登录,自行托管即可。

    功能特性

    核心功能

    • Lists 分类管理 - 创建自定义 Lists,将仓库按项目、技术栈或用途分类,支持 24 种预设颜色
    • AI 智能分类 - 接入 OpenAI 兼容 API,一键自动分类所有未整理的仓库
    • 双向同步 - 与 GitHub 实时同步,取消 Star 也会同步到你的账号
    • README 预览 - 无需跳转即可查看仓库的 README 文档

    搜索与筛选

    • 全文搜索 - 按名称、描述快速搜索仓库
    • 多维筛选 - 按语言、List、星标数、更新时间等筛选
    • 排序方式 - 支持按 Star 时间、更新时间、星标数等排序

    数据管理

    • 笔记备注 - 为仓库添加个人笔记,记录使用心得和备忘
    • 导入导出 - 支持 JSON/CSV 格式导出,便于备份和迁移
    • 数据持久化 - PostgreSQL 存储,支持数据目录映射便于备份

    用户体验

    • 主题切换 - 支持亮色 / 暗色模式,偏好自动保存
    • 键盘快捷键 - 支持快捷键操作,提升效率
    • 响应式设计 - 适配桌面和移动端

    预览

    🌙 暗色模式


    ☀️ 亮色模式



    支持自托管,支持 docker-compose 部署,具体部署比如环境变量配置详情可以查看项目 Github README:

    services: starflow:  gemiluxvii/starflow:latest container_name: starflow restart: unless-stopped ports: - "3000:3000" environment: - DATABASE_URL=postgresql://starflow:starflow@db:5432/starflow - GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID} - GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET} - NEXTAUTH_SECRET=${NEXTAUTH_SECRET} - NEXTAUTH_URL=${NEXTAUTH_URL} depends_on: db: condition: service_healthy db:  postgres:16-alpine container_name: starflow-db restart: unless-stopped environment: - POSTGRES_USER=starflow - POSTGRES_PASSWORD=starflow - POSTGRES_DB=starflow volumes: - ./data/postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U starflow"]
          interval: 5s timeout: 5s retries: 5 


    AI 分类

    Starflow 支持接入 OpenAI 兼容的 API 进行智能分类。

    支持的服务

    • OpenAI 官方 API
    • 第三方中转站
    • 本地部署的 Ollama、LocalAI 等

    配置方式

    1. 进入「设置」页面
    2. 在「AI 分类」部分填写:
      • API 地址(如 https://api.openai.com 或中转站地址)
      • API Key
      • 模型名称(如 gpt-3.5-turbo
    3. 点击「测试连接」验证配置
    4. 启用 AI 分类功能

    分类说明

    • 提供 15 种标准分类:AI 工具、代理工具、CLI 工具、前端、后端、数据库、DevOps、编辑器、开发工具、下载工具、媒体工具、安全工具、学习资源、系统工具、其他
    • 支持单个仓库分类和批量一键分类
    • 优先匹配已有 Lists,减少重复分类


    技术栈

    • 前端: Next.js 15, React 19, Tailwind CSS 4, Radix UI
    • 后端: Next.js API Routes, NextAuth.js 5, Prisma 5
    • 数据库: PostgreSQL
    • AI: OpenAI 兼容 API


    佬友也可以提提建议,喜欢的话点个 star,不胜感激


    📌 转载信息
    原作者:
    GEMILUXVII
    转载时间:
    2026/1/16 18:49:18

    各中转站对 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

    服务

    openlist

    • 一个支持多种存储的文件列表程序
    • 分享文件及 webdav
    Docker Compose
    services: openlist:  openlistteam/openlist:latest container_name: openlist ports: - "自定义端口:5244" user: '0:0' volumes: - /本地存储配置目录/docker/OpenList/data:/opt/openlist/data - /本地存储配置目录/docker/aria2-pro/temp/aria2:/opt/openlist/data/temp/aria2 environment: - UMASK=022 - TZ=Asia/Shanghai restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 depends_on: - aria2-pro # 单独部署aria2,因为据说后续没有aio后缀的镜像了。 aria2-pro:  p3terx/aria2-pro container_name: aria2-pro ports: - "自定义端口:11445" # 不用BT所以注释 # - '6888:6888' # - '6888:6888/udp' volumes: - /本地存储配置目录/docker/aria2-pro/config:/config - /本地存储配置目录/docker/aria2-pro/downloads:/downloads - /本地存储配置目录/docker/aria2-pro/temp/aria2:/opt/openlist/data/temp/aria2 environment: - PUID=0 - PGID=0 - TZ=Asia/Shanghai - UMASK_SET=022 # 设置密码 - RPC_SECRET=123456 - RPC_PORT=11445 - LISTEN_PORT=6888 - IPV6_MODE=true # 由于配置文件是从github拉取的,所以可以通过环境变量设置代理 # - HTTP_PROXY=http://192.168.1.2:7890 # - HTTPS_PROXY=http://192.168.1.2:7890 restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 ariang:  p3terx/ariang container_name: ariang network_mode: host environment: - PUID=0 - PGID=0 - TZ=Asia/Shanghai command: ["--port", "自定义端口", "--ipv6"]
        restart: unless-stopped mem_limit: 1g cpus: 2 depends_on: - aria2-pro networks: defaultnet: external: true 

    gitea

    • 代码仓库
    Docker Compose
    services: gitea:  gitea/gitea:latest container_name: gitea ports: - "自定义端口:22" - "自定义端口:3000" volumes: - /本地存储配置目录/docker/gitea/data:/data environment: - USER_UID=1000 - USER_GID=1000 restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    qinglong

    • 定时任务,配合 dailycheckin 签到
    Docker Compose
    services: qinglong:  whyour/qinglong:debian container_name: qinglong ports: - "自定义端口:5700" volumes: - /本地存储配置目录/docker/qinglong/data:/ql/data restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    vaultwarden

    • 密码管理器
    Docker Compose
    services: vaultwarden:  vaultwarden/server:latest container_name: vaultwarden ports: - "自定义端口:80" volumes: - /本地存储配置目录/docker/vaultwarden/data:/data environment: - SIGNUPS_ALLOWED=false - INVITATIONS_ALLOWED=false - EXPERIMENTAL_CLIENT_FEATURE_FLAGS=ssh-key-vault-item,ssh-agent restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    authentik

    • 用于单点登录各个系统
    Docker Compose
    services: authentik-server:  ghcr.io/goauthentik/server:2025.10.3 container_name: authentik-server command: server restart: unless-stopped environment: AUTHENTIK_SECRET_KEY: 密钥 AUTHENTIK_POSTGRESQL__HOST: postgresql地址 AUTHENTIK_POSTGRESQL__PORT: postgresql端口 AUTHENTIK_POSTGRESQL__NAME: authentik AUTHENTIK_POSTGRESQL__USER: authentik AUTHENTIK_POSTGRESQL__PASSWORD: vUhJ5hGFIxvgK0 ports: - 自定义端口:9000 - 自定义端口:9443 volumes: - - /本地存储配置目录/docker/authentik/media:/media - - /本地存储配置目录/docker/authentik/templates:/templates networks: - defaultnet mem_limit: 3g cpus: 3 authentik-worker:  ghcr.io/goauthentik/server:2025.10.3 container_name: authentik-worker command: worker restart: unless-stopped user: root environment: AUTHENTIK_SECRET_KEY: 密钥 AUTHENTIK_POSTGRESQL__HOST: postgresql地址 AUTHENTIK_POSTGRESQL__PORT: postgresql端口 AUTHENTIK_POSTGRESQL__NAME: authentik AUTHENTIK_POSTGRESQL__USER: authentik AUTHENTIK_POSTGRESQL__PASSWORD: postgresql密码 volumes: # - /var/run/docker.sock:/var/run/docker.sock - - /本地存储配置目录/docker/authentik/media:/media - - /本地存储配置目录/docker/authentik/certs:/certs - - /本地存储配置目录/docker/authentik/templates:/templates networks: - defaultnet mem_limit: 3g cpus: 3 networks: defaultnet: external: true 

    opengist

    • 自部署文本托管,类似 Github Gist
    Docker Compose
    services: opengist:  thomiceli/opengist:latest container_name: opengist ports: - "自定义端口:6157" volumes: - /本地存储配置目录/docker/Opengist:/opengist environment: - TZ=Asia/Shanghai restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    rustDesk

    • 远程桌面
    Docker Compose
    services: hbbs:  rustdesk/rustdesk-server:latest container_name: hbbs command: hbbs ports: - "自定义端口:21115" - "自定义端口:21116/tcp" - "自定义端口:21116/udp" volumes: - /本地存储配置目录/docker/rustdesk/data:/root restart: unless-stopped networks: - defaultnet depends_on: - hbbr hbbr:  rustdesk/rustdesk-server:latest container_name: hbbr command: hbbr ports: - "自定义端口:21117" volumes: - /本地存储配置目录/docker/rustdesk/data:/root restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    glance

    • 主页导航,搭配 sun-panel 的浏览器插件使用
    Docker Compose
    services: glance:  glanceapp/glance:latest container_name: glance ports: - 自定义端口:8080 volumes: - /本地存储配置目录/docker/glance/config:/app/config - /本地存储配置目录/docker/glance/assets:/app/assets - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock restart: unless-stopped environment: - TZ=Asia/Shanghai # - HTTP_PROXY=http://192.168.1.2:7890 # - HTTPS_PROXY=http://192.168.1.2:7890 networks: - defaultnet mem_limit: 1g cpus: 2 networks: defaultnet: external: true 

    dailyhot-api

    • 各大平台热榜接口 api、rss
    • 搭配 glance 使用
    Docker Compose
    services: dailyhot-api:  imsyy/dailyhot-api:latest container_name: dailyhot-api ports: - 自定义端口:6688 restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 networks: defaultnet: external: true 

    HowToCook

    • 菜谱
    Docker Compose
    services: how-to-cook:  ghcr.io/anduin2017/how-to-cook:latest container_name: how-to-cook ports: - "自定义端口:5000" restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    sun-panel

    • 导航页
    • 暂时用的是 glance,感觉信息更多一点
    Docker Compose
    services: sun-panel:  hslr/sun-panel:latest container_name: sun-panel ports: - "自定义端口:3002" volumes: - /本地存储配置目录/docker/sun-panel/conf:/app/conf restart: unless-stopped networks: - defaultnet sun-panel-helper:  madrays/sun-panel-helper:latest container_name: sun-panel-helper ports: - "自定义端口:80" volumes: - /本地存储配置目录/docker/sun-panel/sun-panel-helper/data:/app/backend/data - /本地存储配置目录/docker/sun-panel/sun-panel-helper/backups:/app/backend/backups - /本地存储配置目录/docker/sun-panel/conf/custom:/app/backend/custom environment: - BACKEND_PORT=3001 restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    RSS

    rsshub

    • 万物皆可 RSS
    Docker Compose
    services: rsshub:  diygod/rsshub:chromium-bundled container_name: rsshub ports: - "自定义端口:1200" environment: - REDIS_URL=redis://192.168.1.2:6379/ - PROXY_URI=http://192.168.1.2:7890 - PUPPETEER_WS_ENDPOINT=ws://browserless:3000 - ACCESS_KEY= #密钥 - CACHE_TYPE=redis depends_on: - redis - browserless restart: unless-stopped networks: - defaultnet browserless:  browserless/chrome:latest container_name: browserless ulimits: core: hard: 0 soft: 0 restart: unless-stopped networks: - defaultnet redis:  redis:alpine container_name: redis volumes: - /本地存储配置目录/docker/redis/data:/data restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    freshrss

    • 一个可自托管的 RSS 和 Atom 源聚合器
    Docker Compose
    services: freshrss:  linuxserver/freshrss:latest container_name: freshrss ports: - "自定义端口:80" volumes: - /本地存储配置目录/docker/FreshRSS/config:/config environment: - TZ=Asia/Shanghai - PUID=1000 - PGID=1000 restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    rss-to-telegram

    • 将 RSS 推送到 Tg
    Docker Compose
    services: rss-to-telegram:  rongronggg9/rss-to-telegram:latest container_name: rss-to-telegram volumes: - /本地存储配置目录/docker/rsstt/config:/app/config environment: - TOKEN= #你的机器人token - MANAGER= #你的tgid - T_PROXY=socks5://192.168.1.2:7890 - R_PROXY=socks5://192.168.1.2:7890 - MULTIUSER=0 restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    wewe-rss

    • 微信公众号 RSS
    Docker Compose
    services: wewe-rss:  cooderl/wewe-rss-sqlite:latest container_name: wewe-rss ports: - "自定义端口:4000" volumes: - /本地存储配置目录/docker/wewe-rss/data:/app/data environment: - SERVER_ORIGIN_URL= #你的域名 - MAX_REQUEST_PER_MINUTE=60 - AUTH_CODE= #你的密钥 - DATABASE_URL=file:../data/wewe-rss.db - AUTH_DATABASE_TYPECODE=sqlite - FEED_MODE=fulltext - ENABLE_CLEAN_HTML=true restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    影视

    moviepilot

    • 媒体库自动化管理
    Docker Compose
    services: moviepilot:  jxxghp/moviepilot-v2:latest container_name: moviepilot ports: - "自定义端口:3000" volumes: - /本地存储配置目录/docker/tr/config/torrents:/tr - /本地存储配置目录/docker/qb/qBittorrent/BT_backup:/qb - /本地存储配置目录/docker/MoviePilot-v2/config:/config - /本地存储配置目录/docker/MoviePilot-v2/core:/moviepilot/.cache/ms-playwright - # 剩下的自己加本地存储的映射 environment: - PGID=0 - PUID=0 - UMASK=000 - TZ=Asia/Shanghai - AUTH_SITE= #你的认证方式,现在似乎也可以不填,跑起来直接去网页里填 - # 对应的认证密钥 - PROXY_HOST=http://192.168.6.2:7890 - MOVIEPILOT_AUTO_UPDATE=release - PORT=3001 - NGINX_PORT=3000 restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    jellyfin

    • 媒体库
    Docker Compose
    services: jellyfin:  jellyfin/jellyfin container_name: jellyfin ports: - "自定义端口:8096" volumes: - /本地存储配置目录/docker/jellyfin/path/to/config:/config - /本地存储配置目录/docker/jellyfin/path/to/cache:/cache # :ro只读模式 - /本地存储配置目录/public/公共下载:/downloads:ro - /本地存储配置目录/public/公共下载1:/downloads1:ro environment: # 外部访问地址 - JELLYFIN_PublishedServerUrl=https://example.com # 为了刮削,添加代理 - HTTP_PROXY=http://192.168.1.2:7890 - HTTPS_PROXY=http://192.168.1.2:7890 # 调用核心显卡 devices: - /dev/dri:/dev/dri restart: unless-stopped networks: - defaultnet mem_limit: 2g cpus: 2 networks: defaultnet: external: true 

    qbittorrent

    • 下载器
    Docker Compose
    services: qbittorrent:  linuxserver/qbittorrent:4.6.7 container_name: qbittorrent network_mode: host volumes: - /本地存储配置目录/docker/qb:/config - # 剩下的自己加本地存储的映射 environment: - WEBUI_PORT=自定义端口 - PGID=0 - PUID=0 restart: unless-stopped 

    transmission

    • 保种
    Docker Compose
    services: transmission:  linuxserver/transmission:4.0.4 container_name: transmission network_mode: host volumes: - /本地存储配置目录/docker/tr/watch:/watch - /本地存储配置目录/docker/tr/web:/web #默认不用加,需要单独去下UI仓库的代码 - /本地存储配置目录/docker/tr/config:/config - # 剩下的自己加本地存储的映射 environment: - PGID=0 - PUID=0 - TZ=Asia/Shanghai - PEERPORT=自定义端口 - USER= #账号 - PASS= #密码 - TRANSMISSION_WEB_HOME=/web #默认不用加,有UI才需要 restart: unless-stopped 

    omnibox

    • 影视综合管理,集成影视站,网盘搜索,iptv,直播平台,支持 tvbox 订阅
    Docker Compose
    services: omnibox:  lampon/omnibox:latest container_name: omnibox ports: - 自定义端口:7023 volumes: - /本地存储配置目录/docker/omnibox/data:/app/data restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 networks: defaultnet: external: true 

    pansou

    • 网盘搜索 api,搭配 OmniBox 使用
    Docker Compose
    services: pansou:  ghcr.io/fish2018/pansou:latest container_name: pansou ports: - 自定义端口:8888 environment: - PORT=8888 - CHANNELS=tgsearchers3,Aliyun_4K_Movies,bdbdndn11,yunpanx,bsbdbfjfjff,yp123pan,sbsbsnsqq,yunpanxunlei,tianyifc,BaiduCloudDisk,txtyzy,peccxinpd,gotopan,PanjClub,kkxlzy,baicaoZY,MCPH01,bdwpzhpd,ysxb48,jdjdn1111,yggpan,MCPH086,zaihuayun,Q66Share,ucwpzy,shareAliyun,alyp_1,dianyingshare,Quark_Movies,XiangxiuNBB,ydypzyfx,ucquark,xx123pan,yingshifenxiang123,zyfb123,tyypzhpd,tianyirigeng,cloudtianyi,hdhhd21,Lsp115,oneonefivewpfx,qixingzhenren,taoxgzy,Channel_Shares_115,tyysypzypd,vip115hot,wp123zy,yunpan139,yunpan189,yunpanuc,yydf_hzl,leoziyuan,pikpakpan,Q_dongman,yoyokuakeduanju,TG654TG,WFYSFX02,QukanMovie,yeqingjie_GJG666,movielover8888_film3,Baidu_netdisk,D_wusun,FLMdongtianfudi,KaiPanshare,QQZYDAPP,rjyxfx,PikPak_Share_Channel,btzhi,newproductsourcing,cctv1211,duan_ju,QuarkFree,yunpanNB,kkdj001,xxzlzn,pxyunpanxunlei,jxwpzy,kuakedongman,liangxingzhinan,xiangnikanj,solidsexydoll,guoman4K,zdqxm,kduanju,cilidianying,CBduanju,SharePanFilms,dzsgx,BooksRealm # 必须指定启用的插件,多个插件用逗号分隔 - ENABLED_PLUGINS=labi,zhizhen,shandian,duoduo,muou,wanou,hunhepan,jikepan,panwiki,pansearch,panta,qupansou,hdr4k,pan666,susu,thepiratebay,xuexizhinan,panyq,ouge,huban,cyg,erxiao,miaoso,fox4k,pianku,clmao,wuji,cldi,xiaozhang,libvio,leijing,xb6v,xys,ddys,hdmoli,yuhuage,u3c3,javdb,clxiong,jutoushe,sdso,xiaoji,xdyh,haisou,bixin,djgou,nyaa,xinjuc,aikanzy,qupanshe,xdpan,discourse,yunsou - CACHE_ENABLED=true - CACHE_PATH=/app/cache - CACHE_MAX_SIZE=100 - CACHE_TTL=60 - ASYNC_PLUGIN_ENABLED=true - ASYNC_RESPONSE_TIMEOUT=4 - ASYNC_MAX_BACKGROUND_WORKERS=20 - ASYNC_MAX_BACKGROUND_TASKS=100 - ASYNC_CACHE_TTL_HOURS=1 # 认证配置(可选) # - AUTH_ENABLED=true # - AUTH_USERS=admin:admin123,user:pass456 # - AUTH_TOKEN_EXPIRY=24 # - AUTH_JWT_SECRET=your-secret-key-here # 如果需要代理,取消下面的注释并设置代理地址 # - PROXY=socks5://192.168.1.2:7890 volumes: - /本地存储配置目录/docker/pansou/app/cache.env:/app/cache restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 networks: defaultnet: external: true 

    danmu-api

    • 弹幕 api,搭配 OmniBox 使用
    Docker Compose
    services: danmu-api:  logvar/danmu-api:latest container_name: danmu-api ports: - 自定义端口:9321 volumes: - /本地存储配置目录/docker/danmu-api/config.yaml:/app/config.yaml restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 networks: defaultnet: external: true 

    管理

    dockge

    • 一个美观、易用且响应迅速的自托管 Docker compose.yaml 堆栈管理器。
    Docker Compose
    services: dockge:  louislam/dockge:latest container_name: dockge ports: - "自定义端口:5001" volumes: - /本地存储配置目录/docker/dockge/data:/app/data - /var/run/docker.sock:/var/run/docker.sock - /本地存储配置目录/docker/dockge/opt/stacks:/opt/stacks environment: - DOCKGE_STACKS_DIR=/opt/stacks restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 networks: defaultnet: external: true 

    portainer

    • docker 管理面板
    • 暂时弃用了,没有遮罩层,web 页面用得很难受
    Docker Compose
    services: portainer:  6053537/portainer-ce:latest container_name: portainer ports: - "自定义端口:9000" volumes: - /本地存储配置目录/docker/portainer/data:/data - /var/run/docker.sock:/var/run/docker.sock environment: - HTTP_PROXY=http://192.168.1.2:7890 - HTTPS_PROXY=http://192.168.1.2:7890 - NO_PROXY=localhost,127.0.0.1,::1,docker.internal restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 networks: defaultnet: external: true 

    home-assistant

    • 智能家居
    Docker Compose
    services: home-assistant:  ghcr.io/home-assistant/home-assistant:stable container_name: home-assistant network_mode: host privileged: true volumes: - /本地存储配置目录/docker/HomeAssistant/config:/config - /本地存储配置目录/docker/HomeAssistant/ssh:/root/.ssh environment: - TZ=Asia/Shanghai restart: unless-stopped 

    备份

    icloudpd

    • icloud 照片备份
    Docker Compose
    services: icloudpd:  boredazfcuk/icloudpd:latest container_name: icloudpd network_mode: host volumes: - /本地存储配置目录/docker/icloudpd/config:/config - /本地存储配置目录/Goalonez/Photos/iCloud:/iCloud environment: - apple_id= #你的appid - download_path=/iCloud - icloud_china=true - auth_china=true - auto_delete=true - skip_check=true #跳过检测,处理全部文件,否则只有在有新的照片的时候才能触发删除 - notification_type=Telegram #默认不需要,通知 - telegram_token= #你的机器人token - telegram_chat_id= #你的tgid - telegram_polling=true - telegram_server= #反代tg api地址。当然你也可以直接HTTP_PROXY去走代理 - telegram_http=false - TZ=Asia/Shanghai restart: unless-stopped 

    duplicati

    • 跨盘备份、备份到云盘
    Docker Compose
    services: duplicati:  duplicati/duplicati:latest container_name: duplicati ports: - 自定义端口:8200 volumes: - /本地存储配置目录/docker/duplicati/data:/data - /本地存储配置目录/:/sourcessd - /本地存储配置目录/backup:/backup restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    bili-sync

    • 哔哩哔哩收藏视频备份
    Docker Compose
    services: bili-sync-rs:  amtoaer/bili-sync-rs:latest container_name: bili-sync-rs ports: - 自定义端口:12345 volumes: - /本地存储配置目录/docker/bili-sync-rs/config:/app/.config/bili-sync - /本地存储配置目录/public/videos/Bilibilis:/Bilibilis # - /本地存储配置目录/docker/jellyfin/path/to/config/metadata/People:/app/.config/bili-sync/upper_face restart: unless-stopped networks: - defaultnet mem_limit: 1g cpus: 2 networks: defaultnet: external: true 

    syncthing

    • 同步文件
    Docker Compose
    services: syncthing:  syncthing/syncthing:latest container_name: syncthing ports: - 自定义端口:8384 # Web UI - 自定义端口:22000/tcp # TCP file transfers - 自定义端口:22000/udp # QUIC file transfers - 自定义端口:21027/udp # Receive local discovery broadcasts volumes: - /本地存储配置目录/docker/syncthing:/var/syncthing environment: - PUID=1000 - PGID=1000 restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    immich

    • 照片管理
    Docker Compose
    services: immich-server:  ghcr.io/immich-app/immich-server:release container_name: immich_server ports: - '自定义端口:2283' volumes: - /本地存储配置目录/docker/immich/data:/data # 中文地理编码https://github.com/ZingLix/immich-geodata-cn - /本地存储配置目录/docker/immich/geodata:/build/geodata - /本地存储配置目录/docker/immich/i18n-iso-countries/langs:/usr/src/app/server/node_modules/i18n-iso-countries/langs - /本地存储配置目录/Goalonez/Photos:/Photos environment: - DB_HOSTNAME=immich_postgres - DB_PORT=5432 - DB_USERNAME=postgres - DB_PASSWORD=自定义密码 - DB_DATABASE_NAME=immich # 我是复用了rsshub的redis,请自行参考上方rsshub中的redis镜像 - REDIS_HOSTNAME=redis - REDIS_PORT=6379 # 同实例不同库 - REDIS_DBINDEX=1 - TZ=Asia/Shanghai depends_on: - immich_postgres restart: unless-stopped networks: - defaultnet mem_limit: 2g cpus: 3 immich-machine-learning:  ghcr.io/immich-app/immich-machine-learning:release container_name: immich_machine_learning volumes: - /本地存储配置目录/docker/immich/model-cache:/cache environment: # 代理 - HTTP_PROXY=http://192.168.5.2:7890 - HTTPS_PROXY=http://192.168.5.2:7890 - NO_PROXY=localhost,127.0.0.1,immich - TZ=Asia/Shanghai restart: unless-stopped networks: - defaultnet mem_limit: 4g cpus: 4 immich_postgres:  ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:32324a2f41df5de9efe1af166b7008c3f55646f8d0e00d9550c16c9822366b4a container_name: immich_postgres ports: - '5432:5432' volumes: - /本地存储配置目录/docker/immich/postgresql/data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=自定义密码 - POSTGRES_USER=postgres - POSTGRES_DB=immich - POSTGRES_INITDB_ARGS=--data-checksums - TZ=Asia/Shanghai restart: unless-stopped networks: - defaultnet shm_size:  mem_limit: 3g cpus: 2 networks: defaultnet: external: true 

    网络

    lucky

    • 自动续 ssl 证书,反代
    • 还有一堆功能
    Docker Compose
    services: lucky:  gdy666/lucky:latest container_name: lucky network_mode: host volumes: - /本地存储配置目录/docker/lucky/luckyconf:/goodluck restart: unless-stopped 

    mihomo

    Docker Compose
    services: mihomo:  metacubex/mihomo:latest container_name: mihomo ports: - "自定义端口:7890" - "自定义端口:9090" volumes: - /本地存储配置目录/docker/mihomo/metacubexd:/metacubexd #默认不用,图形化界面需要单独去git拉代码映射 - /本地存储配置目录/docker/mihomo/config:/root/.config/mihomo restart: unless-stopped networks: - defaultnet networks: defaultnet: external: true 

    📌 转载信息
    转载时间:
    2026/1/14 11:05:30

    最近写一个关于 Proxmox VE 多集群开源项目,第一次整这玩意,各位观众老爷们给评一评,国内会有人用?不知道有木有要入坑欢迎大家一起交流交流

    项目简介

    一个开源的 Proxmox VE 多集群 Web 管理平台,解决多集群运维的痛点。

    解决什么问题

    如果你运维多个 PVE 集群,应该深有体会:

    • 在多个 Web 界面之间频繁切换
    • 手动同步虚拟机模板费时费力
    • 缺少跨集群的资源全局视图

    PveSphere 提供统一的控制面板,让你从单一界面管理所有集群。

    核心功能

    • 多集群统一管理
    • 虚拟机生命周期管理(创建、迁移、备份等)
    • 自动化模板同步
    • 实时资源监控
    • VNC 控制台访问

    快速体验

    git clone https://github.com/pvesphere/pvesphere.git
    cd pvesphere
    make docker-compose-build
    

    默认账号:[email protected] / Ab123456

    访问: http://localhost:8080

    技术栈

    • 后端:Go + Nunu 框架
    • 前端:Vue + vue-pure-admin
    • 部署:Docker Compose

    适用场景

    ✅ 管理多个 PVE 集群
    ✅ 需要自动化模板分发
    ✅ 需要集中监控和管理

    ❌ 单集群用户(原生界面可能更合适)

    项目地址

    联系方式

    博客原文

    https://www.ljohn.cn/posts/91d244ba/

    欢迎试用和反馈 🙌

    分享一个自用的 Certimate docker compose file 配置,一个支持 SSL 证书从申请到部署完全自动化的开源软件。

    文档 | Certimate

    https://docs.certimate.me/zh-CN/docs/introduction/

    services: certimate:  certimate/certimate:latest container_name: certimate restart: always ports: - "127.0.0.1:8090:8090" volumes: - /etc/localtime:/etc/localtime:ro - ./data:/app/pb_data environment: - TZ=Asia/Shanghai deploy: resources: limits: memory: 512M reservations: memory: 128M security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp:size=64M,mode=1777 healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:8090/api/health"]
          interval: 30s timeout: 10s retries: 3 start_period: 10s logging: driver: json-file options: max-size: "10m" max-file: "3" compress: "true" networks: default: driver: bridge 

    📌 转载信息
    原作者:
    puppetdevz
    转载时间:
    2026/1/12 15:02:10

    分享一个自用的 Certimate docker compose file 配置,一个支持 SSL 证书从申请到部署完全自动化的开源软件。

    文档 | Certimate

    https://docs.certimate.me/zh-CN/docs/introduction/

    services: certimate:  certimate/certimate:latest container_name: certimate restart: always ports: - "127.0.0.1:8090:8090" volumes: - /etc/localtime:/etc/localtime:ro - ./data:/app/pb_data environment: - TZ=Asia/Shanghai deploy: resources: limits: memory: 512M reservations: memory: 128M security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp:size=64M,mode=1777 healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:8090/api/health"]
          interval: 30s timeout: 10s retries: 3 start_period: 10s logging: driver: json-file options: max-size: "10m" max-file: "3" compress: "true" networks: default: driver: bridge 

    📌 转载信息
    原作者:
    puppetdevz
    转载时间:
    2026/1/12 11:38:43

    前言:
    这到底是啥,我就不展开详细解释了,懂的肯定懂。

    背景:
    原本 Bytemuse 自带的 BT 数据库停止维护,导致无法自动下载,很是头疼。后来机缘巧合下发现 Bytemuse 支持了新的 BT 数据搜索格式,又发现了一个神级镜像 byte-muse-bt。两者一结合,可谓天衣无缝,完美解决了搜刮问题。

    下面分享一下我的接入步骤,只需简单三步。

    第一步:部署中间件 byte-muse-bt

    使用 Docker Compose 部署。将以下内容保存为 docker-compose.yml 并启动:

    version: '3' services: byte-muse-bt:  liqman/byte-muse-bt:latest container_name: byte-muse-bt ports: - "3850:3850" environment: - CONFIG_PATH=/app/config.json volumes: - /mnt/user/appdata/byte-muse/bt/config.json:/app/config.json:ro restart: unless-stopped 

    第二步:创建配置文件 config.json

    在映射的路径下创建 config.json。以下是我的配置模版,集成了 bitmagnetcilijia 等源,大家可根据自己的网络环境按需修改。
    当然如果你选择自建 bitmagnet,那就更哇塞了。

    注意:如果不走代理,请确保你的网络能访问这些 BT 源的 API。

    { "bt": { "provider_defaults": { "count": 20, "timeout_seconds": 20, "min_size_mb": 512, "max_size_mb": 51200, "proxy": { "enabled": false, "url": "http://192.168.1.2:7890", "username": "", "password": "" } }, "providers": [ { "name": "bitmagnet", "enabled": true, "base_url": "http://daninas.ddnsfree.com:3333/graphql", "retries": 3, "min_seeders": 1, "verify_ssl": false }, { "name": "cilijia", "enabled": true, "base_url": "https://cilijia.net/apis/apis/search", "retries": 3, "cookies": "" } ] }, "api": { "seeders_default": 5, "limit": 20, "priority_keywords": [ "98t", "色花堂" ], "keyword_match": { "enabled": true, "mode": "auto", "partial_threshold": 0.6 } }, "logging": { "level": "DEBUG" } } 

    第三步:修改 Bytemuse 配置

    修改 Bytemuse 的环境变量文件 app.env,将 BT_URL 指向我们刚才部署的容器:

    # 请将 IP 修改为你部署 byte-muse-bt 容器的实际 IP
    BT_URL='http://192.168.1.X:3850/bt/api' 

    最后

    重启 Bytemuse 容器,享受丝滑的自动搜刮吧!效果立竿见影。祝大家玩得开心!


    📌 转载信息
    原作者:
    langhai8045
    转载时间:
    2026/1/6 12:21:51

    前提:

    1. 有一个基于 Docker Compose 编排,且包含 Nginx 部署的前端服务项目。
    2. 有一个域名(证书会基于域名自动申请)。

    配置流程:

    1. 修改 docker-compose.yml 文件,确保前端服务映射了 443 端口
      示例:
    services: ruoyi-ui: container_name: ruoyi-ui build: context: . # Dockerfile.ui 及 nginx.conf 所在上下文路径 dockerfile: Dockerfile.ui ports: - "${FRONTEND_PORT}:80" - "443:443" # https端口 depends_on: xxx-service: condition: service_started # 后端服务及其它服务配置 xxx-service: ... 
    1. 在 Dockerfile.ui 中使用正确的基础镜像,需要支持 ACME 的 nginx 镜像,如:ghcr.io/3az7qmfd/ngacme:main:
    FROM ghcr.io/3az7qmfd/ngacme:main
    
    # 移除 Nginx 默认配置
    RUN rm /etc/nginx/conf.d/default.conf
    
    # 复制自定义的 Nginx 配置文件
    COPY ./nginx.conf /etc/nginx/conf.d/default.conf
    
    # 从构建阶段复制构建好的静态文件到 Nginx 托管目录
    COPY ./dist /usr/share/nginx/html
    
    # 暴露 Nginx 端口
    EXPOSE 80
    
    # Nginx 默认会启动,也可以指定 CMD
    CMD ["nginx", "-g", "daemon off;"]
    
    1. nginx.conf 配置自动获取证书
    # DNS 解析器(用于访问 ACME 服务器,推荐用可靠的如 Cloudflare 或 Google)
    # 没有可用的 IPv6 出口时,可设置禁用ipv6:ipv6=off
    resolver 8.8.8.8 1.1.1.1 ipv6=off valid=30s;
    
    # ACME issuer 配置(这里用 Let's Encrypt 生产环境示例)
    acme_issuer letsencrypt {
        uri         https://acme-v02.api.letsencrypt.org/directory;
        contact     xxx@qq.com;  # <----- 你的邮箱,用于通知
        state_path  /var/cache/nginx/acme-letsencrypt;  # 持久化存储路径,确保目录存在并可写
        accept_terms_of_service;
    }
    
    # 共享内存区(存储证书和挑战数据)
    acme_shared_zone zone=ngx_acme_shared:1M;
    
    server {
        listen 80;
        server_name xxx.com;  # 你的实际域名,证书会基于此自动申请
    
        # 可选:显式允许挑战路径
        # location /.well-known/acme-challenge/ { }
    
        location / {
            return 301 https://$server_name$request_uri;  # 重定向所有普通请求到 HTTPS
        }
    }
    
    server {
        listen 443 ssl; http2 on;
        server_name xxx.com;  # 你的实际域名,证书会基于此自动申请
    
        # ACME 自动管理证书
        acme_certificate letsencrypt;  # 使用上面定义的 issuer
    
        ssl_certificate       $acme_certificate;
        ssl_certificate_key   $acme_certificate_key;
    
        # 避免每次请求解析证书
        ssl_certificate_cache max=2;
    
        # 静态资源根目录(与原配置相同)
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    
        # 处理前端 SPA 路由
        location / {
            try_files $uri $uri/ /index.html;
        }
    
        # API 请求反向代理
        location /api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://xxx-service:8080/; # <---- 你的后端服务
        }
    
        # 错误页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        # 其他 SSL 优化(可选推荐)
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
    }
    

    参考连接:

    1. 以 Nginx 为反代服务端时以 Certbot 自动申请 HTTPS 证书的流程
    2. nginx-acme
      nginx-acme/README.md at main · nginx/nginx-acme · GitHub
    3. Module ngx_http_acme_module
      Module ngx_http_acme_module
    4. NGINX with ACME 模块 Docker 镜像
      Package ngacme · GitHub

    📌 转载信息
    转载时间:
    2026/1/6 12:16:35

    Kamal 提供零停机部署、滚动重启、资源桥接、远程构建、附属服务管理,以及使用 Docker 在生产环境部署和管理 Web 应用所需的一切。最初为 Rails 应用打造,Kamal 适用于任何可容器化的 Web 应用。

    美国 37signal 公司是一家 “小而美” 的公司,员工只有几十人但是每年有数百万利润。著名的项目管理工具 Basecamp、网络框架 Ruby on Rails 都出自他们。Kamal 也是他们的作品,用 Ruby 编写并集成到 Rails 的默认工具链中。
    Kamal 的主要优势有二:一是与 Git 版本管理紧密结合,一次 commit 一个镜像,出什么问题可以立即回退;二是使用 kamal-proxy,从而带来健康检查与零停机部署,新版本实例正常上线前不会影响已有的实例。

    前提条件

    如上所述,只要能被 Docker 打成镜像的 Web 应用都能用 Kamal 部署。同时因为 Kamal 有 Accessories 的概念,事实上让 Kamal 占据了与 Docker Compose 一样的生态位。然而,你要部署的应用还要满足一些特殊条件:

    • 你需要手动写一个 Dockerfile,使你的服务正常启动并向某个端口提供 HTTP 服务。
    • 你需要添加 GET /up 端点,该端点用于健康检查,如果应用状态正常则返回 200 OK(Kamal 最初是为 Rails 设计的,这个端点其实就是 Rails 的惯例。)

    对于部署目标 VPS 也有一定要求:

    • 建议使用刚刚安装、仅配置好 SSH Key 远程连接的全新系统。
    • 发行版建议为最新版本的 Ubuntu 或 Debian。
    • SSH 开放在 22 端口且为 root 账户登录。(显然 Kamal 的默认配置并不合安全的最佳实践,但是你会需要额外的配置,下文会说明)

    下面准备了一个 Node.js 的例子,与一个 PHP+MySQL 的例子来说说它的基本用法。

    请准备一个域名,并在 DNS 提供商中把域名解析事先设置到你的服务器上。


    首先安装 Ruby 3.2+,如果你不知道怎么安装,可以用 rbenv

    然后运行:

    $gem install kamal 

    把 Kamal 安装到本机上。

    Node.js 应用

    我已经准备了一个例子: GitHub - uqsme/app-size-comparison: App sizes comparison

    切换到根目录,如你所见我已经写了 Dockerfile。本应用共有三个端点,根端点是一个 SPA,/api/files 是数据源,/up 是健康检查端点。

    在根目录下执行:

    $kamal init 

    此时会出现 config/deploy.yml,这就是 kamal 的配置文件。但是原配置过于冗长、注释繁琐,这里针对本例的简单应用,请直接清空然后复制粘贴以下内容:

    service: app-size-comparison # 把kamal改成你Docker Hub的用户名,或你自定义registry的命名空间  kamal/app-size-comparison # 部署的目标服务器,即你ssh的IP或域名 servers: web: - 192.168.0.1 # 自动启用Let's Encrypt proxy: ssl: true # 换成你要部署的域名 host: lastname.uqs.me app_port: 8000 builder: arch: amd64 registry: password: KAMAL_REGISTRY_PASSWORD 

    再转到.kamal/secret

    # Secrets defined here are available for reference under registry/password, env/secret, builder/secrets, # and accessories/*/env/secret in config/deploy.yml. All secrets should be pulled from either # password manager, ENV, or a file. DO NOT ENTER RAW CREDENTIALS HERE! This file needs to be safe for git. # Option 1: Read secrets from the environment # KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD # Option 2: Read secrets via a command # RAILS_MASTER_KEY=$(cat config/master.key) # Option 3: Read secrets via kamal secrets helpers # These will handle logging in and fetching the secrets in as few calls as possible # There are adapters for 1Password, LastPass + Bitwarden # # SECRETS=$(kamal secrets fetch --adapter 1password --account my-account --from MyVault/MyItem KAMAL_REGISTRY_PASSWORD RAILS_MASTER_KEY) # KAMAL_REGISTRY_PASSWORD=$(kamal secrets extract KAMAL_REGISTRY_PASSWORD $SECRETS) # RAILS_MASTER_KEY=$(kamal secrets extract RAILS_MASTER_KEY $SECRETS) 

    Kamal 在这个文件中存储凭据的获取方式,注释说了不仅支持环境变量、文件,还适配了密码管理器(当然也包括明文),可以直接从管理器中的条目读取。这里你需要设置你的 Docker Hub 密码,添加以下内容

    KAMAL_REGISTRY_PASSWORD=你的Docker Hub密码
    

    然后针对你的特殊情况,展开对应的部分:

    一切配置完成后,运行 kamal setup

    这将:

    1. 通过 SSH 连接到服务器(默认使用 root,通过 SSH 密钥认证)。
    2. 在任何尚未安装 Docker 的服务器上安装 Docker(使用 get.docker.com):这需要通过 SSH 获取 root 权限。
    3. 在本地和远程登录镜像仓库。
    4. 使用应用根目录下的标准 Dockerfile 构建镜像。
    5. 将镜像推送到镜像仓库。
    6. 从镜像仓库拉取镜像到服务器。
    7. 确保 kamal-proxy 正在运行,并在 80 和 443 端口接收流量。
    8. 启动一个与当前 Git 版本哈希对应的应用版本的新容器。
    9. 告诉 kamal-proxy,一旦新容器对 GET /up 返回 200 OK,就将流量路由到该容器。
    10. 停止运行旧版本应用的上一个容器。
    11. 清理未使用的镜像和已停止的容器,防止服务器磁盘被占满。

    稍后访问你的域名,或者 lastname.uqs.me,你应该就能看到一张图表,证明我们的 SPA 启动成功了。

    接下来,假设你又进行了开发,请转到 app/src/index.html,找到这两行注释:

    <!-- <h1>Here it is!</h1>
    <p>I just changed the content.<p> -->

    选中,用 Ctrl+/ 组合键取消注释。
    Kamal 对 Git 有很好的集成,所以如果你有什么更改,可以在 git 提交后就立马上线。下面请 git add --all .git commit -m "changed something" 完成提交,然后使用 kamal deploy 命令。

    $kamal deploy 

    完成后,刷新你的网站,你会发现标题与内容如期呈现了。

    PHP 应用

    下面以异次元发卡系统为例。首先克隆源码:

    $git clone https://github.com/lizhipay/acg-faka 

    然后初始化 Kamal

    $cd acg-faka $kamal init 

    为了用 Docker 部署,编写 Dockerfile。由于有.htaccess,可以考虑用 fpm+apache 类型的,这里用 shinsenter 的:

    FROM shinsenter/php:8.2-fpm-apache
    
    COPY . /var/www/html/
    
    WORKDIR /var/www/html
    

    这里我还是直接提供完善的脚本 config/deploy.yml

    service: acg-faka # 把kamal改成你Docker Hub的用户名,或你自定义registry的命名空间  kamal/acg-faka # 部署的目标服务器,即你ssh的IP或域名 servers: web: - 192.168.0.1 # 自动启用Let's Encrypt proxy: ssl: true # 换成你要部署的域名 host: demo.uqs.me # fpm-apache脚本默认开80 app_port: 80 healthcheck: path: / builder: arch: amd64 registry: password: KAMAL_REGISTRY_PASSWORD accessories: db:  mysql:8 # 假设是同一机器 host: 192.168.0.1 # 避免暴露公网 port: "127.0.0.1:3307:3306" # 要引入数据库容器的环境变量 # 都是mysql容器特有的设置 # 详见:https://hub.docker.com/_/mysql#environment-variables env: # 明文 clear: # 允许远程访问 MYSQL_ROOT_HOST: '%' # 库名 MYSQL_DATABASE: production # 需要保密的 secret: - MYSQL_ROOT_PASSWORD 

    首先要注意的是健康检查,上面说了 Kamal 要求 GET /up 返回 200 OK,但这只是 Rails 的惯例,往往其他应用就会 404,所以这里先把检查端点改成首页。
    然后,发卡系统是一个数据库驱动的应用。一般情况下将网站与数据库同时部署,我们会考虑 Docker Compose,现在 Kamal 有 Accessories 机制,事实上就与前者等效了。
    而且,Accessories 与主服务都在相同的 docker 网络下,可以直接用 <镜像名>-<accessory名> 代替 IP,来实现容器间的互通了。
    在部署前,你仍要提供密码,不仅有 registry 的密码,还有你想让数据库使用的密码。.kamal/secret

    KAMAL_REGISTRY_PASSWORD=<你的registry密码>
    MYSQL_ROOT_PASSWORD=mysql112233
    

    配置完成后,提交一次 git commit,运行:

    $git add --all . $git commit -m "setup kamal" $kamal setup 

    稍后,访问 demo.uqs.me,可以看到安装界面。在连接数据库时,可以这样写:


    第一个字段是数据库所在主机,可以填 acg-faka-db,Docker 的域名解析就会转到数据库所在容器。第二个字段数据库名、第三个账户、第四个密码都是通过环境变量定义的。最后一个是表名前缀,但是 docker 部署的一个特点就是自带隔离,所以这个字段在这种部署模式下意义不大了。
    最后看一下安装好的发卡网:


    使用 kamal details 命令查看容器情况:

    更多资料

    官网
    kamal 加速 - Ruby China
    Kamal 的讨论与问题汇总 - Ruby China


    📌 转载信息
    原作者:
    tistest
    转载时间:
    2026/1/1 15:50:53

    简介

    AutoCFT(Automate Cloudflare Tunnel)是一个简化 Cloudflare Tunnels 配置和运维的开源工具,适合 Self-hosted 的 Docker 环境,主要提供配置自动化更新,避免频繁登录 Zero Trust Dashboard 进行更新;通过 Docker 或 Docker compose 部署,便于管理;采用 Go 实现,轻量化结构;中英文文档完整。

    项目地址:GitHub - cloudfogtech/autocft: A tool for Docker Compose to automatically update access endpoints to Cloudflare Tunnel.

    官方文档:https://autocft.cloudfogtech.ltd/

    部署与使用

    要使用 AutoCFT,基本上默认已经有 Docker 环境了,下面的教程将直接基于 Docker 环境开始。

    AutoCFT 部署

    services: autocft:  cloudfogtech/autocft:latest container_name: autocft restart: always environment: - AUTOCFT_CF_API_TOKEN=<AUTOCFT_CF_API_TOKEN> - AUTOCFT_CF_ACCOUNT_ID=<AUTOCFT_CF_ACCOUNT_ID> - AUTOCFT_CF_TUNNEL_ID=<AUTOCFT_CF_TUNNEL_ID> volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /root/data/autocft:/app/data networks: - test_net networks: test_net: external: true 

    必填参数获取指南:https://autocft.cloudfogtech.ltd/zh/cloudflare.html

    Cloudflared 部署

    宿主机部署

    如果 Cloudflared 在宿主机部署,则需要为每个应用增加端口映射。auto.service 设置为从宿主机访问的地址。

    容器部署

    services: cloudflared:  cloudflare/cloudflared:2025.11.1 container_name: cloudflared restart: always command: tunnel run environment: - TUNNEL_TOKEN=<TUNNEL_TOKEN> networks: - test_net networks: test_net: external: true 

    容器部署的情况下,所有容器应该处于同一网络,因此不需要端口映射到宿主机,直接通过 Docker 网络访问。

    示例应用

    下面将部署示例应用展示应用如何和 AutoCFT 结合使用

    普通应用

    services: nginx:  nginx container_name: nginx restart: always # 宿主机部署Cloudflared需要开启端口映射 # ports: #   - "80:80" volumes: - /etc/ssl/certs:/etc/ssl/certs:ro labels: - autocft.enabled=true - autocft.hostname=nginx.example.com - autocft.service=http://nginx:80 # 宿主机访问地址为本地方位映射的端口 # - autocft.service=http://localhost:80 networks: - test_net networks: test_net: external: true 

    HTTPS 应用

    services: nginx:  nginx container_name: nginx restart: always # 宿主机部署Cloudflared需要开启端口映射 # ports: #   - "443:443" volumes: - /etc/ssl/certs:/etc/ssl/certs:ro labels: - autocft.enabled=true - autocft.hostname=nginx.example.com - autocft.service=https://nginx:443 # 宿主机访问地址为本地方位映射的端口 # - autocft.service=https://localhost:443 - autocft.origin.origin-server-name=nginx.example.com # 如需忽略TLS证书验证,请设置下面的值 - autocft.origin.no-tls-verify=true networks: - test_net networks: test_net: external: true 

    应用部署后,默认配置的情况下大约 10s 后,配置将同步到 Tunnel,就可以访问了。

    问题与反馈

    两种方式供君挑选

    • 跟帖反馈
    • 通过 Github Issue 反馈


    这算是我首次成体系的一个开源项目,在 2025 年末给大家一个更便于使用的工具,也给我自己做一个 2025 年的总结。

    感谢始皇和 linux.do 平台的各位佬提供的各种教程、公益资源和这个交流的平台,缘分让我们聚在一起。

    真诚友善团结专业 ,共建你我引以为荣之社区。

    预祝 2026 的各位佬事业步步高升,生活顺心如意~linux.do 做大做强,再创辉煌~

    新年快乐


    📌 转载信息
    原作者:
    catfishlty
    转载时间:
    2025/12/31 17:14:05

    此 docker 是在 perplexity-ai 基础上,增加了 mcp 功能,具体看上一个帖子。目前原项目没做自动更新 token 功能,token 一个月过期。
    除了 mcp 之外的问题,提 issue 请找原项目

    从这里继续讨论,https://linux.do/t/topic/1371904 增加 http 远程调用,因此封装了个 docker 自用,发出来给需要的人。

    github workflow 自动化构建还没时间搞(让 ai 写了一版,没改变量,也没测)

    docker compose 一键部署

    注意,socks 代理没有测试过

    services: perplexity-mcp:  shancw/perplexity-mcp:latest container_name: perplexity-mcp ports: - "${MCP_PORT:-8000}:8000" environment: # MCP 认证密钥 - MCP_TOKEN=${MCP_TOKEN:-sk-123456} # Perplexity 账户凭证 (可选,用于高级功能) - PPLX_NEXT_AUTH_CSRF_TOKEN=${PPLX_NEXT_AUTH_CSRF_TOKEN:-} - PPLX_SESSION_TOKEN=${PPLX_SESSION_TOKEN:-} # SOCKS 代理配置 (可选) # 格式: socks5://[user[:pass]@]host[:port][#remark] # 示例: socks5://127.0.0.1:1080 或 socks5://user:pass@proxy.example.com:1080 # - SOCKS_PROXY=${SOCKS_PROXY:-} restart: unless-stopped 

    .env 环境变量

    # Perplexity MCP Server 环境变量配置 # 复制此文件为 .env 并填入实际值 # ============================================ # MCP 服务配置 # ============================================ # MCP 服务端口
    MCP_PORT=8000
    
    # MCP API 认证密钥 (客户端需要在 Authorization header 中携带此密钥)
    MCP_TOKEN=sk-123456
    
    # ============================================ # Perplexity 账户凭证 (可选) # 用于解锁高级功能: Pro 模式、Reasoning 模式、Deep Research # 不配置则只能使用 auto 模式 # ============================================ # 从 Perplexity 网站 Cookie 中获取 # 打开 perplexity.ai -> F12 开发者工具 -> Application -> Cookies
    PPLX_NEXT_AUTH_CSRF_TOKEN=
    PPLX_SESSION_TOKEN=
    


    perplexity mcp docker 一键部署(一个 pro 账号无限额度独享 ai 搜索 mcp)3

    mcp 配置

    { "perplexity": { "type": "http", "url": "http://127.0.0.1:8000/mcp", "headers": { "Authorization": "Bearer sk-123456" } } } 

    github


    📌 转载信息
    原作者:
    shan_CW
    转载时间:
    2025/12/30 10:27:01