为什么不用WordPress、Typecho?

动态程序时不时会爆个安全漏洞,我比较懒,所以选择了静态这个路线,直接将博客文章生成html,自动上传到OSS,然后配合CDN加速,让读者纵向丝滑。

基于GitHub平台自动化部署方案概述

.md文章和图片都托管到GitHub

借助GitHub的Actions工作流,Hexo生成静态文件后,由Github增量同步到阿里云OSS,缺点是大图片从国内本地->国外GitHub服务器->阿里云国内的OSS节点,受网络抖动,可能存在传输失败的情况,优点是文章的书写可以在GitHub官方网站的Web界面完成。

仅.md文章托管到GitHub

借助阿里云官方的OSS工具oss-browser、ossutil,将图片从国内本地直传阿里云国内的OSS节点,可靠性更高,但是涉及到的软件和配置会多一点点。

我们先从公共部分开始配置

安装Hexo
1
2
3
git clone https://github.com/hexojs/hexo-starter.git blog
cd blog
npm install
删除用不到的文件
1
2
.github/dependabot.yml
themes
创建Github自动化部署脚本

.github/workflows/deploy.yml

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
28
29
30
31
32
33
34
35
36
37
name: Deploy My Blog #自动化的名称

on:
push:
branches:
- master #master为你的主分支名称

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '12'
cache: 'npm'

# 配置Hexo环境
- name: Setup Hexo
run: |
npm install hexo-cli -g
npm install
# 生成静态文件 hexo clean
- name: Build
run: |
hexo g

# 生成静态文件
- name: upload files to OSS
uses: fangbinwei/aliyun-oss-website-action@v1
with:
accessKeyId: ${{ secrets.ACCESS_KEY_ID }}
accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }}
bucket: 'szltblog' #修改成你自己的bucket
endpoint: 'oss-cn-shanghai.aliyuncs.com'
folder: 'public'
创建阿里云OSS读写AccessKey

在阿里云 https://ram.console.aliyun.com/manage/ak 界面创建云账号 ACCESS_KEY_IDACCESS_KEY_SECRET,然后在GitHub项目设置界面添加进去。

image-20230121214636578

新建个空白的 yarn.lock文件

至此,当GitHub检测到仓库新增 yarn.lock文件后,将开始自动编译Hexo,并将生成的静态文件自动上传到你的OSS bucket。

Github仓库结构如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HEXO-STARTER
│ .gitignore
│ package.json
│ yarn.lock
│ _config.landscape.yml
│ _config.yml

├─.github
│ └─workflows
│ deploy.yml

├─scaffolds
│ draft.md
│ page.md
│ post.md

└─source
└─_posts
hello-world.md

方案实施细节

.md文章和图片都托管到GitHub
仅.md文章托管到GitHub

进阶优化方向

提升阿里云账户安全性

云账号 AccessKey 是您访问阿里云 API 的密钥,具有账户的完全权限,建议改用RAM 访问控制子账户,可以为子账户只授权读写存放blog这个Bucket https://help.aliyun.com/document_detail/102600.html

image-20230122140055105
附上权限策略,将szltblog替换成你的Bucket名称

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
28
29
30
31
32
33
34
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:GetObjectAcl",
"oss:GetObjectTagging",
"oss:DeleteObject",
"oss:DeleteObjectTagging",
"oss:PutObject",
"oss:PutObjectAcl",
"oss:PutObjectTagging",
"oss:ListParts"
],
"Resource": [
"acs:oss:*:*:szltblog/*"
],
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:ListMultipartUploads"
],
"Resource": [
"acs:oss:*:*:szltblog"
],
"Condition": {}
}
]
}

网卡开机自启动

查看网卡名称

1
ip addr

配置网卡开机自启动,以网卡eth0 为例

1
nmcli connection modify eth0 connection.autoconnect yes

修改主机名

1
hostnamectl set-hostname vm2

使用阿里云镜像源替换默认源

备份默认源

1
2
mkdir /etc/yum.repos.d/backup
cp /etc/yum.repos.d/Rocky-* /etc/yum.repos.d/backup/

替换为阿里云

1
2
3
4
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/Rocky-*.repo
1
dnf makecache

参考:https://developer.aliyun.com/mirror/rockylinux

升级系统中所有软件包

1
2
dnf update 
dnf upgrade

创建一个新用户

当你使用 root 登录到服务器,我们一般都是新建一个普通用户
以用户 admin 为例,您可以将 admin 替换为您喜欢的名字

1
adduser admin

设置这个用户的密码

1
passwd admin

添加Root 权限

Rocky Linux 默认的 wheel 组有运行 sudo 的权限,将新用户加入 wheel 组中

1
gpasswd -a admin wheel

添加服务器的公钥授权(推荐)

如果你没有这一对密钥,可以使用一下命令生成,本例中用户名为 admin

1
2
ssh admin@SERVER_IP_ADDRESS
ssh-keygen -t rsa -C youremail@yourdomain.com

注意
输入密码的部分:
如果不输入密码,每次访问服务器不会提示输入密码
如果输入密码,每次访问服务器都需要输入这个密码

这里使用命令参数-t 指定了密钥的算法,-C 指定了密钥的注释
执行命令之后,会在 $HOME 下的 .ssh 目录下生成 2 个文件,id_rsa 为私钥,id_rsa.pub 为公钥

拷贝id_rsa.pub公钥到服务器
生成 SSH 密钥对之后,您需要将本地(客户端)的公钥,拷贝到服务器(服务端)

从本机拷贝到本机,执行以下命令

1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

另外,从本机拷贝到远程服务器,执行以下命令

1
ssh-copy-id -i ~/.ssh/id_rsa.pub admin@SERVER_IP_ADDRESS

这会将本地用户的公钥拷贝到服务端的 admin 用户的 .ssh/authorized_keys 文件中

开启私钥登录

1
2
3
4
5
sudo vi /etc/ssh/sshd_config

RSAAuthentication yes //去掉前面的注释
PubkeyAuthentication yes //去掉前面的注释
AuthorizedKeysFile .ssh/authorized_keys //去掉前面的注释

如果私钥不在本机,请先下载回来

1
scp -r admin@SERVER_IP_ADDRESS:~/.ssh/id_rsa  .ssh/vm2-admin

退出当前登录,验证证书能否正常登录

1
ssh -i .ssh/vm2-admin admin@SERVER_IP_ADDRESS

如果您是Windows用户,如果出现以下错误,请记得把私钥放到C:\Users目录下,比如C:\Users\admin\.ssh

1
2
3
4
5
6
7
8
PS C:\Users\admin> ssh -i /tmp/vm2-admin-id_rsa admin@10.0.0.33
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for '/tmp/vm2-admin-id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/tmp/vm2-admin-id_rsa": bad permissions

禁止root用户远程登录

先用admin登录到服务器,然后修改SSH配置

1
2
3
4
5
ssh admin@SERVER_IP_ADDRESS
sudo vi /etc/ssh/sshd_config

PermitRootLogin yes //去掉前面的注释
PermitRootLogin no //yes改为no

:wq 之后,保存退出

重启 SSH 服务,使其生效

1
sudo systemctl reload sshd

禁止密码远程登录

操作前确保私钥可以正常登录,并且当前用户拥有sudo权限

1
2
3
4
5
sudo vi /etc/ssh/sshd_config

PasswordAuthentication no //yes改为no
ChallengeResponseAuthentication no //yes改为no

:wq 之后,保存退出

重启SSH 服务,使其生效

1
sudo systemctl reload sshd
0%