Hugo+Git+Obsidian博客自动化方案

Hugo+Git+Obsidian博客自动化方案

仍需解决的问题

  • Obsidian的格式与Hugo不同
  • Obsidian自动同步到文件夹并push

前言

之前的那些方案总感觉有些不得劲

所以本次的技术方案为:

项目技术
服务端Nginx
证书自动续签Acmebot
静态站点生成器Hugo
文档同步Git
博文管理Obsidian

Hugo的主题我选用的 西班牙 中国开发者Jimmystack主题

站点的搭建

Hugo的安装与初始化

Nginx和Acmebot的安装配置暂且略过,直接快进到Hugo这一步

首先需要在Hugo的releases中下载插件版(即开头是hugo_extended)

熟悉我的人应该都知道我Linux使用的是Debian,所以接下来一切都以Debian系系统为基准操作

执行

1
sudo dpkg -i ./hugo_extended_0.145.0_linux-arm64.deb

安装完毕后,cd进网站目录,初始化博客文件夹

1
2
sudo hugo new site blog
cd blog

这个时候blog文件夹中就是存有hugo目录结构的文件夹

如果想要了解更多,可以看hugo官方文档

主题的安装与配置、网站的生成

根据Stack文档的说法,在theme直接Clone仓库即可,即:

1
2
cd theme
sudo git clone https://github.com/CaiJimmy/hugo-theme-stack.git

为了使用该主题,我们还要进行配置,配置文件可以在./hugo-theme-stack/exampleSite/中找到,或者也可以直接执行:

1
2
sudo rm ../hugo.*
sudo cp ./hugo-theme-stack/exampleSite/hugo.yaml ../

此时可以直接sudo vim ../hugo.yaml,或者chown之后用其他软件修改

具体修改的内容可以参考Stack文档

⚠注意,需要在./content中创建文件夹page并在page中创建标签页信息,在content文件夹中创建_index.md等,详见Stack文档

修改完成后,只需要执行:

1
2
cd ../
sudo hugo

然后将blog.yourdomain的地址解析到/www/wwwroot/blog/publish就可以访问了

文档同步

对于文档而言,存在于/www/wwwroot/blog/content/posts(我这里做了修改,默认应该是post)文件夹中,但是出于偶尔可能要修改page,所以同步整个content

创建Git用户

不太喜欢弄混,所以在这里新建一个用户blog,隶属于组blog

1
sudo usradd blog -G blog

初始化Git仓库

1
2
3
sudo -u blog git init /www/wwwroot/blog/content
sudo chown -R blog:blog /www/wwwroot/blog/content
sudo chmod -R 775 /www/wwwroot/blog/content

设置Git裸仓库

为了允许远程访问,需要创建一个裸仓库,使用钩子函数设置自动同步

1
2
3
4
sudo mkdir /home/blog
sudo chown -R blog:blog /home/blog
sudo -u blog git init --bare /home/blog/blog-content.git
sudo -u blog vim /home/blog/blog-content.git/hooks/post-receive

post-receive的内容为

1
2
#!/bin/bash
GIT_WORK_TREE=/www/wwwroot/blog/content git checkout -f

post-receive设置可执行

1
sudo chmod +x /home/blog/blog-content.git/hooks/post-receive

仓库提交

因为刚刚创建了裸仓库blog-content.git,而且 /www/wwwroot/blog/content 有文件

所以我们需要进行一次提交:

1
2
3
4
5
6
cd /www/wwwroot/blog/content
sudo -u blog git init
sudo -u blog git add .
sudo -u blog git commit -m "Initial commit"
sudo -u blog git remote add origin /home/blog/blog-content.git
sudo -u blog git push -u origin master

此时本地就可以直接clone了

1
git clone blog@your-server-ip:/home/blog/blog-content.git

权限设置&博客自动生成

因为pull操作后所有文件会变为644(-rw-r--r--),所以需要将文件权限自动设置为775(-rwxrwxr-x),我们还是使用钩子函数,顺便把博客自动生成做了

1
2
3
sudo chown -R blog:blog /www/wwwroot/blog
sudo chmod -R 775 /www/wwwroot/blog
sudo -u blog vim /home/blog/blog-content.git/hooks/post-checkout

post-checkout的内容为

1
2
3
4
#!/bin/bash
echo "Fixing file permissions..."
find /www/wwwroot/blog/content -type d -exec chmod 775 {} \;
find /www/wwwroot/blog/content -type f -exec chmod 664 {} \;

post-checkout设置可执行

1
sudo chmod +x /home/blog/blog-content.git/hooks/post-checkout

Git免密

为了让后续访问不需要输密码,需要配置SSH密钥

在本地主机执行(我用的是Win11):

1
ssh-keygen -t ed25519 -f "$HOME\.ssh\blog" -C "blog@your-server-ip"

或者如果你用的是Linux的话:

1
ssh-keygen -t ed25519 -f "~\.ssh\blog" -C "blog@your-server-ip"

进入对应目录,打开终端,输入:

1
cat blog.pub

获取公钥,进入服务器SSH,执行操作:

1
2
3
4
sudo -u blog mkdir -p ~/.ssh
sudo -u blog chmod 700 ~/.ssh
sudo -u blog echo "公钥内容" >> ~/.ssh/authorized_keys
sudo -u blog chmod 600 ~/.ssh/authorized_keys
  1. 在本地主机(我用的是Win11):

    1. 打开$HOME\.ssh文件夹

    2. 使用记事本编辑config文件

  2. 或者如果你用的是Linux的话,执行:

1
2
cd ~\.ssh\
sudo -u blog vim config

输入以下内容

1
2
3
4
5
Host blog
    HostName your_server_ip
    User blog
    IdentityFile ~/.ssh/blog
    IdentitiesOnly yes

然后cd进克隆仓库,设置局部Git信息

1
2
git config user.name "blog"
git config user.email "[email protected]"

这样我们的博文只需要在本地的blog-content文件夹中进行修改,再push回服务器就可以实现博客的自动更新了

Obsidian的搭建

模板创建

在设置-第三方插件安装Template

创建一个笔记Template.md作为模板,添加以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
---
description:   

title:   

date: <% tp.date.now("YYYY-MM-DDTHH:mm:ss+08:00")%>  

tags: []  

categories: []  

featured: true  

---

同时开启插件设置的Enable folder templates

此时每创建一个笔记,都会自动应用模板并添加时间信息

使用 Hugo 构建
主题 StackJimmy 设计,DoubleCat 修改
© Copyright Licensed under CC BY-NC-SA 4.0