MoreRSS

site iconLaoda | 咕咕修改

主要分享服务器折腾指南、Docker自建项目、博客搭建等技术内容,同时推荐好用的网站和在线工具。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Laoda | 咕咕的 RSS 预览

10 分钟搭建一个支持超过 1000 种不同格式的在线文件转换器——ConvertX|好玩儿的 Docker 项目

2026-01-20 15:12:49

1. 唠嗑

好久没更新了,这周来和大家分享一个自托管的在线文件转换器。支持超过一千种不同格式。使用 TypeScript、Bun 和 Elysia 编写。

e3a1dbdc76a602c085010e7ba78c6e40.png

2. ConvertX 简介

功能特性

  • 将文件转换为不同格式
  • 一次处理多个文件
  • 密码保护
  • 多个账户

5da3095bb57e3702117dda7268c82b2d.png

支持转换的类型

Converter Use case Converts from Converts to
Inkscape Vector images 7 17
libjxl JPEG XL 11 11
resvg SVG 1 1
Vips Images 45 23
libheif HEIF 2 4
XeLaTeX LaTeX 1 1
Calibre E-books 26 19
LibreOffice Documents 41 22
Dasel Data Files 5 4
Pandoc Documents 43 65
msgconvert Outlook 1 1
VCF to CSV Contacts 1 1
dvisvgm Vector images 4 2
ImageMagick Images 245 183
GraphicsMagick Images 167 130
Assimp 3D Assets 77 23
FFmpeg Video ~472 ~199
Potrace Raster to vector 4 11
VTracer Raster to vector 8 1
Markitdown Documents 6 1

3. 相关地址

官方 GitHub 地址:https://github.com/C4illin/ConvertX (目前 15.3k 个 star,欢迎大家去给项目点星星!)

当然如果你想自己用 docker 搭建一个,那我们就继续往下!

4. 搭建环境

5. 搭建视频(过俩周补充 = =)

5.1 YouTube

视频地址:

5.2 哔哩哔哩

哔哩哔哩:

6. 搭建方式

6.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

6.2 创建安装目录

创建一下安装的目录:

sudo -i

mkdir -p /root/data/docker_data/convertx

cd /root/data/docker_data/convertx

接着我们来编辑下docker-compose.yml

vim docker-compose.yml
services:
  convertx:
    image: ghcr.io/c4illin/convertx
    container_name: convertx
    restart: unless-stopped
    ports:
      - "3001:3000"
    environment:
      - JWT_SECRET=aLongAndSecretStringUsedToSignTheJSONWebToken123412 # will use randomUUID() if unset
      # - HTTP_ALLOWED=true # uncomment this if accessing it over a non-https connection 如果通过 http 访问的话取消这行注释
      - LANGUAGE=zh
    volumes:
      - ./data:/app/data

其中的左边的3001可以改成服务器上没有用过的端口。

修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

环境变量

所有都是可选的,但建议设置 JWT_SECRET

Name Default Description
JWT_SECRET when unset it will use the value from randomUUID() 用于签署 JSON Web Token 的一串密钥字符串
ACCOUNT_REGISTRATION false 允许用户注册账户
HTTP_ALLOWED false 允许 HTTP 连接,仅在本地部署的时候将它设置为 true
ALLOW_UNAUTHENTICATED false 允许未认证用户使用该服务,仅在本地部署的时候将它设置为 true。
AUTO_DELETE_EVERY_N_HOURS 24 每 n 小时检查一次,删除超过 n 小时的文件,设置为 0 表示禁用。
WEBROOT 将根路径设置为 "/convert" 的地址将在 "example.com/convert/" 上提供网站。
FFMPEG_ARGS 传递给 ffmpeg 输入文件的参数,例如 -hwaccel vaapi。有关硬件加速的更多信息,请参见 #190
FFMPEG_OUTPUT_ARGS 传递给 ffmpeg 输出的参数,例如 -preset veryfast
HIDE_HISTORY false 隐藏历史页面
LANGUAGE en 用于格式化日期字符串的语言,指定为 BCP 47 language tag
UNAUTHENTICATED_USER_SHARING false 所有未经身份验证用户共享转换历史记录
MAX_CONVERT_PROCESS 0 允许的最大并发转换进程数量。设置为 0 表示无限制。

按需添加修改,修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

6.3 查看端口是否被占用

查看端口是否被占用(以 3001 为例),输入:

lsof -i:3001  #查看 3001 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~

如果出现:

-bash: lsof: command not found

运行:

apt install lsof  #安装 lsof

如果端口没有被占用(被占用了就修改一下端口,比如改成 8381,注意 docker 命令行里和防火墙都要改)

6.4 启动 convertx

cd /root/data/docker_data/convertx

docker compose up -d   # 注意,老版本用户用 docker-compose up -d

662decf436731fa2acf7a276e4af9caf.png

镜像还是比较大的……

耐心等待拉取好镜像,出现 Created的字样之后,

理论上我们就可以输入 http://ip:3001 访问了。

但是我们部署在公网一定要考虑使用反向代理工具配置 SSL!

做反向代理前,你需要一个域名!

namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo 上 6 位数字的 xyz 续费永远都是 0.99 美元 = =)

如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)

namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些 古老 = =)

【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)

我们接着往下看!

7. 反向代理

7.1 利用 Nginx Proxy Manager

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

0a6c012bb847558679e499f447dd4958.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

直接丢几张图:

61a4b0f2f2c6bb56b3bf540e00deb8a5.pngceb23ce98beed6ac28add2b03d4e53e8.png894dac73d5b90a9032806b61cdf22540.png67b28075187f39a44dce4b23b9228abb.png

注意填写对应的 域名IP端口,按文章来的话,应该是 3001

IP 填写:

如果 Nginx Proxy Manager 和 convertx 在同一台服务器上,可以在终端输入:

ip addr show docker0

查看对应的 Docker 容器内部 IP。

否则直接填 convertx 所在的服务器 IP 就行。

然后访问域名就可以访问了!

7.2 利用宝塔面板

发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:

直接新建一个站点,不要数据库,不要 php,纯静态即可。

然后打开下面的配置,修改 Nginx 的配置。

image-20220819150345725image-20220819150542867

代码如下:

location / {
      proxy_pass http://127.0.0.1:3001/;       # 注意改成你实际使用的端口
      rewrite ^/(.*)$ /$1 break;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
      proxy_set_header X-Forwarded-Proto https;
    }

