用 Hugo + Coding 搭建静态博客

更新:CODING 虽好但有费用,建议用 Gitee 搭建免费博客。

适宜读者

了解 Git 的基本用法,能看懂简单的 Shell Script。

介绍

Hugo

Static Site Generator (SSG). The world’s fastest framework for building websites.

Pronunciation of Hugo: H EW G OH

Definition of Hugo by Merriam-Webster / Official Video Tutorials

Coding

是一个面向开发者的 云端开发平台,提供 Git/SVN 代码托管、任务管理、在线 WebIDE、Cloud Studio、开发协作、文件管理、Wiki 管理、提供个人服务及企业版本的服务。

选择 Hugo + Coding 的原因

虽然有很多其它静态网站生成器和代码托管平台,但 Hugo + Coding 的优势明显:

  • Hugo 构建速度最快
  • Hugo 主题多,其中很火的 Academic 主题也是我最喜欢的
  • Coding 在国内访问速度快
  • Coding 平台更先进好用,比如
    • 代码多仓库:一个项目下可以新建多个仓库,大大提高代码的管理效率。
    • Cloud Studio:为开发者提供了一个永不间断的云端工作站。离开本地环境时可利用 Cloud Studio 轻松写博客。

搭建 Hugo + Coding

安装软件

Coding 上创建代码仓库

注册 Coding(填团队名称时请三思而后行)。

然后,创建 BLOG 项目:

  • 【创建项目】>【模板-代码托管项目】> 项目名:BLOG >【完成创建】。(blog 仓库用于存放 Hugo 生成的网页文件)

再创建一个仓库用来存放 Hugo 站点:

  • 【代码仓库】>【创建代码仓库】> 仓库名称:hugo >【确定】。

将 Hugo 站点和 Hugo 生成的网站文件分开存放。最直接的原因就是避免源代码泄露。

本地创建 Hugo 站点

先将 hugo 仓库克隆到本地:

cd /DATA/Writing
git clone git@e.coding.net:NAME/blog/hugo.git
cd hugo

再将 blog 仓库添加为 submodule:

git submodule add git@e.coding.net:NAME/blog.git public

这里使用 Academic 主题:

  1. 下载 解压 Academic Kickstart,将 academic-kickstart-master 中的内容复制到 hugo
  2. 下载 解压 Academic theme,将 hugo-academic-master 中的内容复制到 themes/academic/

本地 Hugo 站点创建完毕,使用下面命令实时预览站点 http://localhost:1313/

hugo server --gc -D

使用 hugo server --help 查看参数的含义。

限于篇幅,Hugo 和 Academic 的使用请参考各自的官方文档:

将博客发布到 Coding

配置 Git 以及 SSH 公钥

通常使用 SSH 协议进行 Git 的远程推送,所以推送前确保已完成下面两件事情:

第一,配置个人的用户名称和电子邮件地址。

$ git config --global user.name "[name]"
$ git config --global user.email "[email address]"
$ git config --global color.ui auto
$ git config --global core.autocrlf false # Linux

第二,配置 SSH 公钥

查看是否存在公钥:

cat ~/.ssh/id_rsa.pub

不存在,则生成公钥(一路回车):

ssh-keygen -t rsa -b 4096 -C "your.email@example.com"

登录 CODING ,点击右上角【个人设置】,选择菜单【SSH 公钥】,点击【新增公钥】按钮。

img

id_rsa.pub 中的内容填写到【公钥内容】一栏,公钥名称按需填写即可。

将站点推送到 Coding

为了方便,新建一个简单的部署脚本,gedit deploy.sh

#!/usr/bin/env bash
# Filename: deploy.sh
#

#### Action 1 ####

echo -e "\n\033[0;34;1m1) Building web pages... [HTML]\033[0m"
# Build the project.
hugo --config ./config/_default/config.toml --gc --minify


#### Action 2 ####

echo -e "\n\033[0;32;1m2) Upload pages to CODING... [HTML]\033[0m\n"
# Go To Repository folder
cd public
# ----------------------------------------------
# Add changes to git.
git add .
# Commit changes.
msg="Update $(date +"[%x %T]")"
if [ -n "$*" ]; then
    msg="$*"
fi
git commit -m "$msg"
# Push source and build repos.
git push origin master
# ----------------------------------------------
# Come Back up to the Project Root
cd ..


#### Action 3 ####

