ryot 介绍与选型指南
自托管全类型媒体追踪系统 ryot(IgnisDa/ryot v10.5.6,GPL-3.0,3.7k★)的定位、架构、功能与限制,含 GraphQL 快速上手实测回显及与 Trakt/Simkl/AniList/Overseerr/Jellyseerr 的量化选型对比。
ryot 介绍与选型指南
目标:回答「ryot 是什么、内部怎么组成、适合谁用、与 Trakt/Simkl/AniList/Overseerr/Jellyseerr 怎么选」。文中版本、星数、接口规模、快速上手回显均来自 2026-11-03 对运行实例
http://127.0.0.1:8141(v10.5.6)与 GitHub/shields.io 的实测实查。
一、环境信息
- 操作系统:Ubuntu 24.04.5 LTS(x86_64)
- ryot 版本:v10.5.6(GitHub 仓库 IgnisDa/ryot,GPL-3.0)
- 依赖数据库:PostgreSQL 18(官方要求 ≥ 15)
- 服务地址:
http://127.0.0.1:8141(统一入口;GraphQL 端点POST /backend/graphql) - 演示账号:
admin/q1w2e3r4
二、软件概述
ryot 是一款自托管(self-hosted)媒体追踪服务:把电影、剧集、动漫、漫画、书籍、游戏、音乐、播客等所有「消费过的媒体」的评分、评论、观看进度、收藏集合集中记录在自己服务器上,数据完全自主。
- 技术栈:Rust 后端(GraphQL)+ React 前端,打包为一体化可执行服务(内置反向代理统一入口)。
- 开源与许可:GPL-3.0;社区版功能完整,
SERVER_PRO_KEY对应可选增值能力。 - 仓库纠偏(实查 2026-11-03):历史资料中的
Synthead/ryot已 404,真实仓库为github.com/IgnisDa/ryot;shields.io 实测 3.7k stars / 145 forks。 - 版本节奏:Releases 几乎每周发 v10.x.y 补丁,实测最新为 v10.5.6(releases.atom)。
- 遥测:默认启用 Umami 匿名统计,可用
DISABLE_TELEMETRY=true关闭(见 《ryot v10.5.6 配置参数详解》)。
三、核心架构
ryot 单进程组对外只暴露一个入口(内部 8000),由内置反向代理分流(Caddyfile 实查):
| 路径 | 去向 | 说明 |
|---|---|---|
/backend* | Rust GraphQL 后端(内部 5000) | 剥 /backend 前缀;/backend/graphql 为 API 端点,/backend/config 为免认证配置核对端点 |
/_i/* | 后端 /webhooks/integrations | Plex/Jellyfin 等媒体服务器回调 |
/health | 内联 /actions + /backend/config | 聚合健康检查(实测 200) |
| 其余 | React SSR 前端(内部 3000) | 未登录访问受保护页 302 跳 /auth(实测) |
数据层:全部业务数据落 PostgreSQL(实测运行 7 小时数据目录 72M),上传/截图类文件可选走 S3 兼容对象存储。
接口规模(__type introspection 实测):QueryRoot 46 个查询字段、MutationRoot 70 个变更字段,完整 API 用法见 《ryot v10.5.6 API 使用详解》。
四、功能特性
- 11 种媒体类型(
MediaLot枚举实测):BOOK / SHOW / MOVIE / ANIME / MANGA / MUSIC / PODCAST / AUDIO_BOOK / VIDEO_GAME / COMIC_BOOK / VISUAL_NOVEL。 - 19 个外部元数据源(
MediaSource枚举实测):TMDB、TVDB、IGDB、AniList、MyAnimeList、Google Books、Hardcover、OpenLibrary、Spotify、ListenNotes、Metron、Giant Bomb、VNDB、iTunes、Audible、Manga Updates、YouTube Music、MusicBrainz、Custom。多数需自备 API key,ANILIST 等免 key 可用(实测搜索成功)。 - 追踪模型:评分(Decimal)+ 评论 + 观看历史(
SeenState:COMPLETED / IN_PROGRESS / ON_A_HOLD / DROPPED)+ 逐集/逐章进度。 - 集合系统:新用户自动获得 7 个默认集合(Completed/In Progress/Monitoring/Reminders/Watchlist/Custom/Owned,实测
userCollectionsList可见),可自建并异步批量加实体。 - 日历与分析:
userCalendarEvents、userAnalytics、trendingMetadata、peopleSearch(演职人员)等查询域。 - 历史导入:Trakt、Plex、Jellyfin、AniList、MyAnimeList、Goodreads、Grouvee、Hardcover、Movary、Netflix、IMDb、Storygraph、Audiobookshelf、MediaTracker、Strong、OpenScale、Hevy、Watcharr 等专用导入器(源码
crates/services/importer/目录实查)。 - 媒体服务器集成:Plex/Jellyfin/Emby/Kodi 观看事件回调入库,Sonarr/Radarr 状态联动(源码
crates/services/integration/实查)。 - 企业级周边:OIDC 单点登录、两步验证(2FA)、SMTP 通知、S3 文件存储、多用户与管理员(
usersList/updateUser)、定时任务(默认每 5 分钟/每晚)。
五、快速开始
部署全流程见 《ryot Docker Compose 部署指南》;服务就绪后,以下四条命令即可完成验证与首次使用(实测回显):
# 1. 健康检查
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://127.0.0.1:8141/health
# HTTP 200
# 2. GraphQL 端点探测(免认证)
curl -s http://127.0.0.1:8141/backend/graphql -H 'Content-Type: application/json' \
-d '{"query":"query { __typename }"}'
# {"data":{"__typename":"QueryRoot"}}
# 3. 查看实例核心信息
curl -s http://127.0.0.1:8141/backend/graphql -H 'Content-Type: application/json' \
-d '{"query":"query { coreDetails { version pageSize docsLink } }"}'
# {"data":{"coreDetails":{"version":"v10.5.6","pageSize":20,"docsLink":"https://docs.ryot.io"}}}
# 4. 登录取 API 令牌(管理员 admin/q1w2e3r4)
curl -s http://127.0.0.1:8141/backend/graphql -H 'Content-Type: application/json' \
-d '{"query":"mutation { loginUser(input: {password: {username: \"admin\", password: \"q1w2e3r4\"}}) { __typename ... on ApiKeyResponse { apiKey } } }"}'
# {"data":{"loginUser":{"__typename":"ApiKeyResponse","apiKey":"UFPP7KKBIKI4P4NXZXVFX2Q2MNGWXODSEQ7TIOIKLWD7RNB6TVPQ===="}}}
⚠️ 注意:ryot 没有默认管理员账号,首次使用必须先
registerUser(携带SERVER_ADMIN_ACCESS_TOKEN),详见 《ryot Docker Compose 部署指南》第 4.4 节。
六、适用场景与限制
适用:
- 想在自建服务器上统一管理影视/动漫/书籍/游戏/播客追看与评分的个人与家庭(多用户 + 角色控制);
- 已有 Plex/Jellyfin 媒体服务器,希望观看历史自动回流并联动 Sonarr/Radarr;
- 需要程序化批量操作(GraphQL API 全覆盖,见 API 使用篇)。
限制(实测/实查):
- 只做「追踪」,不播放、不管理媒体文件,不是媒体服务器;
- 必须外部 PostgreSQL(≥15),不支持 SQLite/MySQL;
- 无 REST API,程序化只有 GraphQL 单端点;
- 影视主源 TMDB、游戏主源 IGDB(Twitch)等需自行申请 API key,未配置则对应源不可搜索;
- 默认向作者 Umami 实例上报匿名统计,隐私敏感需显式关闭。
七、同类选型对比
| 方案 | 形态 | 定位 | 开源自托管 | 星数(shields.io 实测 2026-11-03) | 许可 |
|---|---|---|---|---|---|
| ryot | 自托管服务 | 全类型媒体追踪 | 是 | 3.7k(IgnisDa/ryot) | GPL-3.0 |
| Trakt | 云服务 | 影视追踪 + 播放生态 | 否(仅开放 API) | — | 商业 |
| Simkl | 云服务 | 影视/动漫/游戏/书追踪 | 否 | — | 商业 |
| AniList | 云服务 | 动漫/漫画社区追踪 | 否(开放 GraphQL API;协议文档库 1.3k★) | 1.3k(AniList/ApiV2-GraphQL-Docs) | 商业(前端开源) |
| Overseerr | 自托管服务 | Plex/Jellyfin 请求管理 | 是 | 5k(sct/Overseerr) | MIT |
| Jellyseerr | 自托管服务 | Jellyfin 请求管理(Overseerr 分支) | 是 | 13k(fallenbagel/jellyseerr) | MIT |
解读:Trakt/Simkl/AniList 是「云端记录、随时可能被停服/改条款」的托管追踪;Overseerr/Jellyseerr 解决的是「让家人点播请求媒体」,不记录你看过什么、打几分。ryot 与它们不重叠——它是自托管的全类型追踪层,还能把 Plex/Jellyfin 的真实观看事件自动记进来。
选型建议:
- 只追动漫、混社区 → AniList 够用;要影视多平台评分同步且不在乎数据主权 → Trakt/Simkl;
- 家庭媒体服务器点播场景 → Overseerr/Jellyseerr(可与 ryot 并存);
- 需要「所有类型媒体的评分/进度/历史都在自己手里 + 可编程」→ 选 ryot。