dorkhub

MediaStationGo

MediaStationGo 是一个自动化媒体库管理工具,面向 NAS、小主机、家庭影音和多用户共享场景。它把媒体库、刮削、下载整理、订阅、网盘播放、Emby 协议兼容、用户权限和 Bot 通知放在一个后台里,目标是让用户只维护一套服务,…

ShukeBta
Go25044 forksupdated 2 weeks ago
visit the demogit clone https://github.com/ShukeBta/MediaStationGo.gitShukeBta/MediaStationGo

MediaStationGo

MediaStationGo Logo

适合 NAS、家庭共享和多端播放的私人媒体中心

Docker 一键部署 · PostgreSQL 主库 · Redis 热缓存 · OpenSearch 搜索增强 · Emby 协议兼容 · Bot 通知

快速开始 · 三挡部署 · 路径映射 · 旧 SQLite 迁移 · 开发构建 · 贡献规范 · 在线演示

Go React Docker License


项目简介

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

核心能力:

  • 媒体库管理:电影、电视剧、动漫、综艺、音乐和自定义媒体库统一管理。
  • Emby 协议兼容:Infuse、VidHub、SenPlayer、Fileball 等客户端可按 Emby/Jellyfin 方式添加服务器。
  • 本地 + 网盘:支持本地硬盘、下载目录、OpenList、CloudDrive2、WebDAV、STRMURL 和 302 反代播放。
  • 订阅下载入库:连接 qBittorrent 后支持搜索、订阅、下载完成整理、刮削和入库通知。
  • 多用户与权限:管理员/普通用户、有效期、成人内容开关、设备管理、注册码和 Telegram Bot 绑定。
  • 灵活部署:单镜像 SQLite 一键起步,或按规模选择 PostgreSQL、Redis、OpenSearch,低配 NAS 到大库检索都能覆盖。

社区与友链

关于MediaStationGo多用户授权码

获得方式:

1、通过爱发电获得:爱发电

2、提交Inssues

3、提交PR贡献

4、L站积分兑换

5、公益服向管理申请即可获得

所有爱发电收益也将会拿来维持Mgo项目的维护与更新迭代以及招募更多想参与Mgo项目的技术大神们来参与

&暂无其他获取方式

禁止在国内任何平台对Mgo项目进行提起宣传

如:抖音、快手、B站、其他内网论坛及平台

在线演示

演示站只用于看功能,请不要填写私人 API Key、站点 Cookie 或真实隐私信息。

快速开始

最推荐使用 Docker Compose。仓库提供四份独立完整模板,全部不依赖 .env。想最省心就下载单镜像档(SQLite,只有一个镜像);只需要按需修改访问端口、媒体目录、下载目录和可选硬件设备。需要多用户/高并发再选第一档起的 PostgreSQL 档位。

mkdir -p MediaStationGo
cd MediaStationGo
# 最省心:单镜像 + SQLite,只启动一个容器
curl -fsSL https://raw.githubusercontent.com/ShukeBta/MediaStationGo/main/docker-compose.simple.yml -o docker-compose.yml
# 或第一档:PostgreSQL(多用户/高并发更稳)
# curl -fsSL https://raw.githubusercontent.com/ShukeBta/MediaStationGo/main/docker-compose.yml -o docker-compose.yml
docker compose up -d

启动后访问:

http://服务器IP:18080

默认账号:

admin / admin123

首次登录后请立刻修改管理员密码。

镜像地址:

GHCR:ghcr.io/shukebta/mediastation-go:latest
Docker Hub 备用:shukbet/mediastationgo:latest

部署档位

MediaStationGo 推荐按机器资源和用户规模选择部署档位。每份 Compose 文件都是完整文件,不需要再叠加多个 -f。想一个镜像跑起来就选单镜像档(SQLite);需要多用户 / 高并发时再用 PostgreSQL 三档。Redis 和 OpenSearch 是增强组件,不替代 PostgreSQL。

档位 完整配置文件 组件 适合场景
单镜像档 docker-compose.simple.yml MediaStationGo + 内置 SQLite 新手、单人使用、只想一个镜像跑起来的低配机器
第一档 docker-compose.yml MediaStationGo + PostgreSQL 大多数 NAS、个人/家庭使用、低内存机器
第二档 docker-compose.standard.yml MediaStationGo + PostgreSQL + Redis 多用户、Emby 客户端频繁刷新、首页/媒体列表访问较多
第三档 docker-compose.search.yml MediaStationGo + PostgreSQL + Redis + OpenSearch 超大媒体库、复杂全文搜索、后续需要独立搜索索引

单镜像档:SQLite(最省心)

