DecoTV
🎬 DecoTV 是一个开箱即用的、跨平台的影视聚合播放器。它基于 Next.js 16 + Tailwind CSS 4 + TypeScript 5 构建,支持多资源搜索、在线播放、收藏同步、播放记录、云端存储,让你可以随时随地畅享海量免费影视内容。支持本地无数据库模式、CMS 全量代理、隐私纵深防御等企业级特性。
明亮模式
|
暗夜模式
|
注意:部署后项目为空壳项目,无内置播放源和直播源,需要自行收集配置。
免责声明:请不要在 B 站、小红书、微信公众号、抖音、今日头条或其他中国大陆社交平台发布视频或文章宣传本项目,不授权任何"科技周刊/月刊"类项目或站点收录本项目。
点击查看项目截图

| 分类 | 主要依赖 |
|---|---|
| 前端框架 | Next.js 16 · App Router · Turbopack |
| UI & 样式 | Tailwind CSS 4 |
| 语言 | TypeScript 5 |
| 播放器 | ArtPlayer · HLS.js |
| 代码质量 | ESLint 9 · Prettier 3 · Jest 29 |
| 部署 | Docker |
本项目仅支持 Docker 或其他基于 Docker 的平台 部署。
如果你计划运行在 OpenWrt(软路由 / ARM 盒子 / 树莓派等)设备上,参阅完整指南:
快速拉取预构建镜像:
docker pull ghcr.io/decohererk/decotv:latest
若需在外部主机自行构建后再导入至 OpenWrt,请参考指南中的 “获取或构建镜像” 与 “导出并传输” 步骤。
DecoTV 提供以下 Docker 镜像标签:
| 标签 | 说明 | 使用场景 |
|---|---|---|
latest |
最新构建版本 | 总是使用最新代码,包含所有小更新 |
v1.0.0 |
特定版本号 | 固定版本部署,便于版本管理和回滚 |
推荐使用方式:
# 方式1:使用 latest 标签(自动获取最新更新)
docker pull ghcr.io/decohererk/decotv:latest
# 方式2:使用特定版本号(生产环境推荐)
docker pull ghcr.io/decohererk/decotv:v1.0.0
# 方式3:回滚到旧版本
docker pull ghcr.io/decohererk/decotv:v0.9.0
版本号标签优势:
注意:使用
latest标签时,重启容器不会自动拉取新镜像,需要手动执行docker pull才能获取更新。使用版本号标签可以明确控制何时更新。
services:
decotv-core:
image: ghcr.io/decohererk/decotv:latest # 或使用 :v1.0.0 固定版本
container_name: decotv-core
restart: on-failure
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=admin_password
- NEXT_PUBLIC_STORAGE_TYPE=kvrocks
- KVROCKS_URL=redis://decotv-kvrocks:6666
networks:
- decotv-network
depends_on:
- decotv-kvrocks
decotv-kvrocks:
image: apache/kvrocks
container_name: decotv-kvrocks
restart: unless-stopped
volumes:
- kvrocks-data:/var/lib/kvrocks
networks:
- decotv-network
networks:
decotv-network:
driver: bridge
volumes:
kvrocks-data:
services:
decotv-core:
image: ghcr.io/decohererk/decotv:latest # 或使用 :v1.0.0 固定版本
container_name: decotv-core
restart: on-failure
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=admin_password
- NEXT_PUBLIC_STORAGE_TYPE=redis
- REDIS_URL=redis://decotv-redis:6379
networks:
- decotv-network
depends_on:
- decotv-redis
decotv-redis:
image: redis:alpine
container_name: decotv-redis
restart: unless-stopped
networks:
- decotv-network
# 请开启持久化,否则升级/重启后数据丢失
volumes:
- ./data:/data
networks:
decotv-network:
driver: bridge
services:
decotv-core:
image: ghcr.io/decohererk/decotv:latest # 或使用 :v1.0.0 固定版本
container_name: decotv-core
restart: on-failure
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=admin_password
- NEXT_PUBLIC_STORAGE_TYPE=upstash
- UPSTASH_URL=上面 https 开头的 HTTPS ENDPOINT
- UPSTASH_TOKEN=上面的 TOKEN
如果你只是想快速体验或单机使用,不需要多端同步功能,可以使用本地存储模式。此模式下数据保存在浏览器的 localStorage 中,无需任何外部数据库。
docker run -d \
--name decotv \
-p 3000:3000 \
-v decotv-downloads:/app/.cache/ffmpeg-downloads \
-e PASSWORD=你的管理密码 \
ghcr.io/decohererk/decotv:latest
services:
decotv:
image: ghcr.io/decohererk/decotv:latest
container_name: decotv
restart: unless-stopped
ports:
- '3000:3000'
environment:
- PASSWORD=你的管理密码
volumes:
- decotv-downloads:/app/.cache/ffmpeg-downloads
volumes:
decotv-downloads:
| 项目 | 说明 |
|---|---|
| ✅ 必需配置 | PASSWORD - 管理员登录密码 |
| ❌ 不需要 | USERNAME、NEXT_PUBLIC_STORAGE_TYPE、任何数据库连接变量 |
| ❌ 不需要 | AUTH_SECRET、AUTH_URL(这些是其他认证框架的配置,DecoTV 不使用) |
| ⚠️ 数据存储 | 所有配置保存在浏览器 localStorage,清除浏览器数据会丢失配置 |
| ⚠️ 多端同步 | 不支持,每个浏览器独立存储 |
| ⬇️ 下载缓存 | 建议挂载 /app/.cache/ffmpeg-downloads,避免容器重建时丢失已转存文件 |
默认仍为 NEXT_PUBLIC_AUTH_MODE=password,需要登录后使用。家庭局域网、NAS、电视盒子、OpenWrt、飞牛 OS 等完全可信内网场景,可以显式开启免登录:
docker run -d \
--name decotv \
-p 3000:3000 \
-e NEXT_PUBLIC_AUTH_MODE=public \
-v decotv-downloads:/app/.cache/ffmpeg-downloads \
ghcr.io/decohererk/decotv:latest
Docker Compose 示例:
services:
decotv:
image: ghcr.io/decohererk/decotv:latest
container_name: decotv
restart: unless-stopped
ports:
- '3000:3000'
environment:
- NEXT_PUBLIC_AUTH_MODE=public
volumes:
- decotv-downloads:/app/.cache/ffmpeg-downloads
volumes:
decotv-downloads:
⚠️
NEXT_PUBLIC_AUTH_MODE=public仅建议局域网、NAS、家庭内网、VPN、自用环境开启,不建议公网暴露。/admin和/api/admin/*默认仍需要登录保护;只有同时设置PUBLIC_ALLOW_ADMIN=true才会免登录开放后台和后台 API,该开关风险极高,仅适合完全可信内网。
Q: 登录成功后操作仍提示 401 Unauthorized?
这可能是以下原因:
REDIS_URL、KV_REST_API_URL 等数据库变量X-Forwarded-Proto 头Q: 如何从本地模式迁移到数据库模式?
由于本地模式数据存储在浏览器中,无法直接迁移。建议:
完成部署后为空壳应用,无播放源,需要站长在管理后台的配置文件设置中填写配置文件(后续会支持订阅)
配置文件示例如下:
{
"cache_time": 7200,
"api_site": {
"dyttzy": {
"api": "http://xxx.com/api.php/provide/vod",
"name": "示例资源",
"detail": "http://xxx.com"
}
// ...更多站点
},
"custom_category": [
{
"name": "华语",
"type": "movie",
"query": "华语"
}
]
}
cache_time:接口缓存时间(秒)。api_site:你可以增删或替换任何资源站,字段说明:key:唯一标识,保持小写字母/数字。api:资源站提供的 vod JSON API 根地址。name:在人机界面中展示的名称。detail:(可选)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取。custom_category:自定义分类配置,用于在导航中添加个性化的影视分类。以 type + query 作为唯一标识。支持以下字段:name:分类显示名称(可选,如不提供则使用 query 作为显示名)type:分类类型,支持 movie(电影)或 tv(电视剧)query:搜索关键词,用于在豆瓣 API 中搜索相关内容custom_category 支持的自定义分类已知如下:
也可输入如 "哈利波特" 效果等同于豆瓣搜索
DecoTV 支持标准的苹果 CMS V10 API 格式。
可借助 watchtower 自动更新镜像容器
dockge/komodo 等 docker compose UI 也有自动更新功能
| 变量 | 说明 | 可选值 | 默认值 |
|---|---|---|---|
| USERNAME | 管理员账号 | 任意字符串 | 无默认,数据库模式必填,本地模式可省略 |
| PASSWORD | 管理员密码 | 任意字符串 | 无默认,必填 |
| NEXT_PUBLIC_AUTH_MODE | 访问模式 | password、public | password |
| PUBLIC_ALLOW_ADMIN | public 模式下是否开放后台 | true/false | false |
| SITE_BASE | 站点 URL | 形如 https://example.com | 空 |
| NEXT_PUBLIC_SITE_NAME | 站点名称 | 任意字符串 | DecoTV |
| ANNOUNCEMENT | 站点公告 | 任意字符串 | 本网站仅提供影视信息搜索服务,所有内容均来自第三方网站。本站不存储任何视频资源,不对任何内容的准确性、合法性、完整性负责。 |
| 变量 | 说明 | 可选值 | 默认值 | 备注 |
|---|---|---|---|---|
| NEXT_PUBLIC_STORAGE_TYPE | 存储类型 | localstorage、redis、kvrocks、upstash | localstorage | 不填则默认本地模式,数据存浏览器中 |
| KVROCKS_URL | Kvrocks 数据库连接地址 | redis://host:port | 空 | 当 STORAGE_TYPE=kvrocks 时必填 |
| REDIS_URL | Redis 数据库连接地址 | redis://host:port | 空 | 当 STORAGE_TYPE=redis 时必填 |
| UPSTASH_URL | Upstash Redis REST URL | https://xxx.upstash.io | 空 | 当 STORAGE_TYPE=upstash 时必填 |
| UPSTASH_TOKEN | Upstash Redis REST 令牌 | AUxxxx... | 空 | 当 STORAGE_TYPE=upstash 时必填 |
注意:Upstash 使用 REST API 连接,需要填写
UPSTASH_URL(HTTPS ENDPOINT)和UPSTASH_TOKEN,不是传统的 Redis 连接字符串。
注册需要先配置 redis、upstash 或 kvrocks 存储。部署后由站长在 /admin -> 用户配置 -> 公开注册 中直接控制开关和新用户默认用户组,无需为日常启停重新部署。
| 变量 | 说明 | 可选值 | 默认值 | 备注 |
|---|---|---|---|---|
| NEXT_PUBLIC_ENABLE_REGISTRATION | 旧配置迁移时的初始注册状态 | true/false | false | 后续以管理面板保存的设置为准 |
| DEFAULT_REGISTRATION_GROUP | 旧配置迁移时的初始默认用户组 | 用户组名称 | 空 | 后续在管理面板选择已创建的用户组 |
安全提示:公开注册默认关闭;不设置默认用户组时,新账号默认可使用全部可用视频源。详见 用户注册功能说明
| 变量 | 说明 | 可选值 | 默认值 | 备注 |
|---|---|---|---|---|
| NEXT_PUBLIC_SEARCH_MAX_PAGE | 搜索接口可拉取的 |
$ claude mcp add DecoTV \
-- python -m otcore.mcp_server <graph>