在阿里云函数计算中部署 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_ENVproduction 来关闭 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 生成的信息是否正确有效,现在可能需要多方求证,这是不是一种反提效呢?

本文为「捣鼓键盘的小麦」原创文章,转载请联系微信:Micoozlee

评论

你需要先登录才能发表评论
Made by 捣鼓键盘的小麦 / © 2026 Front Talk 版权所有