此方法对 90% 的反向代理都能生效,然后就可以用域名来安装访问了。

有同学可能会问,为什么不直接用宝塔自带的反向代理功能。

image-20220819150730128

也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =

所以后来就不用了,直接用上面的方法来操作了。

8. 使用教程

非常简单,所见即所得。

先注册账号:

45e7bc9343633faae0922c3f9a788670.png

f1a7c788c803a41e6aa3ccb88607c5fd.png

JPG 转换成 webp

8475bb89d272567691366dd6c838f86b.png

f65aa6b232020dc70071d0cea24f442c.png

MP4 转 AVI

2e655386026439a4f31bad8221504d7f.png

正常转换。

转换历史:

11626ac66e09b45b5d7efe77b02e8d10.png

服务器里还是能看到文件的,

97c9f37455cfbabc34e0049b079356ef.png

8.1 更新 convertx

这个项目后续会持续有更新,所以提供一个更新的方式。

cd /root/data/docker_data/convertx

docker compose pull

docker compose up -d    # 请不要使用 docker compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入 y

利用 Docker 搭建的应用,更新非常容易~

8.2 卸载 convertx

同样进入安装页面,先停止所有容器。

cd /root/data/docker_data/convertx

docker compose down

cd ..

rm -rf /root/data/docker_data/convertx  # 完全删除

可以卸载得很干净。

9. 使用问题

大家使用上有什么心得或者问题,欢迎评论区交流~

10. 结尾

祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。

同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!

最后,感谢作者 @C4illin 的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star。

参考资料

官方 GitHub:https://github.com/C4illin/ConvertX

十分钟搭建一个 AI 驱动的图表生成器——Next-AI-Draw.io|好玩儿的 Docker 项目

2025-12-18 17:11:24

1. 唠嗑

好久没更新了,这周来和大家分享一个 AI 驱动的图表生成器——Next-AI-Draw.io

2. Next-AI-Draw.io 简介

Next-AI-Draw.io 是一个集成了 AI 功能的 Next.js 网页应用,与 draw.io 图表无缝结合。通过自然语言命令和 AI 辅助可视化来创建、修改和增强图表。

9dc17920a8529ad875088874df11e1c7.png

0284f7edc67110d515a3edabf7ba418a.png

功能特性

  • LLM 驱动的图表创建:利用大语言模型通过自然语言命令直接创建和操作 draw.io 图表
  • 基于图像的图表复制:上传现有图表或图像,让 AI 自动复制和增强
  • PDF 和文本文件上传:上传 PDF 文档和文本文件,提取内容并从现有文档生成图表
  • AI 推理过程显示:查看支持模型的 AI 思考过程(OpenAI o1/o3、Gemini、Claude 等)
  • 图表历史记录:全面的版本控制,跟踪所有更改,允许您查看和恢复 AI 编辑前的图表版本
  • 交互式聊天界面:与 AI 实时对话来完善您的图表
  • 云架构图支持:专门支持生成云架构图(AWS、GCP、Azure)
  • 动画连接器:在图表元素之间创建动态动画连接器,实现更好的可视化效果

3. 相关地址

官方 GitHub 地址:https://github.com/DayuanJiang/next-ai-draw-io (目前 13k 个 star,欢迎大家去给项目点星星!)

Demo 地址:https://next-ai-drawio.jiang.jp/

当然如果你体验完还想自己用 docker 搭建一个,那我们就继续往下!

4. 搭建环境

5. 搭建视频(过俩周补充 = =)

5.1 YouTube

视频地址:

5.2 哔哩哔哩

哔哩哔哩:

6. 搭建方式

6.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

6.2 创建安装目录

创建一下安装的目录:

sudo -i

mkdir -p /root/data/docker_data/drawioai

cd /root/data/docker_data/drawioai

接着我们来编辑下docker-compose.yml

vim docker-compose.yml
name: nextaidrawio
services:
    next-ai-draw-io:
        ports:
            - 3001:3000
        env_file:
            - .env
        image: ghcr.io/dayuanjiang/next-ai-draw-io:latest

其中的左边的3001可以改成服务器上没有用过的端口。

修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

接着我们来编辑下.env

cd /root/data/docker_data/drawioai
vim .env

粘贴如下内容:

# AI Provider Configuration
# AI_PROVIDER: Which provider to use
# Options: bedrock, openai, anthropic, google, azure, ollama, openrouter, deepseek, siliconflow, gateway
# Default: bedrock
AI_PROVIDER=bedrock

# AI_MODEL: The model ID for your chosen provider (REQUIRED)
AI_MODEL=global.anthropic.claude-sonnet-4-5-20250929-v1:0

# AWS Bedrock Configuration
# AWS_REGION=us-east-1
# AWS_ACCESS_KEY_ID=your-access-key-id
# AWS_SECRET_ACCESS_KEY=your-secret-access-key
# Note: Claude and Nova models support reasoning/extended thinking
# BEDROCK_REASONING_BUDGET_TOKENS=12000  # Optional: Claude reasoning budget in tokens (1024-64000)
# BEDROCK_REASONING_EFFORT=medium        # Optional: Nova reasoning effort (low/medium/high)

# OpenAI Configuration
# OPENAI_API_KEY=sk-...
# OPENAI_BASE_URL=https://api.openai.com/v1  # Optional: Custom OpenAI-compatible endpoint
# OPENAI_ORGANIZATION=org-...  # Optional
# OPENAI_PROJECT=proj_...      # Optional
# Note: o1/o3/gpt-5 models automatically enable reasoning summary (default: detailed)
# OPENAI_REASONING_EFFORT=low   # Optional: Reasoning effort (minimal/low/medium/high) - for o1/o3/gpt-5
# OPENAI_REASONING_SUMMARY=detailed  # Optional: Override reasoning summary (none/brief/detailed)

# Anthropic (Direct) Configuration
# ANTHROPIC_API_KEY=sk-ant-...
# ANTHROPIC_BASE_URL=https://your-custom-anthropic/v1
# ANTHROPIC_THINKING_TYPE=enabled            # Optional: Anthropic extended thinking (enabled)
# ANTHROPIC_THINKING_BUDGET_TOKENS=12000     # Optional: Budget for extended thinking in tokens

