12 KiB
MediaStationGo
A lightweight, polished, NAS-friendly private media center
Docker-first setup · Media library · Metadata · Playback · Downloads · Emby-compatible clients · Cloud playback
中文 · Quick Start · Docker Compose · FAQ · Live Demo
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.
- Scan files and enrich posters, summaries, years, seasons, and episodes.
- Play in the web UI or external 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
datadirectory before upgrades.
Who is it for?
- Beginners who want to edit one
docker-compose.ymland 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 an Emby-style API for third-party apps.
- Developers who want to study or extend a Go + React self-hosted media app.
Live Demo
- URL: https://mgo.3jzs.com
- Username:
admin - Password:
admin123
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
Docker Compose Recommended
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
volumesis the real path on your host/NAS. - The right side is the container path. Keep
/mediaand/downloadsunless you know why you are changing them. - In the web UI, create libraries with container paths such as
/media/Moviesor/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:roandD:/Downloads:/downloadsare 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
-
Create a library
- Go to the library page.
- Use a container path such as
/media/Movies. - Start a scan.
-
Connect qBittorrent
- Go to download client settings.
- If qBittorrent runs on the host, try
http://host.docker.internal:8085.
-
Configure metadata providers
- Go to system settings / external APIs.
- Add TMDb, Bangumi, TheTVDB, Fanart, Douban, or other providers when needed.
-
Use external players
- Add the server as an Emby/Jellyfin-compatible server.
- Server URL:
http://SERVER_IP:18080. - Log in with your MediaStationGo account.
-
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/downloadsas 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_concurrentto1. - 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-style APIs for many third-party apps |
| 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
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
- Telegram group: https://t.me/MediaStationGo
- NodeSeek: https://www.nodeseek.com/
- LINUX DO: https://linux.do/
Donation
If MediaStationGo saves you time, feel free to buy the author a bowl of noodles.
Star History
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.0license text, the code license is governed by LICENSE; commercial usage should additionally obtain author permission.
Made with ❤️ by ShukeBta



