折腾完Nginx后继续折腾Caddy,下面是踩坑记录。

大致过程

本地安装Hugo制作静态网站,将静态网站推到Github仓库中,服务器上安装Caddy利用GithubWebhook抓取静态网站到服务器上实现自动部署。

搭建环境

  • 本地:MacOS
  • 服务器:CentOS 7

这里吐槽下Caddy,他家的systemd简直神坑,CentOS 6 不支持, CentOS 7 又存在兼容性问题。

Hugo

本地安装Hugo并搭建网站

可以参考官网的指引:https://gohugo.io/getting-started/quick-start/

安装Hugo

brew install hugo

可能会出现 brew 升级,大概需要5分钟,不想升级的ctrl+c取消掉就行了。验证Hugo是否安装成功可以查一下 Hugo 版本。

hugo version

创建网站

先选择存放网站的路径后执行以下命令,把heap.fun换成你都网站名或自己喜欢的名字即可。

hugo new site heap.fun 

进入创建好的网站目录

cd heap.fun

此时的目录结构应该是这样的

.
├── archetypes # 内容类型,在创建新内容时自动生成内容的配置
├── content # 网站内容,Markdown 文件
├── data
├── layouts # 网站模版,选择主题后会将主题中的 layouts 文件夹中的内容复制到此文件夹中
├── static # 包含 CSS、JavaScript、Fonts、media 等,决定网站的外观。选择主题后会将主题中的 ststic 文件夹中的内容复制到此文件夹中
├── themes # 存放主题文件
└── config.toml # 网站的配置文件

然后可以找个主题,我的博客的主题用的是LeaveIt。作者是mogeko,他的博客地址是https://mogeko.me,里边有几篇文章是对这个主题的介绍。

如果你想参考别人网站用到什么主题,可以在https://whatcms.org上输入他的网址即可查询。注意不同类型引擎的主题不通用,即用Hugo搭建的网站只能用Hugo的主题。

导入主题

cd themes
git clone https://github.com/Mogeko/LeaveIt.git

创建一个新页面

hugo new about.md

此时 content 文件夹下就多了一个 about.md文件,打开文件就可以看到时间、文件名等信息已经自动生成了。

---
title: "About"
date: 2019-07-20
draft: true
---

两条 --- 间的信息是文章的配置信息,有的信息是自动生成的 (如:title、date 等),注意冒号后面要加一个空格,不然会报错。

配置 config.toml

config.toml 用于存放整个网站的配置信息。可以参考/heap.fun/themes/LeaveIt/exampleSite/config.toml,每项配置信息的作用请参照注释和调试结果查看,这里不一一介绍。

拷贝/heap.fun/themes/LeaveItlayoutsstatic两个文件夹至heap.fun下,覆盖已有文件夹。

注意:网站中About按钮对应的页面文件about.md应放到/heap.fun/content下,其它的文章应放到/heap.fun/content/posts下。

生成网站

设置完 config.toml 后我们进入/heap.fun目录下执行以下命令

hugo server --buildDrafts -w

此时你就可以在 http://localhost:1313 访问到你的博客了

简单介绍一下两个参数:

  • --buildDrafts: 生成被标记为 「草稿」 的文档

  • -w: 监控更改,如果发生更改直接显示到博客上 (保存即可预览效果)

但此时只能在本地访问 (相当于预览博客,如果与期望值不符,可以随时更改),在/heap.fun目录下执行命令

hugo

此时你的博客目录下会多出一个 public 文件夹来。这便是 Hugo 生成的静态网站。

Github

需要你本机安装 Git ,并在Github建一个公开库,并把public推到这个仓库中。教程见Github官方中文教程

本地执行命令cd public进入到public文件夹中,然后执行

echo "# 你的仓库名" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/用户名/仓库名.git
git push -u origin master

也可以使用Github客户端简化操作。

建好仓库后,在仓库的Settings下左侧的Webhooks里,点Add webhook添加钩子。

  • Payload URL设置为您的博客根目录加/webhook,例如这里就是https://heap.fun/webhook
  • Content type 设置为 application/json
  • Secret即密码,自己设置
  • 事件可以只选择push event
  • 点击Add webhook按钮即可。

服务器配置

Caddy

这部分参考了https://www.howtoing.com/how-to-host-a-website-with-caddy-on-centos-7

安装Caddy

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

查看安装路径

which caddy

创建用户和组

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

创建必要的目录并赋权

sudo mkdir /etc/caddy
sudo chown -R root:caddy /etc/caddy
sudo touch /etc/caddy/Caddyfile
sudo mkdir /etc/ssl/caddy
sudo chown -R caddy:root /etc/ssl/caddy
sudo mkdir /var/www
sudo chown caddy:caddy /var/www

安装systemd服务配置文件

我测试的 CentOS 6 下安装不了systemd

sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

打开caddy.service,修改里边的用户、群组和ReadWritePaths

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

CentOS 7在这里有个坑,参见Unknown lvalue ‘ReadWritePaths’ in section ‘Service’

#原值
ReadWritePaths=/etc/ssl/caddy
#修改为
ReadWriteDirectories=/etc/ssl/caddy

修改过caddy.service就需要重载

sudo systemctl daemon-reload


#开机自启
sudo systemctl enable caddy.service

#查看是否启动成功,这里因为没启动应该显示 Active: inactive (dead)
sudo systemctl status caddy

#启动命令,还没配置完这里先不启动
sudo systemctl start caddy
#重启命令
sudo systemctl restart caddy

配置 Caddyfile

sudo vi /etc/caddy/Caddyfile

git以下的是http.git自动部署用,可以先注释先测试网站效果。

heap.fun  {
    tls youremail@gmail.com #随便一个可用的邮箱,申请https证书用
    gzip #启用压缩,提升网页打开速度
    root /var/www/heap.fun #你的网站根目录,里边直接放html文件
    
    #自动部署用,可以先注释后面再测试
    git https://github.com/devwulin/heap.fun.git { #你的仓库地址
        path /var/www/heap.fun
        then hugo --destination=/var/www/heap.fun/public
        hook /webhook pd #webhook里的secret
        hook_type github
        clone_args --recursive
        pull_args --recurse-submodules
    }
}

# A记录的@和www是两个网站,把www重定向至@
# 要把其它域名指向这个网站也是一样的写法
www.heap.fun {
    tls youremail@gmail.com
    redir https://heap.fun
}

把你本地生成的public下所有文件上传至服务器网站根目录下,比如我上面用到的/var/www/heap.fun

sudo systemctl start caddy
sudo systemctl status caddy

启动caddy服务查看状态,sudo systemctl status caddy最好用两次,以第二次结果为准。

如果启动失败,可以用journalctl -u caddy查看日志。这个caddy.service神坑,问题会比较多。

启动成功就可以用网页打开你的网站了。

测试自动部署,你本地push到github后会自动触发,也可以在github-webhook下的Recent Deliveries点Redeliver手工推送。

自动部署功能服务器是否需要安装git跟hugo我也忘了,不方便测试,如果你测试不通可以把git跟hugo装上。