使用 Elasticsearch 作为搜索引擎(Pro)

使用 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 容器启动失败
检查以下项目:
  1. /opt/seafile-elasticsearch/data 是否存在,以及 Elasticsearch 容器用户是否有写入权限。
  2. vm.max_map_count 是否满足要求。
  3. 服务器是否有足够的内存,以及 Docker 是否有足够的可用资源。
  4. elasticsearch.yml 是否已加入 COMPOSE_FILE ,且配置文件名与实际文件一致。
Seafile 无法连接 Elasticsearch
同机 Docker 部署时,优先检查 .env 中的 ELASTICSEARCH_HOST=elasticsearch 和 ELASTICSEARCH_PORT=9200 。如果使用远程服务,还应检查网络连通性、TLS 证书及身份认证信息。
搜索不到新上传的文件
索引更新不是实时完成的,默认存在更新间隔。可以先等待下一次自动更新,或者按上面的命令手动执行 ./pro/pro.py search --update 。
搜索不到加密资料库中的文件内容
Seafile 服务器无法对加密文件的内容建立常规全文索引,因此无法通过服务器端全文搜索检索这些文件内容。