资讯动态

NAS变身怀旧游戏机:Docker部署EmulatorJS全指南

发布时间:2026/9/9 18:01:46 来源:尧图企业网站定制
我一直觉得NAS这东西除了存照片、挂下载、跑服务应该还能干点更“有灵魂”的事。前阵子折腾完手上的黑群晖和一台飞牛NAS突然冒出个念头既然这玩意儿7x24小时开机、家里所有设备都能访问为什么不把魂斗罗、超级马里奥这些红白机经典游戏直接塞进去做成一台全家人随时能开的怀旧游戏机说干就干。我花了一个周末把环境全搭好现在手机、平板、客厅电视、办公室电脑只要打开浏览器输入NAS地址就能直接开打魂斗罗存档还自动保存在NAS里。整个过程比我想象中简单但踩的坑也不少。这篇就把完整思路、部署步骤和排查记录整理出来给准备在群晖、飞牛或者任何一台能跑Docker的NAS上玩复古游戏的朋友做参考。1. 为什么要把游戏塞进NAS先想清楚这几点1.1 NAS当游戏机的三个核心优势我见过很多人在电脑上装模拟器玩复古游戏问题是游戏存档、ROM文件散落在各个设备上换台电脑就得重新折腾。放在NAS上就不一样了核心优势就三条。第一集中存储。ROM、存档、封面图全部放在NAS的磁盘阵列里硬盘坏了有冗余备份换设备不影响游戏进度。第二随时可访问。NAS一年四季不断电只要有网络浏览器打开就是游戏机不用专门开电脑。第三多人同时用。家里孩子想在客厅玩马里奥你在书房也能同时打开另一个游戏互不干扰。这一点和NAS上的Jellyfin特别像——Jellyfin把电影集中管理并转码推送到各终端游戏模拟器则是把ROM集中管理并通过浏览器推送到各终端。我一直认为NAS上除了影音最值得折腾的就是这个方向。1.2 这套方案的硬件门槛和适用场景先说结论跑红白机、SFC、MD这类16位以前的模拟器几乎任何NAS都能胜任哪怕是玩客云刷NAS这种性能一般的设备跑NES游戏也毫无压力。如果还想玩PS1、PSP、N64建议CPU稍微好点比如蜗牛星际的J1900级别或以上。我自己手上有两台设备一台是黑群晖J3455的板子8G内存跑PS1游戏偶尔掉帧但能玩另一台是飞牛NAS用的是一颗老至强E3性能富裕很多N64游戏也能流畅跑。总体来讲这套方案对硬件的要求比跑Jellyfin转码低得多因为模拟器的运算量主要在浏览器本地NAS本身只负责推送文件和跑一个轻量的模拟器服务。适用场景也很明确个人怀旧、家庭客厅娱乐、朋友聚会来几局对战。不适合追求极致画质和大型3D游戏的人想玩PS2、Wii那类游戏还是得靠独立游戏主机或者高性能PC。2. 方案选型模拟器那么多为什么我推荐EmulatorJS2.1 市面主流方案对比在NAS上玩复古游戏其实有好几条路可以走我一开始也纠结了很久。先整理一下市面上常见的方案方案部署方式访问方式硬件要求易用性适合人群EmulatorJSDocker浏览器直接玩很低很高想省事、多设备访问的玩家RetroArch WebDocker/套件需要独立客户端或Web前端中中追求原汁原味RetroArch体验的玩家Batocera/Lakka独立系统引导HDMI接电视手柄低中把NAS或旧电脑改成专用游戏机桌面版模拟器安装在NAS的操作系统里需要显示器和输入设备低低不推荐纯折腾Batocera这类把NAS刷成独立游戏系统的方案我最早也心动过但一想刷了之后NAS的存储、下载、影音功能全都得剥离出去太不划算。RetroArch本身是模拟器里的老大哥功能极其强大但它的Docker镜像在浏览器访问方面体验一般而且配置起来比EmulatorJS复杂不少。2.2 EmulatorJS的核心优势EmulatorJS能让我最终拍板主要靠几个完全贴合NAS场景的特性。第一它是纯Web方案。内核是把RetroArch模拟核心编译成WebAssembly和JavaScript浏览器打开页面就能跑不需要在客户端装任何软件。这意味着Windows电脑、Mac、安卓手机、iPhone、iPad甚至电视盒子里的浏览器通通能玩。第二它对NAS硬件极其友好。因为实际运算发生在浏览器终端NAS上的Docker容器只承担文件服务和页面推送CPU占用非常低。群晖DS920、飞牛NAS这种主流配置跑起来毫无压力。第三多平台支持齐全。从街机MAME、FCNES、SFC、MD到GBA、PS1、N64、PSP一口气覆盖了几十个模拟核心。魂斗罗、马里奥这种红白机游戏属于入门级它支持得最好。第四自带游戏库UI。EmulatorJS启动后直接有一个网页版游戏列表界面带封面展示、收藏功能不用自己写前端。配合NAS的存储能力体验非常接近一个轻量级“游戏版Jellyfin”。2.3 硬件加速和GPU转码要不要开很多从Jellyfin那边过来的朋友会习惯性问需不需要给模拟器开显卡转码。这里明确说一下EmulatorJS默认不需要GPU转码也不要把它当作Jellyfin那种视频转码服务来理解。它的工作模式是“NAS发文件、浏览器算画面”视频解码和图形渲染都由终端设备完成。唯一可能需要关注的是如果终端设备是老旧的电视盒子浏览器性能偏弱玩GBA以上机种可能会卡。解决办法不是升级NAS而是换一台性能好点的终端设备或者选择更轻量的游戏平台比如红白机和SFC。3. 动手实操Docker方式部署模拟器3.1 群晖和黑群晖的部署步骤我手头这台黑群晖装的是DSM 7.x套件中心自带Container Manager就是原来Docker套件的升级版整个部署流程很顺。打开Container Manager进入“注册表”搜索框输入emulatorjs。我建议直接拉取lscr.io/linuxserver/emulatorjs:latest这个镜像LinuxServer.io这个组维护的镜像比较规范更新也勤快。镜像下载完成后点击“创建容器”。这里有几个关键配置要特别注意端口设置把容器的3000端口映射到NAS的某个端口比如3000 - 3000。如果你NAS上已经有其他服务占用3000可以改成3001 - 3000。存储空间需要映射三个目录分别是/config配置文件、/roms游戏ROM目录、/data数据文件主要是前端页面。环境变量建议设置PUID和PGID对应你登录NAS的账号权限否则后面传ROM可能遇到没有读写权限的问题。默认可以不设但遇到权限问题就要回头补这里。保存并启动容器后在浏览器里访问http://NAS_IP:3000能看到EmulatorJS的Web界面说明部署成功了。第一次启动会比较慢因为容器会把前端页面下载到/data目录耐心等一两分钟。3.2 飞牛NAS上的部署步骤飞牛NAS作为这两年热度很高的国产NAS系统对Docker的支持做得很友好完全是Web图形化管理。如果你用的是飞牛NAS整个过程更简单。打开飞牛NAS的Docker应用进入镜像管理搜索emulatorjs同样选择LinuxServer.io的镜像下载。飞牛的好处是它自己会把容器配置界面做得很直观端口、存储路径、环境变量都是表单形式直接填就行。飞牛系统默认的文件管理路径是/vol1之类的挂载点建议提前在文件管理里建好/vol1/docker/emulatorjs下的config、roms、data三个文件夹然后映射的时候直接选这些文件夹。注意飞牛的Docker容器如果遇到文件权限问题通常是因为PUID/PGID没设对可以先用id命令查一下你当前用户的UID和GID然后填到环境变量里。3.3 通用命令行部署方式不管是群晖还是飞牛其实底层都是Docker如果你更习惯命令行SSH登录NAS后一行命令也能搞定docker run -d \ --nameemulatorjs \ -e PUID1000 \ -e PGID1000 \ -e TZAsia/Shanghai \ -p 3000:3000 \ -v /path/to/config:/config \ -v /path/to/roms:/roms \ -v /path/to/data:/data \ --restart unless-stopped \ lscr.io/linuxserver/emulatorjs:latest--restart unless-stopped这个参数一定要加否则NAS重启后模拟器不会自动启动。我之前好几次重启NAS后忘了手动开容器导致家里孩子想玩游戏打不开后来加上这个参数就再也没操心过。3.4 初始化配置和浏览器访问验证容器启动后第一次访问页面会有个简单的初始化过程。EmulatorJS会自动检测/roms目录下的游戏文件并扫描生成游戏列表。如果/roms目录下什么都没有页面会显示空列表这是正常的。访问时如果遇到“本地无法访问”的情况先别急着怀疑配置。大量是防火墙或路由器端口问题。群晖的防火墙默认可能放行局域网访问如果你的NAS开了防火墙需要把3000端口加入白名单。飞牛NAS一般默认就是开放的但如果是其他系统记得在路由器或NAS防火墙上放行对应端口。浏览器验证时我建议先用电脑测试再逐步扩展到手机和平板。直接访问http://NAS局域网IP:3000即可千万不要用https因为EmulatorJS的默认配置是HTTP。4. ROM的收集、整理与上传把游戏真正“塞”进去4.1 目录结构规划EmulatorJS对ROM目录有严格的平台子目录要求你需要在/roms下面按平台建立文件夹。我自己的目录规划是这样的/roms ├── atari2600 ├── gb ├── gba ├── genesis ├── mame ├── n64 ├── nds ├── nes ├── psx ├── snes └── psp每个目录名称对应一种游戏平台EmulatorJS根据文件名后缀自动识别平台。比如NES游戏放nes目录ROM文件后缀通常是nesSFC游戏放snes目录后缀是sfc或smc。PS1游戏放psx目录文件可以是bin/cue或者pbp格式但建议用pbp格式体积小很多。这里有个细节必须提醒EmulatorJS不是所有平台都默认开启。部分平台需要上传对应的BIOS文件才会在界面里显示。比如PS1游戏的BIOS文件PSXONPSP660.bin、scph1001.bin等需要放到/data/bios目录。没有BIOS的话即使ROM放对了目录游戏也无法启动。4.2 ROM文件的后缀识别和压缩EmulatorJS支持直接读取最常见的ROM格式同时支持把多个文件打包成一个zip上传容器会自动解压。对于PS1这种多轨道游戏bin/cue建议把它们压缩成一个zip文件再上传既方便管理和上传也能避免cue文件路径不对导致游戏黑屏。我遇到过不少朋友因为直接拖了一堆bin文件进psx目录结果游戏列表中每一轨都显示成一个独立游戏点进去根本玩不了。正确做法是确认游戏是单bin还是多bin多bin的情况下必须用cue或m3u作为启动文件或者统一打包成pbp。我一般用chdman这个工具把PS1的bin/cue转成chd格式一个游戏一个文件EmulatorJS也是支持识别chd的。4.3 用Web界面、FTP和群晖Drive上传游戏上传ROM有两个入口。第一种从EmulatorJS自带的Web界面上传在设置页面或菜单里找到上传按钮选择对应平台的目录把文件拖进去就行。群晖NAS上如果遇到“不能直接拖文件夹上传”的情况那是因为浏览器的拖拽上传对文件夹支持有限可以先在本地把文件夹压成zip再上传或者改用其他方式。第二种是直接把NAS的/roms目录挂载出来用SMB、FTP或WebDAV访问。这也是很多人提到的“NAS上创建FTP”或者“NAS作为本地磁盘”的典型场景。我在飞牛NAS上开启了FTP服务然后在电脑上用FileZilla连接把之前整理好的NES全套ROM一次性拖进去速度比Web上传快很多。对于群晖用户更简单的办法是通过群晖的File Station直接定位到docker目录下的roms/nes把ROM拖进去。如果你习惯把NAS映射成Windows本地磁盘操作起来就跟你本地硬盘一样直接复制粘贴。上传完之后回到EmulatorJS界面刷新一下页面游戏列表就会自动出现。如果刷新后还是没有大概率是平台未激活或者BIOS缺失回头检查一下4.1和4.2提到的两个点。4.4 ROM版权问题务必注意的边界这年头聊模拟器绕不开版权问题我必须多说一句。我自己的原则是只玩自己拥有实卡的ROM备份或者从平台官方渠道购买的数字版本不传播、不下载盗版资源。正版玩家折腾怀旧游戏完全没问题但如果你没有对应的实体卡带或授权下载盗版ROM是不合规的。这个边界希望大家自己把握好别因为这个把NAS和域名都搭进去。5. 手柄配置与局域网串流实测从书房到客厅5.1 浏览器手柄体验EmulatorJS支持浏览器Gamepad API也就是说主流手柄都能直接识别。我自己测试过Xbox手柄、PS4手柄还有一些杂牌的USB手柄基本插上就能用不需要额外装驱动。蓝牙手柄的话电脑或手机先配对好浏览器里再连就行。进入游戏后手柄默认的按键映射基本符合直觉十字键控制方向右侧按键对应ABXYSelect/Start对应手柄的Back/Start。如果想改按键在游戏页面里按键设置菜单调整即可。有一个坑如果你在手机上用手柄需要确认浏览器是否把Gamepad API权限正常开启。部分安卓浏览器默认禁用建议使用Chrome或Edge。iPhone上的Safari对Gamepad API支持得也不好我试过之后果断改用安卓平板。5.2 触屏和键盘的备选方案没有手柄的时候键盘也能玩。EmulatorJS内置了键盘映射默认按键可以查看页面右上角的设置菜单。触屏设备也支持虚拟按键手机和iPad上进入游戏后可以在设置中开启触摸按钮只是体验不如手柄。实际感受下来红白机游戏对操作精度要求不高虚拟按键够用。但像魂斗罗这种需要翻滚跳跃的虚拟按键很容易按错还是建议配一个手柄。几十块的国产USB手柄体验就比触屏强太多。5.3 客厅电视上的大屏模式把NAS上的模拟器接到客厅电视我认为是这套方案最爽的打开方式。如果电视本身有浏览器理论上可以直接访问NAS的3000端口玩。但智能电视自带浏览器一般性能一般玩起来会有延迟。我推荐的方案是用一个电视盒子或者迷你主机连接电视装一个浏览器或者用支持浏览器的Kodi直接全屏访问EmulatorJS页面。如果网络环境是WiFi 5/6延迟基本察觉不到如果是有线连接体验更稳定。我自己在客厅用的是一个小主机装了个轻量级Linux系统开机自启浏览器并全屏进入EmulatorJS页面。配合无线手柄客厅瞬间变成一台怀旧游戏机。效果比很多几百块的所谓复古游戏机强多了游戏库还无限大。5.4 局域网串流的延迟表现“串流”这两个字容易让人担心延迟问题但实际上EmulatorJS的延迟核心不在网络而在浏览器渲染和手柄输入。我实测在同一局域网内WiFi环境下从按键到画面响应的体感延迟大约在50-80毫秒基本不影响游戏体验。前提是路由器别太差建议5GHz频段。如果跨网络访问比如在公司访问家里的NAS延迟会明显增加普通玩法还能接受但魂斗罗这种对反应要求高的游戏就不太行了。这种场景下我建议直接用NAS的远程访问功能配Web页面能用但别指望太完美。6. 常见问题与排查技巧实录6.1 群晖访问不了3000端口这个问题非常常见尤其群晖用户。排查顺序是先确认容器在Container Manager里处于运行状态然后检查端口映射是否生效。然后在群晖控制面板的“防火墙”里放行3000端口如果开了安全顾问之类功能也可能误拦截。最后再确认路由器有没有开启AP隔离AP隔离开了的话终端之间无法互通页面自然打不开。6.2 飞牛NAS容器反复重启飞牛NAS上如果遇到容器反复重启大概率是存储路径的权限问题。Docker容器尝试写入/vol1目录时没有权限就会启动失败。解决办法是把PUID和PGID设置成你飞牛管理员的UID/GID或者在容器配置时勾选以特权模式运行二选一即可。6.3 上传ROM后游戏列表不显示这个坑我复盘过好几次原因就三类。一是平台目录没匹配上比如NES文件的目录名必须是nes不能是fc或者famicom。二是平台的BIOS缺失尤其是PS1、NDS这类需要BIOS的平台没有BIOS就直接不显示。三是容器扫描间隔问题正常情况下刷新页面就会重新扫描如果还是不行重启一下容器再刷新。6.4 游戏启动黑屏或卡在加载界面如果ROM能显示但进不去游戏先检查ROM文件本身是否完整。最简单的方法是用电脑上已有的桌面模拟器测试一下如果电脑端能玩说明ROM没问题问题出在模拟核心或BIOS。然后确认BIOS文件名和放置路径是否正确。最后把容器升级到latest版本不少核心bug都是通过镜像更新修复的。6.5 手柄没反应怎么排查手柄连接后页面没反应首先确认浏览器地址栏左侧的权限指示看是否允许使用游戏手柄。然后在游戏页面的按键设置里手动按下手柄任意按键看能不能被浏览器识别。如果识别不了换一个浏览器试试推荐Chrome系。还是不行的话把蓝牙重新配对一次有些蓝牙手柄连过电脑后NAS端浏览器需要重新唤醒。6.6 关于折腾NAS系统的通用建议顺便拓展一句很多人喜欢在NAS里用宝塔建站或装一堆管理系统然后再部署Docker。我自己也试过在NAS上用宝塔管理Docker但说实话NAS的核心是稳定存储和服务运行不建议在NAS里装太多系统级工具容易出现端口冲突和依赖冲突。容器本身就够用保持系统清爽容量和性能都留给真正需要的服务。写在最后的一个小建议如果你看完已经准备上手我的建议是先别急着下载几百个ROM先放两三个自己真正喜欢、熟悉操作的游戏比如魂斗罗、超级马里奥和绿色兵团把手柄、存档、电视全流程走通再慢慢扩充游戏库。这样就算中途遇到问题排查范围也小很多。另外游戏存档是这套方案里容易被忽略的重点。EmulatorJS的存档默认存放在容器配置目录里建议定期把/config目录备份一下或者用NAS的快照功能不然好不容易通宵打出来的进度丢了真的会崩溃。最后分享一个让我觉得这波折腾很值的瞬间周末下午我爸路过客厅看见我在电视上打魂斗罗愣了几秒然后默默拿起另一个手柄说“来双打”。那一瞬间我就觉得把游戏塞进NAS这事儿干得太对了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价