# Google Generative AI Configuration
# GOOGLE_GENERATIVE_AI_API_KEY=...
# GOOGLE_BASE_URL=https://generativelanguage.googleapis.com/v1beta  # Optional: Custom endpoint
# GOOGLE_CANDIDATE_COUNT=1                   # Optional: Number of candidates to generate
# GOOGLE_TOP_K=40                            # Optional: Top K sampling parameter
# GOOGLE_TOP_P=0.95                          # Optional: Nucleus sampling parameter
# Note: Gemini 2.5/3 models automatically enable reasoning display (includeThoughts: true)
# GOOGLE_THINKING_BUDGET=8192                # Optional: Gemini 2.5 thinking budget in tokens (for more/less thinking)
# GOOGLE_THINKING_LEVEL=high                 # Optional: Gemini 3 thinking level (low/high)

# Azure OpenAI Configuration
# Configure endpoint using ONE of these methods:
#   1. AZURE_RESOURCE_NAME - SDK constructs: https://{name}.openai.azure.com/openai/v1{path}
#   2. AZURE_BASE_URL - SDK appends /v1{path} to your URL
# If both are set, AZURE_BASE_URL takes precedence.
# AZURE_RESOURCE_NAME=your-resource-name
# AZURE_API_KEY=...
# AZURE_BASE_URL=https://your-resource.openai.azure.com/openai  # Alternative: Custom endpoint
# AZURE_REASONING_EFFORT=low                 # Optional: Azure reasoning effort (low, medium, high)
# AZURE_REASONING_SUMMARY=detailed

# Ollama (Local) Configuration
# OLLAMA_BASE_URL=http://localhost:11434/api  # Optional, defaults to localhost
# OLLAMA_ENABLE_THINKING=true                 # Optional: Enable thinking for models that support it (e.g., qwen3)

# OpenRouter Configuration
# OPENROUTER_API_KEY=sk-or-v1-...
# OPENROUTER_BASE_URL=https://openrouter.ai/api/v1  # Optional: Custom endpoint

# DeepSeek Configuration
# DEEPSEEK_API_KEY=sk-...
# DEEPSEEK_BASE_URL=https://api.deepseek.com/v1  # Optional: Custom endpoint

# SiliconFlow Configuration (OpenAI-compatible)
# Base domain can be .com or .cn, defaults to https://api.siliconflow.com/v1
# SILICONFLOW_API_KEY=sk-...
# SILICONFLOW_BASE_URL=https://api.siliconflow.com/v1  # Optional: switch to https://api.siliconflow.cn/v1 if needed

# Vercel AI Gateway Configuration
# Get your API key from: https://vercel.com/ai-gateway
# Model format: "provider/model" e.g., "openai/gpt-4o", "anthropic/claude-sonnet-4-5"
# AI_GATEWAY_API_KEY=...

# Langfuse Observability (Optional)
# Enable LLM tracing and analytics - https://langfuse.com
# LANGFUSE_PUBLIC_KEY=pk-lf-...
# LANGFUSE_SECRET_KEY=sk-lf-...
# LANGFUSE_BASEURL=https://cloud.langfuse.com  # EU region, use https://us.cloud.langfuse.com for US

# Temperature (Optional)
# Controls randomness in AI responses. Lower = more deterministic.
# Leave unset for models that don't support temperature (e.g., GPT-5.1 reasoning models)
# TEMPERATURE=0

# Access Control (Optional)
# ACCESS_CODE_LIST=your-secret-code,another-code

# Draw.io Configuration (Optional)
# NEXT_PUBLIC_DRAWIO_BASE_URL=https://embed.diagrams.net  # Default: https://embed.diagrams.net
# Use this to point to a self-hosted draw.io instance

# PDF Input Feature (Optional)
# Enable PDF file upload to extract text and generate diagrams
# Enabled by default. Set to "false" to disable.
# ENABLE_PDF_INPUT=true
# NEXT_PUBLIC_MAX_EXTRACTED_CHARS=150000  # Max characters for PDF/text extraction (default: 150000)

这里头有很多选项可以开启,当然你也可以不管它,到网页端输入,这样的话就保存在本地浏览器里了,如果在这边输入,所有知道这个网址的人都能用你的 AI 模型。

假设我们用的 OPEN AI 的,其实.env里面只要这仨:

AI_PROVIDER=openai
AI_MODEL=gpt-4o
OPENAI_API_KEY=your_api_key

your_api_key改成你的 API 密钥。

修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

6.3 查看端口是否被占用

查看端口是否被占用(以 3001 为例),输入:

lsof -i:3001  #查看 3001 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~

如果出现:

-bash: lsof: command not found

运行:

apt install lsof  #安装 lsof

如果端口没有被占用(被占用了就修改一下端口,比如改成 8381,注意 docker 命令行里和防火墙都要改)

6.4 启动 drawioai

cd /root/data/docker_data/drawioai

docker compose up -d   # 注意,老版本用户用 docker-compose up -d

耐心等待拉取好镜像,出现 done的字样之后,

理论上我们就可以输入 http://ip:3001 访问了。

但是我们部署在公网一定要考虑使用反向代理工具配置 SSL!

做反向代理前,你需要一个域名!

namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo 上 6 位数字的 xyz 续费永远都是 0.99 美元 = =)

如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)

namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些 古老 = =)

【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)

我们接着往下看!

7. 反向代理

7.1 利用 Nginx Proxy Manager

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

1c160f28afd3549159df3efa2507ad0c.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

直接丢几张图:

c359c92172657c5667c6a1738b214511.png940b5b933d91851bb44423d5bfc3f628.png46b8997021848567235e69ee8b0be54f.pnge2fed6006e075057bacdb57857e516b7.png

注意填写对应的 域名IP端口,按文章来的话,应该是 3001

IP 填写:

如果 Nginx Proxy Manager 和 drawioai 在同一台服务器上,可以在终端输入:

ip addr show docker0

查看对应的 Docker 容器内部 IP。

否则直接填 drawioai 所在的服务器 IP 就行。

然后访问域名就可以访问了!

7.2 利用宝塔面板

发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:

直接新建一个站点,不要数据库,不要 php,纯静态即可。

然后打开下面的配置,修改 Nginx 的配置。

image-20220819150345725image-20220819150542867

代码如下:

location / {
      proxy_pass http://127.0.0.1:3001/;       # 注意改成你实际使用的端口
      rewrite ^/(.*)$ /$1 break;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
      proxy_set_header X-Forwarded-Proto https;
    }

此方法对 90% 的反向代理都能生效,然后就可以用域名来安装访问了。

