记一次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
| 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
RUN useradd -r -s /usr/sbin/nologin nginx
RUN git init --bare /root/blogs.git
RUN mkdir -p /var/www/hexo
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
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
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 ""
ADD nginx/hexo.conf /etc/nginx/nginx.conf
EXPOSE 22 EXPOSE 80 EXPOSE 443
CMD service ssh start && nginx -g "daemon off;"
|
- 将nginx镜像升级成ubuntu的镜像,安装openssh-server nginx cron certbot python3-certbot-nginx必要的服务。后续通过命令启动nginx服务
- ubuntu新增nginx用户才能操作nginx启动,和nginx.conf匹配
- 一键化certbot设置,新增
DEBIAN_FRONTEND=noninteractive
无交互配置,让certbot可以自动执行。但和之前一样,证书和docker分离,还是docker run好后,要自己去docker内部申请一下证书。
- 修复之前配置ssh的的一些公钥不合理的dockerfile命令。
- 在初始化仓库后,提交一个节点避免仓库创建后没有提交记录导致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
| echo "[your_ssh_public_key]" > ~/.ssh/authorized_keys
|
1
| chmod 600 ~/.ssh/authorized_keys
|
配置自动更新certbot
在docker容器内部执行以下命令
1
| echo "0 0 1 * * /usr/bin/certbot renew --quiet" >> /etc/crontabs/root
|
如果说没有/etc/crontabs/
文件夹,那么创建/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
新建密码