1. 程式人生 > 實用技巧 >利用GitHub從零開始搭建一個部落格

利用GitHub從零開始搭建一個部落格

一般我們要搭建一個個人的部落格站點需要買伺服器、域名,裝各種執行環境等等,非常的費錢費力。

其實就算沒有這些,我們也是照樣可以通過Hexo框架結合GitHub Pages搭建一個自己的部落格站點的。

Hexo 這個部落格框架沒有那麼重量級,它是 MarkDown 直接寫文章的,然後 Hexo 可以直接將文章編譯成靜態網頁檔案併發布,所以這樣文章的內容、標題、標籤等資訊就沒必要存資料庫裡面了,是直接純靜態頁面了,這就解決了資料庫的問題。

1、準備條件

  • GitHub賬號
  • 域名(可選)

2、新建GitHub專案

首先在 GitHub 新建一個倉庫(Repository),名稱為 {username}.github.io,注意這個名比較特殊,必須要是 github.io 為字尾結尾的。比如我的使用者名稱是59devops,那麼就新建一個59devops.github.io

的倉庫。

3、為倉庫配置SSH-Key

因為後期我們更新文章或者提交程式碼需要有相應的許可權才可以,通過使用者名稱和密碼不方便且不安全,所以非常有必要配置SSH-Key金鑰。

3.1 建立金鑰對

cd ~/. ssh
ssh-keygen -t rsa -C "郵件地址"

然後連續3次回車,最終會生成一個檔案在使用者目錄下,開啟使用者目錄,找到.ssh\id_rsa.pub檔案,記事本開啟並複製裡面的內容,開啟你的github主頁,進入個人設定 -> SSH and GPG keys -> New SSH key:

3.2 測試是否成功

ssh -T [email protected]

如上圖顯示,則表示SSH-Key配置成功!

3.3 配置Git資訊

git config --global user.name "59devops"
git config --global user.email  "[email protected]"

4、安裝環境

4.1 安裝Node.js

首先在自己的電腦上安裝 Node.js,下載地址:https://nodejs.org/zh-cn/download/,可以安裝 Stable 版本。

安裝完畢之後,確保環境變數配置好,能正常使用 npm 命令。

npm --version

4.2 安裝Hexo

Hexo是一個部落格框架,Hexo 官方還提供了一個命令列工具,用於快速建立專案、頁面、編譯、部署 Hexo 部落格,所以在這之前我們需要先安裝 Hexo 的命令列工具。

sudo npm install -g hexo-cli

安裝完畢之後,確保環境變數配置好,能正常使用 hexo 命令。

hexo --version

5、初始化專案

5.1 建立專案

使用 Hexo 的命令列建立一個專案,並將其在本地跑起來,整體跑通看看。

首先使用如下命令建立專案:

hexo init {name}

這裡的name就是專案名,我這裡要建立59devops的部落格,我就把專案取名為59devops了,用了純小寫,命令如下:

hexo init 59devops

這樣59devops資料夾下就會出現 Hexo 的初始化檔案,包括 themes、scaffolds、source 等資料夾。

5.2 編譯生成HTML程式碼

首先進入新生成的資料夾裡面,然後呼叫 Hexo 的 generate 命令,將 Hexo 編譯生成 HTML 程式碼,命令如下:

hexo generate

可以看到輸出結果裡面包含了 js、css、font 等內容,並發現他們都處在了專案根目錄下的 public 資料夾下面了。

5.3 本地執行專案

利用 Hexo 提供的 serve 命令把部落格在本地執行起來,命令如下:

hexo serve

專案成功執行在本地的4000埠上,瀏覽器訪問http://localhost:4000

6、部署專案

將這個初始化的部落格進行一下部署,放到 GitHub Pages 上面驗證一下其可用性。成功之後我們可以再進行後續的修改,比如修改主題、修改頁面配置等等。

Hexo 已經給我們提供一個命令,利用它我們可以直接將部落格一鍵部署,不需要手動去配置伺服器或進行其他的各項配置。

6.1 修改部署地址

開啟根目錄下的 _config.yml 檔案,找到 Deployment 這個地方,把剛才新建的 Repository 的地址貼過來,然後指定分支為 master 分支,最終修改為如下內容:

# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
  type: git
  repo: https://github.com/59devops/59devops.github.io.git
  branch: master

6.2 安裝Git部署外掛

需要額外安裝一個支援 Git 的部署外掛,名字叫做hexo-deployer-git,有了它我們才可以順利將其部署到 GitHub 上面,如果不安裝的話,在執行部署命令時會報如下錯誤:

Deployer not found: git

安裝hexo-deployer-git外掛的命令如下:

npm install hexo-deployer-git --save

6.3 部署專案

安裝成功後,執行部署命令:

hexo deploy

如果出現類似上面的內容,就證明我們的部落格已經成功部署到 GitHub Pages 上面了,這時候我們訪問一下 GitHub Repository 同名的連結,比如我的59devops部落格的 Repository 名稱取的是59devops.github.io,那我就訪問 http://59devops.github.io,這時候我們就可以看到跟本地一模一樣的部落格內容了。

檢視一下GitHub上的內容:

這些內容實際上是部落格資料夾下面的 public 資料夾下的所有內容,Hexo 把編譯之後的靜態頁面內容上傳到 GitHub 的 master 分支上面去了。

6.4 訪問測試

6.5 上傳部落格原始碼到GitHub倉庫

那我部落格的原始碼也想放到 GitHub 上面怎麼辦呢?其實很簡單,新建一個其他的分支就好了,比如我這邊就新建了一個 source 分支,代表部落格原始碼的意思。

具體的新增過程就很簡單了,參加如下命令:

git init    # 初始化專案
git checkout -b source    # 建立並切換到source分支
git add -A    # 新增所有檔案到暫存區
git commit -m "init blog"    # 提交併註釋
git remote add origin [email protected]:59devops/59devops.github.io.git    # 新增到遠端倉庫
git push origin source    # 將程式碼提交到遠端的source分支

在GitHub倉庫中可以看到已經有兩個分支:

7、配置站點資訊

完成如上內容之後,實際上我們只完成了部落格搭建的一小步,因為我們僅僅是把初始化的頁面部署成功了,部落格裡面還沒有設定任何有效的資訊。下面就讓我們來進行一下部落格的基本配置,另外換一個好看的主題,配置一些其他的內容,讓部落格真正變成屬於我們自己的部落格吧。

7.1 修改站點標題、關鍵字資訊

修改根目錄下的 _config.yml 檔案,找到 Site 區域,這裡面可以配置站點標題 title、副標題 subtitle 等內容、關鍵字 keywords 等內容,比如我的就修改為如下內容:

# Site
title: 59Devops
subtitle: 一個運維小菜雞的個人部落格網站。
description: 記錄學習、工作和生活中遇到的各種問題。
keywords: "運維, Python, Shell, ..."
author: StaryJie
language: zh-CN
timezone: Asia/Shanghai

hexo serve在本地執行並在瀏覽器中開啟測試:

7.2 修改主題

目前 Hexo 裡面應用最多的主題基本就是 Next 主題了,個人感覺這個主題還是挺好看的,另外它支援的外掛和功能也極為豐富,配置了這個主題,我們的部落格可以支援更多的擴充套件功能,比如閱覽進度條、中英文空格排版、圖片懶載入等等。

7.2.1 下載主題

目前 Next 主題已經更新到 7.x 版本了,我們可以直接到 Next 主題的 GitHub Repository 上把這個主題下載下來。

首先命令列進入到專案的根目錄,執行如下命令即可:

git clone https://github.com/theme-next/hexo-theme-next themes/next

執行完畢之後 Next 主題的原始碼就會出現在專案的 themes/next 資料夾下。

7.2.2 修改主題

修改下部落格所用的主題名稱,修改專案根目錄下的 _config.yml 檔案,找到 theme 欄位,修改為 next 即可,修改如下:

theme: next

7.2.3 本地預覽

然後本地重新開啟服務,訪問重新整理下頁面,就可以看到 next 主題就切換成功了,預覽效果如下:

7.3 配置主題

現在我們已經成功切換到 next 主題上面了,接下來我們就對主題進行進一步地詳細配置吧,比如修改樣式、增加其他各項功能的支援。

