Hexo 博客从 GitHub Pages 迁移到你自己的服务器。

方法一(失败了)

在服务器上准备好 Web 环境(如 Nginx + Node.js)。

本地生成静态文件后,把它上传到服务器。

修改 Hexo 的 _config.ymlhexo d 直接推送到你的服务器。

1、先在博客文件里面安装一个插件,这个插件用来通过 SSH + rsync 方式上传。、

npm install hexo-deployer-rsync --save

2、然后配置_config.yml(根目录的,不是主题的)

deploy:
type: rsync
host: your_server_ip #你的服务器 IP 或域名
user: username #SSH 登录的用户名(例如 `root` 或 `ubuntu`)
root: /root/data/www/hexo-blog #要上传到服务器的路径
port: 22
delete: true #部署时清空旧文件
verbose: true #输出详细日志方便排错
progress: true #显示上传进度

然后推送会通过ssh推送到服务器的对应文件目录下的,这里是已经生成的静态文件了。还有个地方也要改一下,也是config.yml(根目录的,不是主题的)

# URL
## 你的博客网址
url: https://www.zxzlimit.xin #改为自己的
# 文章永久链接格式(可按需修改)
permalink: :year/:month/:day/:title/
..........

3、配置域名

因为npm是配置在docker当中的,在 NPM Docker 容器的数据卷目录(通常是 ./data/)下创建一个子文件夹,例如 ./data/blog-code/。确保你的 index.html 文件放在这个文件夹中。(大坑),也就是对应docker-compose文件同层的data下面,这里的data才是对应路径当中的/data/www/hexo-blog的data。

还是使用Nginx Proxy Manager,这里区别其他的,最主要是要添加自定义配置,在里面添加

location / {
root /data/www/hexo-blog;
index index.html;
try_files $uri $uri/ /index.html;
}

/root/data/www/hexo-blog 换成你实际的 Hexo 静态文件路径。

配置好可能会丢失css和js文件,这个自己改了。

以后更新只需要,要输密码的,免密可以先配置ssh免密,参考之前的文章。

hexo clean && hexo g && hexo d

反正就是index.html能正常显示出来,但是啊里面许多对应的css啊,js啊什么的都缺失了。原因可能是没有给NPM对应访问文件的权限吧或者hexo的root配置问题吧,不过没有在尝试了,更换思路了。不过这里的docker下面的挂载确实要注意一下,这里是一个大坑,一个docker容器只能看到自己的配置的文件区域,超出这个区域就找不到文件了,这很重要,挂载可以让这个docker看到这个系统下的挂载的这个文件路径下的文件区域。

方法二(成功)

本质还是将hexo生成的静态文件放在服务器上面,然后用nginx给静态文件代理到一个端口.配置ssl,配置域名啊什么什么的.现在最主要的问题就是如何更新呢,当我有文件内容更新了如何才能方便快速的推送到服务器上面生成静态代码呢.这里就是在服务器上面建一个git初始化库,然后类似于github的,然后写一个钩子文件,当本地推送到服务器时,然后就自动执行钩子文件,在置顶位于生成静态文件强制覆盖这个地方的所有文件以此来实现更新.

这里参考了https://www.cnblogs.com/cheyaoyao/p/17836522.html#33-git-%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE文章.

1、服务器Git环境配置

(1)、服务器安装git

# 安装,遇到 yes 选 yes
apt install git

# 查看版本号
git --version

(2)、创建一个git用户

# 创建git用户
adduser git

# 修改git用户的权限
chmod 740 /etc/sudoers

# 进入 sudo 命令文件
vim /etc/sudoers

找到root ALL=(ALL) ALL,在下面添加git ALL=(ALL) ALL

image-20251025124423658

(3)、然后给权限

# 修改文件权限
chmod 400 /etc/sudoers

# 设置 git 用户的密码
sudo passwd git

(4)、配置服务器的Git 仓库

cd ~
git init --bare hexo.git

配置钩子文件sudo vim /home/git/hexo.git/hooks/post-receive

#!/bin/bash
{
echo "[$(date '+%F %T')] Deploy start"

# 强制删除旧文件(确保不会被权限锁死)
sudo -u git rm -rf /data/hexo/*

# Checkout 最新文件
git --work-tree=/data/hexo --git-dir=/home/git/hexo.git checkout -f HEAD

echo "[$(date '+%F %T')] Deploy end"
} >> /home/git/hexo.git/deploy.log 2>&1

并且要给写入权限

sudo setfacl -R -m u:git:rwx /data/hexo && sudo setfacl -d -m u:git:rwx /data/hexo

查看权限

ls -lah /data/hexo 只能看到组和root

getfacl /data/hexo 可以看全
会出现下面结果
# file: /data/hexo
# owner: www-data
# group: www-data
user::rwx
user:git:rwx
group::rwx
mask::rwx
other::rwx

在本地执行

hexo clean && hexo g && hexo d

在服务器查看钩子的log,看有没有什么问题,最主要就是git用户对应的权限问题了.

cat /home/git/hexo.git/deploy.log

2、配置 SSH 免密登录

有两种方式,一是在本地生成公钥/私钥对,分别配置到服务器和本地电脑就行.另一种是

ssh-copy-id username@your_server_ip配置一次就行了.任选一个就行.

3、Nginx配置;

这里我喜欢服务器同时部署NPM和nginx来进行代理.先使用docker来配置好NPM,端口配80、443、81(webui),然后在安装nginx,这个服务端口配的是8123.

nginx配置静态代理到本地端口,然后在将本地端口转发到NPM配置对外的域名,ssl等.

nginx安装好后主要看两个文件,一个是/etc/nginx/nginx.conf文件,主配置的,另一个是/etc/nginx/sites-available/default

这里比较简单,就配置一下default就行.

sudo vim /etc/nginx/sites-available/default

使用vim配置

server {
listen 8123;
listen [::]:8123;

root /data/hexo;
index index.html;

location / {
try_files $uri $uri/ /index.html;
}
}

然后还要给nginx访问/data/hexo文件的权限

sudo chown -R www-data:www-data /data/hexo

然后重启nginx,应该就可以在本地ip:8123访问到了.访问不到就是其他哪里配置有问题,注意权限问题,经常踩坑502.确保/data/hexo在root和www-data和git都有这个位置的所有权限.

sudo systemctl restart nginx

然后进行NPM的配置了,这里就不讲了.