将 Git封 装到 Ghost 的 Docker 中

这篇文章介绍如何将Git环境封装到Docker中,以避免Git环境被销毁的问题,以更好地用Github备份Ghost博客。
目录

在《在 fly.io 免费运行 Ghost 博客》中,我们提到,fly.io 的 root 环境是临时的,会在重新部署或重启 app 时复原,这得到了 fly.io 论坛的确认。这篇文章介绍如何将 Git 环境封装到 Docker 中,以避免 Git 环境被销毁的问题。

实际上,备份 Ghost 的方法有很多,除了我们过去介绍的使用 SFTP 的方法,还有其他一些,但这些方法传输速度实在太慢,而且每次都是全量备份,相比而言,使用 Git 更为优雅,因为它采用增量备份,而且复制速度极快!虽然搭建 Git 环境稍微繁琐,但一劳永逸。

1.准备部署文件

我们需要部署本地的 Dockerfile,而不是让 fly.io 自动拉取官方映像。

1.到 Github 下载官方映像。将这两个文件都下载。

2.打开终端,运行

mkdir blog

3.将上面两个文件复制到 blog 文件夹。blog 文件夹位于/Users/<ComputerUserName>/blog,也就是你的用户文件夹下。

4.运行

ssh-keygen -t rsa -C "<GithubEmail>"

连续回车。根据提示,查看密钥保存位置。以下是我的示例。

 ssh-keygen -t rsa -C "<GithubEmail>"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/<ComputerUserName>/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/<ComputerUserName>/.ssh/id_rsa
Your public key has been saved in /Users/<ComputerUserName>/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:siVmLMku/3BAem2ruRt44dEgdQsUBrKSAztU6HT1FIs k<GithubEmail>
The key's randomart image is:
+---[RSA 3072]----+
|o.++Bo.o.        |
|oB + o+..        |
|X o oE.o         |
|.+ = *           |
|  . O X S        |
|   = O *         |
|  o * +          |
|   + *           |
|    *+.          |
+----[SHA256]-----+

/Users/<ComputerUserName>/.ssh/ 这个文件中,将 id_rsa 和 id_rsa.pub 文件复制到 blog 文件夹。

用文本编辑器打开 id_rsa.pub,将其内容添加到 Github 的 SSH keys 中。

5.继续运行

nano auto_backup.sh

然后,将如下代码

#!/bin/sh

cd /var/lib/ghost/content/
git config --global init.defaultBranch master
git config --global --add safe.directory /var/lib/ghost/content
git config --global pull.rebase false
git pull
git add .
git commit -m "auto backup"
git push -u origin master --force

添于其中。按CTRL+O键,以保存;按CTRL+X键以退出 nano 编辑器。

6.打开 Dockerfile,编辑几个地方。我建议用 vs code 打开 blog 文件夹。

找到COPY docker-entrypoint.sh /usr/local/bin,然后,在其上方贴上如下代码:

COPY id_rsa /root/.ssh/
COPY id_rsa.pub /root/.ssh/
COPY auto_backup.sh /usr/local/bin/auto_backup.sh

找到ENV GHOST_VERSION,然后在其下一行添加如下代码:

RUN apt-get update -y && apt-get upgrade -y && apt-get install -y  git nano

7.参考上一篇文章准备好 fly.toml 文件。请删除

[build]
  image = "ghost:5"

8.这样,我们用于部署的几个本地文件都已准备好了,它们是:

  • auto_backup.sh
  • docker-entrypoint.sh
  • Dockerfile
  • fly.toml
  • id_rsa
  • id_rsa.pub

2.部署

登录

flyctl auth login --email=<FlyMail> --password=<FlyPassword> --otp=<任意字母>

发起一个 App:

flyctl launch --image=Decokerfile --name=<AppName> -r hkg --no-deploy

按照提示,按 y,以继续。

创建一个卷:

flyctl volumes create data  -r hkg --no-encryption --size 1

部署:

flyctl deploy

注意:若你已以标准方法安装了 Ghost,则你应该直接部署。

3.初始化 Ghost

参考上篇文章

4.备份

1.验证 Github 链接

ssh git@github.com

得到 successfully 的提示,即可。

2.初始化 Git,运行

cd /var/lib/ghost/content
git init
git config --global user.name "<GithubUsername>"
git config --global user.email <GithubMail>
git config --global --add safe.directory /var/lib/ghost/content
git remote add origin git@github.com:<GithubUsername>/<YourRepo>.git
git add .
git commit -m "auto backup"
git push -u origin master --force

检查 Github 的仓库的内容变化。

若出现错误,则运行

cd /var/lib/ghost/
rm -rf content

会提示其 busy,不用管它,已经清空。

之后,再次尝试初始化 Git。

5.还原

假设你全新安装了 Ghost,需要还原 Github 中已有的备份。

与备份不同的是,我们需要从 Github 中 pull 而不是 push 内容。

rm -rf /var/lib/ghost/content
cd /var/lib/ghost/content
git init
git config --global user.name "<GithubUsername>"
git config --global user.email <GithubMail>
git config --global --add safe.directory /var/lib/ghost/content
git pull --force git@github.com:<GithubUsername>/<YourRepo>.git

假如这个仓库是一个全新的仓库,也就是说,你把你的文件直接复制到其中,但还没有和远程仓库连接过,那么系统可能会提示你运行

git push --set-upstream origin master

执行操作即可。

6.日常备份

首先,赋予自动备份脚本执行权限,在 ssh console 中,运行一次

chmod a+x /usr/local/bin/auto_backup.sh

以后,在本地机器上,运行如下命令

flyctl auth login --email=<FlyMail> --password=<FlyPassword> --otp=<任意字母>
flyctl ssh console
sh  /usr/local/bin/auto_backup.sh

以日常备份。

可以编写一个自动登录 console 的脚本,在本机终端运行

nano fly.sh

将如下代码粘贴进去

cd blog
spawn flyctl auth login --email=<FlyMail> --password=<FlyPassword> --otp=<任意字母>
flyctl ssh console

保存并退出,然后运行

chmod a+x fly.sh

将其放到一个方面的地方,比如桌面。使用时,将其拖到终端,按回车,会直接进入 console。