当前位置: 首页 > news >正文

构建个人博客_Obsidian_github.io_hexo

1 初衷

很早就开始分享文档,以技术类的为主,一开始是 MSN,博客,随着平台的更替,后来又用了 CSDN,知乎,简书…… 再后来是 Obsidian,飞书,Notion,常常有以下困扰:

1.1 问题

  • 各平台格式不同,审核规则不同,需要花很多时间上传多个平台,文档更新成本也高。
  • 分类太简单,搜索困难,不能满足要求。
  • 虽然积累了一些积分和关注,但是平台更替,被黑,不可控。
  • 想表达的东西很多:技术文,书评,旅行,画画,其它作品,日常感受;长文与短文,文献与田野的不同风格;每个平台调性,受众不同,全放一起,显得很不专业。

1.2 优势

这么看来,自建平台相对来说更自由,更方便:

  • 租个每年几百块钱的服务器,或者先用个免费平台。
  • 从内容到数据迁移更自由,可利用工具切换平台,减少时间成本,一键分享/更新。
  • 构造一种介于“给自己看”和“给别人看”之间的状态,打通公/私分享内容。
  • 在自己的 blog 和 其它内容之间建立深度链接。
  • 设计自己的逻辑,做自己喜欢的分类和屏蔽规则,让不同类型的内容互不干扰。

1.3 劣势

但也存在一些问题:

  • 学习成本:虽然入门成本不高,但想做到自己满意,需要花很多时间。
  • 内容过多:当文章上千,待分享的内容大几百的情况下,有很多类别时,Layout很难做得好看,会引入整理和设计的时间成本。
  • 让更多人看到:写在公共网站上,写得好会被推荐,平台的属性和分类也会吸引更多读者;而自己做的网站相对难推,且有的免费站被百度搜索屏蔽掉了,只能申请自己的域名。
  • 建站成本:除了买域名,还需要做网站公安备案,也是费时费力。

总之,选择自建平台/公共平台,主要视情况而定,不过艺不压身,多学点东西,有更多选择总是没错的。

2 设计思路

2.1 选平台

最终的目标是可以省时省力,随时切换到各种服务器和平台。具体步骤如下:

  • 先找个免费的平台
    这里选用了 github.io,用法类似于 github 普通项目,可方便切换到任何历史版本。
  • 设计方便的切换方法
    为后期可方便地切换到一般的 Linux服务器,主要基于:Docker环境 + Python 后端工具 + JS 前端工具的架构。
    • Docker:便于切换平台;
    • Python:我对 Python 用着比较顺手,后面还可以加一些有意思的功能;
    • 前端:前端先期选用 Hexo,基于以下原因:
      • 既可以自己启动服务,也可以生成静态网页自动部署到已有的 Web 服务。
      • 无缝对接之前的 markdown 写作风格。
      • 插件多,且有很多网络 Theme 可选。

2.2 打通私人笔记和分享笔记

之前笔记写在 Obsidian中,主要使用 markdown 格式,只是文件头写得并不规范,导致转成 Html 后列表卡片显示不正常。这里使用简单的 Python 代码编辑所有文档的文件头。以保证文档正常显示。(非常简单,正在整理,后面会上传到 github 项目,或者做得更通用一些)

2.3 降低分享成本

  • 设计分享规则
    将笔记分为:分享、不分享 两个类别;不分享的包含一些还没写完的文档,模板,测试,以及某些不足为外人道的内容。如果大部分都可以分享,hexo 自带排除功能。所以只要用目录区分就可以了。如果有更进一步的要求,则需要一些程序或插件实现。
  • 快速部署到服务器
    Hexo支持部署功能,通过配置文件和一些简单脚本,即可实现:一键将 markdown 笔记分享/更新到博客。

2.4 设计展示

  • Hexo 默认 Theme 将展示分为:按标签分类、按日期分类、最近的文章。先实现基本功能,后期再通过插件扩展。
  • 选择喜欢的展示风格 Theme。

总之,前期架构使用了 Docker + github.io + Hexo 的组合,成本低扩展性高,具体方法下面逐一介绍。

3 github.io 建站

3.1 建立仓库

https://github.com/new

image.png

