Stremio Docker 插件持久化完全指南
-
Stremio Docker 插件持久化完全指南
目录- 核心原理
- 🏗️ 镜像架构概览
- 📦 localStorage.json 的数据流
- 🧬 localStorage.json 的完整结构
- 🔑 关键字段详解
- 完整 docker-compose.yml 模板
- 🔍 逐行解读核心逻辑
- 如何添加新插件:三步法
- 📋 第一步:获取插件的 manifest 信息
- ✏️ 第二步:在 addons 数组中添加条目
- 🚀 第三步:重新部署
- 实战示例:同时部署多个插件
- 常用第三方插件速查表
- 🎬 流媒体源(Stream)
- 📚 内容目录(Catalog)
- 📺 直播与 IPTV
- 🔧 关于可配置插件的特殊处理
- 技术要点总结
- ✅ 正确做法
- ❌ 常见错误
- 排错指南
- 🔍 插件安装后不显示
- 🚫 容器启动失败(exit code 1)
- 🛠️ 日志中常见的正常警告
- 🧪 调试命令速查
- 最终进阶配置(添加FileBrowser)
- 参考资料
Stremio 是一款免费的流媒体聚合应用,它本身不托管任何内容,而是通过插件(Add-on)从不同来源拉取电影、剧集、直播、字幕等资源。社区维护的 Docker 镜像
tsaridas/stremio-docker将 Stremio Server、Web Player 和 FFmpeg 打包成一个轻量的 Alpine 容器,是目前最流行的自托管方案之一(Docker Hub 拉取量超过 100K+)。但在实际使用中存在一个核心痛点: 通过 Web UI 手动安装的插件配置存储在浏览器的
localStorage中,这意味着:- 🔄 更换浏览器或设备后,插件配置丢失
- 🧹 清除浏览器缓存后,插件配置丢失
- 🐳 容器重建后,如果浏览器缓存也被清除,插件需要重新安装
- 🤖 无法通过 Infrastructure as Code 的方式实现自动化部署
本文将从底层原理出发,详细讲解如何通过
docker-compose.yml一键部署并预装任意第三方插件,实现真正的持久化与可复现部署。核心原理
要解决插件持久化的问题,首先需要理解
tsaridas/stremio-docker镜像的内部架构和启动流程。 只有理解了数据流转的每一个环节,才能精准地在正确的位置注入配置。🏗️ 镜像架构概览
tsaridas/stremio-docker是一个 All-in-One 容器,内部包含三个核心组件:组件 作用 端口 nginx 反向代理,统一对外提供 Web UI 服务 8080(对外暴露)node server.js Stremio 流媒体引擎(EngineFS),负责种子解析、转码、缓存 11470(内部 + 对外)stremio-web(静态文件) Stremio Web Player 前端,由 nginx 托管 通过 nginx 在 8080端口提供tsaridas/stremio-docker的 Dockerfile 没有设置ENTRYPOINT(为空),而是使用CMD ["./stremio-web-service-run.sh"]作为默认启动命令。 这意味着如果你在docker-compose.yml中覆盖command,必须确保最终仍然执行./stremio-web-service-run.sh,否则 nginx 和 Web 服务都不会启动。📦 localStorage.json 的数据流
理解下面这条数据流是本文最关键的部分:
📁 /srv/stremio-server/localStorage.json ← 源文件(镜像内置默认配置) │ │ ① docker-compose command 中的 node 脚本修改此文件(注入自定义插件) ▼ 📁 /srv/stremio-server/localStorage.json ← 修改后的源文件 │ │ ② stremio-web-service-run.sh 启动时复制(如设置了 SERVER_URL 还会做 sed 替换) ▼ 📁 /srv/stremio-server/build/localStorage.json ← nginx 实际托管的静态文件 │ │ ③ 浏览器加载 Web Player 时,load_localStorage.js(webpack 注入的入口脚本) │ 通过 fetch() 请求此文件 ▼ 🌐 浏览器 localStorage ← Stremio Web App 的实际状态存储 │ │ ④ stremio-core(Rust 编译的 WASM 模块)从 localStorage 读取 profile │ 初始化应用状态,包括已安装的插件列表 ▼ 🎬 Stremio Web Player 界面显示已安装的插件⚠️ 踩坑警示: 如果你直接写入
build/localStorage.json,启动脚本stremio-web-service-run.sh会用源文件覆盖它——你的修改会被丢弃。必须修改源文件/srv/stremio-server/localStorage.json。🧬 localStorage.json 的完整结构
localStorage.json不是简单的插件 URL 列表。 它是对浏览器localStorage的完整序列化,每个顶层键对应一个localStorage.setItem()调用。以下是其完整结构(省略部分字段值以提高可读性):{ "schema_version": 16, "installation_id": "3dd61281a4a594b1f6eb", "streaming_server_urls": { "uid": null, "items": { "http://127.0.0.1:11470/": "2099-12-31T23:59:59.999Z" } }, "profile": { "auth": null, "addons": [ { "manifest": { "id": "插件唯一ID(如 com.stremio.torrentio.addon)", "version": "语义化版本号(如 0.0.15)", "name": "显示名称", "contactEmail": null, "description": "插件描述", "logo": null, "background": null, "types": ["movie", "series"], "resources": ["stream"], "idPrefixes": ["tt"], "catalogs": [], "addonCatalogs": [], "behaviorHints": { "adult": false, "p2p": false, "configurable": false, "configurationRequired": false } }, "transportUrl": "https://插件地址/manifest.json", "flags": { "official": false, "protected": false } } ], "addonsLocked": false, "settings": { "interfaceLanguage": "eng", "streamingServerUrl": "http://127.0.0.1:11470/", "subtitlesLanguage": "eng", "audioLanguage": "eng" } } }🔑 关键字段详解
每个 addon 条目由三部分组成——
manifest、transportUrl、flags。三者缺一不可,否则 stremio-core 会忽略该插件。manifest对象——插件的身份证:字段 必填 说明 id✅ 插件唯一标识符,通常使用反向域名格式如 com.stremio.torrentio.addonversion✅ 语义化版本号 name✅ 在 UI 中显示的名称 description✅ 插件描述 resources✅ 提供的资源类型: catalog(目录)、meta(元数据)、stream(流)、subtitles(字幕)types✅ 支持的内容类型: movie、series、channel等idPrefixes⬚ ID 前缀过滤器。设为 ["tt"]表示只响应 IMDB ID(以tt开头)的请求catalogs✅ 目录定义数组。如果插件不提供目录资源,设为 []addonCatalogs⬚ 插件目录(用于在"发现插件"页面分类),一般设为 []contactEmail⬚ 联系邮箱,一般为 nulllogo/background⬚ 插件 logo 和背景图 URL,可为 nullbehaviorHints⬚ 行为提示对象,强烈建议始终提供以避免 stremio-core 解析异常 behaviorHints对象:字段 说明 adult是否包含成人内容,用于向用户展示警告 p2p是否涉及 P2P(如 BitTorrent),使用时可能暴露用户 IP configurable是否支持配置(设为 true时用户可以在 UI 中点击"配置"按钮)configurationRequired是否必须先配置才能使用 transportUrl——插件的网络入口:这是 Stremio 客户端与插件通信的基础 URL,通常指向
manifest.json端点。Stremio 会向{transportUrl}/../{resource}/{type}/{id}.json发起请求获取数据。flags对象:字段 说明 official是否为官方插件。第三方插件一律设为 falseprotected是否受保护(不可被用户卸载)。自定义插件一般设为 false💡
profile的值是 JSON 对象,不是字符串。 这是最容易犯的错误之一。load_localStorage.js会对每个顶层 key-value 做localStorage.setItem(key, typeof value === 'object' ? JSON.stringify(value) : value),所以profile在文件中必须是对象形式"profile": {...},而不是转义后的字符串"profile": "{...}"。完整 docker-compose.yml 模板
以下是经过实际验证的、可以直接复制使用的部署配置。 核心思路是利用容器内自带的 Node.js 运行时,在启动前读取镜像原始
localStorage.json,通过 JavaScript 精确注入自定义插件,然后再执行镜像默认的启动脚本。services: stremio: image: tsaridas/stremio-docker:latest container_name: stremio ports: - 8080:8080 # Web UI(nginx 反向代理) - 11470:11470 # Streaming Server(流媒体引擎) environment: - NO_CORS=1 # 禁用 CORS 限制,本地部署推荐开启 - AUTO_SERVER_URL=1 # 自动从浏览器访问 URL 推断流媒体服务器地址 volumes: - ./stremio-data:/root/.stremio-server # 持久化服务器数据(缓存、设置) command: - sh - -c - | node -e " const fs = require('fs'); const d = JSON.parse(fs.readFileSync('localStorage.json','utf8')); const addons = [ { manifest: { id: 'com.stremio.torrentio.addon', version: '0.0.15', name: 'Torrentio', contactEmail: null, description: 'Provides torrent streams from scraped torrent providers', logo: null, background: null, types: ['movie','series'], resources: ['stream'], idPrefixes: ['tt'], catalogs: [], addonCatalogs: [], behaviorHints: {adult:false,p2p:true,configurable:true,configurationRequired:false} }, transportUrl: 'https://torrentio.strem.fun/manifest.json', flags: {official:false,protected:false} } ]; addons.forEach(a => { if (!d.profile.addons.some(x => x.manifest.id === a.manifest.id)) { d.profile.addons.splice(-1, 0, a); } }); fs.writeFileSync('localStorage.json', JSON.stringify(d, null, 2)); " exec ./stremio-web-service-run.sh restart: unless-stopped🔍 逐行解读核心逻辑
为什么用
command数组形式而不是字符串形式?# ❌ 错误写法——YAML 字符串转义会吃掉引号,导致 shell 解析失败 command: > sh -c 'cat > file << EOF ... EOF && exec ./start.sh' # ✅ 正确写法——数组形式,每个元素独立传递,不经 YAML 字符串转义 command: - sh # 第一个参数:shell 解释器 - -c # 第二个参数:-c 标志,表示后面是要执行的脚本 - | # 第三个参数:YAML 字面量块,保留所有内容原样 node -e "..." exec ./stremio-web-service-run.sh为什么用 Node.js 而不是
sed/jq/ 手写 JSON?镜像基于 Alpine,默认不包含
jq,但 Node.js 是容器运行 Stremio Server 的必备依赖,一定存在。用 Node.js 操作 JSON 既安全又精确,避免了以下常见错误:- ❌ 手写完整 JSON(几百行,极易出错且难以维护)
- ❌ 用
sed做字符串替换(JSON 中的特殊字符会导致替换异常) - ❌ 用
echo/catheredoc(YAML + Shell + JSON 三层转义的噩梦)
splice(-1, 0, a)的含义:将新插件插入到 addons 数组的倒数第一个位置之前。这是因为镜像默认配置中,
Local Files插件位于数组末尾,它负责处理本地文件,按照 Stremio 的约定应始终排在最后。some()防重复检查:容器每次启动都会执行
command中的脚本,some()通过manifest.id检查插件是否已存在,避免重启后重复注入。exec的作用:exec会用stremio-web-service-run.sh的进程替换当前 shell 进程(而不是创建子进程)。这确保了 Docker 的 PID 1 是实际的服务进程,能正确接收SIGTERM等信号实现优雅停机。如何添加新插件:三步法
📋 第一步:获取插件的 manifest 信息
在浏览器中访问插件的
manifest.json地址。每个 Stremio 插件都必须暴露这个端点,它是插件系统的核心协议。例如访问:https://torrentio.strem.fun/manifest.json你会得到类似以下的 JSON 响应:
{ "id": "com.stremio.torrentio.addon", "version": "0.0.15", "name": "Torrentio", "description": "Provides torrent streams from scraped torrent providers...", "resources": ["stream"], "types": ["movie", "series"], "idPrefixes": ["tt"], "catalogs": [], "behaviorHints": { "adult": false, "p2p": true, "configurable": true, "configurationRequired": false } }从这个响应中提取
id、version、name、description、resources、types、idPrefixes、catalogs、behaviorHints字段即可。 如果某些字段(如behaviorHints)在响应中不存在,使用默认值填充。⚠️ 注意:部分可配置插件(如 Torrentio、MediaFusion、Comet)的 manifest URL 会包含用户自定义配置参数。 例如在 Torrentio 配置页面选择了特定种子源后,URL 会变成
https://torrentio.strem.fun/providers=yts,eztv|sort=seeders/manifest.json。此时transportUrl应使用这个包含配置的完整 URL。✏️ 第二步:在 addons 数组中添加条目
在
docker-compose.yml的const addons = [...]数组中追加新条目。以下是通用模板,将注释中标记的字段替换为第一步获取的实际值即可:{ manifest: { id: 'manifest.json 中的 id 字段', version: 'manifest.json 中的 version 字段', name: 'manifest.json 中的 name 字段', contactEmail: null, description: 'manifest.json 中的 description 字段', logo: null, background: null, types: ['从 manifest.json 的 types 字段复制'], resources: ['从 manifest.json 的 resources 字段复制'], idPrefixes: ['从 manifest.json 获取,多数为 tt'], catalogs: [], addonCatalogs: [], behaviorHints: { adult: false, p2p: false, // 涉及种子流的插件设为 true configurable: false, // 有配置页面的插件设为 true configurationRequired: false } }, transportUrl: 'manifest.json 的完整 URL', flags: {official: false, protected: false} }💡 关于
catalogs字段: 即使原始manifest.json返回了复杂的 catalogs 定义(如 Cinemeta 的电影/剧集分类),在此处也可以简化为空数组[]。catalogs 只在"发现"页面的浏览功能中使用,不影响流媒体搜索和播放。 但如果你希望插件提供的分类目录也能正常显示(比如 Anime Kitsu 的"热门动漫"目录),则需要保留完整的 catalogs 数据。🚀 第三步:重新部署
docker compose down && docker compose up -d首次部署或更换插件后,需要清除浏览器缓存或使用无痕模式访问
http://你的IP:8080。这是因为浏览器可能缓存了旧的localStorage数据,其中不包含新插件。实战示例:同时部署多个插件
以下示例演示如何在
docker-compose.yml中一次性预装 Torrentio(种子流)+ Anime Kitsu(动漫目录)两个第三方插件。只需在addons数组中添加多个条目即可,注入脚本会逐个检查并添加:command: - sh - -c - | node -e " const fs = require('fs'); const d = JSON.parse(fs.readFileSync('localStorage.json','utf8')); const addons = [ { manifest: { id: 'com.stremio.torrentio.addon', version: '0.0.15', name: 'Torrentio', contactEmail: null, description: 'Provides torrent streams from scraped torrent providers', logo: null, background: null, types: ['movie','series'], resources: ['stream'], idPrefixes: ['tt'], catalogs: [], addonCatalogs: [], behaviorHints: {adult:false,p2p:true,configurable:true,configurationRequired:false} }, transportUrl: 'https://torrentio.strem.fun/manifest.json', flags: {official:false,protected:false} }, { manifest: { id: 'anime-kitsu', version: '0.0.1', name: 'Anime Kitsu', contactEmail: null, description: 'Unofficial Kitsu.io anime catalog addon', logo: null, background: null, types: ['anime'], resources: ['catalog','meta'], idPrefixes: ['kitsu:'], catalogs: [], addonCatalogs: [], behaviorHints: {adult:false,p2p:false,configurable:false,configurationRequired:false} }, transportUrl: 'https://anime-kitsu.strem.fun/manifest.json', flags: {official:false,protected:false} } ]; addons.forEach(a => { if (!d.profile.addons.some(x => x.manifest.id === a.manifest.id)) { d.profile.addons.splice(-1, 0, a); } }); fs.writeFileSync('localStorage.json', JSON.stringify(d, null, 2)); " exec ./stremio-web-service-run.sh要点: 多个插件条目之间用逗号分隔,
addons.forEach()会逐个处理,每个都有独立的some()防重复检查。常用第三方插件速查表
以下插件均为非内置的社区第三方插件,需要手动添加。镜像默认已内置 Cinemeta、YouTube、WatchHub、Public Domain Movies、OpenSubtitles v3、Local Files 六个官方插件,无需额外配置。
🎬 流媒体源(Stream)
这类插件提供视频流链接,是实际观看内容的核心。
插件 manifest URL id说明 Torrentio https://torrentio.strem.fun/manifest.jsoncom.stremio.torrentio.addon最流行的种子流插件。 聚合 YTS、EZTV、RARBG、1337x、ThePirateBay 等 20+ 种子站源。支持 RealDebrid、AllDebrid、Premiumize 等 Debrid 服务。高度可配置,可在 配置页面 自定义种子源、排序方式、画质过滤等 MediaFusion https://mediafusion.elfhosted.com/manifest.jsonmediafusionTorrentio 的强力替代品。 支持电影、剧集、直播和体育赛事。特色功能包括用户数据加密、Watchlist 同步、MediaFlow 代理、M3U 播放列表导入。可自托管或使用 ElfHosted 公共实例。在 配置页面 自定义后会生成包含配置的个性化 manifest URL Comet 需配置后获取 配置后确定 注重速度和效率的 Debrid 流插件。 支持 RealDebrid、AllDebrid、Premiumize。可通过 Prowlarr/Jackett 添加自定义索引器,使用 Zilean 抓取 DMM 内容,支持 RTN 智能种子排序。在 配置页面 自定义文件大小、索引器、分辨率等设置后生成 manifest URL AIOStreams 需配置后获取 配置后确定 聚合器中的聚合器。 将 Torrentio、MediaFusion、Comet 等多个流插件的结果合并、去重、排序后统一返回。适合想要一站式获取所有源的用户 📚 内容目录(Catalog)
这类插件提供内容浏览和搜索目录,帮助你发现新内容。
插件 manifest URL id说明 Anime Kitsu https://anime-kitsu.strem.fun/manifest.jsonanime-kitsu非官方 Kitsu.io 动漫目录。提供"全部"、"评分最高"、"最受欢迎"、"热门趋势"等分类。使用 kitsu:作为 ID 前缀Torrent Catalogs https://torrent-catalogs.strem.fun/manifest.jsontorrent-catalogs基于种子热度的电影/剧集/动漫目录,按做种数排序。需配合 Anime Kitsu 使用动漫目录功能 Cyberflix Catalog 需在社区目录查找 视配置而定 提供小众电影和剧集的分类目录,社区支持活跃 RPDB Catalogs 需配置后获取 视配置而定 使用 Rating Poster Database 为目录提供包含评分信息的海报图片 📺 直播与 IPTV
插件 manifest URL id说明 Xtremio 需配置后获取 视配置而定 兼容 M3U URL 和 Xtream Code。如果你有 IPTV 供应商信息,可以集成直播频道 💡 如何查找更多插件? 社区维护的插件目录网站 stremio-addons.net 是目前最全的第三方插件索引(原 GitHub 上的
Stremio-Community/stremio-addons-list仓库已于 2025 年 11 月归档为只读)。你也可以在 Stremio Web UI 中点击 Add-ons → Community 浏览可用插件。🔧 关于可配置插件的特殊处理
Torrentio、MediaFusion、Comet 等插件都提供配置页面(Configure Page)。 当你在配置页面调整参数后,生成的安装链接中会包含编码后的配置信息,例如:
# Torrentio 默认配置 https://torrentio.strem.fun/manifest.json # Torrentio 自定义配置(只用 YTS 和 EZTV,按做种数排序) https://torrentio.strem.fun/providers=yts,eztv|sort=seeders/manifest.json # MediaFusion 带 Debrid 配置的个性化链接 https://mediafusion.elfhosted.com/<base64编码的配置>/manifest.json在
docker-compose.yml中,你需要将transportUrl设为包含你个人配置的完整 URL。manifest中的其他字段(id、name等)保持不变,因为它们描述的是插件本身的身份,而不是你的配置。技术要点总结
✅ 正确做法
要点 说明 📂 修改源文件 localStorage.json位于 /srv/stremio-server/localStorage.json,启动脚本会自动复制到build/目录🔧 用 Node.js 修改 JSON 容器自带 Node.js 运行时,操作 JSON 安全精确,比 sed/jq/手写可靠得多📦 profile是 JSON 对象"profile": {...}而不是"profile": "{...}"。这是最常见的格式错误📝 manifest 字段完整 必须包含 behaviorHints、addonCatalogs等字段,即使值为空对象/空数组🔀 用 splice(-1,0,...)插入确保 Local Files 插件始终排在数组末尾 🔄 用 some()防重复通过 manifest.id判断,容器重启时不会重复注入同一插件♻️ 用 exec替换进程exec ./stremio-web-service-run.sh确保 Docker PID 1 是服务进程❌ 常见错误
错误 后果 用 command直接运行node server.js跳过 nginx、Web 服务和 localStorage 加载机制,Web UI 无法访问 写入 build/localStorage.json被启动脚本用源文件覆盖,修改丢失 将 profile写成字符串化 JSONstremio-core 无法正确解析插件列表 省略 behaviorHints/addonCatalogsstremio-core 反序列化失败,插件不显示 使用 command: > sh -c '...'字符串形式YAML + Shell + JSON 三层转义冲突,引号被吃掉 排错指南
🔍 插件安装后不显示
这是最常遇到的问题,按以下顺序排查:
- 清除浏览器缓存或使用无痕/隐私模式访问——浏览器可能缓存了旧的 localStorage
验证文件内容是否正确写入:
docker exec stremio cat /srv/stremio-server/build/localStorage.json | python3 -m json.tool在输出的 JSON 中搜索你的插件
id,确认它存在于profile.addons数组中验证 JSON 格式是否有效:
docker exec stremio node -e "JSON.parse(require('fs').readFileSync('build/localStorage.json','utf8')); console.log('JSON valid')"如果输出
JSON valid则格式正确,否则会报出具体的语法错误
🚫 容器启动失败(exit code 1)
检查 YAML 语法是否正确:
docker compose config- 确认
command使用数组形式[sh, -c, |],不要使用command: > sh -c '...'字符串形式 单独测试 Node.js 脚本是否可执行:
docker run --rm tsaridas/stremio-docker:latest node -e "console.log('Node works')"- 检查 JS 脚本中的引号——YAML
|块内部的node -e "..."使用双引号包裹,JS 字符串必须使用单引号,否则会导致引号冲突
🛠️ 日志中常见的正常警告
以下日志信息不是错误,可以安全忽略:
日志 含义 Cannot update settings ENOENT: server-settings.json首次启动时文件不存在,服务器会自动创建 Tests failed for hw accel profile: qsv/nvenc/vaapi机器没有 GPU,硬件加速不可用,自动回退到 CPU 软解码 Buffer() is deprecatedNode.js API 弃用警告,不影响功能 Resizing cache size to 2048MB缓存初始化,正常行为 🧪 调试命令速查
# 查看镜像默认的 localStorage.json(未经修改的原始版本) docker run --rm tsaridas/stremio-docker:latest cat /srv/stremio-server/localStorage.json # 查看容器中实际被修改后的源文件 docker exec stremio cat /srv/stremio-server/localStorage.json # 查看 nginx 实际托管的、浏览器最终加载的文件 docker exec stremio cat /srv/stremio-server/build/localStorage.json # 列出当前所有已注入插件的 ID 和名称 docker exec stremio node -e " const d = JSON.parse(require('fs').readFileSync('build/localStorage.json','utf8')); d.profile.addons.forEach((a,i) => console.log(i, a.manifest.id, a.manifest.name)); " # 查看容器启动日志 docker logs stremio --tail 50最终进阶配置(添加FileBrowser)
services: stremio: image: tsaridas/stremio-docker:latest container_name: stremio ports: - 9080:8080 - 11470:11470 environment: - NO_CORS=1 - AUTO_SERVER_URL=1 volumes: - stremio_data:/root/.stremio-server - media_data:/root/.stremio-server/stremio-cache # 修复:切换到 /stremio 目录再执行相对路径脚本,确保 127 错误消失 command: - sh - -c - | cd /stremio ( node -e " try { const fs = require('fs'); if (!fs.existsSync('localStorage.json')) fs.writeFileSync('localStorage.json', JSON.stringify({profile:{addons:[]}})); let d = JSON.parse(fs.readFileSync('localStorage.json','utf8')); if (!d.profile.addons.some(a => a.manifest.id === 'com.stremio.torrentio.addon')) { d.profile.addons.push({ manifest: { id: 'com.stremio.torrentio.addon', version: '0.0.15', name: 'Torrentio', description: 'Provides torrent streams', types: ['movie','series'], resources: ['stream'], idPrefixes: ['tt'], behaviorHints: {adult:false,p2p:true,configurable:true,configurationRequired:false} }, transportUrl: 'https://torrentio.strem.fun', flags: {official:false,protected:false} }); fs.writeFileSync('localStorage.json', JSON.stringify(d, null, 2)); } } catch (e) { console.error('Addon injection failed'); } " ) & ./stremio-web-service-run.sh restart: unless-stopped filebrowser: image: filebrowser/filebrowser:latest container_name: filebrowser ports: - 8081:80 volumes: - media_data:/srv - fb_config:/config user: "0:0" restart: unless-stopped volumes: stremio_data: media_data: fb_config: networks: {}参考资料
歡迎留言回复交流。
Log in to reply.