有同学可能会问,为什么不直接用宝塔自带的反向代理功能。

image-20220819150730128

也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =

所以后来就不用了,直接用上面的方法来操作了。

8. 使用教程

非常简单,所见即所得。

登录页,

ccd17e50213ceede7348a39b298f3085.png

语言设置,改成中文,

b0257ee37eafc1d9f205cf1858ab48fd.png

简单展示

fead7ea8e6e781129d1c91dd03ee7b02.png

右边可以输入提示词,比如让它画一只猫猫,

02798e80fde95bc63142b86cfc83dc33.png

画的熊猫不太像……

b86441ae7cc00d5bab3ae0032ffa9cad.png

当然你也可以隐藏掉这个提示词输入框,把它当成一个普通的画图软件来用,

b821ac8ceac261079ae31b3998e2b55c.png

如果用默认的,其实是用的项目作者的 API,速率可能会有限制,当然用自己的 API 就没有这个问题了,如果手上富裕,也可以考虑捐赠作者,支持开源项目长久发展。

727fd49d8064f8e7fae8d934daf5183f.png

8.1 更新 drawioai

这个项目后续会持续有更新,所以提供一个更新的方式。

cd /root/data/docker_data/drawioai

docker compose pull

docker compose up -d    # 请不要使用 docker compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入 y

利用 Docker 搭建的应用,更新非常容易~

8.2 卸载 drawioai

同样进入安装页面,先停止所有容器。

cd /root/data/docker_data/drawioai

docker compose down

cd ..

rm -rf /root/data/docker_data/drawioai  # 完全删除

可以卸载得很干净。

9. 使用问题

那个保存按钮点了似乎没有任何反馈……

不过画的图导出是没问题的。

大家使用上有什么心得或者问题,欢迎评论区交流~

10. 结尾

祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。

同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!

最后,感谢作者 @DayuanJiang 的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star。

参考资料

官方 GitHub:https://github.com/DayuanJiang/next-ai-draw-io

十分钟搭建一个「万物皆可存」的智能书签应用——karakeep|好玩儿的 Docker 项目

2025-11-13 09:55:12

1. 唠嗑

好久没更新了,这周来和大家分享一个好用的书签工具——Karakeep

2. karakeep 简介

Karakeep(前身为 Hoarder)是一款可自托管的「万物皆可存」书签应用,专为数据囤积爱好者打造,融入一丝 AI 魔法。

b877b9e2ebadea6bd7eb91991a4744e4.png

功能

  • 🔗 书签链接、记录简单笔记,并存储图片和 PDF 文件。
  • ⬇️ 自动抓取链接标题、描述和预览图。
  • 📋 将书签整理到不同列表中。
  • 🔎 全文本搜索所有存储内容。
  • ✨ 基于 AI(类似 ChatGPT)自动打标签和生成摘要。支持使用 Ollama 运行本地模型!
  • 🤖 规则引擎,实现自定义管理。
  • 🎆 图像 OCR,提取图片中的文字。
  • 🔖 Chrome 插件和 Firefox 扩展,快速添加书签。
  • 📱 iOS 应用和 Android 应用。
  • 📰 从 RSS 订阅源自动归档内容。
  • 🔌 REST API 和多种客户端。
  • 🌐 多语言支持。
  • 🖍️ 标记并保存归档内容中的高亮片段。
  • 🗄️ 完整页面归档(使用 monolith),防止链接失效。
  • ▶️ 使用 yt-dlp 自动归档视频。
  • ☑️ 支持批量操作。
  • 🔐 支持 SSO 单点登录。
  • 🌙 深色模式。
  • 💾 优先支持自托管。
  • ⬇️ 从 Chrome、Pocket、Linkwarden、Omnivore、Tab Session Manager 导入书签。
  • 🔄 通过 floccus 与浏览器书签自动同步。
  • [计划中] 移动端离线阅读、书签语义搜索,……

6fb0d16e6fa436a7fceaa95125fee34d.png

3. 相关地址

官方 GitHub 地址:https://github.com/karakeep-app/karakeep (目前 21.1k 个 star,欢迎大家去给项目点星星!)

Demo 地址:https://try.karakeep.app

默认账号密码:

Email: [email protected]

Password: demodemo

当然如果你体验完还想自己用 docker 搭建一个,那我们就继续往下!

4. 搭建环境

5. 搭建视频(过俩周补充 = =)

5.1 YouTube

视频地址:

5.2 哔哩哔哩

哔哩哔哩:

6. 搭建方式

6.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

6.2 创建安装目录

创建一下安装的目录:

sudo -i

mkdir -p /root/data/docker_data/karakeep

cd /root/data/docker_data/karakeep

接着我们来编辑下docker-compose.yml

vim docker-compose.yml
services:
  web:
    image: ghcr.io/karakeep-app/karakeep:latest
    restart: unless-stopped
    volumes:
      # By default, the data is stored in a docker volume called "data".
      # If you want to mount a custom directory, change the volume mapping to:
      # - /path/to/your/directory:/data
      - ./data:/data
    ports:
      - 3030:3000
    env_file:
      - .env
    environment:
      MEILI_ADDR: http://meilisearch:7700
      BROWSER_WEB_URL: http://chrome:9222
      # OPENAI_API_KEY: ...

      # You almost never want to change the value of the DATA_DIR variable.
      # If you want to mount a custom directory, change the volume mapping above instead.
      DATA_DIR: /data # DON'T CHANGE THIS
  chrome:
    image: gcr.io/zenika-hub/alpine-chrome:124
    restart: unless-stopped
    command:
      - --no-sandbox
      - --disable-gpu
      - --disable-dev-shm-usage
      - --remote-debugging-address=0.0.0.0
      - --remote-debugging-port=9222
      - --hide-scrollbars
  meilisearch:
    image: getmeili/meilisearch:v1.13.3
    restart: unless-stopped
    env_file:
      - .env
    environment:
      MEILI_NO_ANALYTICS: "true"
    volumes:
      - ./meilisearch:/meili_data

其中的左边的3030可以改成服务器上没有用过的端口,如果要用到AI功能的话,可以取消OPENAI_API_KEY的注释,填入自己的密钥。

修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

接着我们来编辑下.env

cd /root/data/docker_data/karakeep
vim .env

粘贴如下内容:

KARAKEEP_VERSION=release
NEXTAUTH_SECRET=super_random_string
MEILI_MASTER_KEY=another_random_string
NEXTAUTH_URL=http://localhost:3000
  • 其中的http://localhost:3000这个改成你自己之后用域名访问的地址,比如我的https://karakeep.gugu.ovh
  • 其中的super_random_stringanother_random_string需要我们自己生成。

我们可以先在命令行里面输入

openssl rand -base64 36

生成随机的字符,然后替代它们。

aebf462264a0d4c95fa1416bee41830a.png

我需要放在.env里的内容就是:

KARAKEEP_VERSION=release
NEXTAUTH_SECRET=Lu4YuG5pXji2/QB6blXaoWnfK2WdtKifPhEBt0UQCHqkxCAe
MEILI_MASTER_KEY=wJ222cTFWJ0/9Jnu38gU9Wb+AdCk2SBmQ687MdTbxT8c/V0b
NEXTAUTH_URL=https://karakeep.gugu.ovh

修改完成之后,同样的,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

6.3 查看端口是否被占用

查看端口是否被占用(以 3030 为例),输入:

lsof -i:3030  #查看 3030 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~

如果出现:

-bash: lsof: command not found

运行:

apt install lsof  #安装 lsof

如果端口没有被占用(被占用了就修改一下端口,比如改成 8381,注意 docker 命令行里和防火墙都要改)

6.4 启动 karakeep

cd /root/data/docker_data/karakeep

docker compose up -d   # 注意,老版本用户用 docker-compose up -d

耐心等待拉取好镜像,出现 done的字样之后,

理论上我们就可以输入 http://ip:3030 访问了。

但是这边这个服务必须先搞一下反向代理!既然是加密的项目,不能用 http 使用明文传输,我们部署在公网一定要考虑使用反向代理工具配置 SSL!

做反向代理前,你需要一个域名!

namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo 上 6 位数字的 xyz 续费永远都是 0.99 美元 = =)

如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)

namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些 古老 = =)

【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)

我们接着往下看!

7. 反向代理

7.1 利用 Nginx Proxy Manager

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

8a522c57d08898256ce3814d5183f811.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

直接丢几张图:

deeedad5afbbcc25441ac1a41e89ba31.pngcf5928e754752471d09460cd31fb2eae.png832a857e518a6999f692c56a1b0d6d18.pngbd08eed12b655993b53b6df83bcb6606.pngec68bb8adeb0d9661917ba2e77032906.png

注意填写对应的 域名IP端口,按文章来的话,应该是 3030

IP 填写:

如果 Nginx Proxy Manager 和 karakeep 在同一台服务器上,可以在终端输入:

ip addr show docker0

查看对应的 Docker 容器内部 IP。

否则直接填 karakeep 所在的服务器 IP 就行。

然后访问域名就可以访问了!

7.2 利用宝塔面板

发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:

直接新建一个站点,不要数据库,不要 php,纯静态即可。

然后打开下面的配置,修改 Nginx 的配置。

image-20220819150345725image-20220819150542867

代码如下:

location / {
      proxy_pass http://127.0.0.1:3030/;       # 注意改成你实际使用的端口
      rewrite ^/(.*)$ /$1 break;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
      proxy_set_header X-Forwarded-Proto https;
    }

此方法对 90% 的反向代理都能生效,然后就可以用域名来安装访问了。

有同学可能会问,为什么不直接用宝塔自带的反向代理功能。

image-20220819150730128

也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =

所以后来就不用了,直接用上面的方法来操作了。

8. 使用教程

非常简单,所见即所得。

登录,

32cb2fe6c8694197a931f84b06e6931d.png

首先注册一个账号,

e04dc92bb6e9435aaebfc5d43eb4f56f.png

后台页面,

2069ec87e83c0c1ad747046940e44717.png

用户设置,

213472f4fcb8caa51ae8344d98424a60.png

如果觉得英文不习惯,也可以改成中文,

0cfd2e99f9d8a159389de1d0f8b3f163.png

输入一个网址,测试一下,

2d1764ecbf9c5ff13e0692864d15659b.png

支持给你存下来的网页打标签,

58b7e0e99d814b62bfa15217b140b3a4.png

服务器统计情况,

abe96ef7a5a74c3d3cd8330ec85073c2.png

Karakeep是支持浏览器插件的,这边可以直接下载浏览器插件,方便浏览网页的时候使用,

c5519d815ece46e7a66ebf39b763ec26.png

输入你搭建好的域名,然后登录即可,

ccd39153c2f87d5ae8be6ee098cfbf7c.png

使用

ea1377f2cd994631248c61114a911c92.png

c89e80bfa4ab4a3de5f1e1b7e6c11124.png

也支持下载完整页面,

502f8bd34f6f45f8af5ad101bd17bd69.png

还有一些AI功能,大家可以自行探索。或者查看Karakeep的官方文档

8.1 更新 karakeep

这个项目后续会持续有更新,所以提供一个更新的方式。

cd /root/data/docker_data/karakeep

docker compose pull

docker compose up -d    # 请不要使用 docker compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入 y

利用 Docker 搭建的应用,更新非常容易~

8.2 卸载 karakeep

同样进入安装页面,先停止所有容器。

cd /root/data/docker_data/karakeep

docker compose down

cd ..

rm -rf /root/data/docker_data/karakeep  # 完全删除

可以卸载得很干净。

9. 使用简介

大家有问题欢迎评论区交流。

10. 结尾

祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。

同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!

最后,感谢作者 @civilblur 的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star。

参考资料

官方 GitHub:https://github.com/karakeep-app/karakeep

十分钟搭建一次性私密信息共享平台——OTS|好玩儿的Docker项目

2025-10-22 11:04:21

1. 唠嗑

好久没更新了,这周来和大家分享一个阅后即焚工具,安全高效的一次性私密信息共享平台——OTS(One-Time-Secret)

2. OTS 简介

OTS 是一个一次性私密信息分享平台。私密信息在发送到服务器之前,会在浏览器中使用对称的 256 位 AES 加密进行加密。之后会生成一个包含私密信息的 ID 和密码的 URL。密码永远不会发送到服务器,因此服务器无法以合理的方式解密它所传递的私密信息。此外,私密信息在第一次读取后会立即被删除。

功能

  • 私密信息在浏览器中通过 AES 256 位加密进行加密
  • 服务器永远不会接收到明文私密信息
  • 私密信息在第一次读取后即被删除