注意:repo name 需要填写:“用户名.github.io” 格式,只能使用你的用户名,也就是说每个 github 帐户只能建一个 github.io 的主页。

3.2 创建静态网页

$ git clone git@github.com:用户名/用户名.github.io.git
$ cd 用户名.github.io.git
$ echo 'hello world !!!' > index.html
$ git add index.html
$ git commit -m 'init'
$ git push origin master

提交后需要等一会儿,才能访问:https://用户名.github.io/,我大概等了两分钟。

4 Hexo 框架

Hexo 是一个简单、快速、强大的博客发布工具,支持 Markdown 格式,有众多优秀插件和主题。我一般使用Markdown语法编写文章,通过 Hexo 命令行工具生成静态网页,并通过 Hexo 部署到网站。

4.1 配置环境

安装 Hexo 之前先要安装 javascript 开发环境,因为怕麻烦,就直接使用了 Hexo 的 docker image 现成环境。具体版本用了轻量级且稳定的系统 alpine 版,整个镜像只有几十兆,其中还包含简单的 vi 编辑器。我的宿主机系统是 Ubuntu 22.04,具体操作如下:

$ docker pull taskbjorn/hexo:alpine-latest
$ sudo mkdir /exports/hexo_data -p # 数据存放在 docker 之外
$ sudo chmod 777 /exports/hexo_data
$ docker run -it --rm --name my_hexo_container --privileged=true -p 4000:4000 -v /exports/hexo_data:/home/hexo/.hexo taskbjorn/hexo:alpine-latest # 启动镜像

第一次运行时,数据安装到/home/hexo/.hexo目录,比较慢,再启就快了。
正常启动后,使用 localhost:4000 即可在本机访问博客,生成新内容时自动更新,无需重启服务。

从另一个终端进入 docker container,以使用命令操作 Hexo:

$ docker exec -it my_hexo_container sh

进入 docker 内部可以看到,当前用户为 hexo,在当前目录下已经建立好了项目文件。
其中包安装在 node_modules 目录下,markdown 等源数据在 source 目录下,生成的文件在 public 目录下,主要配置文件是_config.yml。

4.2 配置文件

_config.yml 是最基本的配置文件,至少需要设置其 site 部分:

title: '标题'
subtitle: '副标题'
description: '网站描述'
author: 作者
language: zh-Hans
timezone: 'Asia/Shanghai'

4.3 基本操作

$ hexo cl # hexo clean 清除缓存
$ hexo g # hexo generate 生成静态网页
$ hexo d # hexo deploy 部署
$ hexo s # hexo server 启动服务预览,由于docker已经启动了服务,无需此操作

4.4 Markdown规范

通过 markdown 生成的网页,如果不设置文件头,则列表中只能显示文件创建日期:

因此,至少需要设置 title 才能正常显示,一般设置 title, author, date, tags,Obsidian 的 hexo 模板如下:

---
title: <% tp.file.title %>
author: xieyan0811
date: <% tp.file.creation_date() %>
updated: <% tp.file.last_modified_date() %>
tags:
---

4.5 部署博客到 github.io

4.5.1 配置 github 免密环境

$ git config --global user.email 你的邮箱
$ git config --global user.name 你的用户名
$ ssh-keygen -t rsa -C 你的邮箱 # 一路回车

如果提示找不到 ssh-keygen,可能是 docker 环境中未安装该软件,由于安装的是 alpine 环境,需要用 root 权限登入,才能安装软件(建议另起一终端操作):

$ docker exec -u=root -it my_hexo_container sh # 以root方式登入
# apk add openssh # 安装 openssh 工具集

将 /home/hexo/.ssh/id_rsa.pub 内容加入 github,具体方法是:
https://github.com/settings/keys add ssh key

设置好后,查看能否正常使用:

$ ssh git@github.com  # 正常结果形如: You've successfully authenticated

4.5.2 配置文件

修改配置文件_config.yml,设置部署服务

deploy:type: 'git'repo: git@github.com:用户名/用户名.github.io # 注意这里不是http地址 branch: master

4.5.3 部署

$ npm install hexo-deployer-git # 安装 hexo 的 git 插件
$ hexo g # 生成静态网页
$ hexo d # 部署到 github.io 

正常执行后,可以看到 public 目录内容被更新到 github.io 主页,内容也不多,只有 demo 时不到1M。

