2020-03-28 | UNLOCK

mStream + google-drive-ocamlfuse 谷歌雲盤無損音樂串流服務器

我又在想辦法榨乾VPS小雞的性能了。之前寫過mStream 建構個人音樂雲,但是搬瓦工49.9美元CN2 GT套餐的硬盤只有20G,能放的歌曲數量有限。如果使用google-drive-ocamlfuse掛Google Drive雲盤,就能利用Google Drive做為音樂存儲空間,還能達到代理谷歌雲盤,免翻牆聽歌的效果。

google-drive-ocamlfuse 配置

以下操作全部需要在root環境執行

安裝

首先必須安裝google-drive-ocamlfuse(以下簡稱gdfuse),由於gfuse的docker image很久沒維護了而且使用麻煩,這次採用直接安裝。

1
2
3
sudo add-apt-repository ppa:alessandro-strada/ppa
sudo apt-get update
sudo apt-get install google-drive-ocamlfuse

申請 Google Drive API & 授權

Google APIs & Services搜索啟用Google Drive API,申請一個其他類型的Oath2.0 Credential,記下Client IDClient Secrets。然後在VPS上執行以下指令

1
google-drive-ocamlfuse -headless -label googledrive -id [client id] -secret [client secret]

例子

1
google-drive-ocamlfuse -headless -label googledrive -id 123456-yyyyyyy.apps.googleusercontent.com -secret yyyyyyzzzzz

接著命令行會提示

1
Please, open the following URL in a web browser: https://accounts.google.com/o/oauth2/auth?client_id=##yourClientID##.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&response_type=code&access_type=offline&approval_prompt=force

用本機的瀏覽器打開網址,授權存取Google Drive。然後將得到的授權碼貼上到VPS命令行,按回車,出現Access token retrieved correctly就是成功了。

建立掛載點 && 掛載

1
2
mkdir ~/data/gdrive
google-drive-ocamlfuse -label music ~/data/gdrive -o allow_other

如果需要掛載不同的帳號,可以用label區別,不加label則gdfuse會使用預設值default

編輯 config

gfuse對於共享的檔案需要特別設定才會同步,因此需要修改config然後重新掛載。

1
2
fusermount -u ~/data/gdrive
vi ~/.gfuse/music/config

music部分換成你自己的label名,若沒有label,路徑就是~/.gfuse/default/config。修改以下內容:

1
2
read_only=true
shared_with_me=true

gfuse掛載的文件夾內容是和google drive同步的,若在vps上修改或新增檔案也會同步上傳到google drive。我只是要聽音樂沒必要上載,因此設置read_only避免vps動到google drive的檔案。修改後重新掛載回去

1
google-drive-ocamlfuse -label music ~/data/gdrive -o allow_other

設定開機自動掛載

在家目錄新增一個shell script, gdfuse.sh, 內容如下

1
2
3
#!/bin/bash
google-drive-ocamlfuse -label music ~/data/gdrive -o allow_other
exit 0

加上權限

1
chmod +x ~/gdfuse.sh

然後在/etc/rc.local加上~/gfuse.sh即可

mStream配置

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mstream:
build:
context: ./src/mstream
volumes:
- ./src/mstream/config.json:/config/config.json
- ./data/music:/music
- ./data/gdrive:/gdrive:ro
environment:
- PUID=1000
- PGID=1000
- USE_JSON=true
- TZ=Asia/Shanghai
networks:
- music
restart: always

config/config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"folders": {
"library": { "root": "/music" },
"gdrive": { "root": "/gdrive/.shared/lossless" }
},
"users": {
"user": {
"password":"password",
"vpaths": ["library"],
"lastfm-user": "username",
"lastfm-password": "password"
},
"google": {
"password":"password",
"vpaths": ["library", "gdrive"],
"lastfm-user": "username",
"lastfm-password": "password"
}
}

Dockerfile

1
2
3
4
FROM linuxserver/mstream:latest

RUN rm -rf /config/db
COPY config/config.json /config

路徑說明

gfuse預設是掛載整個google drive,而且自己上傳的檔案(擁用者是自已)與他人共用的檔案(擁有者是上傳者)是分開的。自己上傳的檔案會直接放在掛載目錄,他人共用的檔案放在掛載目錄/.shared。為了保持掛載內容的簡潔,我開了一個小號專門放音樂,然後把放主號的lossless文件夾共享給小號,因此我的目錄就是/gdrive/.shared/lossless,在mStream的網頁中會顯示成gdrive

成果

連上mStream,輸入帳號google,密碼password即可看到google drive己經掛載上去。等資料庫同步完就可以聽了。

幾個坑

  1. 共享的檔案和自己的檔案在不同的文件夾
    前面說明過,擁有者是自己的檔案和擁有者非自己的檔案分別在兩個不同的目錄,這樣路徑很難管理,而且掛載目錄下還會有共享檔案的馬甲,如圖所示。

    建議的解決方法是建一個小號,將需要的檔案由主號共享給小號,這樣只要存取.shared就行了。
  2. Docker container存取掛載目錄提示permission denied
    掛載時要加上-o allow_other,否則mStream會瘋狂崩潰。
  3. mStream瘋狂崩潰
    docker的volumes需要以ro方式binding。或者乾脆別用docker部署mstream,因為docker的權限管理和gdfuse不是很兼容,docker設計的時候並沒有考慮到和host交互的時的權限管理與同步。
  4. 重開機後,gdrive裡的內容消失
    檢查開機自動掛載,或者手動再掛載一次。
  5. mStream數據庫有重複的項目
    在Dockerfile執行rm -rf /config/db,就會強制mStream在每次build時重建數據庫。
  6. 服務器流量消耗大
    換個無限流量的服務器,或者設定mStream的編碼模式節省流量。
  7. 播wav時很卡
    wav對網絡要求較高,建議用flac格式。
  8. CPU佔用飆高
    我在Google Drive裡放了至少1000首歌吧,結果搬瓦工小雞在600多首的時候就卡了,還給我downclock讓我的VPS更卡。實測512MB/1vCPU的主機可以承受的歌曲數量是200-300首左右,超過這個數量就要換更高級的服務器。

結語

wav格式無損音樂檔案太大,超耗流量,沒有無限流量不要輕易嘗試。實際測試一陣子後發現還有掃描歌曲庫時CPU佔用飆高(然後就被BWH downclock,我的服務器就更卡了)、服務器重開後經常無法正確重新掛載google drive、或是重新掛載後的google drive權限和Docker產生各種愛恨情愁導致mStream抽風等問題,坑非常多,總的來說在配置低的機子上穩定性有待加強。

參考資料

評論加載中