1fda6d3277a6b618383e3f5d09ecc446.png

c25e783b58219bbb18541bb45c1688e9.png

3. 相关地址

官方 GitHub 地址:https://github.com/Luzifer/ots (目前 638 个 star,欢迎大家去给项目点星星!)

Demo 地址:https://ots.fyi/

当然如果你看到这边还想自己用 docker 搭建一个,那我们就继续往下!

4. 搭建环境

5. 搭建视频(过俩天补充 = =)

5.1 YouTube

视频地址:

5.2 哔哩哔哩

哔哩哔哩:

6. 搭建方式

6.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

6.2 创建安装目录

创建一下安装的目录:

sudo -i

mkdir -p /root/data/docker_data/OTS

cd /root/data/docker_data/OTS

接着我们来编辑下docker-compose.yml

vim docker-compose.yml
services:
  app:
    image: ghcr.io/luzifer/ots:latest
    container_name: ots-app
    restart: always
    ports:
      - 3003:3000
    environment:
      # Optional, see "Customization" in README
      #CUSTOMIZE: '/etc/ots/customize.yaml'
      # See README for details
      REDIS_URL: redis://redis:6379/0
      # 168h = 1w
      SECRET_EXPIRY: "604800"
      # "mem" or "redis" (See README)
      STORAGE_TYPE: redis
    depends_on:
      - redis

  redis:
    image: redis:latest
    container_name: ots-redis
    restart: always
    volumes:
      - ./data:/data

环境变量的说明如下:

环境变量 描述
REDIS_URL Redis 数据库的连接字符串,格式为 redis://USR:PWD@HOST:PORT/DB。用于指定 OTS 应用连接的 Redis 实例
SECRET_EXPIRY 秘密的过期时间,单位为秒(默认 0 = 无过期)。此示例中设置为 604800(168 小时 = 1 周)
STORAGE_TYPE 用于指定存储类型,可以是 mem(内存存储)或 redis(使用 Redis 存储秘密)

最后,在 ots 目录下执行以下命令一键启动:

其中的左边的3003可以改成服务器上没有用过的端口,记得修改自己的用户名和密码,修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

6.3 查看端口是否被占用

查看端口是否被占用(以 3003 为例),输入:

lsof -i:3003  #查看 3003 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~

如果出现:

-bash: lsof: command not found

运行:

apt install lsof  #安装 lsof

如果端口没有被占用(被占用了就修改一下端口,比如改成 8381,注意 docker 命令行里和防火墙都要改)

6.4 启动 OTS

cd /root/data/docker_data/OTS

docker compose up -d   # 注意,老版本用户用 docker-compose up -d

耐心等待拉取好镜像,出现 done的字样之后,

理论上我们就可以输入 http://ip:3003 访问了。

但是这边这个服务必须先搞一下反向代理!既然是加密的项目,不能用 http 使用明文传输,我们部署在公网一定要考虑使用反向代理工具配置 SSL!

做反向代理前,你需要一个域名!

namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo 上 6 位数字的 xyz 续费永远都是 0.99 美元 = =)

如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)

namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些 古老 = =)

【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)

我们接着往下看!

7. 反向代理

7.1 利用 Nginx Proxy Manager

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

08b09ee8604e6250e24354ccb4cd926b.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

直接丢几张图:

78186b53ea22c99caa737ec043e24947.pngc2075b8e6a85bff585396fd4c0bca1ed.png525e20e0bea1448ff37e3d95dec2876c.pngf5137b06b270769cc2ebca7019f47e35.png

注意填写对应的 域名IP端口,按文章来的话,应该是 3003

IP 填写:

如果 Nginx Proxy Manager 和 OTS 在同一台服务器上,可以在终端输入:

ip addr show docker0

查看对应的 Docker 容器内部 IP。

否则直接填 OTS 所在的服务器 IP 就行。

然后访问域名就可以访问了!

7.2 利用宝塔面板

发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:

直接新建一个站点,不要数据库,不要 php,纯静态即可。

然后打开下面的配置,修改 Nginx 的配置。

image-20220819150345725image-20220819150542867

代码如下:

location / {
      proxy_pass http://127.0.0.1:3003/;       # 注意改成你实际使用的端口
      rewrite ^/(.*)$ /$1 break;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
      proxy_set_header X-Forwarded-Proto https;
    }

此方法对 90% 的反向代理都能生效,然后就可以用域名来安装访问了。

有同学可能会问,为什么不直接用宝塔自带的反向代理功能。

image-20220819150730128

也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =

所以后来就不用了,直接用上面的方法来操作了。

8. 使用教程

非常简单,所见即所得。

19f97b0b247033100477307b379bd7b8.png

6e3f18b4fc5aeef1a5bdb998d4decf6e.png

ddd6171537aa47f30f150dfa9d9f8d6b.png

8.1 更新 OTS

这个项目后续会持续有更新,所以提供一个更新的方式。

cd /root/data/docker_data/OTS

docker compose pull

docker compose up -d    # 请不要使用 docker compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入 y

利用 Docker 搭建的应用,更新非常容易~

8.2 卸载 OTS

同样进入安装页面,先停止所有容器。

cd /root/data/docker_data/OTS

docker compose down

cd ..

rm -rf /root/data/docker_data/OTS  # 完全删除

可以卸载得很干净。

9. 常见问题及注意点

大家有问题欢迎评论区交流。

10. 结尾

祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。

同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!

最后,感谢作者 @civilblur 的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star。

参考资料

官方 GitHub:https://github.com/Luzifer/ots

3分钟利用 Paypal 领取免费一年 Perplexity 会员! 解锁AI搜索神器!网页点点就行!

2025-09-04 18:31:06

简介

Perplexity是什么?

Perplexity 是一个结合了 AI 聊天机器人和搜索引擎功能的工具,旨在快速提供准确、简洁的答案,并附上可靠的来源引用。它通过理解用户问题,从网络上实时抓取信息,整理成清晰的回答,特别适合需要快速查资料或做研究的用户。

Pro版本的功能:

Perplexity Pro 提供更高级的功能,收费20美元/月,功能包括:

  • 多模型选择:用户可切换使用 GPT-4o、Claude 3.7、Gemini Flash 等不同语言模型,灵活应对不同需求。
  • Pages报告生成:可根据用户需求生成定制化的精美简报,适合研究或商务用途。
  • 高级搜索功能:如学术论文模式,专注搜索学术资源(如 Arxiv、SemanticScholar),提升研究效率。
  • 更高使用额度:相比免费版,Pro 版支持更多查询次数和更复杂的任务。