Next 主題內部也提供了一個配置檔案,名字同樣叫做 _config.yml,只不過位置不一樣,它在 themes/next 資料夾下,Next 主題裡面所有的功能都可以通過這個配置檔案來控制,下文所述的內容都是修改的 themes/next/_config.yml 檔案。

7.3.1 樣式

Next 主題還提供了多種樣式,風格都是類似黑白的搭配,但整個佈局位置不太一樣,通過修改配置檔案的 scheme 欄位即可,我選了 Pisces 樣式,修改 _config.yml (注意是 themes/next/_config.yml 檔案)如下:

scheme: Pisces

另外還有幾個可選項,比如:

# scheme: Muse
#scheme: Mist
scheme: Pisces
#scheme: Gemini

重新在本地執行,瀏覽器檢視就已經變成Pisces樣式了:

7.4 favicon

favicon 就是站點標籤欄的小圖示,預設是用的 Hexo 的小圖示,如果我們有站點 Logo 的圖片的話,我們可以自己定製小圖示。

7.4.1 獲取圖示

但這並不意味著我們需要自己用 PS 自己來設計,已經有一個網站可以直接將圖片轉化為站點小圖示,站點連結為:https://realfavicongenerator.net,到這裡上傳一張圖,便可以直接打包下載各種尺寸和適配不同裝置的小圖示。

7.4.2 更換圖示

圖示下載下來之後把它放在 themes/next/source/images 目錄下面。

然後在配置檔案裡面找到 favicon 配置項,把一些相關路徑配置進去即可,示例如下:

favicon:
  small: /images/favicon-16x16.png
  medium: /images/favicon-32x32.png
  apple_touch_icon: /images/apple-touch-icon.png
  safari_pinned_tab: /images/safari-pinned-tab.svg

配置完成之後重新整理頁面,整個頁面的標籤圖示就被更新了。

7.5 avatar

avatar 這個就類似站點的頭像,如果設定了這個,會在站點的作者資訊旁邊額外顯示一個頭像,比如我這邊有一張 avatar.png 圖片:

將其放置到 themes/next/source/images/avatar.png 路徑,然後在主題 _config.yml 檔案下編輯 avatar 的配置,修改為正確的路徑即可。

# Sidebar Avatar
avatar:
  # In theme directory (source/images): /images/avatar.gif
  # In site directory (source/uploads): /uploads/avatar.gif
  # You can also use other linking images.
  url: /images/avatar.png
  # If true, the avatar would be dispalyed in circle.
  rounded: true
  # If true, the avatar would be rotated with the cursor.
  rotated: true

配置完成之後重新整理頁面,頭像的圖片就會顯示出來。

7.6 rss

部落格一般是需要 RSS 訂閱的,如果要開啟 RSS 訂閱,這裡需要安裝一個外掛,叫做 hexo-generator-feed,安裝完成之後,站點會自動生成 RSS Feed 檔案,安裝命令如下:

npm install hexo-generator-feed --save

在專案根目錄下執行這個命令,安裝完成之後不需要其他的配置,以後每次編譯生成站點的時候就會自動生成 RSS Feed 檔案了。

7.7 code

作為一個為程式設計師,雖然程式碼敲的不咋樣,但是程式碼塊的顯示還是需要很講究的,預設的程式碼塊我個人不是特別喜歡,因此我把程式碼的顏色修改為黑色,並把複製按鈕的樣式修改為類似 Mac 的樣式,修改 _config.yml 檔案的 codeblock 區塊如下:

codeblock:
  # Code Highlight theme
  # Available values: normal | night | night eighties | night blue | night bright | solarized | solarized dark | galactic
  # See: https://github.com/chriskempson/tomorrow-theme
  # highlight_theme: normal
  highlight_theme: night bright
  # Add copy button on codeblock
  copy_button:
    enable: true
    # Show text copy result.
    show_result: true
    # Available values: default | flat | mac
    style: mac

修改樣式前是這樣的:

修改完之後是這樣的:

7.8 top

