侧边栏壁纸
博主头像
羊刀仙的部落格 博主等级

很有力量。

  • 累计撰写 284 篇文章
  • 累计创建 60 个标签
  • 累计收到 13 条评论

目 录CONTENT

文章目录

NAS 影视库自动化新方案,Docker一键部署MediaStationGo

羊刀仙
2026-06-25 / 0 评论 / 0 点赞 / 2 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
GW树洞

高速稳定 · 海外专线

  • 自用推荐
  • 90天使用时长
  • 70+ 节点分布
  • IEPL专线 油管4K无压力
  • 全平台客户端
  • 不限制在线设备
立即注册

本期来介绍一个开源的一站式影视媒体库:MediaStationGo,简称 MGO。

笔者目前用的是MP,据本项目作者叙述,MGO与MP的最主要差异:

MP需要额外安装emby等服务配合播放,MGO只需要配合QB下载就可以在第三方播放器中实现登录观看。

如果你在MP部署使用过程中有诸多阻碍,无论是本地还是网盘资源,那不妨来试试这个项目。

截屏2026-06-24 10.17.21.png

项目介绍

完整项目名:ShukeBta/MediaStationGo,可于GitHub搜索。

MediaStationGo 是一个自托管媒体管理系统,面向 NAS、小主机、家庭影音和多用户共享场景。它把媒体库、刮削、下载整理、订阅、网盘播放、Emby 协议兼容、用户权限和 Bot 通知放在一个后台里,目标是让用户只维护一套服务,就能给网页端、手机端、电视端和第三方播放器使用,无需部署Emby服务端。

项目特点

  • 媒体库管理:电影、电视剧、动漫、综艺、音乐和自定义媒体库统一管理。

  • Emby 协议兼容:Infuse、VidHub、SenPlayer、Fileball 等客户端可按 Emby/Jellyfin 方式添加服务器。

  • 本地 + 网盘:支持本地硬盘、下载目录、OpenList、CloudDrive2、WebDAV、STRMURL 和 302 反代播放。

  • 订阅下载入库:连接 qBittorrent 后支持搜索、订阅、下载完成整理、刮削和入库通知。

  • 多用户与权限:管理员/普通用户、有效期、成人内容开关、设备管理、注册码和 TGBot 绑定。

  • 三挡部署:按规模选择 PostgreSQL、Redis、OpenSearch,低配 NAS 到大库检索都能覆盖。

部署流程

以威联通NAS为例,通过Docker Compose的方式进行部署。

需要注意的是,本文介绍的是完整部署方式,也就是下图所示的第三档。如果你对于设备性能不自信,可选择第一档的默认推荐部署方式,资源占用最低且适合绝大多数NAS。三个档的docker-compose.yml点我获取

截屏2026-06-23 09.38.14.png

部署代码如下:

