在阿里云函数计算中部署 Meilisearch
小麦2026年01月06日1381 字
在阿里云函数计算中部署 Meilisearch 的踩坑记录

背景#
Meilisearch 是一款由 Rust 编写的开源高性能搜索引擎,主打「快」和「简单」,私有化部署也比较容易。
由于业务上要用到轻量搜索,并出于架构和成本考量,我需要在阿里云的函数计算服务中部署 Meilisearch。
目前网络上没有找到有关实践,AI 给出的方案也错误百出,实践下来坑还是蛮多的,因此留下这篇日志方便后来者参考。
Docker 镜像#
Meilisearch 官方提供 Docker Hub 镜像 getmeili/meilisearch:latest,因此可以直接通过「自定义仓库中的镜像」来创建函数。


不过好在 容器镜像服务 很良心地提供了镜像加速器,这个加速地址可以免费使用,但只能在阿里云内部使用。

替换容器镜像地址的前缀即可顺利拉取镜像:

数据持久化#
函数计算只管计算,在需要长期数据存储的场景中,比如 Meilisearch、图床等,就必须外挂存储。因为函数实例一旦销毁,临时磁盘空间就会被清空。
阿里云函数计算提供两种持久化的存储方式:
- 挂载 NAS 文件系统
- 挂载 OSS 对象存储
两种方式都可以,NAS 方式由于需要额外配置 VPC(专有网络)会比较复杂,因此这里选择 OSS 方案。
创建好对应的 OSS Bucket 后,即可在这里关联。
以 Docker 容器启动的 Meilisearch 服务,默认的存储地址是 /home/meili/data.ms/,我们需要将其指向 OSS Bucket。
因此设置「函数本地目录」为 /home/meili/data.ms/。


不是,/home/meili/data.ms/ 难道不是绝对地址?也不像系统保留目录啊?
后来发现只有去掉 . 就行,可能是阿里云的一个 bug 了。
于是我们改成 /home/meili/data/,这样一来就必须告诉 Meilisearch 把数据存到新路径上,而不是默认的 /home/meili/data.ms/。
Meilisearch 支持通过 MEILI_DB_PATH 环境变量自定义存储路径:
于是在「更多配置/环境变量中」添加这个环境变量:

现在可以成功创建函数了。
测试验证#
将默认的 HTTP 触发器的「认证方式」改为「无需认证」。

使用 curl 测试服务是否正常:
curl https://xxx.cn-shanghai.fcapp.run

看起来已经正常打开了 Meilisearch 的 Mini-dashboard。
通过浏览器访问(必须绑定自定义域名)即可看到这个内置的 UI 面板,它只提供非常简单的查询功能。

安全密钥(Master Key)#
Meilisearch 的 Master Key 是权限最大的管理员密钥,可通过环境变量 MEILI_MASTER_KEY 设置,这样服务才能安全启动。
同时可以设置 MEILI_ENV 为 production 来关闭 Mini-dashboard 面板。

SDK 验证#
现在用官方的 meilisearch-js SDK 测试一下试试:
import { Meilisearch } from 'meilisearch';const client = new Meilisearch({host: 'https://xxx',apiKey: 'xxx',});const index = client.index('movies');const documents = [{ id: 1, title: 'Carol', genres: ['Romance', 'Drama'] },{ id: 2, title: 'Wonder Woman', genres: ['Action', 'Adventure'] },{ id: 3, title: 'Life of Pi', genres: ['Adventure', 'Drama'] },{id: 4,title: 'Mad Max: Fury Road',genres: ['Adventure', 'Science Fiction'],},{ id: 5, title: 'Moana', genres: ['Fantasy', 'Action'] },{ id: 6, title: 'Philadelphia', genres: ['Drama'] },];console.log(await index.addDocuments(documents));

行吧,看起来这里的 apiKey 并非 Master Key,这 SDK 文档写得...

Tips: API Key 是可以细粒度控制索引和操作权限的 Key,可通过 SDK 提供的 createKey 方法创建,这里就不演示了。
加上 x-meili-api-key 请求头:
import { Meilisearch } from 'meilisearch';const client = new Meilisearch({host: 'https://xxx',// apiKey: 'xxx',+ requestInit: {+ headers: {+ 'x-meili-api-key': 'master key',+ },+ },});...console.log(await index.addDocuments(documents));
后即可成功调用:

数据验证#
查看 OSS,可以看到索引文件已正确持久化:

查看函数日志,可以观察到请求、响应、执行时间和内存占用情况。

总结#
至此已成功在阿里云函数计算上部署 Meilisearch,可以在业务中通过 SDK 来访问它了。
主要的踩坑点在于函数的镜像、存储和环境变量配置上。
期间还遇到自定义启动命令导致容器无法正确启动等问题,比如:
{"errorMessage":"Function not ready: Function instance exited unexpectedly(code 2, message:no such file or directory) with start command 'meilisearch --db-path /mnt/meili_data --master-key=xxx'."}
再比如:
{"errorMessage":"Function not ready: Function instance exited unexpectedly(code 128, message:key has been revoked) with start command '/bin/meilisearch'."}
AI 老怀疑是阿里云的权限设置问题,参考来源是阿里云社区的一篇由 AI 生成的误导向帖子。
关键时刻还得靠工程经验和官方信息来源,鉴别 AI 生成的信息是否正确有效,现在可能需要多方求证,这是不是一种反提效呢?
