利用git+hugo+markdown 搭建一個靜態網站
一直想要有一個自己的文件管理系統:
- 可以很方便書寫,而且相應的文件很容易被分享
- 很方便的儲存、管理、歷史記錄
- 比較方面的瀏覽和查詢
第一點用Makrdown來寫文件是一個非常好的選擇,第二點自然想到了git,
第三點用一個靜態的網站來瀏覽和管理是一個不錯的選擇,這裡選擇了hugo。
Hugo是由Go語言實現的靜態網站生成器。 注意是生成器。他雖然自帶webserver,但是沒有Nigix強大了。
他能非常方便的把markdown檔案轉換為html。
如何搭建
首先必須有一臺伺服器,我選擇了阿里雲。然後:
第一步: 安裝hugo
- 首先檢查系統的版本:cat /proc/version
- 直接用 sudo yum install hugo 發現不行,只能選擇本機安裝了
- 當然發現少了一個能上傳的客戶端: yum install lrzsz
- 因為是radhat,用hugo-0.16-2.el6.x86_64.rpm 包,然後sudo yum install hugo-0.16-2.el6.x86_64.rpm
第二步: 開始建立站點
- hugo new site hub_site
- cd hub_sit
- 安裝皮膚: cd themes; git clone https://github.com/key-amb/hugo-theme-bootie-docs.git themes/bootie-docs
也可以本地上傳 - 編輯: config.toml
- 加一個主頁: _index.md
- 加一個 about頁面: hugo new post/about.md
- 啟動:hugo server --buildDrafts -p 8080 --bind ip -b http://ip:8080/
這時候我們就可以看到第一個頁面了。
第三步:和github結合起來
利用git來管理文件是一個非常好的方式。這裡直接想到用github來儲存文件。gitbhu支援收到push請求的時候呼叫固定的地址http。
所以我們可以用這個來實現完美的功能。
首先在github上配置請求:settings->Webhooks
然後我們要在外面的伺服器上搭建一個Http伺服器來接受這個請求, 這裡選擇用python的import http.server來搭建,簡單方便:
class EntranceHttpRequestHandler(http.server.CGIHTTPRequestHandler):
def do_POST(self):
print('begin')
if __name__=='__main__':
handler = EntranceHttpRequestHandler.EntranceHttpRequestHandler
httpd = socketserver.TCPServer(("", 8001), handler)
httpd.serve_forever()
第四步 用python把整個鏈路連線起來
import http.server
import Convertor
import os
import _thread
TargetPath = "/root/root/site/content/post/blog"
GitSrcPath = "/root/root/site/blog"
HugeSitePath = "/root/root/site/"
HugeStatCommond = r'hugo server --buildDrafts -p 80 --bind 115.28.83.94 -b http://115.28.83.94/'
class EntranceHttpRequestHandler(http.server.CGIHTTPRequestHandler):
def do_POST(self):
print('begin')
self.gitpull(GitSrcPath)
self.stopHugo()
convert = Convertor.Convertor()
convert.excute(GitSrcPath,TargetPath)
self.startHugo()
print("finished")
self.wfile.write(b"msg finished")
def gitpull(self, filePath):
os.chdir(filePath)
command = "git pull "
os.system(command)
def startHugo(self):
_thread.start_new_thread(self.doStartHugo, ())
def doStartHugo(self):
os.chdir(HugeSitePath)
output = os.system(HugeStatCommond)
print(output)
print('sartHugo finished')
def stopHugo(self):
command = 'kill -9 $(pidof hugo)'
os.system(command)
print('stopHugo finished')
其中Convert 是對文件做一些分類和tag的轉換不詳細介紹。
到現在一個完整的網站就搭建完成了,每一次只要在本地push文件,就能在網站上自動更新。
完整程式碼看這裡