我們在瀏覽網頁的時候,如果已經看完了想快速返回到網站的上端,一般都是有一個按鈕來輔助的,這裡也支援它的配置,修改 _config.yml 的 back2top 欄位即可,我的設定如下:

back2top:
  enable: true
  # Back to top in sidebar.
  sidebar: false
  # Scroll percent label in b2t button.
  scrollpercent: true

enable 預設為 true,即預設顯示。sidebar 如果設定為 true,按鈕會出現在側欄下方,個人覺得並不是很好看,就取消了,scrollpercent 就是顯示閱讀百分比,個人覺得還不錯,就將其設定為 true。

7.9 reading_process

reading_process,閱讀進度。大家可能注意到有些站點的最上側會出現一個細細的進度條,代表頁面載入進度和閱讀進度,如果大家想設定的話也可以試試,我將其打開了,修改 _config.yml 如下:

# Reading progress bar
reading_progress:
  enable: true
  # Available values: top | bottom
  position: top
  color: "#222"
  height: 2px

效果如下:

7.10 bookmark

書籤,可以根據閱讀歷史記錄,在下次開啟頁面的時候快速幫助我們定位到上次的位置,大家可以根據喜好開啟和關閉,我的配置如下:

bookmark:
  enable: true
  # Customize the color of the bookmark.
  color: "#222"
  # If auto, save the reading progress when closing the page or clicking the bookmark-icon.
  # If manual, only save it by clicking the bookmark-icon.
  save: auto

7.11 github_banner

在一些技術部落格上,大家可能注意到在頁面的右上角有個 GitHub 圖示,點選之後可以跳轉到其原始碼頁面,可以為 GitHub Repository 引流,大家如果想顯示的話可以自行選擇開啟,我的配置如下:

# `Follow me on GitHub` banner in the top-right corner.
github_banner:
  enable: true
  permalink: https://github.com/59devops/59devops.github.io.git
  title: Follow 59devops on GitHub

效果如下:

7.12 gitalk

由於 Hexo 的部落格是靜態部落格,而且也沒有連線資料庫的功能,所以它的評論功能是不能自行整合的,但可以整合第三方的服務。

Next 主題裡面提供了多種評論外掛的整合,有 changyan | disqus | disqusjs | facebook_comments_plugin | gitalk | livere | valine | vkontakte 這些。

1.12.1 註冊OAuth Application

首先需要在 GitHub 上面註冊一個 OAuth Application,連結為:https://github.com/settings/applications/new,註冊完畢之後拿到 Client ID、Client Secret 就可以了。

1.12.2 修改配置

首先需要在 _config.yml 檔案的 comments 區域配置使用 gitalk:

# Multiple Comment System Support
comments:
  # Available values: tabs | buttons
  style: tabs
  # Choose a comment system to be displayed by default.
  # Available values: changyan | disqus | disqusjs | facebook_comments_plugin | gitalk | livere | valine | vkontakte
  active: gitalk

主要是 comments.active 欄位選擇對應的名稱即可。

然後找打 gitalk 配置,新增它的各項配置:

# Gitalk
# Demo: https://gitalk.github.io
# For more information: https://github.com/gitalk/gitalk
gitalk:
  enable: true
  github_id: 59devops
  repo: 59devops.github.io
  client_id: cb34a61011c438548cec
  client_secret: 3d9c756a081ce2b91a6a286eb1a0a02a71ced6ca
  admin_user: 59devops
  distraction_free_mode: true # Facebook-like distraction free mode
  # Gitalk's display language depends on user's browser or system environment
  # If you want everyone visiting your site to see a uniform language, you can set a force language value
  # Available values: en | es-ES | fr | ru | zh-CN | zh-TW
  language: zh-CN

進入文章之後,效果如下:

GitHub 授權登入之後就可以使用了,評論的內容會自動出現在 Issue 裡面。

7.13 pangu

如果你習慣在中文和英文之間留空格的話,pangu 就是來解決這個問題的,我們只需要在主題裡面開啟這個選項,在編譯生成頁面的時候,中英文之間就會自動新增空格,看起來更加美觀。

具體的修改如下:

pangu: true

7.14 math

可能在一些情況下我們需要寫一個公式,比如演示一個演算法推導過程,MarkDown 是支援公式顯示的,Hexo 的 Next 主題同樣是支援的。

Next 主題提供了兩個渲染引擎,分別是 mathjax 和 katex,後者相對前者來說渲染速度更快,而且不需要 JavaScript 的額外支援,但後者支援的功能現在還不如前者豐富,具體的對比可以看官方文件:https://theme-next.org/docs/third-party-services/math-equations。

這裡選擇了 mathjax,通過修改配置即可啟用:

math:
  enable: true

  # Default (true) will load mathjax / katex script on demand.
  # That is it only render those page which has `mathjax: true` in Front-matter.
  # If you set it to false, it will load mathjax / katex srcipt EVERY PAGE.
  per_page: true

  # hexo-renderer-pandoc (or hexo-renderer-kramed) required for full MathJax support.
  mathjax:
    enable: true
    # See: https://mhchem.github.io/MathJax-mhchem/
    mhchem: true

mathjax 的使用需要我們額外安裝一個外掛,叫做 hexo-renderer-kramed,另外也可以安裝 hexo-renderer-pandoc,命令如下:

npm un hexo-renderer-marked --save
npm i hexo-renderer-kramed --save

另外還有其他的外掛支援,大家可以到官方文件檢視。

7.15 pjax

可能大家聽說過 Ajax,沒聽說過 pjax,這個技術實際上就是利用 Ajax 技術實現了局部頁面重新整理,既可以實現 URL 的更換,有可以做到無重新整理載入。

要開啟這個功能需要先將 pjax 功能開啟,然後安裝對應的 pjax 依賴庫,首先修改 _config.yml 修改如下:

pjax: true

然後安裝依賴庫,切換到 next 主題下,然後安裝依賴庫:

cd themes/next
git clone https://github.com/theme-next/theme-next-pjax source/lib/pjax

這樣 pjax 就開啟了,頁面就可以實現無重新整理載入了。

7.16 其他配置

參考官方文件:https://theme-next.org/docs/。

8、文章

8.1 新建文章

Hexo預設安裝完就會有一篇文章,我們需要藉助hexo命令新增新的文章:

hexo new hello-hexo

建立的文章會出現在 source/_posts 資料夾下,是 MarkDown 格式。

8.2 文章標籤和分類

在文章開頭通過如下格式新增必要資訊:

---
title: 標題 # 自動建立,如 hello-world
date: 日期 # 自動建立,如 2019-09-22 01:47:21
tags: 
- 標籤1
- 標籤2
- 標籤3
categories:
- 分類1
- 分類2
---

開頭下方撰寫正文,MarkDown 格式書寫即可。

這樣在下次編譯的時候就會自動識別標題、時間、類別等等,另外還有其他的一些引數設定,可以參考文件:https://hexo.io/zh-cn/docs/writing.html。

8.3 部落格首頁只顯示文章標題和摘要

預設情況下hexo部落格(如本站)的首頁顯示的是完整的文章 – 而文章比較長的時候這無疑會帶來諸多不便。只要加入一個<!-- more -->這樣的佔位符在文章正文裡面即可:

這就是一個簡介
<!-- more -->
這裡更多的內容

本地執行重新整理後效果如下:

9、標籤頁

現在我們的部落格只有首頁、文章頁,如果我們想要增加標籤頁,可以自行新增,這裡 Hexo 也給我們提供了這個功能,在根目錄執行命令如下:

hexo new page tags

執行這個命令之後會自動幫我們生成一個 source/tags/index.md 檔案,內容就只有這樣子的:

---
title: tags
date: 2019-09-27 11:42:49
---

我們可以自行新增一個 type 欄位來指定頁面的型別:

type: tags
comments: false

然後再在主題的 _config.yml 檔案將這個頁面的連結新增到主選單裡面,修改 menu 欄位如下:

menu:
  home: / || home
  #about: /about/ || user
  tags: /tags/ || tags
  #categories: /categories/ || th
  archives: /archives/ || archive
  #schedule: /schedule/ || calendar
  #sitemap: /sitemap.xml || sitemap
  #commonweal: /404/ || heartbeat

本地執行重新整理後,介面如下:

