使用 Elasticsearch 作为搜索引擎(Pro)
Seafile 专业版支持使用 Elasticsearch 建立文件搜索索引。Seafile 14 专业版的 Docker 部署默认使用 SeaSearch;如果需要改用 Elasticsearch,可以按照本文进行配置。Seafile 13 专业版也支持 Elasticsearch,其配置方式见本文末尾的
Seafile 13 配置说明
。
本文以单节点 Docker Compose 部署为例,假定 Docker Compose 配置文件保存在
/opt/seafile
,Seafile 持久化数据位于
/opt/seafile-data
。如果使用自定义路径,请相应调整命令。
环境要求
-
已使用 Docker 和 Docker Compose 部署 Seafile 专业版。
-
Elasticsearch 使用 8.x 版本。下面以官方模板中的 elasticsearch:8.15.0 为例。
-
Elasticsearch 与 Seafile 部署在同一服务器时,建议至少准备 4 核 CPU、4 GB 内存 ;实际资源需求还取决于文件数量和索引规模。
-
预留用于保存 Elasticsearch 索引的磁盘空间。
在宿主机上调整
vm.max_map_count
:
sudo sysctl -w vm.max_map_count=262144
如需重启后继续生效,可在
/etc/sysctl.conf
中添加:
vm.max_map_count=262144
修改后执行
sudo sysctl -p
,使配置生效。
部署 Elasticsearch
1. 下载 Docker Compose 配置文件
进入 Seafile 的 Docker Compose 配置目录:
cd /opt/seafile
下载 Elasticsearch 的配置文件:
wget -O elasticsearch.yml https://raw.githubusercontent.com/haiwen/seafile-admin-docs/14.0/manual/repo/docker/pro/elasticsearch.yml
默认配置使用
elasticsearch:8.15.0
镜像,容器名称为
seafile-elasticsearch
,服务名称为
elasticsearch
。Elasticsearch 与 Seafile 共用
seafile-net
Docker 网络。
该 Compose 模板没有把 Elasticsearch 的
9200
端口映射到宿主机,因此同一 Docker 网络中的 Seafile 容器可使用
elasticsearch:9200
访问搜索服务。
安全提示:
官方模板中的
xpack.security.enabled=false
会关闭 Elasticsearch 自带的安全认证。请勿在未配置访问控制的情况下将
9200
端口公开到互联网。
2. 准备索引数据目录
默认的持久化目录为
/opt/seafile-elasticsearch/data
。创建目录并为 Elasticsearch 容器用户赋予读写权限:
sudo mkdir -p /opt/seafile-elasticsearch/data
sudo chown -R 1000:0 /opt/seafile-elasticsearch/data
sudo chmod -R u+rwX,g+rX /opt/seafile-elasticsearch/data
Elasticsearch 官方 Docker 镜像默认以 UID
1000
、GID
0
运行。上述命令适用于专门用于 Elasticsearch 的数据目录;如果该目录已有数据或使用了自定义用户,请先检查所有者和权限,不要直接覆盖现有权限设置。
如果使用自定义索引目录,还需要同步修改
.env
中的
SEAFILE_ELASTICSEARCH_VOLUME
。
3. 修改
.env
先备份现有配置:
cd /opt/seafile
cp .env .env.bak
nano .env
在
COMPOSE_FILE
中加入
elasticsearch.yml
,并移除不再使用的
seasearch.yml
。例如,启用了 Seafile、Caddy、SeaDoc 的部署可写为:
COMPOSE_FILE='seafile-server.yml,caddy.yml,seadoc.yml,elasticsearch.yml'
COMPOSE_PATH_SEPARATOR=','
上面的
COMPOSE_FILE
仅为示例。如果已使用通知服务器、缩略图服务或其他扩展,
请保留这些组件对应的 YAML 文件
,只替换搜索引擎对应的条目。
设置 Elasticsearch 的镜像和持久化目录:
SEAFILE_ELASTICSEARCH_IMAGE=elasticsearch:8.15.0
SEAFILE_ELASTICSEARCH_VOLUME=/opt/seafile-elasticsearch/data
如果
.env
已通过
BASIC_STORAGE_PATH
定义了持久化目录,可以继续沿用原有的变量引用方式,无需将所有路径改成固定值。
在 Seafile 14 中启用 Elasticsearch
编辑
/opt/seafile/.env
中的搜索配置:
ENABLE_SEARCH=true
SEARCH_ENGINE=elasticsearch
ENABLE_FULL_TEXT_SEARCH=true
ELASTICSEARCH_SCHEME=http
ELASTICSEARCH_HOST=elasticsearch
ELASTICSEARCH_PORT=9200
ELASTICSEARCH_USER=
ELASTICSEARCH_PASSWORD=
各变量说明如下:
变量名
说明
默认值或示例
ENABLE_SEARCH
是否启用文件搜索
true
SEARCH_ENGINE
选择搜索引擎
elasticsearch
ENABLE_FULL_TEXT_SEARCH
是否为文档内容建立全文索引;设为
false
时只索引文件名
true
ELASTICSEARCH_SCHEME
连接协议
http
;启用 TLS 时为
https
ELASTICSEARCH_HOST
Elasticsearch 的主机名或地址
elasticsearch
(同一 Compose 网络)
ELASTICSEARCH_PORT
Elasticsearch 服务端口
9200
ELASTICSEARCH_USER
Elasticsearch 用户名;未启用身份认证时可留空
留空
ELASTICSEARCH_PASSWORD
Elasticsearch 密码;未启用身份认证时可留空
留空
如果 Elasticsearch 部署在其他服务器上,请将
ELASTICSEARCH_HOST
设置为可从 Seafile 容器访问的主机名或 IP 地址,并根据实际服务设置协议、端口和认证信息。
高级搜索配置
如需调整索引更新间隔或索引名称,可编辑 Seafile 持久化配置目录中的
seafevents.conf
:
nano /opt/seafile-data/seafile/conf/seafevents.conf
在文件中的
[INDEX FILES]
配置段按需设置:
[INDEX FILES]
interval = 10m
highlight = fvh
-
interval :搜索索引更新间隔,可使用 s (秒)、 m (分钟)、 h (小时)、 d (天)等单位。
-
highlight :搜索结果高亮配置。 fvh 可用于提升搜索高亮处理效率。
对于多个 Seafile 实例共用一个 Elasticsearch 服务的情况,可为不同实例设置独立索引名,避免索引名称冲突:
[INDEX FILES]
repo_status_index_name = my-repo-head
repo_files_index_name = my-repofiles
这两项默认使用
repo_head
和
repofiles
。
只有确实需要自定义索引名称时才修改它们
,并确保每个实例使用的名称不冲突。
在 Seafile 14 中,
.env
中的
ENABLE_FULL_TEXT_SEARCH
、Elasticsearch 连接协议、主机、端口及用户名、密码设置优先于
seafevents.conf
中的对应选项。通常优先在
.env
中配置连接信息。
全文搜索
默认情况下:
ENABLE_FULL_TEXT_SEARCH=true
该设置会为受支持的 Office、PDF 等文件内容建立全文索引。如果只需要搜索文件名,可改为:
ENABLE_FULL_TEXT_SEARCH=false
启动服务
确认配置文件已保存,然后在
/opt/seafile
中检查 Compose 配置:
cd /opt/seafile
docker compose config --quiet
配置检查通过后,重启相关服务:
docker compose down
docker compose up -d
查看服务状态:
docker compose ps
查看 Elasticsearch 日志:
docker compose logs -f elasticsearch
查看 Seafile 日志:
docker compose logs -f seafile
如果 Elasticsearch 未正常启动,首先检查索引目录权限、可用内存及
vm.max_map_count
配置。
更新或重建搜索索引
索引默认每隔一段时间更新一次。首次启用 Elasticsearch 后,搜索结果可能不会立即出现。
如需立即更新索引,可进入 Seafile 容器执行:
docker exec -it seafile bash
cd /opt/seafile/seafile-server-latest
./pro/pro.py search --update
如果修改了全文索引开关,或需要重新建立搜索索引,可执行:
docker exec -it seafile bash
cd /opt/seafile/seafile-server-latest
./pro/pro.py search --clear
./pro/pro.py search --update
清理并重建索引可能需要较长时间,具体取决于文件数量及大小。此操作针对搜索索引,不会替代 Seafile 资料库数据备份。
使用现有的远程 Elasticsearch 服务
如果已有独立部署的 Elasticsearch,无需在本机
COMPOSE_FILE
中添加
elasticsearch.yml
。只需将 Seafile 的搜索引擎设置为 Elasticsearch,并使用现有服务的连接信息。
例如,使用 HTTPS 和用户名密码认证时:
ENABLE_SEARCH=true
SEARCH_ENGINE=elasticsearch
ENABLE_FULL_TEXT_SEARCH=true
ELASTICSEARCH_SCHEME=https
ELASTICSEARCH_HOST=search.example.com
ELASTICSEARCH_PORT=443
ELASTICSEARCH_USER=elastic-user
ELASTICSEARCH_PASSWORD=replace-with-your-password
请将主机、端口和认证信息替换为实际值;
443
仅是 HTTPS 服务的常见示例端口,不代表所有 Elasticsearch 服务均使用该端口。使用 HTTPS 时,如需指定 CA 证书文件,可在
seafevents.conf
的
[INDEX FILES]
配置段中设置容器内可访问的证书路径:
[INDEX FILES]
cafile = /path/in/container/to/cert.pem
若使用 Amazon OpenSearch Service 或其他托管服务,请按服务提供商要求配置端点、端口、TLS 及身份认证方式,确认 Seafile 能够访问该服务后再启用搜索功能。
Seafile 13 配置说明
Seafile 13 专业版的标准 Docker 部署使用 Elasticsearch。它与 Seafile 14 一样,可以使用独立的
elasticsearch.yml
文件运行 Elasticsearch 8.x,但
不应照搬上文用于 Seafile 14 的
SEARCH_ENGINE
等环境变量
。
对于标准的 Seafile 13 专业版 Docker 部署,
/opt/seafile/.env
通常已经包含:
COMPOSE_FILE='seafile-server.yml,caddy.yml,seadoc.yml,elasticsearch.yml'
SEAFILE_ELASTICSEARCH_IMAGE=elasticsearch:8.15.0
如果缺少
elasticsearch.yml
,可从 Seafile 13 的官方配置目录下载:
cd /opt/seafile
wget https://manual.seafile.com/13.0/repo/docker/pro/elasticsearch.yml
在
/opt/seafile-data/seafile/conf/seafevents.conf
中配置 Elasticsearch 连接及索引任务:
[INDEX FILES]
enabled = true
es_host = elasticsearch
es_port = 9200
interval = 10m
enable_full_text_search = true
其中
elasticsearch
是同一 Docker Compose 网络内的服务名。如果使用远程 Elasticsearch,请改为实际主机地址。
修改后执行
docker compose down
和
docker compose up -d
使服务重新加载配置。索引更新和重建方法与上文相同。
常见问题
Elasticsearch 容器启动失败
检查以下项目:
-
/opt/seafile-elasticsearch/data 是否存在,以及 Elasticsearch 容器用户是否有写入权限。
-
vm.max_map_count 是否满足要求。
-
服务器是否有足够的内存,以及 Docker 是否有足够的可用资源。
-
elasticsearch.yml 是否已加入 COMPOSE_FILE ,且配置文件名与实际文件一致。
Seafile 无法连接 Elasticsearch
同机 Docker 部署时,优先检查
.env
中的
ELASTICSEARCH_HOST=elasticsearch
和
ELASTICSEARCH_PORT=9200
。如果使用远程服务,还应检查网络连通性、TLS 证书及身份认证信息。
搜索不到新上传的文件
索引更新不是实时完成的,默认存在更新间隔。可以先等待下一次自动更新,或者按上面的命令手动执行
./pro/pro.py search --update
。
搜索不到加密资料库中的文件内容
Seafile 服务器无法对加密文件的内容建立常规全文索引,因此无法通过服务器端全文搜索检索这些文件内容。