Tube Archivist: власний архів YouTube на сервері

Tube Archivist — медіасервер для особистого архіву YouTube. Він завантажує окремі відео, плейлисти й цілі канали, зберігає описи, обкладинки та субтитри, індексує все це для пошуку й дає змогу дивитися ролики в браузері без реклами та без підключення до YouTube. Корисно, коли потрібно зберегти навчальні курси, записи конференцій або відео, які можуть зникнути.
Що вміє Tube Archivist
- підписка на канали й плейлисти з автоматичним завантаженням нових відео;
- черга завантаження з вибором якості;
- повнотекстовий пошук за назвами, описами й субтитрами;
- позначки про перегляд і продовження з місця зупинки;
- вбудований плеєр і розширення для браузера, яке додає відео в архів однією кнопкою;
- інтеграція з медіасерверами Jellyfin і Plex.
Вимоги до сервера
Tube Archivist використовує Elasticsearch, тому до пам’яті він вибагливіший за більшість self-hosted сервісів.
- Пам’ять: від 4 ГБ, з яких не менше ніж 2 ГБ потрібно Elasticsearch.
- Процесор: від 2 ядер.
- Диск: визначається розміром архіву. Година відео в якості 1080p займає приблизно 1–2 ГБ.
- Архітектура: готовий образ Elasticsearch від проєкту зібрано лише для amd64.
Для архіву зручно взяти VPS із великим диском. Знадобляться Docker і Docker Compose — див. інструкцію зі встановлення.
Крок 1. Підготовка системи
Elasticsearch потребує збільшеного ліміту відображень пам’яті. Без цього параметра контейнер не запуститься:
echo 'vm.max_map_count=262144' | sudo tee /etc/sysctl.d/99-elasticsearch.conf
sudo sysctl --system
Крок 2. Файл Compose
mkdir -p ~/tubearchivist && cd ~/tubearchivist
Створіть docker-compose.yml:
services:
tubearchivist:
container_name: tubearchivist
restart: unless-stopped
image: bbilly1/tubearchivist
ports:
- "127.0.0.1:8000:8000"
volumes:
- media:/youtube
- cache:/cache
environment:
- ES_URL=http://archivist-es:9200
- REDIS_CON=redis://archivist-redis:6379
- TA_HOST=https://tube.example.com
- TA_USERNAME=admin
- TA_PASSWORD=надійний_пароль
- ELASTIC_PASSWORD=інший_надійний_пароль
- TZ=Europe/Kyiv
depends_on:
- archivist-es
- archivist-redis
archivist-redis:
image: redis
container_name: archivist-redis
restart: unless-stopped
expose:
- "6379"
volumes:
- redis:/data
depends_on:
- archivist-es
archivist-es:
image: bbilly1/tubearchivist-es
container_name: archivist-es
restart: unless-stopped
environment:
- "ELASTIC_PASSWORD=інший_надійний_пароль"
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- "xpack.security.enabled=true"
- "discovery.type=single-node"
- "path.repo=/usr/share/elasticsearch/data/snapshot"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es:/usr/share/elasticsearch/data
expose:
- "9200"
volumes:
media:
cache:
redis:
es:
На що звернути увагу:
TA_HOST— повна адреса, за якою ви відкриватимете сервіс, обов’язково з протоколом. У разі розбіжності вхід у систему не спрацює.ELASTIC_PASSWORDмає збігатися в обох сервісах.TA_USERNAMEіTA_PASSWORD— облікові дані для першого входу.- Том
mediaзберігає завантажені відео. Щоб розмістити архів на окремому диску, замініть його на шлях до каталогу, наприклад/mnt/storage/youtube:/youtube.
Склад змінних змінюється від версії до версії, тому перед встановленням звірте файл з актуальним зразком у репозиторії проєкту tubearchivist/tubearchivist на GitHub.
Крок 3. Запуск
docker compose up -d
docker compose logs -f tubearchivist
Перший запуск триває одну-дві хвилини: Elasticsearch створює індекси. Коли в журналі з’явиться повідомлення про готовність вебсервера, сервіс доступний.
Крок 4. Доступ за доменом
Порт опубліковано лише на локальній адресі. Опублікуйте сервіс через зворотний проксі з HTTPS — у Nginx Proxy Manager або Nginx. Адреса має збігатися зі значенням TA_HOST.
Для швидкої перевірки без домену підійде SSH-тунель; у цьому разі вкажіть TA_HOST=http://localhost:8000:
ssh -L 8000:127.0.0.1:8000 root@203.0.113.10
Крок 5. Перші завантаження
Увійдіть із логіном і паролем із файлу Compose.
Окреме відео або плейлист. Відкрийте розділ Downloads, натисніть Add to download queue, вставте посилання або ідентифікатор і запустіть чергу кнопкою Start download.
Підписка на канал. У розділі Channels натисніть Subscribe to Channels і вставте посилання на канал. Потім у Downloads натисніть Rescan subscriptions — у чергу потраплять відео каналу.
Якість. Типово завантажується найкраща доступна якість, і архів швидко росте. У Settings → Application → Download Format можна обмежити роздільну здатність, наприклад 720p.
Розклад. У Settings → Scheduling налаштуйте автоматичну перевірку підписок і запуск черги — наприклад, раз на добу вночі.
Обхід обмежень YouTube
YouTube періодично обмежує завантаження з адрес дата-центрів: з’являються помилки з вимогою підтвердити, що ви не бот. У налаштуваннях застосунку можна імпортувати cookies свого акаунта й задати паузу між завантаженнями. Не завантажуйте сотні відео поспіль без пауз — це швидко призводить до тимчасового блокування.
Резервна копія та оновлення
Самі відео лежать у томі media у вигляді звичайних файлів. Індекс і метадані зберігаються знімками: у Settings → Application налаштуйте створення знімків за розкладом.
Оновлення:
cd ~/tubearchivist
docker compose pull
docker compose up -d
Перед оновленням прочитайте примітки до випуску: під час переходу між великими версіями змінюються змінні оточення й версія Elasticsearch.
Якщо не запускається
- Контейнер
archivist-esпостійно перезапускається. Не заданоvm.max_map_countабо бракує пам’яті. - Помилка прав доступу до даних Elasticsearch. Якщо використовується каталог замість тому, призначте власника:
chown 1000:0 -R шлях/до/каталогу. - Не вдається увійти. Значення
TA_HOSTне збігається з адресою в браузері. - Завантаження завершуються помилкою. Оновіть образ: разом із ним оновлюється завантажувач yt-dlp, який має встигати за змінами YouTube.
Юридичний бік
Завантаження відео може суперечити умовам використання YouTube й авторському праву. Використовуйте архів для особистого перегляду та для матеріалів, які ви маєте право зберігати, і не публікуйте свій екземпляр у відкритому доступі.


