??「gortal」一個(gè)使用 Go 語言開發(fā)的骡湖,超級(jí)輕量的堡壘機(jī)(跳板機(jī))服務(wù)
原文鏈接 https://elfgzp.cn/2019/12/09/gortal-site-project
由于最近在 Github 發(fā)了一個(gè)個(gè)人開源項(xiàng)目 - 「gortal」一個(gè)使用 Go 語言開發(fā)的,超級(jí)輕量的堡壘機(jī)(跳板機(jī))服務(wù)耳峦,于是想寫一篇博文來記錄一下自己的開源心得。
雖然不是第一次寫開源項(xiàng)目了焕毫,但是不能放過這次寫博文的熱情蹲坷,下一次就不知道啥時(shí)候?qū)懥恕?/p>
而且這篇文章的主要目的也是想分享一些開源的心得給讀者們。
產(chǎn)生 Idea ??
首先不管是個(gè)人項(xiàng)目還是開源項(xiàng)目都得有一個(gè) Idea邑飒,我先來說說 gortal
這個(gè)項(xiàng)目的 idea 是怎么來的循签。
筆者有一群熱愛開源技術(shù)的小伙伴們,TNK-Studio - technical studio
技術(shù)小作坊疙咸。
@mayneyao 同學(xué)的開源項(xiàng)目 中文獨(dú)立博客調(diào)研 需要服務(wù)器來跑爬蟲县匠,于是我們便將手上的閑置云計(jì)算資源都貢獻(xiàn)出來。
我想了想沒準(zhǔn)以后還會(huì)有這樣的需求罕扎,于是想到了公司使用的 jumpserver 堡壘機(jī)聚唐,想在組織的其中一個(gè)服務(wù)器搭起來丐重。
于是就 docker
一把梭腔召,兩三下就跑起來了。
結(jié)果就是扮惦,服務(wù)器卡死了 ...
去 jumpserver
的官方文檔看了一眼臀蛛。
Jumpserver 環(huán)境要求:
硬件配置: 2個(gè)CPU核心, 4G 內(nèi)存, 50G 硬盤(最低)
...
我們閑置的云計(jì)算資源基本都是 1 核 2 G
的配置,這配置要求玩不起呀崖蜜。
然后搜了一下有沒有其他同類型的浊仆,輕量一點(diǎn)的項(xiàng)目能拿來用,最后也是沒有找到合適的豫领。
自己來造 ??
既然沒有抡柿,那就自己來造!
Idea
有了等恐,就差程序員了洲劣,現(xiàn)在程序員也不缺了,就差用啥語言了课蔬。 這時(shí)候肯定是選世界上最好的語言 P ..
剛開始想考慮使用自己的本命語言 Python
囱稽,但是后來考慮到 Go
語言相比之下部署簡單,而且不管是生成的可執(zhí)行程序還是 docker
鏡像都非常的小二跋,于是果斷選擇了 Go
战惊。
那么應(yīng)該做成什么樣子的呢,因?yàn)轶w驗(yàn)過了 jumpserver
的終端交互的模式扎即,所以也想開發(fā)成相同的方式吞获。當(dāng)然為了輕量况凉,肯定是拋棄了 Web
,完全使用終端來交互各拷。
接下來就是開源的輪子選擇了茎刚,當(dāng)然在實(shí)現(xiàn)你的 Idea 的時(shí)候切忌從頭到位自己做,如果有優(yōu)秀的開源方案一定要拿來用撤逢,如果不滿足自己的需求在針對其進(jìn)行修改膛锭。在使用其中一個(gè)開源項(xiàng)目 manifoldco/promptui 的時(shí)候就發(fā)現(xiàn)不滿足需求的地方,這時(shí)候就可以 fork 一份到自己的倉庫蚊荣,自己改了自己用初狰。
最終根據(jù)技術(shù)方案選擇的輪子如下:
終端交互 - manifoldco/promptui
sshd 服務(wù)開發(fā) - gliderlabs/ssh
ssh 中轉(zhuǎn)客戶端 - helloyi/go-sshclient
其他個(gè)人開源項(xiàng)目 - fatih/color、op/go-logging 等等
項(xiàng)目 To-do ??
啥都選好了互例,準(zhǔn)備開始動(dòng)手了奢入,卻發(fā)現(xiàn)我該從哪里開始好呢?
這時(shí)候就需要列一個(gè) To-do
了媳叨,筆者使用的是 notion 的筆記工具腥光。使用看板將項(xiàng)目各個(gè)待實(shí)現(xiàn)的功能列出來,實(shí)現(xiàn)完一個(gè)將其拖入完成項(xiàng)中糊秆。
這樣不僅僅是自己可以梳理當(dāng)前需要做的武福,而且在多人協(xié)作開發(fā)也非常有幫助。
Notion 牛批6环W狡!
準(zhǔn)備好 To-do 就可以正式開工了汞舱,當(dāng)功能完成得差不多的時(shí)候伍纫,才是正式開始的時(shí)候。
加個(gè) CI ??
基礎(chǔ)功能做好了昂芜,準(zhǔn)備發(fā)布 Release
了莹规,Go
開發(fā)的程序只需要打包成不同平臺(tái)的二進(jìn)制可執(zhí)行文件就可以了。
但是那么多平臺(tái)泌神,一個(gè)一個(gè)的手動(dòng) build
然后上傳良漱,這哪是程序員干的事,這是 CI
- 持續(xù)集成(Continuous integration腻扇,簡稱CI)要干的事情债热。
在開發(fā)這個(gè)項(xiàng)目之前,有使用過 Travis CI
幼苛,它對 Github
開源項(xiàng)目是免費(fèi)的窒篱。 但是前一段時(shí)間 Github
推出了 Github Actions
于是抱著嘗嘗鮮的態(tài)度就選擇了它。
它使用起來也非常的簡單,點(diǎn)擊倉庫上方的 Actions
菜單就可以進(jìn)入倉庫的 Actions
配置頁面墙杯。
筆者在使用過程中覺得 Github Actions
跟 Travis CI
相比配并,其最大的優(yōu)勢是它的 Marketplace
,里面有非常多開源的別人寫好的 Actions
高镐,可以直接拿來簡單修改后使用溉旋,而且這些 Actions
當(dāng)然也是使用 Github
進(jìn)行版本管理的。
如何使用這里就不做詳細(xì)介紹了嫉髓,感興趣的可以查看 Github Actions 官方文檔观腊。
這里我給倉庫添加了一個(gè)「創(chuàng)建 Release」就自動(dòng)打包所有鏡像的 actions
,它的倉庫地址我也放在這里 ngs/go-release.action算行。
最后它的效果就是自動(dòng)幫你打包所有平臺(tái)的二進(jìn)制可執(zhí)行程序梧油,并壓縮上傳到 Github
。
來個(gè) Docker 鏡像 ??
當(dāng)然一個(gè)服務(wù)怎么少的了 Docker
鏡像州邢,還不了解 Docker
的同學(xué)可以看看阮一峰的 Docker 入門教程儡陨,筆者覺得 Docker
簡直就是 21 世紀(jì)程序員最偉大的發(fā)明之一。
而且官方的 Docker Hub
與 Github
結(jié)合使用簡直不能再香量淌。
不需要寫額外的 Github Actions
配置或其他的 CI
配置文件骗村,你只需要將你的倉庫與 Docker Hub
倉庫關(guān)聯(lián)起來,當(dāng)然不要忘了在你的倉庫放 Dockerfile
文件呀枢。
然后在 Docker Hub
倉庫配置好自動(dòng)構(gòu)建鏡像的邏輯胚股,就大功告成了。
而且 Docker Hub
的配置指引也做的非常好硫狞,非常容易理解信轿。
當(dāng)然這里非常非常重要的就是如果你是用的是 Go
語言進(jìn)行開發(fā)的項(xiàng)目,Docker
鏡像構(gòu)建一定要分成兩步残吩。一個(gè)是編譯鏡像,一個(gè)是正式鏡像倘核,這樣最終打包的鏡像只會(huì)包含一個(gè)二進(jìn)制文件泣侮,而不是將源碼一起打包。
FROM golang:1.12-alpine AS builder
# ... 省略代碼
FROM alpine:latest
LABEL maintainer="Elf Gzp <gzp@741424975@gmail.com> (https://elfgzp.cn)"
COPY --from=builder /opt/gortal ./
RUN chmod +x /gortal
# ... 省略代碼
本項(xiàng)目完整的 Dockerfile
鏈接如下紧唱,可以通過鏈接查看完整的 Dockerfile
活尊。
https://github.com/TNK-Studio/gortal/blob/master/Dockerfile
可以通過圖片看到使用分兩步構(gòu)建和一步構(gòu)建,最終打包的 Docker
鏡像大小差異是非常大的漏益。
讓 Readme 看著更高大上 ??
接下來是最重要的一步蛹锰,寫好 Readme
,它是你項(xiàng)目的封面绰疤。 很多時(shí)候我在瀏覽別人的開源項(xiàng)目铜犬,我可能都不在乎他這個(gè)項(xiàng)目做了什么,但從他的 Readme
寫的非常的好,我就給他點(diǎn)個(gè) star
??癣猾。
而且最好是能弄雙語的 Readme
敛劝,這樣能讓老外也能看懂,再不行就寫一份中文的纷宇,剩下交給谷歌翻譯夸盟。
當(dāng)然 Readme
最好不能都是字,要有演示的 GIF
像捶,這樣進(jìn)來的人第一眼就知道你這個(gè)項(xiàng)目是干啥的上陕。
這里筆者推薦 LICEcap 這個(gè)工具,本片文章所有的動(dòng)圖都是使用這個(gè)工具錄制的拓春。
Readme
寫好之后唆垃,給它加上 Badges
- 徽章 就是畫龍點(diǎn)睛之筆了。
Badges
的添加也是非常簡單的痘儡,我們只需要使用這個(gè)開源項(xiàng)目 shields辕万,并選擇我們想要的徽章、填寫好 URL沉删、復(fù)制粘貼到 Readme
渐尿,搞定。
復(fù)制粘貼后你會(huì)得到一個(gè) shields
的鏈接矾瑰,你只需要將鏈接改成 Markdown
的圖片鏈接格式就可以了砖茸,參考鏈接。
乞討 Star ??
項(xiàng)目做完了殴穴,當(dāng)然不能就放著不管了凉夯,除非你的項(xiàng)目非常非常的優(yōu)秀,否則他是不會(huì)自己漲星星的采幌。
以本項(xiàng)目為例劲够,筆者就去 V2EX 分享了自己的項(xiàng)目,也收獲了不少星星 ??休傍。
你需要去各種社區(qū)分享你的開源項(xiàng)目征绎,例如:V2EX、稀土掘金磨取、segmentfault 等等人柿。
讓你的項(xiàng)目給更多的人看到,同理寫博客也是如此忙厌,不分享出去就沒有正反饋凫岖,就少了很多動(dòng)力。
稍微總結(jié)一下 ??
筆者在這片文章沒有過多的去介紹項(xiàng)目的開發(fā)過程逢净,因?yàn)橛X得開發(fā)以外的過程更值得分享哥放。
開源項(xiàng)目不只是實(shí)現(xiàn)了 Idea
就完事了歼指,你可能還需要去讓它更加的方便維護(hù),自動(dòng)的做一些重復(fù)的事情婶芭。還要去包裝它分享它东臀,這樣才會(huì)有更多的人使用。當(dāng)有更多人時(shí)候的時(shí)候犀农,這個(gè)項(xiàng)目就需要花時(shí)間去迭代和維護(hù)了惰赋。
最后的最后,覺得文章還不錯(cuò)的呵哨,覺得這個(gè)開源項(xiàng)目還可以的赁濒,賞個(gè) star
?? 吧,https://github.com/TNK-Studio/gortal孟害。