目录

收起

历程

0 环境

1 安装 Hugo

2 同步到 Github

3 服务器安装配置 Caddy

避坑

感谢

引子

  前几天在网上冲浪的时候恰好点进了一个博客 Wyane’s Blog ,被这个主题所吸引,立即萌生了使用这个主题的想法。阿里云选购了一台最便宜的七十多一年(新用户优惠)的云服务器和一个最便宜的域名,开始了博客迁移之路。原先的博客使用的是 Hexo,搭建在 Github Page 上边,访问速度不理想也是一个很重要的原因。


历程

0 环境

  • 本地主机:macOS 10.15
  • SSH 工具:FinalShell
  • Github 账号
  • 一台服务器:CentOS

1 安装 Hugo

brew install hugo

在 macOS 上使用 brew 进行安装软件时,首先会进行对已有软件的检查更新。由于众所周知的原因,速度普遍偏低,这一步需要好几分钟以至于很长一段时间,需要耐心等待,也可以走更换 HomeBrew 源或者走代理。

安装好 Hugo 后在本地创建博客目录:

hugo new site yoursite

进入 yoursite 文件夹可以看到已经创建好了站点。其中 content 文件夹存放博文,layouts 文件夹存放博客模版,比如博客的页面结构。static 文件夹存放前端文件和以后显示在博客中的图片,themes 存放主题文件,安装的主题都会存放在该文件夹中。config.toml 是博客的配置文件。

创建一个页面:

hugo new posts/Hello-world,md

该命令会在 content/posts 中生成一个 md 文件,使用 markdown 语法写博文。博客的 about.md 文件应该放置于 content 文件夹下。

配置文件 config,toml :

# 我使用的是 Leaveit 主题,所以以该主题的配置文件为例
baseURL = ""
languageCode = "zh-CN"
title = ""              # 你的网站名称
theme = "LeaveIt"       # 当前使用的主题名称,与 themes 文件夹中的子文件夹名称一致
 
paginate = 15           # 每页显示的博文数量
enableEmoji = true      # 允许使用 Emoji 表情,建议 true
enableRobotsTXT = true  # 允许爬虫抓取到搜索引擎,建议 true
googleAnalytics = ""    # 谷歌统计
 
preserveTaxonomyNames = true
hasCJKLanguage = true    # 正确显示文章字数统计,建议为 true
 
[blackfriday]
  hrefTargetBlank = true
  nofollowLinks = true
  noreferrerLinks = true
 
[Permalinks]
 posts = "/:year/:filename/"
 
[menu]
  [[menu.main]]
    name = "Blog"
    url = "/posts/"
    weight = 1
 
  [[menu.main]]
    name = "Categories"
    url = "/categories/"
    weight = 2
 
  [[menu.main]]
    name = "Tags"
    url = "/tags/"
    weight = 3
 
  [[menu.main]]
    name = "About"
    url = "/about/"
    weight = 4
 
[params]
    since = 2020
    author = ""                   # Author's name
    avatar = "images/avatar.jpeg" # Author's avatar
    subtitle = "Fuck The Life"    # Subtitle
    cdn_url = ""                  # Base CDN URL
    home_mode = ""                # post or other
 
    google_verification = ""
 
    description = ""              # site description
    keywords = ""                 # site keywords
    favicon = "favicon.ico"
    beian = ""
    baiduAnalytics = ""
 
    license= '本文采用<a rel="license" href="http://creativecommons.org/licenses/by-nc/4.0/" target="_blank">知识共享署名-非商业性使用 4.0 国际许可协议</a>进行许可'
 
[params.social]
    GitHub = "xxoo"
    Twitter = "xxoo"
    Email   = "xxoo"
    Instagram = "xxoo"
    Wechat = "xxoo"               # Wechat QRcode image
    Facebook = "xxoo"
    Telegram = "xxoo"
    Dribbble = "xxoo"
    Medium = "xxoo"

大致配置好后在本地查看显示效果:

# --buildDrafts 参数表示显示包含草稿在内的所有文章
# -w 表示监控更改,本地修改保存后立即同步,在网页上实时显示
hugo sever --buildDrafts -w

浏览器访问 localhost:1313

执行命令后同时会在 yoursite 目录下创建 public 文件夹,里面是当前网站静态内容。

2 同步到 Github

首先到 github 创建一个 public 类型的仓库, 私有仓库无法自动同步到服务器。接下来需要把 yoursite/public 目录推送到这个仓库中。只需要 public 文件夹内的内容。

cd yoursite/public
# 创建 README 文件
echo "# yoursite" >> README.md
# 仓库初始化
git init
# 添加所有文件到暂存区
git add .
# 提交
git commit -m "first commit"
# 指定远程仓库
git remote add origin https://github.com/user/repo.git
# 推送
git push -u origin master

如果你在创建的时候自动初始化了 README.md 文件,就不用再在本地创建 README,md 文件,但是需要先 git pull 同步到本地再执行 git push。

进入你的仓库,上方菜单栏点击 Settings,左侧 Options 选择 Webhooks,选择 Add webhook。Content type 选择 application/json,设置密码,假装为 password,选择 Enable SSL verification,Just the push event,点击 Add webhook 进行保存。在为仓库添加 webhook 后,可以很方便地使用 caddy 自动同步这个仓库的更新内容到服务器。

