使用caddy和docker部署ghost博客
2022年09月28日更新:
由于最新版ghost的docker镜像不再内置mysql数据库,目前建议大家使用ghost:5.8版本。
最近发现一个很优雅的博客系统——ghost,蠢蠢欲动,看官网没有给出docker的部署方式,但是很容易能在dockerhub上找到社区提供的镜像:ghost-docker,加上最近好友安利了一款design for human的web server —— caddy 。索性推倒重来,在这边记录一下折腾的过程。
1. 安装caddy
首先我们要安装caddy,按照官网的步骤,稳定版安装方式如下:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
操作完以后,我们暂时不操作caddy,先放在一边,开始安装docker。
2. 安装docker
我的服务器是Debian11,以下步骤均为Debian上安装docker的流程。
其他linux发行版的安装步骤,也可以在docker的官方文档上查看到:docker docs
配置apt仓库
更新apt软件包的索引,并且安装下面这些软件,目的是能让apt支持HTTPS:
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
添加一下Docker官方的GPG秘钥:
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
用下面的命令配置apt仓库:
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
3. 配置一个博客域名,解析到这台服务器上
这边我是使用的cloudflare来做我所有的域名解析的:
添加一条记录,类型为A,内容为blog.{your_domain}.com,指向你的服务器ip。如果你和我一样用的cloudflare来进行域名解析,请务必将代理关闭,TTL自动即可。
完事以后,在本地终端ping一下,如果返回的是你的服务器ip,这部分配置就顺利结束。
ping 内容为blog.{your_domain}.com
4.docker安装ghost
回到服务器,参考以下命令稍作修改后执行:
docker run -d --name xxx-blog -e url=https://leitures.com -p 127.0.0.1:3001:2368 -v xxx-ghost-data:/var/lib/ghost/content --restart=always ghost
解释一下部分参数:
- -d 表示运行在后台。
- --name 表示为容器指定一个名称,这里你可以任意修改为 xxx-blog。
- -e 表示传入容器里的配置,ghost的docker支持传入url这个参数,在这一步一定要加上,caddy会自动为我们申请let's encrypted的证书,所以我们这边放心地使用https协议,地址就写上一步我们配置好DNS的博客域名blog.{your_domain}.com。
- -p 表示,将容器内部的2368端口,映射到服务器的3001端口。
- -v 表示使用volume卷。xxx-ghost-data 为卷名,这边你可以自定义。通过这个参数,docker会自动为我们在/var/lib/ghost/content 路径下创建一个名为xxx-ghost-data的volume,并且把容器中的数据,映射到这里。这样做的好处,即使后续我们docker rm删除了这个容器,也能在下次创建的时候,通过指定到同一个volume,来恢复数据,以实现数据持久化的效果。
- --restart=always,能让Docker重启时,自动重启该容器。
经过对这部分参数的理解,你应该能编辑好属于你的容器启动命令,贴入终端并执行。如果你之前没有用docker运行过ghost的镜像,第一次会从社区先下载,稍等片刻后,如果输出了一段容器id,就说明启动成功了。
此时,容器内运行在2368的ghost博客,也已经被映射出来,在服务器的3001端口上了。
5.回到caddy
caddy的配置方式多种多样,我们在任一路径,建立caddy文件夹,进入后,创建一个Caddyfile文件,如:
cd ~
mkdir caddy
cd caddy
touch Caddyfile
用vi打开Caddyfile,并进行如下配置,记得将首行的域名,改成你的真实域名:
blog.{your_domain}.com {
request_body {
max_size 100MB
}
reverse_proxy http://127.0.0.1:3001 {
header_up X-Real-IP {http.request.remote}
}
}
配置好Caddyfile后保存,在当前目录下执行:
caddy start
此时,caddy会读取Caddyfile中的配置信息,将blog.{your_domain}.com 反向代理到了服务器的3001端口,从而能打开ghost博客。
ghost博客地址:
https://blog.{your_domain}.com
ghost博客管理平台:
https://blog.{your_domain}.com/ghost
可以先进入ghost博客管理平台,第一次会要求你配置一些基本信息,随后就可以开始享受天马行空的创作了。