[TOC] # Deploy first laravel 站建置紀錄 ###### tags: `Deploy` `學習紀錄` ## [Web](http://kawa.homes/) ## 事前準備 ### [domain](https://domains.google.com/) * 給人看的文字網址,取代 IP 數字顯示用的 * 一開始在 godaddy & google domain 中選擇了比較便宜且想要的一個網址,結果買了以後發現教學都是 godaddy 的... * 自立自強,自己看 vultr & google 的文件自己來 * google domain 的業務好像賣給 Squarespace 了 ### VPS * 租用一個能在世界各地連接到到 server * 會取得可連接到的 IP * 選擇 [vultr](https://www.vultr.com/) * 一開始連接信用卡時跑去網路上找能用的優惠碼(大都是給新用戶用的),看到一個買多少送多少的優惠上限 100 美,讓我本來想存個 10 美的預計當場乘 10,難過的故事... ### project * 上線顯示網頁的專案 * 我用的是 docker-compose 開啟以下環境建立 laravel 專案 * php-fpm * nginx * postgres ### 目前的結構 * kawa.homes * laravel 基底 * 有後端、簡易後台、前端頁面 * axum.kawa.homes * rust axum 基底 * 正在慢慢建構中的網站 api server * 預計用這個替換掉 laravel 的後端 * 完成後,把目前的 kawa.homes 指向 laravel.kawa.homes,把 kawa.homes 指向新建立的 vue 頁面 * 用遊戲講法,這就是下一個大改版本 * sg-vite.kawa.homes * vue vite 基底 * vue 後台頁面,有 router、auth、類似 vuex 的 pinia 功能 * vue.kawa.homes * vue vite 基底 * 第一次使用三級域名新增的,當時正狂熱著的遊戲,遊戲資訊查詢頁面 * surrealdb.kawa.homes * 之前接觸到的一個新的 DB,覺得有趣就架一個到線上了 ## 過程 * 在 [google domain](https://domains.google.com/) 買網址 kawa.homes * 一年(加不知道啥東東 5% 左右) 440 + 22 = 462 * 在 [Vultr](https://www.vultr.com/) 開啟他介紹說效能較好的 6美/月的 VPS * 地點我選了好像挺近的新地點 Osaka ,應該是大阪 * os ubuntu 20 * (選擇)加入 ssh key * (選擇)安裝 docker * (取消)備份 要 20% 額外費用 * vps 建立後使用 wsl2 的 ssh 連線進入 vultr 的 vps * apt-get update * apt-get install fail2ban * vim /etc/fail2ban/jail.local ``` [sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 findtime = 600 bantime = 1200 destmail = xxxx@gmail.com ``` * ![](https://i.imgur.com/CP1izyc.png) * service fail2ban restart * 查看紀錄 cat /var/log/fail2ban.log * git clone git@github.com:kawagami/docker-env.git * chmod -R 777 docker-env * cd docker-env * sh init.sh * 至此可用 IP 連上專案的首頁 * 設定 domain & IP 的連結 * 到 [vultr vps](https://my.vultr.com/dns/) 設定 domain * [參考](https://www.vultr.com/docs/introduction-to-vultr-dns/) * 到 [google domain](https://domains.google.com/) 設定 IP * [參考](https://support.google.com/a/answer/7538152) * ![](https://i.imgur.com/8UgCvve.png) * ![](https://i.imgur.com/OHDmAeQ.png) * domain & vps 商都設定完後即可使用 domain 直接連上 vps 的 IP 了 * 接下來預計處理 ssl 憑證 * [參考](https://www.vultr.com/docs/setup-letsencrypt-on-linux/) * 失敗,上面的做法是用非 docker 的作法 * [新參考](https://ithelp.ithome.com.tw/articles/10301801) * [ref](https://hub.docker.com/r/jonasal/nginx-certbot) * [好像能用](https://mindsers.blog/post/https-using-nginx-certbot-docker/) * [感覺能直接用情境 2 的方法](https://www.ccc.tc/article/letsencrypt) * [crontab 設定](https://blog.gtwang.org/linux/linux-crontab-cron-job-tutorial-and-examples/) * 使用失敗後的第三種方法情境一手動處理 ssl 憑證 * 隱患,後續嘗試修改成自動更新 * 使用情境 2 的方式失敗狀況 * ![](https://i.imgur.com/HxqfbCP.png) * 2023-02-05 調整專案成較易更新的結構 * 接著應該做 nginx 訪問次數的限制 * 2023-02-05 在 nginx 加入了一秒一次的請求限制 * [參考](https://hackmd.io/@winnienotes/SJyXK5TIj) * 還沒實測,不確定是否有效 * 體驗架站後才有感會有人硬 try 帳密,我的還是小到毫無觸及的那種未完成網站的說... * ![](https://i.imgur.com/l5wMyz4.png) * 2023-02-06 看 nginx logs 發現沒見過的警告訊息,待處理 * ![](https://i.imgur.com/UZy7pEy.png) * [參考](https://serverfault.com/questions/587386/an-upstream-response-is-buffered-to-a-temporary-file) * 2023-02-07 [rust 的範例](https://github.com/lazear/rust-backend-example/blob/master/nginx.conf)好像能用來參考處理 golang L3 domain 的狀況 * 2023-02-08 加上突然想做的小功能,像 HackMD 一樣,Ctrl + V 直接貼上圖片,目前是使用後端存入專案產生可用的實際 url * 2023-02-09 頁面目前看起來還是很陽春,調整頁面 & 專案結構拆分 * 想加個 google 登入之類的功能 * [參考](https://laravel.com/docs/9.x/socialite) * [FB 的參考](https://vocus.cc/article/605c2eaefd89780001efb9fb) * docker 發生預料外的權限問題 * 重新整理 docker-env 的 image * [參考](https://wshs0713.github.io/posts/fe688d83/) * [好像能參考](https://aschmelyun.com/blog/fixing-permissions-issues-with-docker-compose-and-php/) * [另一種思路](https://stackoverflow.com/questions/73654963/laravel-cloned-repository-docker-composer-unable-to-create-vendor) * 調整 VPS 使用者登入方式 * 之前都用 root 操作,權限問題坑越來越多 * 使用 root 登入後,新增一個 non-root user 給後續 deploy 使用 * [參考](https://blog.gtwang.org/linux/linux-useradd-command-tutorial-examples/) * [Linux 更改檔案擁有者與群組,chown 指令使用教學與範例](https://blog.gtwang.org/linux/linux-chown-command-tutorial/) * 這次權限問題處理過程 * 不使用 root 做 deploy 的操作 * [新增非 root user](https://blog.gtwang.org/linux/linux-useradd-command-tutorial-examples/)主 group 設定為 www-data * [在 VPS 上 useradd 之後 home 沒跟著建立使用者資料夾,手動建立並修改擁有者](https://blog.gtwang.org/linux/linux-chown-command-tutorial/) * 將 user 加入 docker group * 這裡應該在建立的時候一起加入 * 至此之後使用新建的 user 重新 deploy 後,可正常 composer i 或 tinker 而不會有任何權限的問題 * 發現新建的 user 沒有 tab 補全 & 上下鍵之前指令功能 * 新建的 user 預設 /etc/passwd 是使用 /bin/sh ,改成 /bin/bash 即可 * 找到的另一種改法 (目前沒實際用過) * ![](https://i.imgur.com/M47O4le.png) * 處理 nginx 接 rust rocket 的設定中 * 繼續摸索 websocket 中 * 加入[短網址功能](https://kawa.homes/short-url) * [想加入將取得的縮址直接塞入 ctrl + c 裡面](https://ithelp.ithome.com.tw/articles/10271977) * 在 nginx 加入 header * ![](https://i.imgur.com/marSZh7.png) * 加入多語系 中文 & 英文 & 日文 * 加上權限設定 & 後臺管理頁面 * 使用 cloudflare 的 ssl 憑證 * cloudflare 免費 ssl 設定到取得 nameserver 後去修改 domain nameserver 設定 * 在 domain 購買的地方(我是 google)將 nameserver 換成 cloudflare 的 nameserver * 再回到 cloudflare 設定後續 & 點擊確定 * 前面設定完後,專案遇到的問題 * 使用 nginx 重新導向 443 的 laravel 專案要把重導向關閉,不然會重導向過多次 * 且在 80 的區塊下加入 443 會做的處理,不然我這次遇到 404 * ![](https://i.imgur.com/kGeUuRj.png) * ~~目前狀況是我原本的免費憑證好像被 cloudflare 延長了~~ * 三個月後可能手動換成 cloudflare 的憑證,或讓 cloudflare 自動延長我憑證的時間 * [參考](https://easonwang.gitbook.io/web_basic/shi-yong-cloudflare) * 加上自學的 CICD 功能 * 目前 master 更新後會自動 deploy 上 vultr * 感覺很多地方可以改善,像是 composer install、migrate、docker 都有可以加強的地方 * 目前的結構 * kawa.homes * laravel 基底 * 有後端、簡易後台、前端頁面 * axum.kawa.homes * rust axum 基底 * 正在慢慢建構中的網站 api server * 預計用這個替換掉 laravel 的後端 * 完成後,把目前的 kawa.homes 指向 laravel.kawa.homes,把 kawa.homes 指向新建立的 vue 頁面 * 用遊戲講法,這就是下一個大改版本 * sg-vite.kawa.homes * vue 後台頁面,有 router、auth、類似 vuex 的 pinia 功能 * vue.kawa.homes * 第一次使用三級域名新增的,當時正狂熱著的遊戲,遊戲資訊查詢頁面 * surrealdb.kawa.homes * 之前接觸到的一個新的 DB,覺得有趣就架一個到線上了 * 相關資訊 ``` What(什麼): SurrealDB是一個動態和適應性的業務平台,提供集成的先進數據庫解決方案、工具和服務。它將數據庫層、查詢層以及API和身份驗證層結合為一個平台,支持實時API、安全權限,並提供靈活的數據建模和高效的查詢。 Why(為什麼): SurrealDB的設計旨在加速實時應用程序的構建和擴展,同時提供靈活的數據建模、實時查詢和動態權限管理。它的目標是讓開發者能夠更容易地構建和擴展實時應用程序。 How(如何): SurrealDB結合了數據庫、實時API層和安全權限,使開發者能夠直接從網頁瀏覽器和客戶端設備連接和查詢數據。它支持多種查詢方式,包括SurrealQL、GraphQL、CRUD支持,並允許使用JavaScript和WebAssembly擴展數據庫功能。 Where(在哪裡): SurrealDB旨在嵌入到應用程序中,可以作為嵌入式數據庫庫使用,也可以作為分佈式集群中的數據庫服務器運行。它使用Rust編程語言構建,旨在在各種環境中運行,包括雲端和本地。 ``` ## [想加的功能](https://hackmd.io/@kawagami/HkaZjzDTo) ## [遇到的問題](https://hackmd.io/@kawagami/HJtlnzP6i) # 加新專案的流程 * 在 docker-env 中加入以下資料 * 該專案資料夾 * docker-compose.dev.yml * docker-compose.prod.yml * dev.conf * prod.conf * .evn 中 COMPOSE_FILE 的值加入上面對應的 .yml 檔案 * 開發環境 => docker-compose.dev.yml * 線上環境 => docker-compose.prod.yml