0%

记一次hexo blog的维护

记一次hexo blog的维护

自从21年把自己的blog docker化后就好久没有维护自己的blog了。以前都是一直是没有加入https的自动更新服务的,本次打算加入自动更新certbot的服务。同时都已经进入2025年了让deepseek优化一下自己的dockerfile。

全面升级dockerfile详解

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 使用 Ubuntu 作为基础镜像
FROM ubuntu:latest

# 设置环境变量(避免交互式提示)
ENV DEBIAN_FRONTEND=noninteractive

# 替换为国内镜像源
RUN sed -i 's#http://deb.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list && \
sed -i 's#http://security.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list && \
rm -rf /var/lib/apt/lists/* && \
apt-get update

# 安装必要的软件
RUN apt-get install -y git openssh-server nginx cron certbot python3-certbot-nginx

# 创建 nginx 用户
RUN useradd -r -s /usr/sbin/nologin nginx

# 初始化 Git 裸仓库(路径保持不变)
RUN git init --bare /root/blogs.git

# 创建目标目录
RUN mkdir -p /var/www/hexo

# 配置 post-receive 钩子
RUN echo "#!/bin/sh" > /root/blogs.git/hooks/post-receive && \
echo "git --work-tree=/var/www/hexo --git-dir=/root/blogs.git checkout -f" >> /root/blogs.git/hooks/post-receive && \
chmod +x /root/blogs.git/hooks/post-receive

# 初始化仓库并创建初始提交(解决 bad object 问题)
RUN git clone /root/blogs.git /tmp/blogs && \
cd /tmp/blogs && \
echo "Initial commit" > README.md && \
git add README.md && \
git config --global user.email "you@example.com" && \
git config --global user.name "Your Name" && \
git commit -m "Initial commit" && \
git push origin master && \
cd / && \
rm -rf /tmp/blogs

# 配置 SSH 服务(仅生成主机密钥,不限制登录形式)
RUN rm -f /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key && \
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && \
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && \
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

# 添加 Nginx 配置文件
ADD nginx/hexo.conf /etc/nginx/nginx.conf

# 暴露端口
EXPOSE 22
EXPOSE 80
EXPOSE 443

# 启动 SSH 和 Nginx 服务
CMD service ssh start && nginx -g "daemon off;"
  1. 将nginx镜像升级成ubuntu的镜像,安装openssh-server nginx cron certbot python3-certbot-nginx必要的服务。后续通过命令启动nginx服务
  2. ubuntu新增nginx用户才能操作nginx启动,和nginx.conf匹配
  3. 一键化certbot设置,新增DEBIAN_FRONTEND=noninteractive无交互配置,让certbot可以自动执行。但和之前一样,证书和docker分离,还是docker run好后,要自己去docker内部申请一下证书。
  4. 修复之前配置ssh的的一些公钥不合理的dockerfile命令。
  5. 在初始化仓库后,提交一个节点避免仓库创建后没有提交记录导致bad object问题。

github地址
dockerhub地址

使用步骤

前期步骤

docker安装看这里(这里拿ubuntu举例子):安装docker

docker设置自己的用户权限

1
2
3
sudo usermod -aG docker $USER

newgrp docker

docker登录自己的dockerhub

1
docker login -u ${yourhub_username}

拉取自己的dockerhub,具体可以按照上面我提供的github自己写一份自己的

1
docker pull ${yourhub}/${yourdocker}:latest

运行docker

volume自己的证书目录,开放80和443端口和8004的blog更新端口

1
docker run -v $(pwd)/letsencrypt:/etc/letsencrypt -d -p 80:80 -p 443:443 -p 8004:22 ${yourhub}/${yourdocker}:latest

进入启动后的docker内部

1
docker exec -it ${your_docker_id} /bin/bash

在运行起来的docker实例内部创建证书,创建证书更新脚本

申请证书

1
certbot --nginx -d "[your_domain.com]"

配置ssh,让本地的Blog可以推送过来

记得要改[your_ssh_public_key]为你自己的public_key

1
mkdir ~/.ssh
1
echo "[your_ssh_public_key]" > ~/.ssh/authorized_keys
1
chmod 600 ~/.ssh/authorized_keys
1
chmod 700 ~/.ssh
1
mkdir /run/sshd
1
/usr/sbin/sshd

配置自动更新certbot

在docker容器内部执行以下命令

1
echo "0 0 1 * * /usr/bin/certbot renew --quiet" >> /etc/crontabs/root

如果说没有/etc/crontabs/文件夹,那么创建/etc/crontabs/ 文件夹

1
mkdir -p /etc/crontabs

hexo推送

这个看我《Hexo博客部署的终极解决办法》这个的章节就好

记录一些其他问题

因为早早就把macbook换成了arm64架构的m1芯片了。所以docker本地build的时候会有些问题。需要做以下构建命令的替换

1
2
3
4
5
docker build -t ${docker_name} . 

# 替换成下面命令,上面不要用了,要用moby/buildkit buildx做一个垫片,不然就会构建arm64的产物而不是远程服务器的linux/amd64产物

docker buildx build --load --platform linux/amd64 -t ${docker_name} .

推送dockerhub的时候要打tag不然没有userscope推送不上去

1
docker tag ${docker_name}:latest ${userscope}/${docker_name}:latest

docker在本地构建老拉不下镜像需要开启bash或者zsh自己的http代理

(这个就没有教程了,科学上网)

一直发现hexo deploy的时候没有办法push上去,提示! [remote rejected] HEAD -> master (missing necessary objects)或者error: cannot create async thread: Operation not permitted或者fatal: bad object错误。

其实就是远端的docker太老了,更新一下远端服务器的docker版本。

某些环境(例如 GitLab 16.0 或 CircleCI 环境)报告需要 Docker 20.10.10 或更高版本才能正常运行。如果你使用的 Docker 版本较低,建议升级 Docker。相关问题

Oracle的服务器可以通过一些占用脚本提高服务器的使用率避免回收。

链接

记得在root下执行。首次使用root要通过sudo passwd 新建密码