4.6 显示图片

Hexo 支持多种显示图片的方法,比如图床,上传图片等,这里介绍最简单的方法:

4.6.1 安装插件

$ npm install hexo-asset-image
$ npm install hexo-renderer-marked

4.6.2 配置文件

保持_config.yml配置文件 中 post_asset_folder: false 不变,加入 marked 设置:

post_asset_folder: false
marked:prependRoot: truepostAsset: true
  • 我在 Obsidian 中的图片都放在 attachments/ 目录下,将此目录复制到 Hexo 项目的 source 目录中,即:source/attachments/xx.png
  • hexo g 重新生成后,图片正常显示
  • 注意图片较少时,建议使用该方法,图片很多时,github项目也变得很“重”,建议使用图床。

4.7 更换主题

建议设置一个常用的主题,比如next,遇到问题也好查资料。
官网主题见:https://hexo.io/themes/

  • 安装主题
npm install hexo-theme-next # 安装在node_modules/ 目录下
cp node_modules/hexo-theme-next/_config.yml _config.next.yml # 复制主题配置文件
  • 修改配置:在_config.yml中, 修改:theme: next
  • 重新生成后,即可看到新主题

4.8 调试

  • 查看软件版本
hexo -v
  • 查看详细 debug 信息
hexo g --debug # 加 --debug 参数
  • 忽略一些文章
    修改_config.yml,修改后注意先清缓存再生成,否则设置可能不生效。
skip_render: ['in_progress/**/*']

5 参考

Hexo + Obsidian + Git 完美的博客部署与编辑方案
搭建个人博客 — Hexo+Markdown+Github Pages
如何让Hexo不渲染某些文件
hexo相对路径图片显示
hexo博客如何插入图片
搭建自己的 github.io 博客
在github.io上写博客

相关文章:

构建个人博客_Obsidian_github.io_hexo

1 初衷 很早就开始分享文档&#xff0c;以技术类的为主&#xff0c;一开始是 MSN&#xff0c;博客&#xff0c;随着平台的更替&#xff0c;后来又用了 CSDN&#xff0c;知乎&#xff0c;简书…… 再后来是 Obsidian&#xff0c;飞书&#xff0c;Notion&#xff0c;常常有以下困…...

烟花厂人员作业释放静电行为检测算法

烟花厂人员作业释放静电行为检测算法通过pythonyolo系列算法模型框架&#xff0c;烟花厂人员作业释放静电行为检测算法在工厂车间入口处能够及时捕捉到人员是否触摸静电释放仪。一旦检测到人员进入时没有触摸静电释放仪&#xff0c;系统将自动触发告警。Python是一种由Guido va…...

ARTS挑战第二周-T:PHP数组相关操作

array_combine() 函数 合并两个数组 array_combine()传入2个参数&#xff0c;使用方法如下 array_combine(array $keys, array $values): array 返回一个 array&#xff0c;用来自 keys 数组的值作为键名&#xff0c;来自 values 数组的值作为相应的值。 array_key_exists() 函…...

【如何对公司网络进行限速?一个案例详解】

有不少朋友问到了关于企业网络QoS配置&#xff0c;这个确实在实际网络应用中非常多&#xff0c;基本上大部分企业或个人都用到这个功能&#xff0c;本期我们详细了解下QoS如何对宽带进行限制&#xff0c;QoS如何企业中应用。 一、什么是QoS? Qos是用来解决网络延迟和阻塞等问…...

服务器安全-修改默认ssh端口

防火墙先打开指定端口,要不修改后连不上(端口需要在65535之内) firewall-cmd --list-ports firewall-cmd --add-port54111/tcp --permanent firewall-cmd --reload-------------------- 先让两个端口同时存在,等配置成功后关闭22端口 vim /etc/ssh/sshd_config重启sshd service…...

保护隐私的第一步:从更新浏览器开始

当今社会已经进入了数字化和网络化的时代&#xff0c;而网络安全问题也日益突显。随着互联网在我们生活中的不断渗透&#xff0c;网络威胁变得愈发普遍和隐蔽。在这样的背景下&#xff0c;网络浏览器作为人们访问互联网的主要工具之一&#xff0c;不仅为我们提供了便捷的上网方…...