只启动 MediaStationGo 一个镜像,主数据库用内置 SQLite,不需要 PostgreSQL / Redis / .env。变量最少、资源占用最低,适合新手和单人使用。日后需要多用户或更高并发时,保留 ./data 后切换到第一档的 PostgreSQL 即可。

mkdir -p MediaStationGo
cd MediaStationGo
curl -fsSL https://raw.githubusercontent.com/ShukeBta/MediaStationGo/main/docker-compose.simple.yml -o docker-compose.yml
docker compose up -d

第一次部署通常只需要改 docker-compose.yml 里的这几处:

ports:
  - "18080:8080"          # 改左边 18080 即可
volumes:
  - ./data:/data          # 必须备份
  - ./media:/media        # 改左边为你的媒体目录,例如 /vol1/1000/Media:/media
  - ./downloads:/downloads # 改左边为你的下载目录,例如 /vol1/1000/Downloads:/downloads
  # - /dev/dri:/dev/dri   # Intel 核显硬解需要时取消注释

网页后台添加媒体库时填写容器内路径:

/media
/media/电影
/media/电视剧

下载器保存目录建议也对齐到:

/downloads

关键数据目录:

./data       JWT 密钥、运行配置、SQLite 主数据库(mediastation.db)——必须备份
./cache      海报/临时缓存,可重建
./media      媒体库
./downloads  下载目录

单镜像模式请不要配置 MEDIASTATION_DATABASE_DSN;一旦填了 DSN 就会切回 PostgreSQL。

第一档:PostgreSQL

第一档是默认推荐部署。它只启动主服务和 PostgreSQL,资源占用最低,适合绝大多数 NAS。

mkdir -p MediaStationGo
cd MediaStationGo
curl -fsSL https://raw.githubusercontent.com/ShukeBta/MediaStationGo/main/docker-compose.yml -o docker-compose.yml
docker compose up -d

关键数据目录:

./postgres   PostgreSQL 主数据库,必须备份
./data       JWT 密钥、运行配置、旧 SQLite 迁移源
./cache      海报、临时文件、转码缓存,可删除重建

第二档:PostgreSQL + Redis

第二档是独立完整文件,包含第一档全部配置并额外启用 Redis。Redis 用作热缓存,能减轻多用户和 Emby 客户端频繁刷新时的数据库压力。

mkdir -p MediaStationGo
cd MediaStationGo
curl -fsSL https://raw.githubusercontent.com/ShukeBta/MediaStationGo/main/docker-compose.standard.yml -o docker-compose.yml
docker compose up -d

Redis 数据目录是 ./redis。它主要保存缓存,通常可重建;真正需要备份的仍然是 ./postgres./data

第三档:PostgreSQL + Redis + OpenSearch

第三档是独立完整文件,包含第二档全部配置并额外启用 OpenSearch,用于大库全文搜索和独立搜索索引。OpenSearch 常驻内存明显更高,低配 NAS 不建议开启。

mkdir -p MediaStationGo
cd MediaStationGo
curl -fsSL https://raw.githubusercontent.com/ShukeBta/MediaStationGo/main/docker-compose.search.yml -o docker-compose.yml
docker compose up -d

OpenSearch 数据目录是 ./opensearch。搜索索引可重建,但重建大库索引会花时间;机器资源足够时再开启第三档。

配置示例

仓库内提供四份推荐 Compose 文件:

docker-compose.simple.yml     单镜像档:MediaStationGo + 内置 SQLite
docker-compose.yml            第一档:MediaStationGo + PostgreSQL
docker-compose.standard.yml   第二档:MediaStationGo + PostgreSQL + Redis
docker-compose.search.yml     第三档:MediaStationGo + PostgreSQL + Redis + OpenSearch

仓库只保留面向用户部署和项目维护的必要文件。旧的本地部署脚本、发包脚本、开发机辅助脚本、.env 示例和旧高级 Compose 模板已经移除;Linux / Docker 用户按上面四个 Compose 文件部署即可。开发者本地生成的 bin/data/cache/logs/.tmp/tools/ 等目录已列入 .gitignore,不应提交到仓库。

如果直接下载为 docker-compose.yml,启动命令统一是:

docker compose up -d

如果保留原始文件名,也可以这样启动:

docker compose -f docker-compose.simple.yml up -d
docker compose -f docker-compose.standard.yml up -d
docker compose -f docker-compose.search.yml up -d

常用配置片段如下,注释保留为中文,方便直接复制到 NAS 上调整:

services:
  mediastation-go:
    image: ghcr.io/shukebta/mediastation-go:latest
    ports:
      # 左边是宿主机访问端口,右边是容器内端口。
      - "18080:8080"
    volumes:
      # 运行数据:JWT 密钥、配置、旧 SQLite 迁移源。
      - ./data:/data

      # 缓存目录:海报、临时文件、转码缓存,可删除重建。
      - ./cache:/cache

      # 媒体库目录:自动整理/重命名/入库需要写权限。
      - /vol1/1000/Media:/media

      # 下载目录:qBittorrent 保存目录和自动整理源目录。
      - /vol1/1000/Downloads:/downloads
    environment:
      TZ: Asia/Shanghai

      # PostgreSQL 主数据库。
      MEDIASTATION_DATABASE_TYPE: postgres
      MEDIASTATION_DATABASE_DSN: postgres://mediastation:mediastation@postgres:5432/mediastation?sslmode=disable

      # 旧 SQLite 迁移源:只在从旧版 data/mediastation.db 导入时使用。
      MEDIASTATION_DATABASE_DB_PATH: /data/mediastation.db

      # 路径换算:宿主机路径和容器路径必须一一对应。
      MEDIASTATION_MEDIA_DIR: /vol1/1000/Media
      MEDIASTATION_MEDIA_CONTAINER_DIR: /media
      MEDIASTATION_DOWNLOAD_DIR: /vol1/1000/Downloads
      MEDIASTATION_DOWNLOAD_CONTAINER_DIR: /downloads

路径映射

路径映射是 Docker 部署里最容易填错的地方。原则是:volumes 左边是宿主机真实路径,右边是容器内路径;环境变量里也要保持对应关系。

NAS 示例:

volumes:
  - /vol1/1000/Docker/moviepilot-v2/media:/vol1/1000/Docker/moviepilot-v2/media
  - /vol1/1000/qBittorrent/downloads:/vol1/1000/qBittorrent/downloads
environment:
  MEDIASTATION_MEDIA_DIR: /vol1/1000/Docker/moviepilot-v2/media
  MEDIASTATION_MEDIA_CONTAINER_DIR: /vol1/1000/Docker/moviepilot-v2/media
  MEDIASTATION_DOWNLOAD_DIR: /vol1/1000/qBittorrent/downloads
  MEDIASTATION_DOWNLOAD_CONTAINER_DIR: /vol1/1000/qBittorrent/downloads

Windows Docker Desktop 示例:

volumes:
  - D:/Media:/media
  - D:/Downloads:/downloads
environment:
  MEDIASTATION_MEDIA_DIR: D:/Media
  MEDIASTATION_MEDIA_CONTAINER_DIR: /media
  MEDIASTATION_DOWNLOAD_DIR: D:/Downloads
  MEDIASTATION_DOWNLOAD_CONTAINER_DIR: /downloads

如果后台添加媒体库时填的是 /vol1/...,Compose 里也建议把同一个 /vol1/... 挂进容器,避免自动整理和下载入库时路径不可访问。

旧 SQLite 迁移

新版推荐 PostgreSQL 作为主数据库。MEDIASTATION_DATABASE_DB_PATH 不是主库路径,而是旧 SQLite 数据的迁移源。

迁移步骤:

  1. 把旧版 mediastation.db 放到 ./data/mediastation.db
  2. 保持 MEDIASTATION_DATABASE_DB_PATH: /data/mediastation.db
  3. 启动一次,确认日志显示迁移完成,网页数据正常。
  4. 备份 ./postgres./data
  5. 确认不再需要 SQLite 后,把迁移源改成不存在的路径,例如:
environment:
  # 已完成 SQLite 迁移后,建议改成不存在的路径,避免下次启动重复检查旧库。
  MEDIASTATION_DATABASE_DB_PATH: /data/no-sqlite-migration.db

不要删除 ./postgres。PostgreSQL 已经是主数据库,删除它会丢失账号、媒体库、订阅、配置和历史数据。

日志与 STRM 路径

Compose 模板默认把完整应用日志写入 ./data/logs/app.log,同时拆分 ./data/logs/warn.log./data/logs/error.log。Docker 自身日志也会保留 10 个 50MB 文件:

docker compose logs -f mediastation-go
tail -f ./data/logs/app.log
tail -f ./data/logs/error.log

如果要排查订阅、站点搜索、自动整理或 STRM 生成问题,保持 MEDIASTATION_LOGGING_LEVEL: info;需要更细日志时临时改成 debug,确认后再改回 info

STRM 输出目录请使用容器内可写路径,例如 /data/strm,或你已经挂载进容器的媒体目录。旧版本保存过 /app/data/strm 的部署会在生成时自动迁移到当前 MEDIASTATION_APP_DATA_DIR,默认就是 /data

更新与备份

更新镜像:

docker compose pull mediastation-go
docker compose up -d --no-deps mediastation-go

