博客从GitHub Pages上迁移到个人VPS

记下博客从GitHub Pages上利用Git迁到VPS上的过程,以及中间遇到的各种问题。

本地安装Hexo搭建网站就不多讲了,可参考俺写的Linux下搭建Hexo个人博客 ,然后配置好本地SSH密钥,可参考俺写的使用SSH密钥进行Git协议传输 ,本地准备妥当,就开始折腾VPS上面了。

安装配置git

打开终端ssh root@vpsip,输入密码,进入vps,以下操作都在服务器上进行。

安装和创建git用户

apt install git //安装git

adduser git ,根据提示设置密码 //创建git用户

赋予git用户sudo权限

1
2
chmod 740 /etc/sudoers
vi /etc/sudoers

找到下面内容

root ALL=(ALL:ALL) ALL 在下面添加 git ALL=(ALL:ALL) ALL,如下

1
2
root    ALL=(ALL:ALL) ALL
git ALL=(ALL:ALL) ALL

保存退出后,修改回文件权限

chmod 440 /etc/sudoers

关闭git用户shell权限

注意:这一步非windows用户不需要修改

命令:vi /etc/passwd

最后一行的git:x:1001:1001:,,,:/home/git:/bin/bash

修改为git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

初始化git仓库

切换到git用户su git ,这一步很关键,下面操作都是git用户

1
2
3
4
cd /home/git      //切换到git用户目录
mkdir blog.git //创建git仓库文件夹,以blog.git为例
cd blog.git //进入仓库目录
git init --bare //使用--bare参数初始化为裸仓库,这样创建的仓库不包含工作区

创建网站目录

1
2
cd /var/www/      //切换目录
mkdir blog //创建网站目录,以blog为例

配置SSH

1
2
3
4
cd /home/git      //切换到git用户目录
mkdir .ssh //创建.ssh目录
cd .ssh
vi authorized_keys

本地执行cat ~/.ssh/id_rsa.pub,把里面的内容复制到刚打开的authorized_keys文件里面。

用户组管理

确保blog.git、.ssh、blog目录的用户组权限为git:git

1
2
3
sudo chown git:git -R /var/www/blog
sudo chown git:git -R /home/git/blog.git
sudo chown git:git -R /home/git/.ssh

配置Git Hooks

为什么要配置Git Hooks呢?因为本地hexo d命令实际上只deploy了本地的public文件夹到Git仓库,当Git仓库收到最新的push时,Git Hooks会将Git仓库接受到的内容复制到VPS上的网站目录内,相当于完成了手动将public文件夹复制到VPS的网站根目录。

创建post-receive文件

git用户下命令:

1
2
3
su git                       //切换到git用户
cd /home/git/blog.git/hooks //切换到hooks目录下
vi post-receive //创建文件

复制下面的内容到post-receive文件中:

1
2
3
4
5
6
7
8
#!/bin/bash
GIT_REPO=/home/git/blog.git
TMP_GIT_CLONE=/tmp/blog
PUBLIC_WWW=/var/www/blog
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

保存后,命令:chmod +x post-receive 赋予可执行权限。

尝试连接

本地打开终端:

ssh git@vpsip

提示 “welcome to ……” 说明连接成功了。

若默认端口不是22,则需要在后面加上端口号:

ssh git@vpsip -p 22

本地配置Hexo

打开本地博客根目录下的_config.yml文件,找到最后的deploy配置,修改为:

1
2
3
4
deploy:
type: git
repo: git@VPS的IP:blog.git
branch: master

服务端配置Nginx

安装Nginx

1
2
apt-get install nginx
nginx -V

配置Nginx

安装完成后修改Nginx的server文件

1
2
3
cd /etc/nginx/sites-available //切换目录
cp default default.bak //备份默认配置
vi default //修改配置

简单修改配置文件,其实这一步有挺多讲的,篇幅有限,下一篇再说,

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
server {
listen 80;
listen [::]:80;
server_name xxxx.com; #域名
root /var/www/blog; #网站根目录,
#下面是https跳转
location / {
return 301 https://$server_name$request_uri;
}
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name xxxx.com; #域名
root /var/www/blog;

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem; #证书路径,把里面的xxxx.com改成你的域名
ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;

location /nginx_status {
stub_status on;
access_log off;
}
}

systemctl start nginx //保存,启动Nginx

systemctl enable nginx //设置开机自动启动

systemctl status nginx //查看运行状态,显示running表示成功运行

nginx -s stop //立刻停止运行Nginx

到此,Hexo建站就全部配置部署完毕,后面就是例行的文章发布。