Stremio Docker 插件持久化完全指南
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.addon |
version | ✅ | 语义化版本号 |
name | ✅ | 在 UI 中显示的名称 |
description | ✅ | 插件描述 |
resources | ✅ | 提供的资源类型:catalog(目录)、meta(元数据)、stream(流)、subtitles(字幕) |
types | ✅ | 支持的内容类型:movie、series、channel 等 |
idPrefixes | ⬚ | ID 前缀过滤器。设为 ["tt"] 表示只响应 IMDB ID(以 tt 开头)的请求 |
catalogs | ✅ | 目录定义数组。如果插件不提供目录资源,设为 [] |
addonCatalogs | ⬚ | 插件目录(用于在"发现插件"页面分类),一般设为 [] |
contactEmail | ⬚ | 联系邮箱,一般为 null |
logo / background | ⬚ | 插件 logo 和背景图 URL,可为 null |
behaviorHints | ⬚ | 行为提示对象,强烈建议始终提供以避免 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 | 是否为官方插件。第三方插件一律设为 false |
protected | 是否受保护(不可被用户卸载)。自定义插件一般设为 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.json | com.stremio.torrentio.addon | 最流行的种子流插件。 聚合 YTS、EZTV、RARBG、1337x、ThePirateBay 等 20+ 种子站源。支持 RealDebrid、AllDebrid、Premiumize 等 Debrid 服务。高度可配置,可在 配置页面 自定义种子源、排序方式、画质过滤等 |
| MediaFusion | https://mediafusion.elfhosted.com/manifest.json | mediafusion | Torrentio 的强力替代品。 支持电影、剧集、直播和体育赛事。特色功能包括用户数据加密、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.json | anime-kitsu | 非官方 Kitsu.io 动漫目录。提供"全部"、"评分最高"、"最受欢迎"、"热门趋势"等分类。使用 kitsu: 作为 ID 前缀 |
| Torrent Catalogs | https://torrent-catalogs.strem.fun/manifest.json | torrent-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 写成字符串化 JSON | stremio-core 无法正确解析插件列表 |
省略 behaviorHints/addonCatalogs | stremio-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 deprecated | Node.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: {}