[Docker] Youtube直播錄影伺服器建置

前言


本文希望建置起能永久自動運作的Youtube直播備份機
此專案目標定位為「錄影備份」,在發生直播主事後砍檔/砍歌時,我才會到伺服器尋找備份
是故,本專案不著重在錄影後的檔案處理,而是在磁碟滿時做自動刪檔

概觀

本專案核心目標

  • 以docker-compose技術,將建置server的難度維持在...還可以?
  • 監控指定的頻道,直播時自動錄製功能
  • 磁碟滿時自動刪檔功能
  • 也能手動下載指定影片

本文適合對象

  • 初級以上的linux操作基礎
  • 有自己的主機或NAS,沒有可以現在租 (不然你東西想放哪裡?)

功能說明

  • 手動下載會儲存在主機的 ../YoutubeRecordings/ 之下,可以在 docker-compose.yml修改
  • 可以在錄影完成後執行callback bash script
  • Jobber會在每日的01:00 UTC檢查磁碟使用率,並由舊檔案刪起,直到磁碟使用率降到設定值(或直到沒有檔案)

流程簡述

  1. Linux主機之Docker安裝和ReveseProxy建置
  2. git clone下來docker-compose建置檔案和config檔案
  3. 設定要自動錄影的直播頻道
  4. docker-compose up -d

架構

WWW

nginx Server (Reverse Proxy) (SSL證書申請、Renew)
├ Jobber (Cron) (定時檢查磁碟使用率,在高於設定之百分比時,自動由舊起刪除錄影)
├ live-dl (直播監控錄影機)
└ youtube-dl-server (WebUI下載器)

建置

Linux主機和Docker安裝

請完成此文的建置章節
琳的備忘手札 [Docker] Linux主機之Docker安裝和ReveseProxy建置
/2020/11/linux-docker-setup-revese-proxy.html
另外,本專案完全可以部屬在Windows10機器上,以圖為證
請自行轉換所有步驟在Windows執行

live-dl建置

  • cd到欲儲存影片的位置,例如我想放在/YoutubeDL
    mkdir /YoutubeDL && cd /YoutubeDL
  • git clone專案
    git clone https://github.com/jim60105/docker-youtube-dl.git
    本專案有submodule
    如果想要build docker image,請用git pull --recurse-submodules
  • 進入docker-live-dl資料夾
    cd docker-youtube-dl
  • 填入.env檔案
    cp .env_sample .env && vim .env
    • LETSENCRYPT_TEST: 此為設定申請測試SSL證書,現在給true,最後上線前才改false
    • LETSENCRYPT_EMAIL: Let's Encrypt在證書到期時通知你用的email,不會透過這個做驗證。建議正確填入。
    • HOST: WebUI網址
    • DelPercentage: 超過時要執行刪除功能的磁碟使用百分比
      (此處請按照你的磁碟大小估算。例如,我的磁碟大小是25G,我希望留下的空間至少為3G,3G / 25G =12%,設定為88)
  • 編輯 config_live-dl.yml 在map下建立名稱對應表,此表用於自動錄播時的資料夾建立
    vim config_live-dl.yml
  • 參考 Monitor/tama.sh 建立要做自動錄影的頻道,所有Monitor資料夾下的檔案都會被執行
    (資料夾內可以建立多個.sh檔)
    請自行為不同頻道替換Youtube URL和Channel Name的內容
    目前內建的直播錄影設定的是久遠たま的頻道
    cp Monitor/tama.sh Monitor/{{Channel Name}}.sh
    vim Monitor/{{Channel Name}}.sh
    內容
    nohup /bin/bash live-dl {{Youtube URL}} &>/youtube-dl/logs/live-dl-{{Channel Name}}.$(date +%d%b%y-%H%M%S).log &
  • 給所有*.sh執行權限
    find ./ -type f -iname "*.sh" -exec chmod +x {} \;
  • 起機囉~~
    docker-compose up -d
  • 檢查Container是否都有起來
    docker ps -a
  • 檢查SSL是否成功
    docker logs proxy_le -f
    注意紅框處,這樣就是成功
  • 將SSL申請改為正式申請
    注意
    因為Let's Encrypt針對網域正式申請有次數限制
    不論成功與否,做太多次就會鎖住
    發布前一定要測試成功再轉正

    或者,若你不需要SSL就把proxy_lecontainer停掉
    vim .env
    第一行LETSENCRYPT_TEST改為false
    重做compose
    docker-compose down -v && docker compose up -d
    檢查是否有成功要到正式證書
    注意紅框處,已沒有_test_字樣

  • 檢查自動錄影是否正常
    查看在../YoutubeRecordings/logs下是否有log輸出,並查看檔案內容
    ls ../YoutubeRecordings/logs
  • 檢查WebUI是否正常
    開啟你在此處設定的網址,看看是否能正常訪問網址

附註: 下載會員限定影片

此專案支援以youtube-dl的cookies file方式登入,可以下載會限影片
(youtube-dl的帳密登入從2019 bug到現在都沒有修好)

  • 安裝瀏覧器擴充功能,以匯出Netscape HTTP Cookie File
  • 瀏覧至Youtube網頁,登入你的帳號
  • 以擴充功能匯出youtube.com網域的所有cookie
  • 將匯出之cookie檔案重命名為cookies.txt
  • 取代專案目錄下的cookies.txt檔或用於後述的volume bind
注意
此cookies file包含了你的Youtube登入授權
任何人只要取得這個檔案,即可由你的身份登入Youtube
務必妥善保管

