本文關鍵字:tcb上安裝onemanager,onemanger實用做站
在《利用大容量網盤onedrive配合公有云做你的nas及做站》中,我們初步談到了使用onemanager配合雲函數或雲主機做站的投入和嘗試,前文說到不能在騰訊cloudbase上安裝onemanager,但實際上經過嘗試發現是可以的:
注意:雲函數產品建議使用包月免費或包月套餐嘗試。按量如果控制不好,可能會因為代碼問題或外部攻擊造成高額費用,比如騰訊scf按量下如果免費額度用完,24小時才停機不會立馬停,而且它的計費即使你帳號沒錢也會往負了扣,極可能超支。包月則不會有預算超支。
所以我們接下來講解在包月免費的tcb上安裝它:
在tcb上安裝onemanager
首先,從http://github.com/qkqpttgf/OneManager-php下載代碼,先不上傳到cloudbase空間,本地修改platform/tencentscf.php的GetGlobalVariable($event){...}函數體中的$_GET = $event['queryString']為$_GET = $event['queryStringParameters'],這樣?admin等參數傳遞就正確了。然而程序還是得不到入口index.main_handler,直接使用cloudbase後臺的新建函數只能用index.man作入口,手動修改入口可以執行,但程序會進一步得不到環境變量,我們可以統一使用cloudbase cli命令行工具全面定製:
cloudbase cli是一個nodejs程序。按騰訊產品文檔在本地安裝後tcb login --key登錄,填入你的用戶access keyid和keysecret,在本地做一個待上傳目錄,在此目錄下寫如下內容的cloudbaserc.json,同時準備子目錄:functions/myonemanager/下放經過上面修改的onemanager代碼,到待上傳目錄:
{
"envId": "你的環境",
"functionRoot": "functions",
"functions":
[{
"name": "myonemanager",
"timeout": 6,
"runtime": "Php7",
"installDependency": true,
"handler": "index.main_handler有了這個就不用改入口了",
"envVariables": {
"Region":"ap-shanghai",
"SecretId":"你的騰訊accesskeyid",
"SecretKey":"你的騰訊accesskeysecret",
"admin": "你要定義給後臺的密碼,明文",
"sitename": "站點名,找一個在線base64轉碼後,將結果填這",
"hideFunctionalityFile": "1",
"disableChangeTheme": "1",
"passfile": "密碼文件名",
"theme": "主題名",
"timezone": "8",
"disktag": "盤名1|盤名2",
"盤名1": "{\"Drive_custom\": \"on\",\"Drive_ver\": \"CN\",\"client_id\": \"你的azure app portal for onemanager的client app id明文\",\"client_secret\": \"你的azure app portal for onemanager的client app secretbase64明文找一個base64轉成結果填這\",\"diskname\": \"明文找一個base64轉成結果填這\",\"domain_path\": \"明文找一個base64轉成結果填這,形式是域名1:/目錄1|域名2:/目錄2......\",\"refresh_token\": \"看接下來手動獲取方法\",\"token_expires\": 9999999999}",
"盤名2": "{同盤1生成方式}"
}
}]
}
可以看到盤名1後面的參數是一個字串,然而它本身也是個json,將json轉成字串供cloudbase識別的方法是將所有"都轉義一下,如果你嫌麻煩實在想圖方便,可以在正常非cloudbase區或vps上直接搭建一個onemanager,註冊盤,然後將結果填到上面。
上面的clientid和secretid,正常方式安裝od是自動的,但其實你也可以手動https://portal.azure.cn/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps去生成,我這裡是互聯,新註冊->任何組織目錄中的帳戶,多租戶->重定向url:web,https://scfonedrive.github.io,這裡可以直接看到client id了。看左邊列,api權限不用設置,證書和密碼->新客戶端密碼,期限永久,就看到secret了。
至於refresh token,也可以從https://service-36wivxsc-1256127833.ap-hongkong.apigateway.myqcloud.com/release/scf_onedrive_filelistor手動得到。token_expires填10位9。
cloudbaserc.json準備完畢,最後cd到這個目錄,cloudbase functions:deploy,這樣你就得到了一個完全手動和程序化的安裝方式,後臺改變256m到128m,觸發路徑/或/xx不能是/xx/結尾,以後deploy,提示覆蓋直接確認即可。
更多讓onemanager實用做站的考慮
我們知道,雲函數主要是處理api結果的傳送,在這裡不能傳遞大量數據,保證一次http所有結果在最短的ms裡完成,否則按調用次數和調用時長及內存佔用的雲函數會相應產生相對高的花費,查雲函數後臺,確保每次2ms內的調用是合理和正常的。故onedrive和託管onemanager等程序的空間(這二者最好是同一地域的,比如世紀互聯配國內空間,國際版配港區空間)對提高調用速度至關重要,有些onedrive列表程序支持,前後端分離,雲函數純粹後端只返回api結果不包前端渲染。api速度快(列文件很快)如fodi.
處理靜態資源問題和定製模板:
由於od是一個特殊的程序,它定位於網盤文件列表而非帶資源的網站展示,它綁定的工作域名下,每一個路徑,如果不是顯式的?setup這種參數,就是文件調用,因此,它對所有js,css的引用,都是外部的(如果發現網頁慢,將它換到快點的cdn地址)。這也是為了上面說的一次request/respon能儘快調用完成,所以od的templates都是不帶靜態asserts的。------ 所以並不推薦將靜態template資源放在代碼theme下,然後根據判斷它是不是網盤文件進一步處理。
談到od的templates,其實它也是網頁模板技術的運用(本質就是定義一系列開頭結尾組合形式的模板變量塊,然後替換),你可以查看已有template自己寫一個比如最簡單的那個nexmoe1.html,,模板體邏輯通常是這樣的:開頭icon處理塊,管理相關的style,前端樣式style塊,外部css和jss引用,渲染omf,md文件的邏輯塊(require一個maked js然後根據md content在頁面直接render),。列文件和目錄的邏輯(其實又包括div邏輯塊,js邏輯塊),blaaaa.....。
加速和cdn:
我們知道網站速度至關重要。不光對用戶對運營也是如此。要實用做站的話,必須要配cdn。對於cdn加速,比如要求文件靜態化為各個url路徑為目錄名的目錄下的index,html。onemanager有沒有相關方面的支持呢
od是帶緩存的。主要是存取到雲函數backend空間的system temp目錄中。這樣列文件和目錄的時間會相對變少。程序效果和體驗會最佳。od內部對text文件(包括markdown)都是有1800秒緩存的。這個過程在common.php中,查看fetch files,render list主要函數,gethiddenpass()等類似函數。
對於md,上面說到它是在客戶端通過client js來渲染從服務端拉取下來的內容的(如果發現大量md的網站慢,有可能這個js處在慢速cdn上,換個),,對於html則是跟md一樣直接下載並output不經過主題渲染處理,相當於部署了一個靜態頁面。
本來它是在客戶端生成的。其實在服務端也可完成md,比如下載一個php的渲染器mdparser.php,再在index.php中include 'mdparser.php';common.php中在對應headmd處理位置的地方作修改:
$parser = new HyperDown\Parser;
$headmd = str_replace('<!--HeadmdContent-->', $parser->makeHtml(fetch_files(spurlencode(path_format(urldecode($path) . '/head.md'),'/'))['content']['body']), $tmp[0]);
$tmp = splitfirst($html, '<!--MdRequireStart-->');
$html = $tmp[0];
$tmp = splitfirst($tmp[1], '<!--MdRequireEnd-->');
在服務端生成html作為api結果返回會稍微增加api時間,但結果更合理。你可以進一步把渲染好的html結果保存在cache中對應md地址的子目錄index.html(而不是原來的raw md content)中,然後下回fetch到這個md地址,直接取cache,按處理html的方式,直接render。這樣的“全站偽靜態”對cdn也是有用的。
你也可以修改refreshcache的邏輯,od有一個refresh cache,它是先切換到當前目錄下就refresh哪個目錄的cache。且只工作在手動管理模式下,其實你可以把它做成自動靜態化的,瀏覽到對應md位置就生成對應index.html到cache/md命名子目錄下。然後在後臺做一個一鍵md全站生成html到cache靜態化按鈕和功能。或者生成到cloudbase的存儲中。---- 已經有這樣的程序了,靜態網站生成器作為雲函數,生成靜態文件到oss,雲存儲。像極了自動化的github page action。
ps:。一般來說,根據我的“硬件使用3年即報廢,不應超過500元/年,總共應投入1500,超過這個都是這個時代的奢侈品“的嘴強說法,如果做站用的虛擬資產也可歸其中,則3年期的1t互聯或淘寶買的個人/家庭office365官方版+3年最低配的1h1m雲主機或虛擬主機也正好落入這個區間(office365已改為microsoft365,感覺國際個人/家庭版的沒有國際商用版的快,優點是前者多了個文件vault庫)。可惜bat等不支持終身制虛擬主機(onemanager需要php curl擴展)或終身制彈性雲主機,否則這就是一種不虐心雲主機的省事投資了。
在前面,我們為oc增加了wp功能和note功能,現在為od增加靜態html功能,同樣基於做站和靜態化考慮,現在,我們對od開刀了。可能最終,我們要類群暉的dsm based on a netdisk,將od類似的理念打造一個mineportal os,而不僅僅停留在一個file lister,這是比雲主機黑群還實用的方案,比如myportalnew: email是必須的+類似微信自託管的chat app+file sync+mateos app那些。。
(此處不設回覆,掃碼到微信參與留言,或直接點擊到原文)