可以看到左側導航也出現了標籤,點選之後右側會顯示標籤的列表。

10、分類頁

分類功能和標籤類似,一個文章可以對應某個分類,如果要增加分類頁面可以使用如下命令建立:

hexo new page categories

然後同樣地,會生成一個 source/categories/index.md 檔案。

我們可以自行新增一個 type 欄位來指定頁面的型別:

type: categories
comments: false

然後再在主題的 _config.yml 檔案將這個頁面的連結新增到主選單裡面,修改 menu 欄位如下:

menu:
  home: / || home
  #about: /about/ || user
  tags: /tags/ || tags
  categories: /categories/ || th
  archives: /archives/ || archive
  #schedule: /schedule/ || calendar
  #sitemap: /sitemap.xml || sitemap
  #commonweal: /404/ || heartbeat

重新整理後頁面如下:

11、搜尋頁

很多情況下我們需要搜尋全站的內容,所以一個搜尋功能的支援也是很有必要的。

如果要新增搜尋的支援,需要先安裝一個外掛,叫做 hexo-generator-searchdb,命令如下:

npm install hexo-generator-searchdb --save

然後在專案的 _config.yml 裡面新增搜尋設定如下:

search:
  path: search.xml
  field: post
  format: html
  limit: 10000

然後在主題的 _config.yml 裡面修改如下:

# Local Search
# Dependencies: https://github.com/wzpan/hexo-generator-search
local_search:
  enable: true
  # If auto, trigger search by changing input.
  # If manual, trigger search by pressing enter key or search button.
  trigger: auto
  # Show top n results per article, show all results by setting to -1
  top_n_per_article: 5
  # Unescape html strings to the readable one.
  unescape: false
  # Preload the search data when the page loads.
  preload: false

這裡用的是 Local Search,如果想啟用其他是 Search Service 的話可以參考官方文件:https://theme-next.org/docs/third-party-services/search-services。

12、404頁面

另外還需要新增一個 404 頁面,直接在根目錄 source 資料夾新建一個 404.md 檔案即可,內容可以仿照如下:

---
title: 404 Not Found
date: 2019-09-27 12:21:37
---

<center>
對不起,您所訪問的頁面不存在或者已刪除。
您可以<a href="https://blog.59devops.com>">點選此處</a>返回首頁。
</center>

<blockquote class="blockquote-center">
    59Dveops
</blockquote>

這裡面的一些相關資訊和連結可以替換成自己的。

其實 Hexo 還有很多很多功能,可以直接參考官方文件:https://hexo.io/zh-cn/docs/ 檢視更多的配置。

15、部署指令碼

最後我這邊還增加了一個簡易版的部署指令碼,其實就是重新 gererate 下檔案,然後重新部署。在根目錄下新建一個 deploy.sh 的指令碼檔案,內容如下:

hexo clean
hexo generate
hexo deploy

這樣我們在部署釋出的時候只需要執行:

sh deploy.sh

就可以完成部落格的更新了,非常簡單。

16、自定義域名

將頁面修改之後可以用上面的指令碼重新部署下部落格,其內容便會跟著更新。

另外我們也可以在 GitHub 的 Repository 裡面設定域名,找到 Settings,拉到下面,可以看到有個 GitHub Pages 的配置項,如圖所示:

下面有個 custom domain 的選項,輸入你想自定義的域名地址,然後新增 CNAME 解析就好了。

另外下面還有一個 Enforce HTTPS 的選項,GitHub Pages 會在我們配置自定義域名之後自動幫我們配置 HTTPS 服務。剛配置完自定義域名的時候可能這個選項是不可用的,一段時間後等到其可以勾選了,直接勾選即可,這樣整個部落格就會變成 HTTPS 的協議的了。

另外有一個值得注意的地方,如果配置了自定義域名,在目前的情況下,每次部署的時候這個自定義域名的設定是會被自動清除的。所以為了避免這個情況,我們需要在專案目錄下面新建一個 CNAME 檔案,路徑為 source/CNAME,內容就是自定義域名。

比如我就在 source 目錄下新建了一個 CNAME 檔案,內容為:

blog.59devops.com

這樣避免了每次部署的時候自定義域名被清除的情況了。