Create Blog with hexo

2024-08-10 星期六 晴

介绍

在大学时(2015年~2019年),我觉得搭建一个博客很酷的事。虽然觉得很酷,但我仍然没有去实现这个很酷的事。直到三年后,我尝试了去搭建个人博客站点,但是对于我难度确实不小(知识储备不足),失败并搁浅了。

为什么几年后的今天,我又尝试去搭建个人博客呢? 一方面,我看到博客园近两年来危机不断,而我当初为了寻求方便,所以一直在博客园记录自己的东西。当然,我也希望博客园能尽快走出危机,准备去买一件博客园的周边T恤,权当赞助博客园。但个人能力有限,只能做到这点帮助,最终还是需要博客园找到自己的运营模式,毕竟单纯依靠粉丝支援和赞助只能解决一时困境。另一方面,随着这几年的技术经验的积累,完全有信心把博客搭建起来。
鸡蛋不能放在同一个篮子里,在博客园存放一份,Github也要存放一份,当然在本地主机上还是要存放一份。这样子就比较保险了,毕竟数据是无价的。

选型

搭建博客的方式有很多种,例如:WordPress、huogo、hexo等等。但是我必须寻求一种适合我的搭建方式,我的要求包括:

  • 支持markdown
    我习惯于了使用markdown写东西,用起来方便、快捷。
  • 简单且易用
    我希望能够通过简单的命令行就能够部署起来
  • 支持Github
    我有使用Github的习惯,一些学习的项目会上传到Github
  • 开源
    我习惯使用开源的东西,支持自定义很多东西

经过一段时间的挑选,hexo基本符合我的需求,而且生态也比较好,出现问题也容易解决,我决定使用hexo搭建个人博客站点。

搭建

搭建环境:
1、ubuntu22.04容器
2、npm (v8.5.1)
3、node (v12.22.9)
4、git (v2.34.1)

我的电脑系统是Ubuntu22.04,并且已经安装了Docker。我不希望hexo的环境影响到我的Ubuntu22.04系统,所以我决定通过Docker创建Ubuntu22.04容器来作为搭建博客的环境。同时,我学习Docker技术的时间也就一周左右,也能通过搭建博客的过程中,加强对Docker的使用和理解,一举两得。

拉取ubuntu22.04镜像

首先,搜索一下镜像源是否存在ubuntu22.04镜像,可以执行命令: docker search ubuntu:22.04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
caojun@caojun-NMH-WCX9:~/07-docker$ docker search ubuntu:22.04
NAME DESCRIPTION STARS OFFICIAL
ubuntu Ubuntu is a Debian-based Linux operating sys… 17202 [OK]
ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 52 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 115 [OK]
apache/cassandra-testing-ubuntu2004-java11 https://github.com/apache/cassandra-builds/t… 2
antrea/antrea-ubuntu-arm64 2
osrf/ubuntu_i386 Ubuntu i386 Docker Base Images 2
istio/app_sidecar_base_ubuntu_xenial Image for testing 0
istio/app_sidecar_ubuntu_jammy Image for testing 0
envoyproxy/envoy-build-ubuntu 7
eclipse/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 17
osrf/ubuntu_arm64 Ubuntu Arm64 Base Images 1
dokken/ubuntu-20.04 Ubuntu 20.04 image for use with Test Kitchen… 3
opensciencegrid/osgvo-ubuntu-18.04 OSG VO's base Ubuntu 18.04 image 0
dokken/ubuntu-18.04 Ubuntu 18.04 image for use with Test Kitchen… 5
fnndsc/ubuntu-python3 A slim Ubuntu-based Python3 image 33
apache/cassandra-ubuntu2004_test Apache Cassandra 0
jenkinsciinfra/jenkins-agent-ubuntu-20.04 "All-in-one" agent image for the Jenkins Inf… 1
antrea/ubuntu 1
dokken/ubuntu-22.04 Ubuntu 22.04 image for use with Test Kitchen… 3
antrea/base-ubuntu 1
ubuntu/cortex Cortex provides storage for Prometheus. Long… 4
jenkinsciinfra/jenkins-agent-ubuntu-22.04 "All-in-one" agent image for the Jenkins Inf… 0
gmao/ubuntu20-geos-env 0
dokken/ubuntu-16.04 Ubuntu 16.04 image for use with Test Kitchen… 2
pytorch/pytorch-binary-docker-image-ubuntu16.04 6

从上面的信息,可以看到镜像源包括了:ubuntu:18.04 、ubuntu:20.04 、ubuntu:22.04。直接拉取镜像到本地,执行命令: docker pull ubuntu22.04
拉取成功后,可以在本地查看所有镜像,执行命令:docker images

1
2
3
4
5
6
caojun@caojun-NMH-WCX9:~/07-docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 8a3cdc4d1ad3 6 weeks ago 77.9MB
ubuntu 20.04 5f5250218d28 2 months ago 72.8MB
hello-world latest d2c94e258dcb 15 months ago 13.3kB

通过上述的信息,可以看到拉取的ubuntu22.04镜像只有77.9MB。很多基础工具软件都没有,所以有必要安装并配置一下基础环境,但是先要宿主机上配置一些东西。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 为了容器映射卷,创建一个文件夹
mkdir -p ~/07-docker/blog-ubuntu22_04
cd ~/07-docker/blog-ubuntu22_04

