1. 说明
在 Ubuntu 22.04 上使用 root 账号,创建普通账号,并赋予 root 权限。
演示站点:https://woniu336.github.io/
魔改hugo主题: https://github.com/woniu336/hugo-magic
2. 服务器配置
建立 git 用户
adduser git
安装 git
sudo apt install git
给新用户添加管理权限
sudo usermod -aG sudo git
账号切换
sudo su git
在服务端新建 git 仓库
cd ~
git config --global init.defaultBranch main
git init --bare hugo.git
sudo chown -R git:git hugo.git
mkdir hugo
配置钩子
vim /home/git/hugo.git/hooks/post-receive
写入以下文本:
git --work-tree=/home/git/hugo --git-dir=/home/git/hugo.git checkout -f
配置权限:
sudo chmod +x /home/git/hugo.git/hooks/post-receive
3.本地生成 SSH 密钥
打开 Git bash
输入:
ssh-keygen -t ed25519 -C "太酷啦"
复制公钥内容:
cat ~/.ssh/id_ed25519.pub
4. 服务器配置
登录到远程服务器,并将公钥内容添加到 ~/.ssh/authorized_keys
文件中
## 登录git用户
cd ~
mkdir -p ~/.ssh
echo "YOUR_PUBLIC_KEY" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
把YOUR_PUBLIC_KEY
替换成公钥内容
5.测试 SSH 连接
在推送代码之前,先测试 SSH 连接是否正常
注意:假设SSH端口是5522
,不是默认的22
ssh -p 5522 git@41.87.27.42
清理 known_hosts 文件
如果之前有错误的连接记录,可以尝试清理 known_hosts 文件
ssh-keygen -f "~/.ssh/known_hosts" -R "41.87.27.42"
6.本地推送
打开博客根目录,打开Git bash,输入:
hugo --gc --minify
创建本地仓库
cd public
git init
git branch -M main
添加远程仓库
git remote add origin ssh://git@8.8.8.8:33/home/git/hugo.git
确认远程仓库配置
git remote -v
第一次推送博客内容到服务器
git add .
git commit -m 'First Commit'
git push -u origin main
如果推送有问题,直接强推:
git push -f origin main
更新本地仓库(可选)
git fetch --prune
git branch -a
7.自动推送脚本
将脚本保存在博客根目录去执行
#!/bin/bash
# 备份 public 目录下的 .git 目录
if [ -d "public/.git" ]; then
mv public/.git .git_backup
fi
# 删除 public 目录
rm -rf public
# 生成静态文件
hugo --gc --minify
# 还原 .git 目录
if [ -d ".git_backup" ]; then
mv .git_backup public/.git
fi
# 进入 public 目录并推送更新
cd public
git add .
git commit -m 'update'
git push origin main
# 提示用户确认退出(使用绿色高亮)
echo -e "\033[1;32m推送完成。按Enter键退出...\033[0m"
read
8.宝塔部署
安装nginx,设置为静态站点,在计划任务添加shell脚本,将DEST_DIR
设置为你站点目录
脚本解释:使用rsync命令将hugo静态目录同步到站点目录
#!/bin/bash
LOCK_FILE="/home/git/myrsyncscript.lock" # 修改为你有权限写入的目录
(
flock -n 9 || { echo "Another instance is running"; exit 1; }
SOURCE_DIR="/home/git/hugo"
DEST_DIR="/www/wwwroot/book.xxx.org"
sudo rsync -avz --delete --exclude='.user.ini' --timeout=600 "$SOURCE_DIR/" "$DEST_DIR/"
if [ $? -eq 0 ]; then
echo "文件拷贝成功"
else
exit 1
fi
) 9>"$LOCK_FILE"
完美结局~