metube

Python 언어로 만든 내 서버에 설치하는 서비스, 동영상 관련 프로젝트예요. 전 세계 개발자 1.5만 명이 스타(좋아요)를 눌렀어요. 깃허브에 올라온 설치파일이 없는 개발자용 프로젝트예요. 마지막 수정은 오늘이에요.

👩‍💻 개발자용⭐ 1.5만 내 서버에 설치하는 서비스동영상

원문 소개: Self-hosted video downloader for YouTube and other sites (web UI for yt-dlp)

바로 쓰기

내 상황에 맞는 방법을 하나 고르세요.

① 설치 명령어 · README에서 찾았어요

docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube

윈도우는 'PowerShell', 맥은 '터미널' 앱을 열고 붙여넣은 뒤 Enter를 누르세요.

브라우저에서 바로 열기 · 설치 없음

내 것으로 가져오기

git clone https://github.com/alexta69/metube.git

git clone: 개발자가 코드를 받는 명령어예요. 수정 내역까지 함께 받아져요.

한눈에 보기

인기⭐ 15,208 스타 · 🍴 1,137 포크
무료 여부AGPL-3.0
무료로 쓸 수 있어요. 단, 고쳐서 남에게 배포하면 고친 코드도 공개해야 해요.
만든 언어Python
최신 버전2026.11.06 · 2026년 11월 6일
활동만든 날 2019.11.30 · 최근 수정 오늘 · 열린 이슈(질문) 4개

설명서 (README)

만든 사람이 쓴 원문 설명서예요. 영어가 어렵다면 한국어로 번역해서 보기 →

MeTube

Build Status Docker Pulls

MeTube is a self-hosted web UI for yt-dlp. Paste a link from YouTube or hundreds of other sites, and it downloads to your server:

  • Video, audio, subtitles and thumbnails — from single videos, whole playlists or entire channels.
  • Subscriptions to channels and playlists, which queue new uploads as they appear.
  • Per-download choices of quality, format and folder, plus server-wide yt-dlp options and presets.

📖 Guides, recipes and a troubleshooting FAQ live in the wiki — many feature requests are already a recipe there, so check it before filing one.

screenshot1

Quick start

docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube

Or with Docker Compose:

services:
  metube:
    image: ghcr.io/alexta69/metube
    container_name: metube
    restart: unless-stopped
    ports:
      - "8081:8081"
    volumes:
      - /path/to/downloads:/downloads

Then open http://<host>:8081 in your browser. Images are multi-arch (amd64/arm64), and also published on Docker Hub as alexta69/metube.

Configuration

MeTube is configured with environment variables: -e NAME=value on the docker run command line, or the environment: section in Compose. Defaults are the Docker image's; outside Docker, the directories default to the working directory.

Runtime and permissions

Variable Default Description
PUID / PGID 1000 User and group MeTube runs as and writes files with. Legacy UID/GID also work.
UMASK 022 Umask for the files MeTube creates.
CHOWN_DIRS true Make PUID:PGID the owner of the download, state and temp directories at startup. With false, MeTube's user must already have access.
LOGLEVEL INFO DEBUG, INFO, WARNING, ERROR, CRITICAL or NONE.
ENABLE_ACCESSLOG false Log every HTTP request.
DEFAULT_THEME auto UI theme: light, dark, or auto to follow the system.

Downloads

Variable Default Description
MAX_CONCURRENT_DOWNLOADS 3 Downloads that run at once; the rest wait their turn.
DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT 0 Default for the Items Limit field: how many entries of a playlist or channel to download (0 = all).
CLEAR_COMPLETED_AFTER 0 Seconds before finished and failed downloads leave the Completed list (0 = never).
DELETE_FILE_ON_TRASHCAN false Also delete the file from disk when its entry is removed from Completed. ask prompts each time.
SUBSCRIPTION_DEFAULT_CHECK_INTERVAL 60 Default minutes between checks of a subscription.
SUBSCRIPTION_SCAN_PLAYLIST_END 50 Newest entries fetched each time a subscription is checked.
SUBSCRIPTION_MAX_SEEN_IDS 50000 Video IDs remembered per subscription, to bound the state file's size.

Directories

Variable Default Description
DOWNLOAD_DIR /downloads Where downloads are saved.
AUDIO_DOWNLOAD_DIR same as DOWNLOAD_DIR Where audio-only downloads are saved, to keep them apart from video.
TEMP_DIR /downloads Where files are written while downloading. An SSD or tmpfs is faster, but on a RAM disk interrupted downloads can't resume.
STATE_DIR /downloads/.metube Where MeTube keeps its queue, history, subscriptions and uploaded cookies.
CUSTOM_DIRS true Show a Download Folder field under Advanced Options, to save into a subfolder of the download directory.
CREATE_CUSTOM_DIRS true Let that field create folders that don't exist yet.
CUSTOM_DIRS_EXCLUDE_REGEX (^|/)[.@].*$ Folders left out of the field's suggestions; the default hides names starting with . or @. Empty hides none.
DEFAULT_FOLDER Folder the field starts with, relative to the download directory. Requires CUSTOM_DIRS.
DOWNLOAD_DIRS_INDEXABLE false Serve browsable listings of the download directories.

File naming

Templates use yt-dlp's output template syntax. How MeTube applies them is explained in Output templates.

Variable Default Description
OUTPUT_TEMPLATE %(title)s.%(ext)s Filename for downloads.
OUTPUT_TEMPLATE_PLAYLIST %(playlist_title)s/%(title)s.%(ext)s Filename for items added from a playlist. Empty means OUTPUT_TEMPLATE.
OUTPUT_TEMPLATE_CHANNEL %(channel)s/%(title)s.%(ext)s Filename for items added from a channel. Empty means OUTPUT_TEMPLATE.
OUTPUT_TEMPLATE_CHAPTER %(title)s - %(section_number)02d - %(section_title)s.%(ext)s Default filename for each chapter when Split by chapters is on.

