把文件传到某个在线转换网站,点一下"转换",下载结果——这个动作很多人每天都在做。

但很少有人停下来想:刚才那份文件去哪了?

如果它是合同、是简历、是财务报表、是身份证扫描件,那它现在正躺在一台你不认识的服务器上。留没留副本、留多久、会不会被索引、有没有人看得到——你都不知道。绝大多数这类网站的服务条款里,对此的表述都很模糊。

ConvertX 给的是另一个选择:一个自托管的在线文件转换器,支持一千多种格式,文件不用出你的机器。

解决什么

它在技术上是什么

README 的定位很简洁:

一个自托管的在线文件转换器。支持一千多种不同格式。用 TypeScript、Bun 和 Elysia 编写。

三句话把定位、规模和实现都说清了。

功能层面不算复杂,但都是实用项:

  • 把文件转换成不同格式
  • 一次处理多个文件
  • 密码保护
  • 多账号

一千多种格式是怎么来的

这是最值得看的部分。ConvertX 本身不是格式转换引擎,它是一层 Web 界面,背后接的是一堆成熟的开源转换工具。README 里给了完整对照表:

转换器 用途 输入格式数 输出格式数
ImageMagick 图像 245 183
GraphicsMagick 图像 167 130
FFmpeg 视频 约 472 约 199
Assimp 3D 资产 77 23
Vips 图像 45 23
Pandoc 文档 43 65
LibreOffice 文档 41 22
Calibre 电子书 26 19
Inkscape 矢量图 7 17
libjxl JPEG XL 11 11
VTracer 位图转矢量 8 1
Potrace 位图转矢量 4 11
Dasel 数据文件 5 4
libheif HEIF 2 4
MarkItdown 文档 6 1
XeLaTeX LaTeX 1 1
msgconvert Outlook 1 1
dvisvgm 矢量图 4 2
VCF 转 CSV 联系人 1 1
pdftops 文档 1 2

这个设计挺聪明。每个工具在自己的领域都已经打磨多年——ImageMagick 处理图像、FFmpeg 处理视频、Pandoc 处理文档互转——ConvertX 不重新发明,只把它们统一到一个界面后面。

这也解释了一千多这个数字:不是自己实现了上千种格式,而是把十几个专业工具的格式矩阵加起来。

转换器阵容

Docker 部署

services:
  convertx:
    image: ghcr.io/c4illin/convertx
    container_name: convertx
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - JWT_SECRET=aLongAndSecretStringUsedToSignTheJSONWebToken1234
    volumes:
      - ./data:/app/data

或者直接一行:

docker run -p 3000:3000 -v ./data:/app/data ghcr.io/c4illin/convertx

一个必须注意的坑,README 用 WARNING 标出来了:

如果登录不了,确认你通过 localhost 或 https 访问,否则需要设置 HTTP_ALLOWED=true。

这是 Cookie 安全策略导致的——非安全上下文下 JWT 存不住。本地测试很容易碰到,知道原因就好办。

另外 JWT_SECRET 不设置的话会用 randomUUID() 随机生成,重启后所有会话失效。长期跑的话记得设一个固定值。

Docker 一把起

谁适合用它

适合:

  • 经常处理敏感文件,不愿上传到第三方网站
  • 有 NAS 或常开服务器,本来就跑着一堆自托管服务
  • 需要一个团队共用的转换入口(支持多账号)
  • 需要批量转换
  • 格式需求杂——图像、视频、文档、电子书、3D 什么都有

不太适合:

  • 完全不想碰 Docker 和命令行
  • 偶尔转一两次文件,用在线工具更省事
  • 需要专业级的转换参数控制(ConvertX 走的是"够用就好"路线)

说点实在的

这类工具的价值不在技术难度,在消除一个不必要的风险。文件格式转换本身没有秘密,ImageMagick、FFmpeg 都是开源老牌工具,谁都能装。问题只在于——你愿不愿意为了省个安装步骤,把自己的合同交给一台陌生服务器。

自托管的成本其实很低:一份 compose 文件,一条命令。收益是这件事从"你不知道发生了什么"变成"一切都在你机器上"。

另外说一句,HTTP_ALLOWED 那个坑不少人会踩。如果你在内网用 IP 访问而不是域名,记得加上这个环境变量,否则会一直卡在登录不了的状态,还以为是部署错了。

项目地址:https://github.com/C4illin/ConvertX