Python爬虫框架之快速抓取互联网数据详解

概要 Python爬虫框架是一个能够帮助我们快速抓取互联网数据的工具。在互联网时代&#xff0c;信息爆炸式增长&#xff0c;人们越来越需要一种快速获取信息的方式。而Python爬虫框架就能够帮助我们完成这个任务&#xff0c;它可以帮助我们快速地从互联网上抓取各种数据&#xf…...

【算法专题突破】双指针 - 盛最多水的容器(4)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;Leetcode&#xff09; 这道题目也不难理解&#xff0c; 两边的柱子的盛水量是根据短的那边的柱子决定的&#xff0c; 而盛水量…...

循环神经网络(RNN) | 项目还不成熟 |还在初级阶段

一&#xff0c;定义 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种深度学习神经网络架构&#xff0c;专门设计用于处理序列数据&#xff0c;如时间序列数据、自然语言文本等&#xff08;一般用来解决序列问题&#xff09;。 因为它们具…...

【Spring Boot】数据库持久层框架MyBatis — MyBatis简介

MyBatis简介 本节首先会介绍什么是ORM、什么是MyBatis、MyBatis的特点以及核心概念&#xff0c;最后介绍MyBatis是如何启动、如何加载配置文件的&#xff1f; 1.什么是ORM ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;是为了解决面向对象…...

K8S Nginx Ingress实现金丝雀发布

通过给 Ingress 资源指定 Nginx Ingress 所支持的 annotation 可实现金丝雀发布。 需给服务创建2个 Ingress&#xff0c;其中1个常规 Ingress&#xff0c;另1个为带 nginx.ingress.kubernetes.io/canary: "true" 固定的 annotation 的 Ingress&#xff0c;称为 Cana…...

【C++入门】new和delete(C/C++内存管理)

目录 1.C/C内存分布2.C语言中动态内存管理方式3.C内存管理方式3.1new/delete操作内置类型3.2new和delete操作自定义类型 4.operator new与operator delete函数5.new和delete的实现原理5.1内置类型5.2自定义类型 6.malloc/free和new/delete的区别7.定位new表达式&#xff08;了解…...

C++设计模式之桥接模式

文章目录 一、桥接模式二、std::error_code与设计模式&#xff08;桥接模式&#xff09;参考 一、桥接模式 在C中&#xff0c;桥接模式通常涉及以下几个角色&#xff1a; 抽象类接口&#xff08;Abstraction&#xff09;&#xff1a;定义抽象部分的接口&#xff0c;并维护一个…...

前端速查速记系列----评论列表

小程序评论列表 效果图 wxml代码 <view id"econtent"><block wx:for"{{commentlist}}" wx:for-item"item" wx:for-index"index" wx:key"{{item.id}}"><view class"box1"><view class"…...

hiredis的安装与使用

hiredis的介绍 Hiredis 是一个用于 C 语言的轻量级、高性能的 Redis 客户端库。它提供了一组简单易用的 API&#xff0c;用于与 Redis 数据库进行交互。Hiredis 支持 Redis 的所有主要功能&#xff0c;包括字符串、哈希、列表、集合、有序集合等数据结构的读写操作&#xff0c…...

【InsCode】InsCode打造的JavaSE与Linux命令互融的伪Linux文件系统小项目

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Ja…...

“深入解析JVM:探索Java虚拟机的内部机制“

标题&#xff1a;深入解析JVM&#xff1a;探索Java虚拟机的内部机制 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;包括JVM的基本结构、内存管理、垃圾回收机制和即时编译器等。通过对JVM内部机制的详细解析&#xff0c;我们可…...

内网远程控制总结

前言 在内网渗透过程中&#xff0c;会碰到远程控制soft或者其他&#xff0c;这里针对远程控制软件做如下总结。 远程控制软件 向日葵篇 向日葵查看版本 向日葵&#xff08;可以攻击&#xff09; 针对向日葵的话其实如果有本地安装的话&#xff0c;是有可能存在漏洞的。这…...

Excel显示此值与此单元格定义的数据验证限制不匹配怎么办?