yt-dlp

Variable Default Description
YTDL_OPTIONS {} Options for every download, as a JSON object — see yt-dlp options.
YTDL_OPTIONS_FILE Path to a JSON file of such options. Reloaded when it changes; wins over YTDL_OPTIONS for the same key.
YTDL_OPTIONS_PRESETS {} Named option bundles, picked per download in the UI.
YTDL_OPTIONS_PRESETS_FILE Path to a JSON file of presets. Reloaded when it changes; wins over YTDL_OPTIONS_PRESETS for the same name.
ALLOW_YTDL_OPTIONS_OVERRIDES false Show a field for per-download yt-dlp options in the UI. Trusted users only: it allows running commands in the container.
YTDL_NIGHTLY_UPDATE_TIME Use nightly yt-dlp builds, upgrading and restarting daily at this time (HH:MM, 24-hour).

Web server and network

Variable Default Description
HOST 0.0.0.0 Address to listen on. The default is every IPv4 interface; * (or empty) adds IPv6; :: is IPv6 only.
PORT 8081 Port to listen on.
URL_PREFIX / Base path, for serving MeTube under a subpath of a reverse proxy.
HTTPS false Serve HTTPS directly, using CERTFILE and KEYFILE.
CERTFILE / KEYFILE Paths to the HTTPS certificate and key.
PUBLIC_HOST_URL download/ Base URL for the links to completed files. The default is relative to MeTube itself; set a full URL if the files are served from elsewhere.
PUBLIC_HOST_AUDIO_URL audio_download/ The same, for audio downloads.
CORS_ALLOWED_ORIGINS Comma-separated origins allowed to call MeTube from other sites, as browser extensions and bookmarklets do. * allows any site, so prefer naming them.
ALLOW_PRIVATE_ADDRESSES false Allow URLs on private and internal addresses, turning off SSRF protection. Needed for Fake-IP proxy clients, not for ordinary proxies — details.
ROBOTS_TXT Path to a robots.txt file to serve, mounted into the container.

yt-dlp options

yt-dlp options are JSON objects keyed by yt-dlp's API option names, which differ from its command-line flags (converter). They apply at three levels, and for an option set at more than one, the more specific level wins:

  1. Global — YTDL_OPTIONS and YTDL_OPTIONS_FILE, for every download.
  2. Presets — YTDL_OPTIONS_PRESETS and YTDL_OPTIONS_PRESETS_FILE, picked per download under Advanced Options.
  3. Overrides — typed into the UI for a single download, when ALLOW_YTDL_OPTIONS_OVERRIDES is on.
environment:
  - 'YTDL_OPTIONS={"writesubtitles": true, "subtitleslangs": ["en", "de"], "updatetime": false}'

The yt-dlp options guide covers presets, overrides and option files in detail, and the YTDL_OPTIONS Cookbook has ready-made recipes.

Guides

The wiki covers everything beyond the reference above:

Keeping yt-dlp up to date

Sites change constantly, and yt-dlp keeps up with frequent releases. A new MeTube image is published automatically for every yt-dlp stable release, so keep your container updated — watchtower can do it for you. To follow yt-dlp's nightly builds instead, set YTDL_NIGHTLY_UPDATE_TIME.

Troubleshooting and support

MeTube is only a UI for yt-dlp, so most download failures are yt-dlp's. Reproduce them with yt-dlp inside the container, and once a set of options works there, carry it over to YTDL_OPTIONS:

docker exec -ti metube sh
cd /downloads
yt-dlp <url>

The Troubleshooting FAQ covers common problems. Ask questions in Discussions; issues are for bugs in MeTube itself.

Scope and contributing

MeTube's scope is deliberately narrow: it downloads well, and stops once the file is written. Tagging and library organization belong to dedicated tools — point beets (headless, scriptable), MusicBrainz Picard (GUI, acoustic fingerprinting) or Lidarr (full library manager) at your AUDIO_DOWNLOAD_DIR.

Feature requests that fit this scope are welcome, and so are pull requests — for a change that isn't obvious, start a discussion first. CONTRIBUTING.md has the scope policy and how to build and run MeTube locally.

자주 묻는 질문

metube 무료로 쓸 수 있나요?

네, AGPL-3.0 라이선스로 공개된 오픈소스예요. 무료로 쓸 수 있어요. 단, 고쳐서 남에게 배포하면 고친 코드도 공개해야 해요. 깃허브 저장소에서 누구나 내려받을 수 있어요.

metube 설치는 어떻게 하나요?

터미널에 `docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube` 명령을 붙여넣으면 설치돼요. 이 페이지 '설치 명령어'에서 복사 버튼을 누르면 1초 만에 복사돼요. 자세한 옵션은 아래 README 설명서에 있어요.

코딩을 몰라도 metube 쓸 수 있나요?

조금 어려울 수 있어요. 완성된 설치파일이 없는 개발자용 프로젝트라서 터미널 명령어나 개발 환경이 필요해요. 처음이라면 Codespaces로 브라우저에서 먼저 실행해 보세요.

metube 인기는 어느 정도인가요?

깃허브 스타 15,208개, 포크 1,137개를 받은 프로젝트예요. 2019년에 만들어졌고 마지막 수정은 오늘이에요. 스타가 1만 개를 넘으면 전 세계적으로 검증된 인기 프로젝트로 봐요.

복사했어요