这篇文章也是用来记录我自己搭建博客博客的经历

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仓库

  1. 在服务器上创建Git裸仓库,用于接收推送的代码

    # 创建 git 文件夹
    mkdir -p blog/repo.git
    cd blog/repo.git
    
    # 初始化裸仓库
    git init --bare
    
  2. 配置自动化钩子,当本地终端通过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
    }
}