如果你需要快速查资料、做研究或验证信息,Perplexity 是最佳选择,尤其适合学术和专业场景。

领取条件

  • 1个PayPal账号(我用的是美区,据网友测试国区也可以)
  • 能访问真正的互联网
  • Perplexity 账号(可以现场注册)

领取方式

领取地址:https://www.perplexity.ai/join/p/paypal-subscription

ca3e75602a808c3b92397198da35363b.png

链接PayPal,

b4718b6f264d1c7de5207d0b5b7f9e34.png

我这边登录的是美区的PayPal,

a1f67cdf27b91ba2458beef66f8cfa17.png

选择接受优惠,
2f608f0e1364368ec38a54e434a4ac29.png

成功领取!

7f1cf6733ecd5e65c02f165a6c8a1964.png

已经可以正常使用了!

b12078649e490b14d6fee9c83be13f85.png

如果担心被反薅,记得取消 Perplexity 自动续费订阅,

访问:https://www.perplexity.ai/account/details

fa470b29a43e2a70b1eb49c74b2f6dcb.png

a6afdd3b8f2a1095fdabd1ee7fe59c19.png

取消订阅即可,不影响使用

同样的,Perplexity 还支持Mac桌面端,也可以用起来了!

257164195481a94f33de0c5b62a87130.png

注意点

  • 这次似乎国区的PayPal也可以领取。
  • 有不少网友评价Perplexity玩不起,之前三星的泄漏的一年优惠码,没用几天被收回了。
  • 也有网友表示现在这次打开会提示开通过了。 You are already subscribed or have previously subscribed to Perplexity Pro.
  • 还有一些一注册上就风控,即使美区也是,原先注册好的死活都不让领说领过了,换无数个邮箱尝试依旧如此,这个时候可以考虑换一个干净的IP再试试。

给你的Docker应用加一层保险!10分钟搭建一个简单好用的认证中间件—— Tinyauth

2025-09-03 16:30:34

1. 唠嗑

这两三年来,我们搭建了不少好玩的Docker应用,其实一直陆陆续续有小伙伴在视频评论区和博客的评论区询问,怎么样才能让我的Docker应用更安全一点?

这一期,我们就来介绍这样一个工具,用最简单的方式来给我们的Docker应用加一层保险!

效果展示:

保存之后。

再次打开简历这个网页。

提示需要登录了。

ae23d63f56a62d74560f7997f8537212.png

输入账号密码,继续

9cb7f756e503807085b95ed778e742c8.png

进来了。

cd86b2609a4ec471929f0fbc4d43d825.png

2. Tinyauth简介

Tinyauth 是个简单好用的认证中间件,能给你的 Docker 应用加个简洁的登录页面,或者支持 Google、GitHub 以及其他平台的 OAuth 认证。它跟主流代理比如 Nginx Proxy Manager、Traefik、Nginx 和 Caddy 都能无缝配合。

355959a7fc641c514e84dc5272ba9893.png

3. 相关地址

官方GitHub地址:https://github.com/steveiliop56/tinyauth (目前5.3K个star,欢迎大家去给项目点星星!)

文档地址:https://tinyauth.app/docs/guides/nginx-proxy-manager

Demo地址:https://tinyauth.app/

下面我们就用 Tinyauth配合 Nginx Proxy Manager,简单分享一下是怎么搭建这个中间件从而来保护我们的Docker应用的。

4. 搭建环境

5. 搭建视频(过俩天补充 = =)

5.1 YouTube

视频地址:

5.2 哔哩哔哩

哔哩哔哩:

6. 搭建方式

6.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

我们这边假设大家都装好了Nginx Proxy Manger,

假设Nginx Proxy Manger在服务器上的路径是~/data/docker_data/npm

这边的话就只需要修改一下即可。

官方文档给的参考如下:

services:
  npm:
    container_name: npm
    image: jc21/nginx-proxy-manager:2
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
      - 81:81
    volumes:
      - npm-data:/data
      - npm-letsencrypt:/etc/letsencrypt

  nginx:
    container_name: nginx
    image: nginx:latest
    restart: unless-stopped

  tinyauth:
    container_name: tinyauth
    image: ghcr.io/steveiliop56/tinyauth:v3
    restart: unless-stopped
    environment:
      - SECRET_FILE=/secret.txt
      - APP_URL=http://tinyauth.example.com
      - USERS=user:$$2a$$10$$UdLYoJ5lgPsC0RKqYH/jMua7zIn0g9kPqWmhYayJYLaZQ/FTmH2/u # user:password

volumes:
  npm-data:
  npm-letsencrypt:

如果直接使用,你一定会遇到很多问题。

我不会告诉你我用官方的这个配置文件,折腾了大半小时 = =

这边直接用咕咕修改过的这个:

重新编辑你的NPM的docker-compose.yaml文件,改成下面这个:

services:
  npm:
    container_name: npm
    image: jc21/nginx-proxy-manager:2
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
      - 81:81
    volumes:
      - ./data:/data         # 冒号左边的 ./data改成你自己实际的路径
      - ./letsencrypt:/etc/letsencrypt  # 冒号左边的 ./letsencrypt改成你自己实际的路径

  tinyauth:
    container_name: tinyauth
    image: ghcr.io/steveiliop56/tinyauth:v3
    restart: unless-stopped
    environment:
      - SECRET=kX9mPqW3zT7rY2vN8bL4jF6hD1cA5eK2  # 这个也要修改
      - APP_URL=https://auth.gugu.ovh  #这个也要修改
      - USERS=roy:$$2a$$10$$oXMqgLV/S1hrknYQht.WYu7YfWxkI4VriQn/y # user:password 这边要修改

然后我们来看需要修改的部分。

SECRET,这个的话,直接在命令行操作:

生成secret:

openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32 && echo

输出类似:kX9mPqW3zT7rY2vN8bL4jF6hD1cA5eK2 填入yaml即可。

APP_URL 这里改成你的tinyauth将来想要使用的域名,比如我这边https://auth.gugu.ovh

USERS ,这个官方也提供了方法,生成用户名和密码。

docker run -i -t --rm ghcr.io/steveiliop56/tinyauth:v3 user create --interactive

6788be9f0dedebd6fa8cd177d5dfe651.png

