使用caddy和docker部署ghost博客

Code 2022年7月1日

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博客管理平台,第一次会要求你配置一些基本信息,随后就可以开始享受天马行空的创作了。

Tags

leitures

坐标南京,缺offer,求前端大佬收留。 微信号: leitures