echo -e "\n\033[0;32;1m3) Upload the HUGO site...\033[0m\n"
# ----------------------------------------------
# Add changes to git.
git add .
# Commit changes.
msg="Update $(date +"[%x %T]")"
if [ -n "$*" ]; then
    msg="$*"
fi
git commit -m "$msg"
# Push source and build repos.
git push origin master
# ----------------------------------------------

运行脚本:

chmod 755 deploy.sh
./deploy.sh

开启静态网站

回到 Coding 的 BLOG 项目

  • 【静态网站】>【新建静态网站】> 网站名称:blog > 选择仓库:blog > 【保存】

点击 访问地址 访问网站。由于访问地址不好记,后期可以考虑购买一个实惠的域名绑到一起。

我的博客(我更愿意叫网络笔记本):https://www.keatonlao.run/。(看看长啥样就行。我就是个普通人,里面很多内容没时间整理,如果你阅读它,可能会浪费你宝贵的时间。所以,该看书去看书,该上网课去上网课。)

Alias 简化部署指令

利用 Alias 将重复性的命令指定别名,提高效率。sudo vi /etc/profile.d/alias.sh

#!/usr/bin/env bash

# Common
alias via='sudo vi /etc/profile.d/alias.sh'
alias vi='vim'

# Hugo
alias gh='cd /DATA/Writing/hugo' # gohugo 快速切换至站点
alias hs='cd /DATA/Writing/hugo && hugo server --gc -D' # 快速生成预览站点
alias hd='cd /DATA/Writing/hugo && ./deploy.sh' # hugo deploy 快速部署网站

# alias gh2='cd /DATA/Writing/secondary-site'
# alias hs2='cd /DATA/Writing/secondary-site && hugo server --gc -D'

执行 source /etc/profile.d/alias.sh 使别名生效,并将这条命令添加到 ~/.bashrc 或者 ~/.zshrc 的尾部。

使用 Typora 撰写文章

推荐使用 Typora 撰写 Markdown。学习 Markdown 可以参看这份笔记:A Study Note for Markdown

利用 cloud studio 云端写博客

离开本地环境时,该如何更新自己的博客?除了跑到 Coding 上直接编辑源代码,你还有另一种选择:利用 Cloud Studio 轻松写博客(需要会用 VS Code)。

首先进入 Coding 的 Cloud Studio 创建工作空间,预置环境选择:Ubuntu 18.04。

将前面下载的 Hugo 安装包放到主站点 static/files 下,并推送到 Coding:

./deploy.sh

回到 cloud studio 中,拉取更新:

git pull

然后安装 hugo:

sudo dpkg -i static/files/hugo_extended_0.72.0_Linux-64bit.deb
hugo version

接下来就可以愉快的写博客了。

重建 Hugo + Coding

网站用久了,很多历史版本记录会占用大量仓库体积。然而对于博客,这些历史版本根本用不到,此时需要重建网站(网站翻新)。

Coding 上重置代码仓库

进入 BLOG 项目,选择【代码仓库】,在 blog 和 hugo 的【设置】中【重置代码仓库】。

重置代码仓库将会删除当前仓库下的所有代码,包括代码分支、合并请求、代码版本。此操作无法恢复!

本地新建 Hugo 站点

将旧站点移到 Backup 下:

cd /DATA/Writing
mv hugo Backup/

再将 hugo 和 blog 仓库依次克隆到本地:

git clone git@e.coding.net:NAME/blog/hugo.git
cd hugo
git submodule add git@e.coding.net:NAME/blog.git public

手动删除原 hugo 站点下的 .gitpublic,将剩余文件全部剪贴到新 hugo 站点下。

将博客发布到 Coding

运行部署脚本,将站点推送到 Coding:

./deploy.sh

搭配 TiddlyWiki 管理知识【开外挂】

Tiddlywiki 是一个非线形的个人笔记工具,所有的内容都保存在一个 HTML 文件内。

我之所以喜欢 Academic Theme,是因为用它的 doc 管理知识点很方便。但是会遇到这样的情况:我最近在学烹饪,但烹饪的知识点太多,使用一个 doc 不能很好的进行管理,而新建一个 courses 又没必要。这个时候,使用 TiddlyWiki 就能很好的构建烹饪知识。

将 TiddlyWiki 文件放到 static/tiddlywiki/cookery.html,为了方便查看,在 Cookery doc 的首页引用:

{{% staticref "tiddlywiki/cookery.html" "newtab" %}}cookery.html{{% /staticref %}}

具体效果参看:安装使用 GoldenDict 查词神器 (Windows/Mac/Linux)。这是用 TiddlyWiki 写的软件使用经验,如果用一个 doc 来写这篇经验,效果将大打折扣。

配置主副站点

由于代码托管平台无法对 Hugo Academic 文章进行加密,我的解决办法是建立主副站点。将前面的站点作为副站点,再新建一个主站点,并使用 Rsync 进行主副站点之间的同步。副站点给别人看,主站点给自己用。由于主站点没有绑定域名解析等服务,也没有透露在任何平台,就自己知道,所以很多自己收集的材料或者学习时的笔记草稿都可以随时上传。当然,如果因为站点体积太大而拆分为两个站点,也是一种思路。

新建主站点

在 BLOG 项目中新建主站点。主副站点之间的对应关系:

  • main-site-html ↛ blog
  • main-site → hugo

主副站点之间同步

同步的逻辑很简单,除了 .gitpublic 两个文件夹,副站点的内容全部来自主站点(副站点的 config 文件夹保存在主站点 scripts/secondarysiteconfig 中)。简单的示意图:

主副站点之间同步.png


使用 Rsync 命令进行单向无差异同步。该命令主要有下面四种用法:

# 单项--无差异同步
rsync -avq --delete $src/dir1 $dest/

# 多项--无差异同步
rsync -avq --delete --include={sh4,sh5} --exclude=* $src/ $src/dir2

# 排除单项--无差异同步
rsync -avq --delete --exclude=dir4 $src/dir1 $dest/

# 排除多项--无差异同步
rsync -avq --delete --exclude={dir4,dir5,file4,file5} $src/ $dest/

具体的同步脚本为:

#!/usr/bin/env bash
# sync_to_public_website.sh
#
# This is a simple script. You should always create new files on the main site.
# Otherwise, you may lose data.
#

src='/DATA/Writing/main-site'
dest='/DATA/Writing/secondary-site'


#################################
##  Update secondary site      ##
#################################

echo -e "\n\033[0;31;1mUpdate secondary site\033[0m\n"
echo -e "\033[37m[directory]\033[0m"

## The root directory
# 先排除多项进行同步,再处理排除项中需要同步的文件夹
echo -e "\033[32m  root\033[0m"
rsync -avq --delete --exclude={config,content,layouts,public,resources,static,.git,.gitmodules} $src/ $dest/
rsync -avq --delete $src/scripts $dest/

## The content directory
echo -e "\033[32m  content\033[0m"
rsync -avq --delete $src/content/authors       $dest/content/
rsync -avq --delete $src/content/courses       $dest/content/
rsync -avq --delete $src/content/home          $dest/content/
rsync -avq --delete $src/content/post          $dest/content/
rsync -avq --delete $src/content/privacy.md    $dest/content/
rsync -avq --delete $src/content/terms.md      $dest/content/

## The static directory
echo -e "\033[32m  static\033[0m"
rsync -avq --delete --exclude={book,temp} $src/static $dest/


##  The secondary site config
# 副站点 config 存在则备份到主站点;不存在则从主站点恢复。
echo -e "\n\033[37m[secondarysiteconfig]\033[0m"

if [ -d "$dest/config" ]; then
    rsync -avq --delete $dest/config $src/scripts/secondarysiteconfig/ \
    && echo -e "\033[32m  Backed up\033[0m\n" \
    || echo -e "\n\033[31m  Error\033[0m Please modify \033[36msync_to_public_website.sh\033[0m\n"
else
    rsync -avq $src/scripts/secondarysiteconfig/config $dest/ \
    && echo -e "\033[32m  Updated\033[0m\n"
fi

在主站点新建 12deploy.sh,依次【同步主副站点 〉部署主站点 〉部署副站点】:

#!/usr/bin/env bash
# 12deploy.sh
#

main=/DATA/Writing/main-site
secondary=/DATA/Writing/secondary-site

bash $main/sync_to_public_website.sh

echo -e "\033[0;31;1mDeploy main site\033[0m"
bash $main/deploy.sh

echo -e "\n\033[0;31;1mDeploy secondary site\033[0m"
cd $secondary
bash $secondary/deploy.sh
cd $main


— END —

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342