客厅已经会连 Jellyfin 了,为什么还要再装一台?Polyfin 开箱
家里最容易被高估的一件小事,是「电视上已经有 Jellyfin 客户端了,再装一台媒体服务器,客厅就能播」。我原本以为缺的是另一套扫描硬盘的软件。真去看仓库,Polyfin 把自己写成:a self-hosted server that brings your addons and IPTV to any Jellyfin app。口号听起来已经像给现成的 Infuse、Findroid、官方 App 留了一台会说话的后端。口号不等于你家那台小盒子已经变成今晚能选台的片库。
这点很重要。我缺的往往不是再一个播放器皮肤,是一个愿意承认「我想让客厅 App 连上家里」和「我愿意自己接上源、自己管账号、自己接受它其实不扫本地文件夹当主业」中间还隔着 Postgres、setup code 和一块没有 GPU 的板子的地方。今天这篇不讲概念。我在本机(ARM64、大约 4C / 3.8G 内存、根盘大约 115G)拉的是 ghcr.io/moodiness/polyfin:latest,仓库 moodiness/polyfin,采集时公开大约 ★32。OCI 标签写 0.59.0。二进制对得上 AArch64。18096 开了。/healthz 回了 ok。下面都是空客厅附近的实话,不是假装已经把插件目录和直播源填进这台后端。
它和「再部署一只会扫盘的 Jellyfin」、和那些只提供网页播放器的盒子,不在同一句话里。Polyfin 讲的是 Jellyfin API:客户端当它是一台普通 Jellyfin 服务器来登录、浏览、播放;内容从你配置的 Stremio 插件、Eclipse 音乐插件、M3U / Xtream 直播源,以及可选的本地只读目录来。官方自己写:它不托管、不存储、不分发任何内容,只转发运营者接上的源。家用可以试。买之前最好先把这句摆正:官方 compose 不是一只 nginx,是 Polyfin + Postgres 18;本机 3.8G 能跑,空载就已经看见大约 58MB + 66MB,镜像在 docker images 里大约 635MB + 672MB。今天这只入口对你就是「门自己还活着」,不是已经替你把客厅节目单铺好。
第一次让我愣住的,不是片库。是开机顺序。浏览器标题写成 Polyfin administration。页面没有海报墙,只有一张浅色欢迎卡:Welcome to Polyfin。英文写得很老实:No administrator exists yet. Create the first account to manage this server and sign in from Jellyfin apps. 下面四栏:Setup code、Administrator name、Password、Confirm password。按钮 Create administrator。旁边还有 Restore a backup instead。没有中文向导,没有「欢迎来到你的家庭影院」。我预想中的「装上先搜昨日那部片子」,实际看见的是一张已经愿意值班的安装卡,并且明确告诉你:一次性 setup code 打在容器日志里,格式 XXXX-XXXX。
Polyfin 安装页:Welcome to Polyfin,要填日志里的 setup code 才能建管理员18096 开了,门已经在值班。值班的是日志里那串 setup code,不是已经扫完的片库。
这点我能接受——家用工具如果一打开就把全屋目录摊在客厅电视上,我会先怀疑自己是不是把 8096 丢给了光猫。可这也是边界:本机我故意把宿主机端口写成 18096,避开常见的 8096。官方默认就是 8096。门是有的。门不替你决定家里的电视以后敲哪一个数字。还有一件更土的事:我第一次把 POLYFIN_SECRET_KEY 写成一句人话,容器直接 Restarting。日志只重复一句:not 32 bytes in base64。改成 openssl rand -base64 32 那种 32 字节,健康检查才变成 healthy。密钥不是装饰。填错,门都不开。
点完 Create administrator,它没有把我丢进海报墙。标题仍是 Polyfin administration。问候改成 Good morning, NAS Daily。正中先写 Nothing is playing and nothing to look at. Everything runs normally. 版本 0.59.0。下面一张 Get started 卡片:7 步里只亮了 1 步 Done,就是 Set POLYFIN_SECRET_KEY。其余全是 To do——Add a metadata addon、Choose your libraries、Create users or an invite link、Back up the database every day、Serve HTTPS or set a public address、Let apps on your network find Polyfin。Now playing 是 0。Cache 是 0 bytes of 10 GB。Database Ready,盘上 15 MB。Graphics card None,Conversions use the processor。
管理员首页:Good morning NAS Daily,Get started 写 1 of 7 steps done,正在播放是 0菜单已经在值班。值班的是一张还没源的看板,和一句 Everything runs normally。
这点我反而松了一口气。很多媒体软件会在空库时塞一页假海报,让你以为家里已经有片单了。Polyfin 选择把边界摊开:源是你加的,库是你选的,备份默认关着,HTTPS 还没设,局域网发现还要另说。本机没有 GPU。日志里 NVENC 找不到 libcuda.so.1,VAAPI 直接写 arm64 镜像没装 libva。所以这句 Conversions use the processor 不是故障,是今天这只镜像诚实的开机顺序。客厅如果指望它硬转 4K,预期就要从「装上就能播」改成「先接受 CPU 转码,或者根本别接需要转的源」。
顺手的地方其实很轻,也其实不轻。空载时 Polyfin 大约 58MB,Postgres 大约 66MB。Health 页自己报内存大约 91MB。3.8G 的板子对这一套能坐下,但已经不是「再加一只 30MB 的静态站」。官方还把根文件系统做成只读,能力全 drop,用户 65532。这点我喜欢。喜欢不等于 18096 可以丢给公网。官方自己把 HTTPS、公网地址、每日备份都放进那张 Get started 清单。没勾,就不要假装已经给全家人做了远程观影。
点进 Content › Sources,抽屉才真正露出来。页面标题 Sources。英文写:Stremio addons, Eclipse addons, IPTV sources and local folders in one list. 正中一行大字:No source yet。按钮 Add a source。没有预填的直播源,没有演示用的插件。Libraries 那边更直:No catalog yet. Add a source first. 家用如果照着「装上就能在电视上选台」原样理解,踩的可能不是「镜像坏了」,是「源还没接,目录当然是空的」。
Sources 页:No source yet,要自己加 Stremio / Eclipse / IPTV / 本地目录源列表已经在值班。值班的是一句还没有源,不是已经铺开的频道表。
点 Add a source,右侧才弹出选项:Stremio addon、Eclipse addon、IPTV source、HDHomeRun tuner、Folder。默认停在 Stremio addon,要你贴 Manifest address。小字写得很清楚:install link 里常常带着设置或密钥,Polyfin 会藏起来,界面只显示缩短的形式。本机我没贴任何插件地址——那一步会把你自己的源写进这台服务器。没贴,就不要假装已经看见 Popular Movies。官方法律声明也在同一句话里:你接什么源,合规是你的事。今天这篇只写门开了没有,不替任何人选源。
添加源面板:Stremio addon,要贴 Manifest address,下面还有 IPTV 和 Folder表单已经在值班。值班的是安装链接那一栏,不是已经转起来的码流。
Users 页同样老实。Accounts 1:NAS Daily,You,Administrator,Last sign-in: just now,Hidden from sign-in screen。Invite links 0。按钮有 Create a user、Create an invite link,还有从另一台服务器、从 App、从 Letterboxd 导入。家用如果照着「装上就能给全家人建号」理解,其实可以建;只是默认并没有第二个人。本机停在一个管理员。停在这儿,电视 App 就算扫到这台服务器,也还得拿这一个账号登录。
Health 把边界写得更土。Addons 0。IPTV sources 0。Programme guides 0。GPU None: video is converted on the CPU。CPU encoders 列了 libx264、libx265、aac 这些。FFmpeg 是 Polyfin 自带的那份。Database Answering,15 MB。Source cache 0 bytes of 10 GB。Backups are off。Thumbnails off。Version 0.59.0。Last crash None。Cache folder 还剩大约 108 GB。这页不向源发请求,只读自己已经记下的状态。所以「No problem found」和「The server has no addon」可以写在同一屏:机器没病,片库也还没出生。
Health 页:No problem found,Addons 0,GPU None,数据库 15 MB体检已经在值班。值班的是一台没有插件、也没有显卡的服务器,不是已经转完的客厅。
手机视口更直。390×844 打开同一张首页,问候仍是 Good morning, NAS Daily,Get started 仍是 6 个 To do,Now playing 仍是 0。底栏被收成更窄的管理壳。README 把自己写成任何 Jellyfin App 都能连。今天这只手机壳对你就是「管理页在,片单不在」。内置网页播放器在 /web/,标题会变成 Polyfin,后面仍是登录墙。本机那一屏几乎是空的——客户端脚本还在转,不等于客厅已经有封面。
手机视口里的管理首页:Get started 仍是 1 of 7,正在播放仍是 0底栏布置好了。布置的是一只愿意值班的管理壳,不是已经选完台的遥控器。
原理其实不神秘。浏览器进管理端;Jellyfin 客户端进同一套 API;服务后面是 Postgres 18。账号、观看记录、设置、插件、直播频道表都在库里。所以它能装成一台 Jellyfin 服务器,也所以它必须有一台活着的数据库。官方还说:直连播放时它尽量 302 到源;只有转码、要带头的源、客户端跟不动的跳转,才会自己去读码流。所以带宽吃在哪,取决于你接的源和客厅那台盒子会不会直通。本机没有源,这条链路今天走不到。走不到,就不要把「API 活着」听成「已经在电视上出声」。
还有几件开机时才碰到的土事。第一,Linux 上 Docker 桥接网络不会把 UDP 7359 的广播送进容器。官方要你加 compose.host.yaml,或者自己填 Address on the local network。本机没走 host 网络。电视如果扫不到服务器,未必是镜像坏了。第二,语言包有英、法、德、西、意、巴西葡,没有中文。界面是英文,不代表标题不能是中文片。第三,README 写 early development,版本之间会变。本机 latest 已经是 0.59.0,Release 页当时还挂着 0.58.0。钉版本比追 latest 更合适。第四,官方写了和现有 Jellyfin / Emby / Plex 账号导入。写在文档里,不等于今天这只 18096 已经搬走你的观看记录。本机没导。没导,就不要假装续播点还在。
如果你已经有一台愿意长期开着的家用盒子、客厅已经在用 Jellyfin 客户端、缺的是「让这些 App 连上一台会讲 Jellyfin 话的后端」而不是再扫一遍硬盘、接受「这一套是 Polyfin 加 Postgres、空载就要一百多兆、第一次打开先问 setup code、密钥必须是 32 字节 base64、没有 GPU 就走 CPU、源要自己接、7 步清单里今天只亮了 1 步、局域网发现在桥接网络上可能失效、项目还在早期、3.8G 的板子能坐下但别指望硬转 4K」,也接受合规责任在运营者自己,可以考虑。本机镜像对得上 arm64,面板活着。还只是想要一个「装上就能播」按钮的,现在这只入口对你就是「门很漂亮,片库还要你自己接」,不必为了「换个皮肤」再养一套 Postgres。已经有正经 Jellyfin 在扫本地盘、而且缺的就是扫描和转码稳定性的,官方自己也把定位写成另一台 API 服务器,不是去替代你的媒体库。
不适合的人也清楚。把拉取成功听成「已经导入全部片子、已经能在电视上选台」的,今天这条镜像对你就是「壳在,源不在」,不是「再改一下主题色」。完全不想管密钥格式、又把人话写进 POLYFIN_SECRET_KEY 的,这里多出来的不是影院,是一串 Restarting。指望它替代 Jellyfin 做本地刮削、替代客厅盒子做硬解、就把空的 Get started 理解成「家里已经有直播和插件」、就把 Stremio 三个字听成「我已经有片源且片源已经合法且已经转起来」的,会把启动顺序听漏。No source yet 的时候,电视上什么都不会出现。
对我来说,真正改变习惯的不是 18096 这个数字,是我开始把「我想让客厅 App 连上家里」和「我想再装一套会出海报的媒体服务器」拆开。以前我会怪自己片库乱,怪五个 App 来回切,怪小盒子看起来不像一台成品。现在至少有一个仓库能告诉我:懒不是唯一原因,安装页也可能先问 setup code,门也可能只挡会话、不挡那句 Nothing is playing,Docker 盒子上的「Jellyfin 兼容后端」可能只是一台还没源、也还没第二用户的 0.59.0。这句话听起来没有那么刺激,但可能更真实。买之前最好先把预期摆正:它给的是一台会讲 Jellyfin 话的门廊、不替你找源、不把空看板听成已经播完的客厅,不是一台已经装满的媒体库。我这台 ARM 小盒子,今天进了门廊,墙上还没有一张被它标成正在播放的海报。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