不要执行裸 docker compose pull 做日常更新。PostgreSQL / Redis / OpenSearch 是数据与缓存基础组件,compose 已设置为 pull_policy: missing,首次部署缺镜像时会拉取,日常更新只建议拉取 mediastation-go。需要升级这些基础组件时,请先备份 ./postgres,再手动修改镜像版本并单独拉取。

如果第二档或第三档保留了原始文件名,更新时指定对应完整文件:

# 第二档
docker compose -f docker-compose.standard.yml pull mediastation-go
docker compose -f docker-compose.standard.yml up -d --no-deps mediastation-go

# 第三档
docker compose -f docker-compose.search.yml pull mediastation-go
docker compose -f docker-compose.search.yml up -d --no-deps mediastation-go

必须备份:

./postgres   PostgreSQL 主数据库
./data       JWT 密钥、运行配置、旧 SQLite 迁移源

可重建:

./cache      图片缓存、临时文件、转码缓存
./redis      Redis 热缓存
./opensearch 搜索索引

Bot 与通知

MediaStationGo 支持 Telegram Bot 绑定、用户菜单、群组管理菜单和事件通知。常见通知事件包括:

  • 订阅命中新资源
  • 下载任务完成
  • 入库完成
  • 刮削失败告警
  • 系统异常通知

管理员可以在后台配置 Bot Token、Chat ID、通知频道和事件类型。群组里管理类命令只允许管理员执行,普通用户只能看到和使用用户命令。

常见问题

启动后还是反复迁移 SQLite?

确认旧数据已经迁移成功后,把 MEDIASTATION_DATABASE_DB_PATH 改成不存在的路径,例如 /data/no-sqlite-migration.db,然后重启容器。

扫库或入库速度很慢?

先确认数据库档位和路径映射正确。第一档已经足够大多数场景;第二档 Redis 能缓解频繁刷新造成的数据库压力;第三档主要增强搜索,不会替代媒体扫描本身。网盘扫描还会受网盘接口响应、目录数量和网络质量影响。

qBittorrent 下载完成后无法整理?

确认 qBittorrent 保存路径已经通过 volumes 挂载进 MediaStationGo 容器,并且 MEDIASTATION_DOWNLOAD_DIRMEDIASTATION_DOWNLOAD_CONTAINER_DIR 对应正确。

硬链接目录在 Docker / NAS 上看不到内容?

硬链接不能直接链接“目录”本身,只能链接目录里的文件。文件管理器执行目录硬链接时会递归创建目标目录结构,并为每个文件创建硬链接。硬链接还要求源文件和目标文件在容器内属于同一个文件系统/子卷;如果下载目录和媒体目录是两个独立 bind mount、不同硬盘、不同 btrfs 子卷或网盘挂载,系统会返回 invalid cross-device link,此时请选择“复制”或“软链接”。

第三方播放器无法连接?

确认播放器填写的是 http://服务器IP:18080,账号密码使用 MediaStationGo 用户账号。反代部署时需要正确设置外部访问地址和 HTTPS 头。

开发构建

本地开发需要 Go、Node.js 和 npm。

# 后端测试
go test ./...

# 前端依赖与构建
npm --prefix web install
npm --prefix web run build

# 本地运行后端
go run ./cmd/server

# 本地运行前端开发服务器
npm --prefix web run dev

前端开发服务器默认访问:

http://127.0.0.1:3000

后端健康检查:

http://127.0.0.1:8080/api/health

贡献与反馈

提交 Bug、功能建议或 Pull Request 前,请先阅读 贡献规范

  • Bug 反馈请使用 Issue 模板,并提供部署方式、复现步骤、日志和关键配置。
  • 功能建议请说明使用场景、期望行为和可接受的替代方案。
  • 安全漏洞请不要公开发 Issue,按 安全策略 使用私密渠道报告。
  • Pull Request 请从独立分支或 fork 分支发起,不要直接向 main 推送。
  • 分支名建议使用 fix/...feat/...docs/...test/...,例如 docs/contribution-guidelines
  • 提交前按改动范围运行 go test ./...npm --prefix web run build 或定向测试,并在 PR 中说明验证结果。

赞赏

如果这个项目节省了你的时间,欢迎请作者吃桶泡面。

微信赞赏码

Star History

Star History Chart

许可证

本项目使用 GPL-3.0 License。详见 LICENSE

more like this

ViTAS

Code for ViTAS_Vision Transformer Architecture Search

Python50

ScreenRecoder

这是一个基于FFmpeg使用 C# 、C++ 开发的最简单的屏幕录制软件。

C50

emby-watchparty

A synchronized watch party application for Emby media servers. Watch videos together with friends in real-time, no matt…

Python51

search

search projects, people, and tags