Vercel能架Laravel-admin嗎?!
先說結論
可以,其實他就是一種Serverless版的Laravel,但思維要改變,例如log變成標準輸出到平台,由平台提供調閱方式(像AWS有Cloudwatch);檔案儲存也是使用外部功能如AWS S3這種比較好管理,但S3要錢就是了...之後會想辦法找到功能類似的免費替代品
網路文章閱讀與疑難排解
- 這文章適合"入門"
- 但牽涉到描靜態資產就..
- 影片版-用CLI
- 遇到以下問題
php: error while loading shared libraries: libssl.so.10: cannot open shared object file: No such file or directory 可參考這篇 版本指定問題~
- 靜態資產一直404可參考這個庫描vercel.json,build換成你要描的路徑;另外可能要留意允許HTTPS的問題
- 這個Repository 沒描靜態資產,但如果有遇到API路徑問題,或許可以參考?
- 我自己在
route/web寫了一個/hihi的get router測試倒是不受影響,route/api就真的很尷尬-.-
- 我自己在
後來呢?
最後學上面的儲藏庫描成這樣
vercel.json
{
"version": 2,
"functions": {
"api/index.php": { "runtime": "vercel-php@0.6.1" }
},
"routes": [
{
"src": "/upload/images/(.*)",
"dest": "/public/upload/images/$1"
},
{
"src": "/vendor/laravel-admin/(.*)",
"dest": "/public/vendor/laravel-admin/$1"
},
{
"src": "/(.*)",
"dest": "/api/index.php"
}
],
"env": {
"APP_ENV": "prod",
"APP_DEBUG": "true",
"APP_CONFIG_CACHE": "/tmp/config.php",
"APP_EVENTS_CACHE": "/tmp/events.php",
"APP_PACKAGES_CACHE": "/tmp/packages.php",
"APP_ROUTES_CACHE": "/tmp/routes.php",
"APP_SERVICES_CACHE": "/tmp/services.php",
"VIEW_COMPILED_PATH": "/tmp",
"CACHE_DRIVER": "array",
"LOG_CHANNEL": "stderr",
"SESSION_DRIVER": "file"
}
}
終於看到正常的登入畫面!!
但登入後又顯示419頁面過期
🫠
應該跟session或令牌有關...?➡️把SESSION_DRIVER改為cookie就好了,但這樣真的好嗎🤔
還有另一案,跟下方修改檔案路徑有關,但因為跟這個json有關所以先note:
把上方json APP_CONFIG_CACHE到CACHE_DRIVER拔掉後會出現cache目錄錯誤(而且還沒進到Laravel,竟然是Symfony的錯誤);然後可能跟我改掉session儲存的storage路徑有關,SESSION_DRIVER改回file也會報錯檔案不存在-這些env雖然大部分在Laravel專案表面看似沒用到,但底層可能會吃??又或是
/tmp/下對應目錄不存在無法建立檔案(指session,cache不確定,但在改/tmp/前,session驅動為file頂多顯示Laravel 419頁面過期)
我後來想想,cache遇到的問題跟session一樣,因為我把CACHE_DRIVER拔掉,那Laravel預設會走file,問題是我描的路徑資料夾又不存在..不過其它設定真的就神奇了(Laravel include Symfony)
又然後呢?
因為storage不可寫,延伸很多問題,例如不能上傳頭像、沒辦法看到傳統Laravel log(它輸出到控制台那啥啦只剩accept跟exit
-.-)
可能要嘗試更換storage為/tmp...?(相關討論:blade模板沒有辦法編譯)-這個想法出自於,Vercel每個專案在作業系統的/tmp/有512MB的空間可以用
我總共改了這些檔案(不要理vercel.json跟app.php,那兩個是改壞的),並確保vercel.json內容是對的,就能上傳頭像了,不過旋即又遇到無法顯示頭像的問題,應該跟vercel.json目錄描法應該要一起改變有關-但我發現vercel.json好像描不到根目錄...等於說tmp資料夾可能只能供需要上傳檔案的function使用(搞不好還不能用??),而且這目錄的性質本來就是重開機就會消失..
效益不是很大,而且導致專案在不同環境難以使用(雖然可以用.env判斷環境,但有必要費這工嗎?),又全都改回來了..
乖乖用類似S3的桶子吧...?
老實說log就算成功生在/tmp也沒辦法很方便看到(Vercel介面根本看不到,得寫個程式叫出來=_=)
20240501開發日誌
- 找到一個supabase storage的driver,但只支援Laravel 10以上
;w;- 這種狀況延伸出兩種解決方法
- 一種是繼續讓
/tmp/可用(但效益不佳,這樣會變成一個Lambda專用的Laravel...) - 另種是接其他有現成driver的儲存平台
- 想說自己A一份Driver還不是現階段的我能隨心所欲的事情<-其實可以用fork的,像是Supabase Storage說自己是相容S3,但我用Laravel官方文件推薦的S3 driver連踩坑滿滿,調超多次設定網址都不太對,上GitHub看發現有不少人為了不同服務fork那份S3 driver改寫
- 一種是繼續讓
- 這種狀況延伸出兩種解決方法
- 儲存空間配置問題其實可以打這組關鍵字來查-
serverless laravel storage,Laravel架在AWS Lambda/Google App Engine會遇到的問題跟Vercel差不多,例如這篇他的結論跟我挺相似