[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
```
* 
* 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)
* 
* 
* 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 的方式失敗狀況
* 
* 2023-02-05 調整專案成較易更新的結構
* 接著應該做 nginx 訪問次數的限制
* 2023-02-05 在 nginx 加入了一秒一次的請求限制
* [參考](https://hackmd.io/@winnienotes/SJyXK5TIj)
* 還沒實測,不確定是否有效
* 體驗架站後才有感會有人硬 try 帳密,我的還是小到毫無觸及的那種未完成網站的說...
* 
* 2023-02-06 看 nginx logs 發現沒見過的警告訊息,待處理
* 
* [參考](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 即可
* 找到的另一種改法 (目前沒實際用過)
* 
* 處理 nginx 接 rust rocket 的設定中
* 繼續摸索 websocket 中
* 加入[短網址功能](https://kawa.homes/short-url)
* [想加入將取得的縮址直接塞入 ctrl + c 裡面](https://ithelp.ithome.com.tw/articles/10271977)
* 在 nginx 加入 header
* 
* 加入多語系 中文 & 英文 & 日文
* 加上權限設定 & 後臺管理頁面
* 使用 cloudflare 的 ssl 憑證
* cloudflare 免費 ssl 設定到取得 nameserver 後去修改 domain nameserver 設定
* 在 domain 購買的地方(我是 google)將 nameserver 換成 cloudflare 的 nameserver
* 再回到 cloudflare 設定後續 & 點擊確定
* 前面設定完後,專案遇到的問題
* 使用 nginx 重新導向 443 的 laravel 專案要把重導向關閉,不然會重導向過多次
* 且在 80 的區塊下加入 443 會做的處理,不然我這次遇到 404
* 
* ~~目前狀況是我原本的免費憑證好像被 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