为docker格式化输出这个,记得选yes(按住shift再按小键盘方向键就可以选)

原因是USERS这边在yaml文件里要做哈希转换(比如哈希中的 $ 需要正确转义为 $$,命令行的 Docker 格式会自动处理。),如果不格式化输出会有问题。

c60fa52194d0d7b685327187290f75de.png

当然也支持多个用户,可以再打一遍代码,设置第二个用户,

595a1c77b1cc3807c6f4d398609c5c20.png

如果是一个用户,我们直接贴到yaml文件里即可,但是如果像我们现在这样,有三个用户,直接放进yaml文件会有点长,而且也不好维护。

所以,我们可以把用户配置放入 .env 文件,可以这样做:

编辑 ~/data/docker_data/npm/.env

SECRET=kX9mPqW3zT7rY2vN8bL4jF6hD1cA5eK2
APP_URL=https://auth.gugu.ovh
USERS=roy:$$2a$$10$$oXMqgLV/S1hrknYQht.WYu7YfEjBdSB5rIicj23O8WxkI4VriQn/y,gugu:$$2a$$10$$s.nq/KZLBlFwUiSUNyRUGe0j2pp.A9/.tecuX7QsCBq242baKgKJ.,xixi:$$2a$$10$$6smj5Y/PD.jB1a2Z2gDAxOVnlcv8HfINtLrzCmmTjMZLObBwV8DoW

修改 docker-compose.yaml 以引用 .env

services:
  npm:
    container_name: npm
    image: jc21/nginx-proxy-manager:2
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
      - 81:81
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

  nginx:
    container_name: nginx
    image: nginx:latest
    restart: unless-stopped

  tinyauth:
    container_name: tinyauth
    image: ghcr.io/steveiliop56/tinyauth:v3
    restart: unless-stopped
	env_file:
      - .env
#    environment:
#      - SECRET=kX9mPqW3zT7rY2vN8bL4jF6hD1cA5eK2
#      - APP_URL=https://auth.gugu.ovh
#      - USERS=roy:$$2a$$10$$oXMqgLV/S1hrknYQht.WYu7YfEjBdSB5rIicj23O8WxkI4VriQn/y # user:password

这样基本上就OK啦。

重新启动NPM

cd ~/data/docker_data/npm

docker compose down 

docker compose up -d 

docker compose logs tinyauth

出现类似,代表成功。

d9f4bfbde7c1b712d735d834b0cffb87.png

这边我们先搞一下反向代理!

做反向代理前,你需要一个域名!

namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo上 6位数字的xyz续费永远都是0.99美元 = =)

如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)

namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些 古老 = =)

【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)

我们接着往下看!

7. 反向代理

7.1 配置Tinyauth的反向代理

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

343d7766a70c301276c8bfae52fae8e3.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

直接丢几张图:

aca0ebcc28a73586bb9c43131b0490cf.png

确保“阻止常见漏洞”(Bolck Common Exploits)选项是关掉的。如果这选项开了,Nginx 会把 URL 里的查询参数给拦下来,而 Tinyauth 得靠这些参数才能正常工作。

tinyauth这个是容器的名字,因为它和NPM在一个网络下,所以可以用容器名字来代替域名,3000是内部的端口,保持即可不要更改。

8ecf402ef51f5a3ec7ca759a85ae647c.png48c4db84474ea229406a39104f965c33.pngb1f1a1aec3c198cc06b60758a3fad1e5.png

然后访问域名就可以访问了!

5c42cfa09961f64c36e18ea9d2ba4aeb.png

7.2 配置需要保护的应用的反向代理

我这边以之前介绍的简历应用(让写简历变得简单且智能!十分钟搭建一个在线简历编辑器——Magic Resume|好玩儿的Docker项目)为例子,

084d9f5958a47f6b0e867f163ddc06de.png

找到你需要添加登录页的应用的对应的NPM配置,在Advance里面添加:

# Root location
location / {
  # Pass the request to the app
  proxy_pass          $forward_scheme://$server:$port;

  # Add other app specific config here

  # Tinyauth auth request
  auth_request /tinyauth;
  error_page 401 = @tinyauth_login;
}

# Tinyauth auth request
location /tinyauth {
  # Pass request to Tinyauth
  proxy_pass http://tinyauth:3000/api/auth/nginx;

  # Pass the request headers
  proxy_set_header x-forwarded-proto $scheme;
  proxy_set_header x-forwarded-host $http_host;
  proxy_set_header x-forwarded-uri $request_uri;
}

# Tinyauth login redirect
location @tinyauth_login {
  return 302 https://auth.gugu.ovh/login?redirect_uri=$scheme://$http_host$request_uri; # Make sure to replace the https://auth.gugu.ovh with your own app URL
}

其他地方都不用管,只要把https://auth.gugu.ovh 替换成你自己的tinyauth的域名即可。

75bde1737d7b3d2d605860bb839fa567.png

保存之后。

再次打开简历这个网页。

提示需要登录了。

ae23d63f56a62d74560f7997f8537212.png

输入账号密码,继续

9cb7f756e503807085b95ed778e742c8.png

进来了。

cd86b2609a4ec471929f0fbc4d43d825.png

8. 使用教程

其他的也类似,只需要在对应应用的NPM的Advance里面加:

# Root location
location / {
  # Pass the request to the app
  proxy_pass          $forward_scheme://$server:$port;

  # Add other app specific config here

  # Tinyauth auth request
  auth_request /tinyauth;
  error_page 401 = @tinyauth_login;
}

# Tinyauth auth request
location /tinyauth {
  # Pass request to Tinyauth
  proxy_pass http://tinyauth:3000/api/auth/nginx;

  # Pass the request headers
  proxy_set_header x-forwarded-proto $scheme;
  proxy_set_header x-forwarded-host $http_host;
  proxy_set_header x-forwarded-uri $request_uri;
}

# Tinyauth login redirect
location @tinyauth_login {
  return 302 https://auth.gugu.ovh/login?redirect_uri=$scheme://$http_host$request_uri; # Make sure to replace the https://auth.gugu.ovh with your own app URL
}

即可。

PS: /tinyauth 这个路径可以随便改,指南里用这个名字只是为了方便。

9. 常见问题及注意点

大家有问题欢迎评论区交流。

10. 结尾

祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。

同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!

最后,感谢作者@steveiliop56的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star ⭐️

参考资料

官方GitHub:https://github.com/steveiliop56/tinyauth