这篇文章也是用来记录我自己搭建博客博客的经历
1. 项目
1.1 实现链路
下面是整个博客的链路,因为我要考虑服务器迁移的问题,为了方便迁移所以会使用容器化方案。

最终实现我写好一篇文章,在本地使用 git push命令即可实现服务器自动更新内容。
1.2 文件结构
hugo-blog/
├── blog/
│ ├── source/
│ ├── repo.git/
└── docker-compose.yaml
source:存放hugo原始数据以及hugo编译后的public文件夹
repo.git:Git仓库
2. 博客搭建
2.1 创建Git仓库
-
在服务器上创建Git裸仓库,用于接收推送的代码
# 创建 git 文件夹 mkdir -p blog/repo.git cd blog/repo.git # 初始化裸仓库 git init --bare -
配置自动化钩子,当本地终端通过
git push推送文章时,服务器自动触发这个脚本vim hooks/post-receive#!/bin/bash # 定义路径 GIT_DIR=$HOME/docker/hugo-blog/blog/repo.git SRC_DIR=$HOME/docker/hugo-blog/blog/source # 1. 检出源码到临时目录 git --work-tree=$SRC_DIR --git-dir=$GIT_DIR checkout -f main echo "迁出分支成功" # 2. 使用 Docker 运行 Hugo 构建 # --rm 表示构建完后自动删除容器 docker run --rm \ -u $(id -u):$(id -g) \ -v $SRC_DIR:/src \ hugomods/hugo:latest build echo "Hugo构建成功"给脚本执行权限
chmod +x hooks/post-receive
2.2 本地终端Hugo配置
在Hugo项目根目录添加Git远程端
git remote add blog levitan@levitan.top:/home/levitan/docker/hugo-blog/blog/repo.git
2.3 docker-compose配置
services:
nginx:
image: nginx:alpine
container_name: hugo-blog
ports:
- "8002:80"
volumes:
- ./blog/source/public:/usr/share/nginx/html:ro
restart: always
2.4 主机Nginx配置
server {
listen 8443 ssl;
server_name blog.levitan.top;
# 域名证书位置
ssl_certificate /etc/nginx/ssl/blog/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/blog/key.pem;
location / {
proxy_pass http://127.0.0.1:8002;
# 重要的头部设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https; # 告知后端协议是 HTTPS
}
}