总结&#xff1a;1、在编辑excel文档的时候&#xff0c;弹出此时预测单元格定义的数据验证&#xff0c;限制不匹配的提示。2、这是我们点击菜单来的数据菜单。3、然后点击数据工具栏的数据验证下拉按钮。4、在弹出的菜单中选择数据验证的菜单项。5、然后在打开的窗口中点击左下…...

mysql(八)事务隔离级别及加锁流程详解

目录 MySQL 锁简介什么是锁锁的作用锁的种类共享排他锁共享锁排它锁 粒度锁全局锁表级锁页级锁行级锁种类 意向锁间隙临键记录锁记录锁间隙锁 加锁的流程锁的内存结构加锁的基本流程根据主键加锁根据二级索引加锁根据非索引字段查询加锁加锁规律 锁信息查看查看锁的sql语句 数据…...

华为云Stack的学习(二)

三、华为云Stack产品组件 FunsionSphere CPS 提供云平台的基础管理和业务资源&#xff08;包括计算资源和存储资源&#xff09;。采用物理服务器方式部署在管理节点。可以做集群的配置&#xff0c;扩容和运维管理。 Service OM 提供云服务的运维能力&#xff0c;采用虚拟化方…...

好用的网页制作工具就是这6个,快点来看!

对于网页设计师来说&#xff0c;好用的网页设计工具是非常重要的&#xff0c;今天本文收集了6个好用的网页设计工具供设计师自由挑选使用。在这6个好用的网页设计工具的帮助下&#xff0c;设计师将获得更高的工作效率和更精致的网页设计效果&#xff0c;接下来&#xff0c;就一…...

一文讲通物联网嵌入式

最近有很多同学问我&#xff0c;物联网近几年一直是科技的热点&#xff0c;嵌入式和物联网有什么关系呢&#xff1f;我在这里统一给大家讲解一下。 嵌入式是应用于物联网产品方向的一种嵌入式操作系统。类似于Android系统是谷歌开发的移动操作系统&#xff0c;嵌入式实际上也是…...

Unity3D Pico VR 手势识别 二

Unity3D Pico VR 手势识别_Cool-浩的博客-CSDN博客 此篇主要讲解怎么手势追踪&#xff0c;手势姿态自定义预制识别&#xff0c;不会导入SDK和配置环境的请看上一章节 环境要求 SDK 版本&#xff1a;2.3.0 及以上PICO 设备型号&#xff1a;PICO Neo3 和 PICO 4 系列PICO 设备系…...

ubuntu中使用iptables限制端口

脚本 #!/bin/bash#关闭所有端口 echo "关闭所有入口" iptables -P INPUT DROP iptables -P FORWARD DROP#允许所有已建立的连接和相关连接的回复数据包通过 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT#允许ping iptables -A INPUT -p…...

Orchestrator介绍二 自身高可用性方案

目录 获得 HA 的方法 一 没有高可用性 &#xff08;No high availability&#xff09; 使用场景 架构组成 架构图 二 半高可用性&#xff08;Semi HA&#xff09; 三 基于共享数据库后端高可用&#xff08;HA via shared backend&#xff09; 四 基于Raft协议高可用 五…...

成集云 | 旺店通多包裹数据同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 随着品牌电商兴起&#xff0c;线上线下开始逐渐融为一体&#xff0c;成集云以旺店通ERP系统为例&#xff0c;通过成集云-旺店通连接器&#xff0c;将旺店通ERP系统多包裹数据同步至钉钉实现数据互通&#xff0c;帮助企业解决了电商发货存在的错…...

什么是字体图标(Icon Font)?如何在网页中使用字体图标?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 字体图标&#xff08;Icon Font&#xff09;⭐ 如何在网页中使用字体图标⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…...

Blender文件云端GPU渲染

本文介绍如何在 GPU云平台vast.ai 上渲染Blender动画的技术指南&#xff0c;假设你已使用 vast.ai 并知道如何启动实例&#xff0c;这里的重要步骤是为实例选择正确的映像。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 使用 nvidia/cuda:11.4.1-cudnn8-devel-ubuntu2…...

C++——引用

引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在的变量取一个别名&#xff0c;编译器不会因为引用变量而开辟内存空间&#xff0c;它和它引用的变量公用同一块空间。 相当于是给被引用的变量取了一个小名&#xff0c;但是相当于是同一个变量。 类型& 引用变…...