用 rsync 部署
用 rsync 把 Hugo 构建产物同步到 SSH 主机并脚本化。
前提条件
- 一台运行 Web 服务器的网页主机,共享主机环境或 VPS 都可以。
- 可以通过 SSH 访问该主机。
- 一个用 Hugo 构建好、可以正常运行的静态站点。
先说结论:部署整个网站只需要一条形如下面的命令:
hugo && rsync -avz --delete public/ www-data@ftp.example.com:www/接下来要做的,是把这条命令写进一个 shell 脚本文件,这样构建和部署就简化成执行一次 ./deploy。
把 SSH 公钥复制到主机
为了让登录服务器更安全、更少交互,可以把你的 SSH 密钥上传到服务器。如果你已经在这台服务器上装好了 SSH 公钥,可以直接跳到下一节。
先安装 SSH 客户端。在 Debian 系发行版上执行:
sudo apt-get install openssh-client然后生成 SSH 密钥。如果主目录下还没有 .ssh 目录,先创建它并进入:
cd && mkdir -p .ssh && cd .ssh接着执行下面的命令,生成一对名为 rsa_id 的新密钥:
ssh-keygen -t rsa -q -C "For SSH" -f rsa_id命令会提示你输入 passphrase(口令),这是额外一层保护。输入你想用的口令,并在再次提示时重复输入;如果不想要口令就直接留空。不设口令可以让你在非交互的情况下传输文件——登录时不会被要求输入密码,但安全性会略低一些。
为了让登录更方便,可以在 SSH 的 config 文件中为网页主机添加一段定义。把 HOST 换成主机的 IP 地址或域名,把 USER 换成你传输文件时登录网页主机所用的用户名:
Host HOST
Hostname HOST
Port 22
User USER
IdentityFile ~/.ssh/rsa_id然后用 ssh-copy-id 命令把 SSH 公钥复制到远端服务器:
ssh-copy-id -i rsa_id.pub USER@HOST.com现在就可以直接连接远端服务器了:
ssh user@host既然已经能用 SSH 密钥登录,接下来创建一个脚本,把 Hugo 站点的部署自动化。
编写部署脚本
在 Hugo 项目根目录下新建一个名为 deploy 的脚本文件,写入以下内容,并把 USER、HOST、DIR 换成你自己的值:
#!/bin/sh
USER=my-user
HOST=my-server.com
DIR=my/directory/to/example.com/ # 网站文件应该放到的目录
hugo build && rsync -avz --delete public/ ${USER}@${HOST}:${DIR} # 服务器上不在本地 public 目录里的内容都会被删除
exit 0注意 DIR 是相对远端用户主目录的路径。如果你必须指定完整路径(例如服务器上的 /var/www/mysite/),就要把命令行里的 ~/${DIR} 改成 ${DIR};大多数情况下用不到。
保存并关闭文件,然后给 deploy 文件加上可执行权限:
chmod +x deploy运行部署
以后只要执行下面这一条命令,就能部署并更新网站:
./deploy站点会自动构建并部署,输出类似:
Started building sites ...
Built site for language en:
0 draft content
0 future content
0 expired content
5 pages created
0 non-page files copied
0 paginator pages created
0 tags created
0 categories created
total in 56 ms
sending incremental file list
404.html
index.html
index.xml
sitemap.xml
posts/
posts/index.html
sent 9,550 bytes received 1,708 bytes 7,505.33 bytes/sec
total size is 966,557 speedup is 85.86你还可以把其他处理任务(例如压缩图片、校验链接)一并加进这个部署脚本。