2026-06-13 14:45:58 +08:00

MediaStationGo

MediaStationGo Logo

A lightweight, polished, NAS-friendly private media center

Docker-first setup · Multi-user management · Media library · Metadata · Downloads · Emby-protocol clients · Cloud playback

中文 · Quick Start · Docker Compose · FAQ · Live Demo

Go React Docker License


What is it?

MediaStationGo is a self-hosted media center for personal libraries, home NAS, and home-theater users.

It helps you:

  • Manage movies, TV shows, anime, variety shows, music, and adult libraries.
  • Create multiple user accounts for family members, friends, or different devices.
  • Scan files and enrich posters, summaries, years, seasons, and episodes.
  • Play in the web UI, or log in with a MediaStationGo account from Emby-protocol apps such as Infuse, VidHub, SenPlayer, and Emby clients.
  • Connect qBittorrent for search, subscriptions, downloads, and post-download organization.
  • Connect OpenList, CloudDrive2, WebDAV, and other storage backends with STRMURL or 302 redirect playback.
  • Run on NAS, mini PCs, VPS, Linux, Windows Docker Desktop, or any Docker-friendly host.

The project is moving fast. Keep a backup of the data directory before upgrades.


Key Highlights

  • One server, many clients: deploy MediaStationGo once; you do not need to run a separate Emby server.
  • Emby-protocol compatibility: add the server in third-party players as an Emby/Jellyfin-compatible server, then log in with your MediaStationGo username and password.
  • Multi-user management: supports admins, regular users, account enable/disable, expiry dates, device management, Bot registration, and redeem codes.
  • Local + cloud media in one place: manage local disks, download folders, OpenList, CloudDrive2, WebDAV, and other storage backends from one panel.
  • Download-to-library workflow: connect qBittorrent for search, subscriptions, download completion organization, and metadata matching.
  • NAS-friendly: simple Docker Compose deployment, important data stored under data/, suitable for low-power NAS and mini PCs.

Who is it for?

  • Beginners who want to edit one docker-compose.yml and start the service.
  • NAS users who want a low-resource media center for local disks and cloud storage.
  • PT/download users who want downloads, organization, metadata, and playback in one panel.
  • External-player users who want to log in to Emby-protocol third-party apps with one MediaStationGo account.
  • Family-sharing users who want separate user accounts without deploying a separate media server for each person.
  • Developers who want to study or extend a Go + React self-hosted media app.

Live Demo

The demo is for feature preview only. Do not save private API keys, tracker cookies, or personal data there.


Quick Start

Docker Compose is the recommended path. Beginners do not need .env, bare-metal binaries, or source builds.

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

Edit docker-compose.yml:

vi docker-compose.yml

Start:

docker compose up -d

Open:

http://SERVER_IP:18080

Default login:

Username: admin
Password: admin123

The repository docker-compose.yml is intentionally simple and does not require .env.

Focus on this part:

volumes:
  - ./data:/data
  - ./cache:/cache
  - ./media:/media:ro
  - ./downloads:/downloads

Meaning:

Host path Container path Purpose
./data /data Database, users, settings; back this up
./cache /cache Cache; safe to clean when needed
./media /media Media libraries; use /media/... in the web UI
./downloads /downloads Download directory and organization source

If your NAS paths are:

/vol1/1000/Media
/vol1/1000/Downloads

change the compose file to:

volumes:
  - ./data:/data
  - ./cache:/cache
  - /vol1/1000/Media:/media:ro
  - /vol1/1000/Downloads:/downloads

environment:
  MEDIASTATION_MEDIA_DIR: /vol1/1000/Media
  MEDIASTATION_DOWNLOAD_DIR: /vol1/1000/Downloads

Rules:

  • The left side of volumes is the real path on your host/NAS.
  • The right side is the container path. Keep /media and /downloads unless you know why you are changing them.
  • In the web UI, create libraries with container paths such as /media/Movies or /media/TV.
  • Do not write NAS absolute paths as ./vol1/...; ./ means a folder under the current compose directory.
  • On Windows Docker Desktop, paths like D:/Media:/media:ro and D:/Downloads:/downloads are fine.

Minimal compose example

The root docker-compose.yml follows this style:

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

    # Browser: http://SERVER_IP:18080
    ports:
      - "18080:8080"

    # Let the container reach qBittorrent running on the host:
    # qB URL example: http://host.docker.internal:8085
    extra_hosts:
      - "host.docker.internal:host-gateway"

    volumes:
      # Application data. Back this up before upgrades.
      - ./data:/data
      - ./cache:/cache

      # Beginners can keep ./media and ./downloads.
      # NAS users should replace the left side with real absolute paths.
      - ./media:/media:ro
      - ./downloads:/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_DATABASE_DB_PATH: /data/mediastation.db
      MEDIASTATION_CACHE_CACHE_DIR: /cache

      # If you changed ./media or ./downloads above,
      # set these to the same real host paths.
      MEDIASTATION_MEDIA_DIR: ./media
      MEDIASTATION_MEDIA_CONTAINER_DIR: /media
      MEDIASTATION_DOWNLOAD_DIR: ./downloads
      MEDIASTATION_DOWNLOAD_CONTAINER_DIR: /downloads

