Skip to main content
EmbyTok provides official Docker images with multi-architecture support (AMD64/ARM64). The container includes both the web UI and file server API for serving local media files.

Quick Start with Docker Compose

The fastest way to get EmbyTok running is with Docker Compose:
1

Prepare media directory

Create a directory for your video files:
mkdir -p ./media
Copy your video files into this directory, or use an existing media path.
2

Create docker-compose.yml

Create a docker-compose.yml file with the following content:
docker-compose.yml
services:
  embytok:
    build:
      context: .
      dockerfile: Dockerfile
    image: embytok:local
    container_name: embytok
    restart: unless-stopped
    ports:
      - "${EMBYTOK_PORT:-5176}:5176"
    environment:
      HOST: "0.0.0.0"
      PORT: "5176"
      SERVE_WEB: "true"
      WEB_ROOT: "/app/dist"
      LAN_CONFIG_FILE: "/app/data/lan-media-config.json"
      MEDIA_ROOT: "/media"
      BROWSE_ROOTS: "/media"
    volumes:
      - "./lan-media-config.json:/app/data/lan-media-config.json"
      - "${EMBYTOK_MEDIA_PATH:-./media}:/media:ro"
3

Start the container

Launch EmbyTok with Docker Compose:
docker compose up -d --build
The application will be available at http://localhost:5176
The media volume is mounted as read-only (:ro) for security. Remove :ro if you need write access.

Using Pre-built Images

Pull and run official images from GitHub Container Registry:
1

Pull the image

docker pull ghcr.io/<owner>/<repo>:main
Available tags:
  • main - Latest development build
  • v* - Stable version releases
2

Run the container

docker run -d --name embytok --restart unless-stopped \
  -p 5176:5176 \
  -e HOST=0.0.0.0 \
  -e PORT=5176 \
  -e SERVE_WEB=true \
  -e WEB_ROOT=/app/dist \
  -e LAN_CONFIG_FILE=/app/data/lan-media-config.json \
  -e MEDIA_ROOT=/media \
  -e BROWSE_ROOTS=/media \
  -v /path/to/lan-media-config.json:/app/data/lan-media-config.json \
  -v /path/to/media:/media:ro \
  ghcr.io/<owner>/<repo>:main

Environment Variables

Configure EmbyTok’s behavior with these environment variables:
VariableDefaultDescription
HOST0.0.0.0Listen address (0.0.0.0 for all interfaces)
PORT5176Internal container port
SERVE_WEBtrueEnable static web file serving
WEB_ROOT/app/distWeb application directory
LAN_CONFIG_FILE/app/data/lan-media-config.jsonConfiguration persistence file
MEDIA_ROOT/mediaDefault media directory for initial setup
BROWSE_ROOTS/mediaComma-separated browsable directories
NODE_ENVproductionNode.js environment mode
The BROWSE_ROOTS variable restricts which directories can be accessed through the admin panel. Only mount trusted directories.

Volume Mounts

Required Volumes

  1. Configuration file (recommended):
    -v ./lan-media-config.json:/app/data/lan-media-config.json
    
    Persists service configuration across container restarts.
  2. Media directory:
    -v /path/to/media:/media:ro
    
    Mount your video files (read-only recommended).

Multiple Media Libraries

Mount multiple directories for different media types:
volumes:
  - "./lan-media-config.json:/app/data/lan-media-config.json"
  - "/mnt/movies:/media/movies:ro"
  - "/mnt/tvshows:/media/tvshows:ro"
  - "/mnt/videos:/media/videos:ro"
Then set BROWSE_ROOTS=/media/movies,/media/tvshows,/media/videos

Docker Compose Configuration Options

Basic Setup (Web + API only)

Minimal setup without media volumes:
docker-compose.simple.yml
services:
  embytok:
    image: ghcr.io/<owner>/<repo>:main
    container_name: embytok
    restart: unless-stopped
    ports:
      - "5176:5176"
    environment:
      SERVE_WEB: "true"
Use with: docker compose -f docker-compose.simple.yml up -d

Custom Port

Change the exposed port using environment variables:
EMBYTOK_PORT=8080 docker compose up -d
Or modify docker-compose.yml:
ports:
  - "8080:5176"

Custom Media Path

Use existing media directory:
EMBYTOK_MEDIA_PATH=/mnt/storage/videos docker compose up -d

Building from Source

Standard Build

Build the Docker image locally:
1

Clone the repository

git clone https://github.com/your-username/embytok.git
cd embytok
2

Build with Docker Compose

docker compose build
3

Run the container

docker compose up -d

Multi-Architecture Build

Build for AMD64 and ARM64:
docker buildx create --use
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t embytok:latest \
  --load .
Multi-architecture builds require Docker Buildx and QEMU emulation for cross-platform builds.

Export Image for NAS

Build and save image for transfer to NAS systems:
# Build for AMD64
docker buildx build --platform linux/amd64 -t embytok:amd64 --load .

# Save to tar file
docker save -o embytok_amd64.tar embytok:amd64
Transfer embytok_amd64.tar to your NAS and load:
docker load -i embytok_amd64.tar

Dockerfile Overview

The multi-stage Dockerfile:
FROM node:20-alpine AS build
WORKDIR /app
COPY package.json ./
RUN npm install --no-audit --no-fund
COPY . .
RUN npm run build

FROM node:20-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production \
    HOST=0.0.0.0 \
    PORT=5176

COPY --from=build /app/dist ./dist
COPY --from=build /app/server ./server

RUN mkdir -p /app/data /media
EXPOSE 5176
CMD ["node", "server/lan-media-server.mjs"]
Build stages:
  1. Build: Installs dependencies and builds frontend
  2. Runtime: Minimal production image with Node.js server

Admin Panel Configuration

After starting the container, configure media services:
1

Access admin panel

Navigate to http://localhost:5176/adminDefault password: admin
2

Browse and select directories

Use the file browser to navigate mounted volumes and select media directories.
3

Create media services

  • Enter a service name (e.g., “Movies”, “TV Shows”)
  • Select the directory path
  • Save configuration
4

Connect from clients

Use the service name when connecting from web, iOS, or Android clients.

Accessing EmbyTok

Web Browser

  1. Open http://<server-ip>:5176
  2. Select File Service mode
  3. Enter server address: http://<server-ip>:5176
  4. Choose media service from dropdown
  5. Connect and start browsing

iOS Native App

  1. Select Folder mode
  2. Server: http://<server-ip>:5176
  3. Password/Token: Enter service name or ID
  4. Connect

Health Check

Verify the container is running:
# Check container status
docker ps | grep embytok

# Check logs
docker logs embytok

# Test API endpoint
curl http://localhost:5176/api/folder/ping

Troubleshooting

Check:
  • Port mapping: docker ps shows port 5176
  • Firewall rules allow traffic on port 5176
  • Container logs: docker logs embytok
Solution: Ensure SERVE_WEB=true is set in environment variables.
Check:
  • Volume mount path is correct
  • Files exist in mounted directory
  • Permissions allow container user to read files
Solution: Verify with:
docker exec embytok ls -la /media
Solution: Ensure lan-media-config.json is mounted:
touch ./lan-media-config.json
chmod 666 ./lan-media-config.json
Restart container after creating the file.
Solution: The container runs as non-root user app. Ensure mounted volumes have appropriate permissions:
chmod -R 755 ./media

Next Steps

Android App

Connect to your Docker server from Android

iOS App

Build iOS app to access Docker-hosted media

File Server Guide

Learn about folder server configuration

NAS Deployment

Deploy on Synology, QNAP, or other NAS devices

Build docs developers (and LLMs) love