昨天晚上更新了一篇博客,想看看显示效果,结果发现 gitlab 给了个404,尴尬。过两天是不是可以看 到“你都遇到过什么奇葩简历”的问题下面会有这样的回复“简历上特地标明了有技术博客,然后博客打不开”。 原因gitlab变政策,域名要添加验证txt解析,我没看到,然后就不给用了。决定转到VPS和github算了。

1. 博客404原因

打开 ss 查了下 gmail 的邮件,原来3月23 gitlab 就已经发邮件通知了,域名验证失败,不再对 本博客域名进行转发。具体的说是 gitlab 为了确保 pages 使用者是域名的拥有者,需要添加一条 txt 解析记录。我对这点有疑问,无论使用者是否是域名的拥有着,只要域名拥有着本身同意将域名 CNAME 到 gitlab 的 pages 的地址,有什么问题吗? 可能只是因为使用者太多,故意添加一条障碍 减少免费用户罢了吧。

从中学到 1. 网站要做好监控 2. 接受监控信息的邮箱不要用需要开SS才能收到的gmail

2. 转到VPS+github

既然不爽 gitlab 这么搞事情,那么就把博客放到自己的VPS上去吧。实现的方案是,建一个git repo, 用来存储博客,添加一个 worktree, 然后用 hugo 生成网站内容,使用 nginx 服务。添加一个 post-update 的 hook, 通过密钥验证直接将内容 push 一份到 github 上。

具体操作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  # 用 > 表示 root 用户 shell, $ 表示普通用户的 shell
  > useradd git
  > mkdir -p /home/git/blog
  > mkdir /home/git/.ssh
  > cp ~/.ssh/authorized_keys /home/git/  # 使用密钥验证,无需设置密码
  > chown -R git:git /home/git
  > su git
  $ cd /home/git/blog
  $ git init --bare  # 创建一个bare的仓库
  $ cd hooks # 准备设置post-update的hook,该hook会在repo接受push后执行
  $ cat > post-update << EOF  
  #!/bin/sh
  git push  # push 内容到github
  update-blog-public  # 运行 update-blog-public 命令
  EOF
  $ git worktree add ../blogpages  # 添加一个 worktree,用来给 hugo 和 nginx 使用
                                   # 该动作会自动添加一个名为 blogpages 的 branch
                                   # 并且 checkout 到 ../blogpages 文件夹
                                   # 每次push后 worktree 中的内容通过 update-blog-public
                                   # 进行更新
  $ ssh-keygen  # 生成不需要密码的sshkey pair,默认名称即可
                # 需要将生成的 /home/git/.ssh/id_rsa.pub 内容添加到 github 账户下
                # 同时 github 上添加一个名为 blog 的空repo
  $ git push -u [email protected]:USER_NAME/blog  # 将 upstream 设置为 github 的repo
  $ exit  # 退出 git 用户,回到 root
  > cat > /usr/bin/update-blog-public << EOF
  #!/bin/sh
  cd /home/git/blogpages
  unset GIT_DIR  # git 优先使用 GIT_DIR 环境变量而非 PWD 作为 repo 的位置
                     # 为了使 cd 生效, unset 掉环境变量
  git merge master  # 更新到 master 的内容
  hugo
  EOF
  > chmod +x /usr/bin/update-blog-public

然后在nginx中添加对 /home/git/blogpages/public 作为根文件夹的 server 段就可以了, 注意 添加域名区分之前存在的服务。这样在 VPS 上就实现了 接受 git push -> push 到 github -> 更新 worktree 内容 -> hugo 生成静态页面 -> nginx服务 的功能路线.

其中的 unset GIT_DIR 变量开始没有发现,在 shell 中执行时由于没有 GIT_DIR 这个环境变量, 因此没有出现问题, 但是通过 git push 触发 hooks 时,环境变量中有这个值, 从而导致 fatal: Not a git repository: '.' 问题。从 stackoverflow 上找到的答案。

回到个人电脑上:

1
2
3
  $ cd blog  # 进入blog内容所在的repo
  $ git remote add vps [email protected]:~/blog  # 添加 vps 上的仓库作远程
  $ git push -u vps  # push 内容到 vps

之后,每次更新内容后 git push 就可以了,如果确定不再需要将内容 push 到 gitlab  也可以将 gitlab 的 remote 删除.

更新记录: 2018-06-11: update-blog-public中的内容修复