# 宿主机防火墙开放8110端口,先查一下8110端口是否被占用
# 若没有被占用,就用8110来做映射
netstat -ap | grep 8110

# 防火墙开放8110
ufw enable
ufw allow 8110
ufw status

# 创建并运行容器,image_id=8a3cdc4d1ad3
docker run -itd -p 127.0.0.1:8110:4000 -e LANG=C.utf8 -e LC_ALL=C.utf8 --restart=always -v $PWD:/workspace -u 1000 --security-opt seccomp=unconfined 8a3cdc4d1ad3

完成宿主机上的一些基本配置后,可以进入ubuntu22.04容器配置环境了。首次进入ubuntu22.04容器还是要把基础环境搭起来,不然使用起来很不方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 进入ubuntu22.04容器,container_id=52e0bd6293ac
docker exec -it -u root 52e0bd6293ac /usr/bin/bash

# 为root用户创建密码
passwd root

# 创建普通用户cj
useradd -u 1000 -m -s /usr/bin/bash cj
passwd cj

# 切换到普通用户cj
su cj


# 更新apt源和升级本地软件包
sudo apt update
sudo apt upgrade

# 安装基础工具软件
sudo apt install -y git net-tools iputils-ping build-essential vim sudo curl

上面基本环境搭建起来后,发现有两个小问题:

  • cj用户无法使用sudo
  • git命令无法自动补全

解决第一个问题:

/etc/sudoers 文件中,把cj的权限添加进去,对于整个文件仅新增一行即可。
由于 /etc/sudoers 文件的权限是:440,所以先修改文件权限才能修改文件,执行命令:sudo chmod 640 /etc/sudoers

打开文件,执行:vim /etc/sudoers,新增一行:cj ALL=(ALL:ALL) ALL,给出修改后的部分内容

1
2
3
4
5
6
7
8
# 省略...

# User privilege specification
root ALL=(ALL:ALL) ALL
cj ALL=(ALL:ALL) ALL


# 省略...

修改并保存文件,需要将该文件的权限修改回来,执行命令:sudo chmod 440 /etc/sudoers

解决第二个问题:

ubuntu22.04容器没有激活git的自动补全脚本,所以git相关的命令都无法自动补全。
激活git自动补全脚本,执行命令:source /usr/share/bash-completion/completions/git

至此,ubuntu22.04容器的基本环境准备完成了,可以进入到下一步。

安装hexo

安装hexo

1
2
3
4
5
6
7
8
9
# 更新apt源
sudo apt update

# 下载hexo的依赖包
sudo apt intall node npm

# 下载hexo
sudo npm install -g hexo-cli

hexo安装完成后,可以查看版本,执行命令:hexo -v

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cj@52e0bd6293ac:/workspace/blog$ hexo -v
INFO Validating config
hexo: 7.3.0
hexo-cli: 4.3.2
os: linux 6.5.0-45-generic Ubuntu 22.04.4 LTS 22.04.4 LTS (Jammy Jellyfish)
node: 12.22.9
v8: 7.8.279.23-node.56
uv: 1.43.0
zlib: 1.2.11
brotli: 1.0.9
ares: 1.18.1
modules: 72
nghttp2: 1.43.0
napi: 8
llhttp: 2.1.6
http_parser: 2.9.4
openssl: 1.1.1m
cldr: 40.0
icu: 70.1
tz: 2021a3
unicode: 14.0

运行

通过hexo初始化一个博客站点,在本地运行博客站点

1
2
3
4
5
6
7
8
9
10
# 为博客创建根目录
mkdir -p /workspace/blog
cd /workspace/blog

# 初始化博客
hexo init

# 运行博客,可以通过参数-p指定端口,默认端口是4000
hexo s

在执行:hexo s 时会失败,提示如下报错:

1
{% extends ‘_layout.swig‘ %} {% import ‘_macro/post.swig‘ as post_template %}

经过在网上查找,发现hexo缺少了swig模块,现在将该模块下载到本地

1
2
3
cd /workspace/blog
npm i hexo-renderer-swig

再次运行博客,可以看下如下提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
cj@52e0bd6293ac:/workspace/blog$ hexo s
INFO Validating config
INFO Start processing
WARN ===============================================================
WARN ========================= ATTENTION! ==========================
WARN ===============================================================
WARN NexT repository is moving here: https://github.com/theme-next
WARN ===============================================================
WARN It's rebase to v6.0.0 and future maintenance will resume there
WARN ===============================================================
INFO Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop.


此时已经成功了,可以在ubuntu22.04容器内访问:http://localhost:4000/,可以通过curl去访问博客,但是这没法渲染。ubuntu22.04容器又没有浏览器,所以只能通过宿主机的浏览器去访问博客,在创建ubuntu22.04容器时,就已经做了端口映射:-p 127.0.0.1:8110:4000,所以宿主机访问 http://localhost:8110 就是访问ubuntu22.04容器 http://localhost:4000。所以,直接在宿主机的浏览器地址栏输入:http://localhost:8110 即可看到博客内容。

至此,在ubuntu22.04容器上基于hexo搭建个人博客就完成了。后续还会修改博客的主题(选择:next主题),并对next主题自定义修改,以及部署到Github。