Git 是重要的代码管理工具,本文提供一种使用 Git 将 Hugo 生成的静态网站部署到 VPS 的方法。

准备

假设服务端系统为 Ubuntu 18.04,SSH 可登录,Web Server 可正常访问。

客户端系统为 Windows 10,SSH 终端可用 MobaXterm。

配置SSH

  • 客户端
1
2
3
4
5
6
7
8
9
# 创建密钥 (回车可忽略提问)
ssh-keygen -t rsa -C "yourname@email.com"
# C:\Users\[YOURNAME]\.ssh 目录下会生成 id_rsa 和 id_rsa.pub 两个文件

# 复制公钥(或用 clip, pbcopy)
type C:/Users/YOURNAME/.ssh/id_rsa.pub

# 登录服务端
ssh user@host
  • 服务端
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 编辑SSH授权公钥文件
vim ~/.ssh/authorized_keys
# 粘贴公钥,按ESC,输入:x保存退出,或:
echo public_key_string >> ~/.ssh/authorized_keys

# 配置目录与文件权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# or
chmod -R go= ~/.ssh
chown -R $USER:$USER ~/.ssh

# 配置 SSH 服务
sudo vim /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 重启 SSH 服务
sudo service sshd restart

点击 查看更多 SSH 用法

配置 Git

  • 服务端

在服务端创建一个Git“裸仓库”并设置钩子脚本,Git“裸仓库”在收到客户端推送后触发钩子脚本,复制网站文件到Web服务器相应目录,从而实现Hugo静态网站的服务端部署。

以下将博客部署到网站子目录 /blog 中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 初始化 Git Repo
mkdir -p ~/hugo/blog.git && cd $_
git init --bare

# 创建钩子函数
cd hooks
vim post-receive
#!/bin/sh
GIT_BLOG=/home/[username]/hugo/blog
WWW_BLOG=/var/www/myweb/blog
rm -rf ${WWW_BLOG}/*
git clone $GIT_BLOG $WWW_BLOG

# 设置相关权限
chmod +x post-receive
sudo mkdir -p /var/www/myweb/blog
sudo chown -R $USER:$USER /var/www/myweb

Git裸仓库:不包含工作目录的仓库,即.git文件夹。

  • 客户端
1
2
3
4
5
6
7
8
cd [hugo/blog]  # 进入hugo博客项目目录
hugo  # 生成网站,保存到 public 目录
cd public
git init
git add .
git commit -m 'initial blog'
git remote add origin [username]@[host]:~/hugo/blog.git  # or
git remote add origin [username]@[host]:/home/[username]/hugo/blog.git

执行推送

1
2
3
4
5
6
7
# 确认远程地址
git remote -v  # 若没有正确配置,可重新设置:
git remote set-url origin [username]@[host]:/home/[username]/hugo/blog.git

# 推送到服务端
git push -u origin master  # 或
git push -u origin master -f  # 强制推送

一键部署

编写一个 PowerShell (或Bash) 脚本,实现一键部署。

1
2
cd ..  # 回项目根目录
code deploy.ps1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
if ($args.count -gt 0) {
    hugo
    cd public
    git add .
    git commit -m $args[0]
    git push origin master -f
    cd ..
} else {
    Write-Host "error: git requires a message"
}
1
./deploy.ps1 "deployment test"

推送完成后,打开浏览器,输入网址,确认网站部署成功。

结束语

部署文件到服务器,还可以使用 scp, rsync 以及许多第三方工具。

Hugo 网站可以部署到任何一种静态网站托管服务平台,如 GitHub Pages, Netlify, Now 等。

Netlify CMS

一键发布到 Now

Hugo官方部署文档