本文地址 山月的部落格
前端調研
剛開始調研伺服器渲染寫了一個 demo,正好對詩詞感興趣,就做了一個關於詩詞的站點,越寫越大,demo 變成了 DEMO,總的來說還是特別簡單。隨手掛到了伺服器下。
技術棧 ? Next.js + React + ApolloClient + Docker + Docker Compose
網址如下 ? 詩詞絃歌
後來又把自己的部落格掛了上去 ? 山月的部落格
後端支援
有了前端自然需要伺服器端支援,遵循著簡單方便好用易於上手的原則,在 parse-server 與 graphql 直接做抉擇,最後選了 graphql。並做了一個半成品的腳手架。支援以下功能
半成品腳手架掛到了github github.com/shfshanyue/…
- N+1 query
- 對資料庫欄位的按需載入
- 對特定 field 快取的中介軟體
- 接入 Sentry
- 接入 Consul kev/value store
- jwt 做身份認證
- 結構化錯誤資訊,並使用 sentry 報警
- 結構化日誌資訊,方便 elk 分析
- Docker 與 Docker Compose
- Traefik 做負載均衡(並沒有)與反向代理
這個腳手架在這裡有一個活的示例 todos.xiange.tech/playground 你需要先使用 shanyue/shanyue 做賬號密碼登入,登入的 mutation 是 createUserToken
那時候順手寫了一個前端的半半半半半成品腳手架,shfshanyu/react-apollo-starter,不知道現在還能不能跑得起來......
技術棧 ? Graphql + ApolloServer + Sequelize + Docker + JWT + (Traefik + Sentry + Consul)
Docker
部署的時候使用 docker + docker-compose,拉程式碼重啟解決。也經常在上邊做一些 docker 的測試
資料庫
後端依賴於資料,於是又用 docker 部署了 redis 與 postgres
當你接入監控後你會發現 postgres 從剛開始到使用所佔記憶體越來越大,這是有一部分資料從磁碟走到了記憶體。
VPN
資料庫放在公網訪問有點危險,於是又用docker建了vpn在本地開發訪問。使用了以下映象
雖然配好了,但還是很懵逼,目前只控制了某個 cidr 段走 vpn
配置服務
後端需要配置服務,用 docker 部署了 consul,只用它的 key-value 儲存,它的服務發現功能就這麼被浪費掉了
直接裸機安裝下載
consul agent -data-dir=/consul/data -config-dir=/consul/config -server -data-dir=/consul/data -advertise 172.17.68.39 -bootstrap-expect=1 -node=consul-server -bind=0.0.0.0 -client=0.0.0.0 -ui
複製程式碼
錯誤收集系統
無論前端還是後端都需要一個錯誤收集系統,於是又用 docker 部署了 sentry
sentry 依賴於 redis,postgres,我直接把依賴指向了與我的站點公用的 redis 和 postgres。一來以後遷移是一個問題,二來錯誤日誌過多甚至有可能把資料庫給弄爆掉。不過不管了,我的站點也就我一個使用者,沒有人用就沒有錯誤,沒有錯誤就沒有問題。
反向代理
前後端需要做一個反向代理,偶然選擇的 traefik,至少比 nginx 多個漂亮的介面,更方便的服務配置,還可以做服務發現,缺點就是文件少
traefik 也直接在裸機安裝,docker 起的直接配置 label,代理埠號直接使用 file。後來寫了篇文章簡單介紹了它
至於圖上為什麼有這麼多請求,那是因為 gitlab runner 每秒請求一次 gitlab。
日誌系統
搭建了 elk。但鑑於目前訪問最多的三個小夥伴分別是谷歌小蜘蛛,百度小蜘蛛以及我自己,自從搭建起來就沒有使用過
參考搭建: github.com/deviantony/…
有可能還需要一個 file beats,但是還沒弄過
程式碼倉庫
一些個人程式碼,學習記錄,以及自己一些關於山水花草的筆記需要一個地方放,搭了一個 gitlab,不過 gitlab 吃了我兩個多G的記憶體...
注意關掉 gitlab 的 prometheus 等依賴,不然會吃很多記憶體
CI
搭建了 gitlab 以後,為了配套 gitlab,後又搭建了 gitlab-runner,做 CI/CD。
不過目前只有部落格接入了 CI,因為只有部落格是 CI 之後才搭建的,感覺最先開始的前後端專案要廢掉...
DNS server
有了這麼多的服務,但有的東西不好放在公網,如 consul,redis,postgres以及gitlab,又記不住埠號,所以又搭了一個 dns server,方便在本地訪問
yum install dnsmasq
複製程式碼
檔案編輯與視窗管理
vim 和 tmux 在linux上是標配,提高在伺服器的工作效率,建議使用原始碼編譯安裝。yum即使配置了epel,裝的包版本也過低,且缺少很多功能。如 vim 開啟檔案目錄。以下是我自己 vim 和 tmux 的配置
自動化運維
初期折騰伺服器的時候經常需要重灌系統,並且我有兩臺伺服器,自動化運維是必不可少的了。一般我用 ansible 做一些伺服器的預配置,一些必備工具如 docker,git,vim,tmux,jq,auto-jump 的安裝。
由於我的伺服器都是 centos,playbook 寫的有點糟糕。
不過伺服器裡大部分服務通過 docker-compose 管理,小部分工具通過 ansible role 管理,實在沒有再自己寫 ansible-playbook。
當你有了一臺新伺服器時,你可以遵循以下步驟
- 使用 ansible-role 預配置環境
- 如果沒有 ansible-role,則自己寫 ansible-playbook
- 對於一些服務使用 docker 進行安裝
- 如果以上都無法解決,手動安裝
監控
使用 prometheus
+ node-exporter
+ cadvisor
監控主機以及容器,使用 grafana
做視覺化
當你需要監控主機,容器或者資料庫時,可以採用以下步驟
- 在 grafana 找一個 star 多的 Dashboard
- 根據需要微改一下
自從用上了時序資料庫,我的磁碟空間也日漸縮小
總結
簡而言之,伺服器還是以測試,學習和實踐居多,後續應該會加入 k8s。