附註: 不部屬之單次執行

若要單次執行而不部屬,可直接docker run
我有build好了image在此: https://hub.docker.com/r/jim60105/live-dl

例如

docker run --rm
        -v D:\YoutubeDownload:/youtube-dl
        -v D:\YoutubeDownload\cookies.txt:/usr/src/app/cookies.txt
        jim60105/live-dl https://www.youtube.com/watch?v=GDOQTShjTQs

此格式如下
將{{}}填入你的內容,若不需要登入就不用傳入cookies file
cookies file之相關說明請見上一節

docker run --rm
        -v {{影片儲存資料夾}}:/youtube-dl
        -v {{cookies file,用於登入驗證}}:/usr/src/app/cookies.txt
        jim60105/live-dl {{Youtube網址}}

附註: 錄影完成Callback

本專案提供的 download_again.sh ,能在下載完成後等待一分鐘,再下載第二次
由於串流中錄影容易有漏秒,所以我會在「直播結束後至Youtube版權砲前」再下載一次

callback.sh傳入之參數

  __info "Calling callback function..."
  local cmd=( "$CALLBACK_EXEC" "${OUTPUT_PATH}.mp4" "$BASE_DIR/" "$VIDEO_ID" "$FULLTITLE" "$UPLOADER" "$UPLOAD_DATE" )
  nohup "${cmd[@]}" &>> "$OUTPUT_PATH.log" &

bash參數

  1. 產出檔案的完整路徑
  2. 產出檔案之所在資料夾
  3. 影片id
  4. 影片標題
  5. 影片上傳者
  6. 上傳日期

附註: Logging相關設定

本專案logging經過調整,可搭配Seq Log Server使用 (或是任何支援GELF http post的log server)

  • 參考這個repo部屬Seq: https://github.com/jim60105/docker-Seq
  • .env正確設置LOGSERVER路徑,格式為IP:埠號
  • Monitor/*.sh註解掉File logging,改用「STDOUT logging (with log tag)」方式呼叫
  • download_again.sh註解掉File logging,改用「Docker logs logging (with log tag)」方式呼叫
  • 啟動指令改用 docker-compose -f docker-compose.yml -f docker-compose.log-server.yml up -d
    或是將docker-compose.log-server.yml重命名為docker-compose.override.yml,使 docker-compose up -d 可以自動應用override檔

8 則留言:

  1. 您好,最近嘗試自己架了伺服器起來
    想請問哪邊能設定下載的畫質嗎?下載好的好像都只有720P

    回覆刪除
    回覆
    1. 在config中可以帶入youtube-dl參數
      預設是會下載最高畫質
      https://github.com/jim60105/docker-youtube-dl/blob/master/config_live-dl.yml#L67

      刪除
  2. 大大您好,
    首先先不好意思@@,我對程式語言還在摸索,有幾個問題想詢問一下:
    1. 請問大大提供的這個和Live-dl差別是只在於自動刪檔嗎?因為我在想Live-dl本身不關掉似乎就是永久自動備份?

    2. 最近只有在MacOS成功執行Live-dl,但Windows怎麼試不知為何都無法,我在想大大所提供的和Live-dl是否是代表只能在Linux和MacOS環境下進行?但看大大的照片似乎是在Windows環境下進行的(附註下面的照片似乎是windows?),忽然抱持希望想問一下。
    (Windows我都有下載Live-dl所需的Dependencies,但都說No platform/architecture supported, please install it manually.)

    3. 請問自動抓到的實況檔案出現的json和log的意義是?我刪除後也不會讓影片出錯,所以想說這個有需要留存嗎?

    不好意思問題有點多,若大大有閒時間再回覆就好。
    感謝感謝m(_ _)m

    回覆刪除
    回覆
    1. 1. 這個專案下就使用到live-dl,但是是我自己魔改過的版本。像是支援cookie登入、ts改成mp4,詳見commit log https://github.com/jim60105/live-dl
      2. 建議了解一下什麼是docker
      3. json是在下載的影片資訊;log是下載記錄,可以不用留

      刪除
    2. 謝謝回覆,我用VM裝了Ubuntu後照著大大的流程走,過程滿順利,但目前卡在一個點,請問「HOST: WebUI網址」指得是什麼網址?我看大大是用自己本身的blog的網址...而我就沒改了,直接用live-dl.domain.com。
      但在執行docker logs proxy_le -f的時候,等很久後跳出Verify error, please check log file.

      另外想請問一下這版的live-dl的實況錄製時間是否也是6小就會斷開?因為有時候vtuber會開超過6hr...上網找都沒找到解決方法QQ

      謝謝。

      刪除
    3. 1. 建議了解有關網域名稱、SSL憑證(我的專案下是用Let's Encrypt)。SSL不是必要的。
      2. 是這個issue吧 https://github.com/sparanoid/live-dl/issues/1
      就說明,6H似乎是youtube連結的有效期
      我在直播錄制上不是用streamlink而是youtube-dl,我不確定youtube-dl有沒有handle這個,但我猜hls應該沒有這個問題
      另外因為有自動重命名功能,不會有檔案覆寫狀況,再怎樣頂多是6H後斷開寫新的檔
      我沒有實測過6H,沒有肯定回答

      刪除
    4. 請問這個意思是要去申請自己的網域才能進行後續的步驟嗎?

      刪除
    5. 沒用網域reverse proxy沒得做routing
      你可以修改docker-compose file,把port開出去直接從ip:port連,就不使用reverse proxy了

      刪除