First-time Setup

  1. Create a library

    • Go to the library page.
    • Use a container path such as /media/Movies.
    • Start a scan.
  2. Connect qBittorrent

    • Go to download client settings.
    • If qBittorrent runs on the host, try http://host.docker.internal:8085.
  3. Configure metadata providers

    • Go to system settings / external APIs.
    • Add TMDb, Bangumi, TheTVDB, Fanart, Douban, or other providers when needed.
  4. Use external players

    • Add the server as an Emby/Jellyfin-compatible server.
    • Server URL: http://SERVER_IP:18080.
    • Use the username and password created in MediaStationGo. No separate Emby server is required.
    • Admins can create regular users in the web UI or Bot so each person can log in with their own account.
  5. Use cloud playback

    • Configure OpenList, CloudDrive2, WebDAV, or another provider in storage settings.
    • Choose STRMURL or 302 redirect playback in the admin settings.
    • The enabled option takes priority. If both are disabled, playback falls back to the normal server playback path.

Update, Backup, Logs

Update

docker compose pull
docker compose up -d

Logs

docker logs -f mediastation-go

Backup

Back up:

data/

It contains the database, users, settings, and runtime state. cache/ is usually not important.

Stop

docker compose down

FAQ

1. The web page does not open

Check the container:

docker ps
docker logs --tail=100 mediastation-go

Then open:

http://SERVER_IP:18080

2. The library cannot find files

Most cases are path mistakes.

  • Docker maps media to /media.
  • In the web UI, use /media/Movies, not the original NAS path.
  • Docker maps downloads to /downloads; use /downloads as the organization source when possible.

3. qBittorrent cannot connect

If qBittorrent is on the host, try:

http://host.docker.internal:8085

If qBittorrent is on another machine, use that machine's LAN IP.

4. NAS CPU usage is high

Suggested settings:

  • Set ffprobe.max_concurrent to 1.
  • Enable automatic organization, scrape-after-scan, and boot cloud scan only when you really need them.
  • Avoid frequent full-library scans on large libraries. Prefer manual scan or scheduled night sync.

5. Should I use .env?

Beginners should not. Editing docker-compose.yml directly is easier to understand.

.env is useful only for advanced users who reuse the same compose file on multiple machines. The repository keeps docker-compose.simple.env.example, but it is not the main path.


Features

Area Features
Libraries Movies, TV shows, anime, variety, music, adult content
Metadata NFO, local artwork, TMDb, TheTVDB, Bangumi, Douban, Fanart, JavBus/JavDB
Playback Web playback, HTTP Range, HLS transcoding, direct links, STRMURL, 302 redirect
External clients Emby-protocol compatible APIs; MediaStationGo accounts can log in to third-party players
User management Multi-user accounts, admin/regular users, expiry dates, device management, Bot registration and redeem codes
Downloads qBittorrent, site search, subscriptions, post-download organization
File manager Browse, organize, copy, move, hardlink, symlink
Operations Task queue, recycle bin, duplicate files, notifications, logs
AI OpenAI-compatible API, AI search, recommendations, assistant

Screenshots

Preview
Login Home
Login Home
Libraries Player
Libraries Player

Development

Regular users should use Docker. Developers can run:

go run ./cmd/server

Frontend:

cd web
npm install
npm run dev

Tests:

go test ./...
cd web && npm run build

Community and Friends


Donation

If MediaStationGo saves you time, feel free to buy the author a bowl of noodles.

WeChat Donation QR

Star History

Star History Chart

License and Non-Commercial Statement

This project uses GPL-3.0 as its base license. See LICENSE.

The maintainers also state and request:

  • The project is intended for personal learning, home NAS, self-hosted media, non-commercial research, and community collaboration.
  • Without explicit written permission from the author, do not use this project or derivative versions for commercial resale, paid hosting, paid SaaS, pre-installed commercial devices, closed-source redistribution, or other profit-oriented commercial use.
  • For commercial cooperation, enterprise deployment, custom development, integrated redistribution, or commercial authorization, contact the author first.
  • If there is any interpretive difference between this README and the formal GPL-3.0 license text, the code license is governed by LICENSE; commercial usage should additionally obtain author permission.

Made with ❤️ by ShukeBta

S
Description
No description provided
Readme 76 MiB
Languages
Go 74.3%
TypeScript 25.6%