services:
  mediastation-go:
    image: ghcr.io/shukebta/mediastation-go:latest
    container_name: mediastation-go
    restart: unless-stopped
    init: true

    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      opensearch:
        condition: service_healthy

    ports:
      - "18080:8080"

    volumes:
      - /share/Container/MediaStationGo/data:/data
      - /share/Container/MediaStationGo/cache:/cache
      - /share/Multimedia:/media
      - /share/Download:/downloads

    environment:
      TZ: Asia/Shanghai
      PUID: "1000"
      PGID: "1000"

      MEDIASTATION_APP_HOST: 0.0.0.0
      MEDIASTATION_APP_PORT: 8080
      MEDIASTATION_APP_WEB_DIR: /app/web/dist
      MEDIASTATION_APP_DATA_DIR: /data

      MEDIASTATION_LOGGING_LEVEL: warn
      MEDIASTATION_LOGGING_FORMAT: console
      MEDIASTATION_LOGGING_OUTPUT_PATH: /data/logs

      MEDIASTATION_DATABASE_TYPE: postgres
      MEDIASTATION_DATABASE_DSN: postgres://mediastation:mediastation@postgres:5432/mediastation?sslmode=disable

      MEDIASTATION_CACHE_CACHE_DIR: /cache
      MEDIASTATION_CACHE_REDIS_URL: redis://redis:6379/0

      MEDIASTATION_SEARCH_BACKEND: opensearch
      MEDIASTATION_SEARCH_OPENSEARCH_URL: http://opensearch:9200
      MEDIASTATION_SEARCH_INDEX: mediastation_media

      MEDIASTATION_MEDIA_DIR: /share/Multimedia
      MEDIASTATION_MEDIA_CONTAINER_DIR: /media
      MEDIASTATION_DOWNLOAD_DIR: /share/Download
      MEDIASTATION_DOWNLOAD_CONTAINER_DIR: /downloads

      MEDIASTATION_TRANSCODER_ENABLED: "true"
      MEDIASTATION_TRANSCODER_HARDWARE_ACCEL: "false"
      MEDIASTATION_TRANSCODER_REALTIME: "true"
      MEDIASTATION_TRANSCODER_THREADS: "2"
      MEDIASTATION_TRANSCODER_MAX_CONCURRENT: "1"
      MEDIASTATION_TRANSCODER_IDLE_TIMEOUT_SECONDS: "120"

    networks:
      - mediastation_net

    healthcheck:
      test: ["CMD-SHELL", "busybox wget -qO- http://127.0.0.1:8080/api/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 60s

    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  postgres:
    image: postgres:16-alpine
    container_name: mediastation-postgres
    restart: unless-stopped

    environment:
      POSTGRES_DB: mediastation
      POSTGRES_USER: mediastation
      POSTGRES_PASSWORD: mediastation
      TZ: Asia/Shanghai

    volumes:
      - /share/Container/MediaStationGo/postgres:/var/lib/postgresql/data

    networks:
      - mediastation_net

    healthcheck:
      test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U mediastation -d mediastation"]
      interval: 10s
      timeout: 5s
      retries: 10

    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  redis:
    image: redis:7-alpine
    container_name: mediastation-redis
    restart: unless-stopped

    command:
      - redis-server
      - --appendonly
      - "yes"
      - --maxmemory
      - 256mb
      - --maxmemory-policy
      - allkeys-lru

    volumes:
      - /share/Container/MediaStationGo/redis:/data

    networks:
      - mediastation_net

    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 10

    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  opensearch:
    image: opensearchproject/opensearch:2
    container_name: mediastation-opensearch
    restart: unless-stopped

    environment:
      discovery.type: single-node
      plugins.security.disabled: "true"
      DISABLE_INSTALL_DEMO_CONFIG: "true"
      bootstrap.memory_lock: "false"
      OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m"

    volumes:
      - /share/Container/MediaStationGo/opensearch:/usr/share/opensearch/data

    networks:
      - mediastation_net

    healthcheck:
      test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:9200 >/dev/null || exit 1"]
      interval: 20s
      timeout: 10s
      retries: 15
      start_period: 90s

    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

networks:
  mediastation_net:
    external: true

打开威联通的Container Station创建新的应用程序。

截屏2026-06-23 14.24.42.png

部署完毕后,你在该应用下,会得到如图4个容器。

截屏2026-06-23 14.41.01.png

配置一览

在浏览器界面输入NAS_IP:10080即可访问服务,默认账户/密码:admin/admin123

截屏2026-06-23 14.49.34.png

因为这台机器啥也没有,所以界面为空,可以直接点击「前往管理后台」。

截屏2026-06-23 14.54.48.png

如下图,我的个人习惯一般是先配置下载器,点击「下载器管理」。

截屏2026-06-23 14.55.35.png

点击右上角「添加下载器」。

截屏2026-06-23 14.56.27.png

命名随意。类型按需求选择,我个人喜欢用QB。URL这个部分要注意,其他平台我不是太清楚,威联通如果不是像上面那样多个容器统一部署到一个应用内,网络一般是不能互通的。因此要更新你的QB部署代码,让QB加入MGO网络,在原本的yml中加入部分内容。假设MGO的网络为mediastation_net,大概如下:

services:
  qbittorrent:

    ······
    networks:
      mediastation_net:
        aliases:
          - qbittorrent

networks:
  mediastation_net:
    external: true

因此URL的内容可如下图填写(name:port),当然写成QB当前的局域网访问地址也是没问题的。

截屏2026-06-23 15.27.52.png

填写完毕后进行测试,可以右上角的看到成功标志。

截屏2026-06-23 15.28.01.png

其实大部分配置项,以前玩过Nastool朋友,应该都会很熟悉。

再就是站点管理,比较常用的站都可以添加认证。配置这个主要用于站点搜索,订阅、自动抓取、自动下载这个我用不上,因此就不配置RSS。

截屏2026-06-23 16.58.50.png

馒头比较特殊,本想拿AGCV来测试,但作者目前并没适配这个站点。操作步骤嘛,其实就是正常的填入网址和cookie保存即可。

截屏2026-06-23 17.22.11.png

题外:你的站到底选啥,可以到站点的首页直接拉到最底下查看(会有大字标注),如果没有,则到 FAQ 页面查看,站长一般都会提供说明。NexusPHP 应该会占不小的比例。

截屏2026-06-23 17.32.14.png

最后没法子,还是用馒头吧。。。

截屏2026-06-23 19.15.41.png

跨站点搜索,能搜索出站点的内容,但是MGO这边的部分显示有点问题。

截屏2026-06-23 19.14.12.png

点击下载,会自动添加种子文件到QB自动下载。如下图也可以看到,下载目录是/downloads/外语电影自动分类上了的。不过这个自动归类,也是存在些许问题。

截屏2026-06-24 08.53.48.png

MT这边也是成功做上了。

截屏2026-06-23 19.29.13 拷贝.png

接着,我们添加媒体库目录。因为文章开头的项目特性介绍过,以及上面的演示测试,我们可以直接用QB的/downloads,所以如下图填写。

截屏2026-06-23 19.32.46.png

添加媒体库后,便可扫描刮削,如果不满意,也支持手动调整。

截屏2026-06-24 08.23.00.png

截屏2026-06-24 10.15.33.png

可以添加很多平台的API,辅助刮削之类。

截屏2026-06-24 11.00.53.png

不过在我看来,最好的也是最经典的整理方式,还是通过硬链接自动整理入库。不过这里要注意的是,硬链接不支持跨共享文件夹~也就是说,你在部署时,需要调整映射文件目录,也就是 MGO 的媒体目录要和 QB 下载目录放一起。大概结构如下:

/share/Media/downloads
/share/Media/library/电影/外语电影
/share/Media/library/电影/国语电影

限于篇幅问题,大家可以参考前辈们过去的 NASTool 相关教程。

截屏2026-06-24 10.27.25.png

最后是网盘挂载,以及STRM支持。

个人建议自己轻易别整理,直接用大佬们分享的整理好的资源一键转存。

作者推荐把网盘等挂载到 OpenList、CloudDrive2 或 Alist 后,在这里选择 OpenList / CloudDrive2 / Alist转存。

截屏2026-06-24 13.11.19.png

因为我不太用网盘,所以直接挂上夸克咱们一起来看看效果。保存cookie,连通后,便会自动显示网盘文件夹。如果你一键转存别人整理好的,那几乎不用担心。但如果像我下图这种,建议还是提前规范命名,分门别类、一条一套的导入,用「自动识别」、「一键导入」识别错误反而会浪费更多时间。

截屏2026-06-24 13.16.28.png

能刮削成功,但是海报墙这里显示的是上级文件夹的名字。

截屏2026-06-24 13.52.16.png

还需要微调。

截屏2026-06-24 13.57.26.png
截屏2026-06-24 13.52.28.png

用infuse连接的话,大概率是因为网盘速率问题,导致并不能很好显示,本地的两部资源就没问题。Vidhub那边表现倒是好不少。

截屏2026-06-24 14.28.38.png

最后

项目仍然是在起步阶段,很多功能需要优化和完善,不过基础使用倒也差不多了。

感谢观看,本文完。

0

评论区