🚪「gortal」一個使用 Go 語言開發的,超級輕量的堡壘機(跳板機)服務html
因爲最近在 Github 發了一個我的開源項目 - 「gortal」一個使用 Go 語言開發的,超級輕量的堡壘機(跳板機)服務,因而想寫一篇博文來記錄一下本身的開源心得。git
雖然不是第一次寫開源項目了,可是不能放過此次寫博文的熱情,下一次就不知道啥時候寫了。程序員
並且這篇文章的主要目的也是想分享一些開源的心得給讀者們。github
首先不論是我的項目仍是開源項目都得有一個 Idea,我先來講說 gortal
這個項目的 idea 是怎麼來的。golang
筆者有一羣熱愛開源技術的小夥伴們,TNK-Studio - technical studio
技術小做坊。docker
@mayneyao 同窗的開源項目 中文獨立博客調研 須要服務器來跑爬蟲,因而咱們便將手上的閒置雲計算資源都貢獻出來。segmentfault
我想了想沒準之後還會有這樣的需求,因而想到了公司使用的 jumpserver 堡壘機,想在組織的其中一個服務器搭起來。bash
因而就 docker
一把梭,兩三下就跑起來了。服務器
結果就是,服務器卡死了 …markdown
去 jumpserver
的官方文檔看了一眼。
Jumpserver 環境要求:
硬件配置: 2個CPU核心, 4G 內存, 50G 硬盤(最低)
…
咱們閒置的雲計算資源基本都是 1 核 2 G
的配置,這配置要求玩不起呀。
而後搜了一下有沒有其餘同類型的,輕量一點的項目能拿來用,最後也是沒有找到合適的。
既然沒有,那就本身來造!
Idea
有了,就差程序員了,如今程序員也不缺了,就差用啥語言了。 這時候確定是選世界上最好的語言 P ..
剛開始想考慮使用本身的本命語言 Python
,可是後來考慮到 Go
語言相比之下部署簡單,並且不論是生成的可執行程序仍是 docker
鏡像都很是的小,因而果斷選擇了 Go
。
那麼應該作成什麼樣子的呢,由於體驗過了 jumpserver
的終端交互的模式,因此也想開發成相同的方式。固然爲了輕量,確定是拋棄了 Web
,徹底使用終端來交互。
接下來就是開源的輪子選擇了,固然在實現你的 Idea 的時候切忌從頭到位本身作,若是有優秀的開源方案必定要拿來用,若是不知足本身的需求在針對其進行修改。在使用其中一個開源項目 manifoldco/promptui 的時候就發現不知足需求的地方,這時候就能夠 fork 一份到本身的倉庫,本身改了本身用。
最終根據技術方案選擇的輪子以下:
終端交互 - manifoldco/promptui
sshd 服務開發 - gliderlabs/ssh
ssh 中轉客戶端 - helloyi/go-sshclient
其餘我的開源項目 - fatih/color、op/go-logging 等等
啥都選好了,準備開始動手了,卻發現我該從哪裏開始好呢?
這時候就須要列一個 To-do
了,筆者使用的是 notion 的筆記工具。使用看板將項目各個待實現的功能列出來,實現完一個將其拖入完成項中。
這樣不只僅是本身能夠梳理當前須要作的,並且在多人協做開發也很是有幫助。
Notion 牛批!!!
準備好 To-do 就能夠正式開工了,當功能完成得差很少的時候,纔是正式開始的時候。
基礎功能作好了,準備發佈 Release
了,Go
開發的程序只須要打包成不一樣平臺的二進制可執行文件就能夠了。
可是那麼多平臺,一個一個的手動 build
而後上傳,這哪是程序員乾的事,這是 CI
- 持續集成(Continuous integration,簡稱CI)要乾的事情。
在開發這個項目以前,有使用過 Travis CI
,它對 Github
開源項目是免費的。 可是前一段時間 Github
推出了 Github Actions
因而抱着嚐嚐鮮的態度就選擇了它。
它使用起來也很是的簡單,點擊倉庫上方的 Actions
菜單就能夠進入倉庫的 Actions
配置頁面。
筆者在使用過程當中以爲 Github Actions
跟 Travis CI
相比,其最大的優點是它的 Marketplace
,裏面有很是多開源的別人寫好的 Actions
,能夠直接拿來簡單修改後使用,並且這些 Actions
固然也是使用 Github
進行版本管理的。
如何使用這裏就不作詳細介紹了,感興趣的能夠查看 Github Actions 官方文檔。
這裏我給倉庫添加了一個「建立 Release」就自動打包全部鏡像的 actions
,它的倉庫地址我也放在這裏 ngs/go-release.action。
最後它的效果就是自動幫你打包全部平臺的二進制可執行程序,並壓縮上傳到 Github
。
固然一個服務怎麼少的了 Docker
鏡像,還不瞭解 Docker
的同窗能夠看看阮一峯的 Docker 入門教程,筆者以爲 Docker
簡直就是 21 世紀程序員最偉大的發明之一。
並且官方的 Docker Hub
與 Github
結合使用簡直不能再香。
不須要寫額外的 Github Actions
配置或其餘的 CI
配置文件,你只須要將你的倉庫與 Docker Hub
倉庫關聯起來,固然不要忘了在你的倉庫放 Dockerfile
文件。
而後在 Docker Hub
倉庫配置好自動構建鏡像的邏輯,就大功告成了。
並且 Docker Hub
的配置指引也作的很是好,很是容易理解。
固然這裏很是很是重要的就是若是你是用的是 Go
語言進行開發的項目,Docker
鏡像構建必定要分紅兩步。一個是編譯鏡像,一個是正式鏡像,這樣最終打包的鏡像只會包含一個二進制文件,而不是將源碼一塊兒打包。
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 # ... 省略代碼 複製代碼
本項目完整的 Dockerfile
連接以下,能夠經過連接查看完整的 Dockerfile
。
能夠經過圖片看到使用分兩步構建和一步構建,最終打包的 Docker
鏡像大小差別是很是大的。
接下來是最重要的一步,寫好 Readme
,它是你項目的封面。 不少時候我在瀏覽別人的開源項目,我可能都不在意他這個項目作了什麼,但從他的 Readme
寫的很是的好,我就給他點個 star
⭐️。
並且最好是能弄雙語的 Readme
,這樣能讓老外也能看懂,再不行就寫一份中文的,剩下交給谷歌翻譯。
固然 Readme
最好不能都是字,要有演示的 GIF
,這樣進來的人第一眼就知道你這個項目是幹啥的。
這裏筆者推薦 LICEcap 這個工具,本片文章全部的動圖都是使用這個工具錄製的。
Readme
寫好以後,給它加上 Badges
- 徽章 就是畫龍點睛之筆了。
Badges
的添加也是很是簡單的,咱們只須要使用這個開源項目 shields,並選擇咱們想要的徽章、填寫好 URL、複製粘貼到 Readme
,搞定。
複製粘貼後你會獲得一個 shields
的連接,你只須要將連接改爲 Markdown
的圖片連接格式就能夠了,參考連接。
項目作完了,固然不能就放着無論了,除非你的項目很是很是的優秀,不然他是不會本身漲星星的。
以本項目爲例,筆者就去 V2EX 分享了本身的項目,也收穫了很多星星 ⭐️。
你須要去各類社區分享你的開源項目,例如:V2EX、稀土掘金、segmentfault 等等。
讓你的項目給更多的人看到,同理寫博客也是如此,不分享出去就沒有正反饋,就少了不少動力。
筆者在這片文章沒有過多的去介紹項目的開發過程,由於以爲開發之外的過程更值得分享。
開源項目不僅是實現了 Idea
就完事了,你可能還須要去讓它更加的方便維護,自動的作一些重複的事情。還要去包裝它分享它,這樣纔會有更多的人使用。當有更多人時候的時候,這個項目就須要花時間去迭代和維護了。
最後的最後,以爲文章還不錯的,以爲這個開源項目還能夠的,賞個 star
⭐️ 吧,github.com/TNK-Studio/…。