3 服务器安装配置 Caddy

caddy 是一个轻量级的 web 服务端,可以提供 http 服务。功能不如 Apache/Nginx 强大但是可以自动从 GitHub 上拉取更新到本地,并且能自动申请 ssl 证书,避免访问时的不安全网站提醒。

安装:

curl https://getcaddy.com | sudo bash -s personal http.git

由于众所周知的原因,这一步的时间可能会比较长。personal 参数表示安装的是免费的个人版本而非收费的企业版本,http.git 是 caddy 扩展。

安装好后需要为 caddy 创建一个独立的用户和用户组:

sudo adduser -r -d /var/www -s /sbin/nologin caddy

创建必要目录并为 caddy 用户赋予相关目录权限:

# caddy 配置文件保存目录
sudo mkdir /etc/caddy
# 赋予权限
sudo chown -R root:caddy /etc/caddy
# 创建 caddy 配置文件 Caddyfile
sudo touch /etc/caddy/Caddyfile
# 创建 ssl 证书保存目录
sudo mkdir /etc/ssl/caddy
# 赋予权限
sudo chown -R caddy:root /etc/ssl/caddy
# 创建网站文件夹,一般网站的部署路径为 /var/www,在该文件夹下建立多个网站目录
sudo mkdir /var/www
# 赋予权限,从 GitHub 拉取仓库的时候必须有读写权限
sudo chown caddy:caddy /var/www

安装systemd服务配置文件:

# 当前使用 centos 7,据说 centos 6 无法安装 systemmd
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

修改 caddy.service 内容:

sudo vi /etc/systemd/system/caddy.service
# 原值
; User and group the process will run as.
User=www-data
Group=www-data
 
# 修改为
; User and group the process will run as.
User=caddy
Group=caddy
 
# 原值
ReadWritePaths=/etc/ssl/caddy
ReadWriteDirectories=/etc/ssl/caddy
 
# 注释掉 ReadWritePaths
; ReadWritePaths=/etc/ssl/caddy
ReadWriteDirectories=/etc/ssl/caddy
 
# 原值
StartLimitIntervalSec=14400
StartLimitBurst=10
 
# 注释掉
; StartLimitIntervalSec=14400
; StartLimitBurst=10

因为开启 caddy 后网站一直无法访问,使用命令查看日志:

journalctl -u caddy

发现报错 Unknown lvalue ‘xxxxxx’ in section ‘Service’,于是找到这几行进行删除。原因参见 Unknown lvalue ‘ReadWritePaths’ in section ‘Service’

修改 Caddyfile 文件:

sudo vi /etc/caddy/Caddyfile

写入:

yourdomain {
    root /var/www/yoursite
    index index.html
    log /var/log/caddy/access_log.log
    errors /var/log/caddy/error.log
    tls youremail
    gzip
 
    git https://github.com/user/repo.git {
        path /var/www/yoursite
        hook /webhook password
        hook_type github
        clone_args --recursive
        pull_args --recurse-submodules
    }
}

第一行为你申请的域名。 root 参数表示要请求分发的路径,yoursite 里面的文件就是你本地 hugo 网站内自动生成的 public 文件夹内的文件,也就是同步到 GitHub 上的静态网页文件。index 指定了访问的入口。log,error 参数指定了 caddy 运行日志和错误日志的保存路径,需要提前给 caddy 用户进行赋权,否则会启动失败。 tls 为自动申请 ssl 证书所需要的邮箱,切记要你当前服务器能访问的邮箱。比如我用的阿里云服务器,一开始写上了 gmail 邮箱,因为众所周知的原因是访问不了的,caddy 申请多次后就被拒绝,启动失败,一小时内无法再次申请。换成 qq 邮箱一小时后重新启动 caddy 自动申请证书,启动成功。gzip 表示开启压缩加速访问。

下面的 git 配置是使用 webhook 自动同步仓库到本地。git 后面接仓库地址。path 为拉取仓库后要保存的地址,即在服务器上的网站目录。hook 最后填写的是当初在 github 仓库中设置 webhook 时的密码,假装是 password。

配置完成后保存退出,启动 caddy:

# 重载配置文件
sudo systemctl daemon-reload
# 设置 caddy 开机自启
sudo systemctl enable caddy.service
# 查看是否启动成功,这里因为没启动应该显示 Active: inactive (dead)
sudo systemctl status caddy
# 启动 caddy
sudo systemctl start caddy
# 过十秒钟左右再次查看 caddy 状态
sudo systemctl status caddy
 
# 重启命令
sudo systemctl restart caddy
# 停止命令
sudo systemctl stop caddy

至此就可以使用域名访问博客了。


避坑

  • 切记邮箱要能够访问。国内的服务器就用国内的邮箱。
  • systemctl status caddy 会显示最近的几条日志,如果提示认证失败,极有可能是邮箱问题,换一个邮箱试试
  • caddy 启动问题最好的解决办法还是查看日志:journalctl -u caddy
  • 服务器记得放行 80 和 443 端口。http 请求走 80 端口,https 请求走 443 端口

感谢

Allin’s Blog:

Wyane’s Blog:

Leave It 主题的作者 Mogeko 的博客: