Hexo-Nginx-阿里云WindowServer2019建站2

Hexo-Nginx-阿里云建站2

上文记录了如何使用 Hexo-Nginx-阿里云 搭建静态网站。

但是!不能每次要更新网站,都把东西往服务器上面复制吧?这样太麻烦。

本文记录如何在本地一键部署至服务器。在 Windows Server 2019 服务器上安装 OpenSSH 服务,创建 git bare repo 并使用 post-receive 钩子,再进行简单的设置使本地 Hexo 部署时远程服务器仓库自动更新。

最终效果是我的个人博客“Cdd的庇护之地”:https://www.ahucd.cn

1. OpenSSH

首先需要在 Windows Server 上安装 OpenSSH 服务器,让本地机器可以 ssh 到服务器。

不需要下载额外的东西,在 windows 自带的可选功能中,就能启用 OpenSSH server。

1.1 安装OpenSSH服务器

设置-添加可选功能,对于 Windows Server 2019,OpenSSH 服务器已经集成进系统了。

服务器管理器-工具-服务,开启 OpenSSH SSH Server

在本地机器上,使用 ssh 服务器用户名@服务器公网ip,测试能否连上服务器。输入密码,连接成功。

1.2 使用公钥免密连接

如果每次都输入密码,有些麻烦,不能一键部署了。可以生成本地机器的公钥,将他放在服务器上,这样使用 ssh 连接的时候就不需要输密码了。

在有 git 的情况下 使用 ssh-keygen -t rsa -C "youremail@example.com" 生成密钥,直接 enter 这里不需要输密码。在 C:\Users\你的用户名\.ssh 可以看到刚刚生成的密钥,其中带 pub 后缀的是公钥,另一个是私钥。第三方网站例如 github/gitlab/gitee,进行 clone/push/pull 时有 http 和 ssh 协议,使用 ssh 时也需要设置好密钥。

接下来打开本地机器 git bush,使用 ssh-copy-id -i C:/Users/本地用户名/.ssh/id_rsa.pub 服务器用户名@服务器公网ip,将本地公钥复制到服务器上。enter 确认,这次要输入密码。

完成后这台本地机器再 ssh 服务器,就不需要密码了,免密连接。

这里有两个小坑:

一是用 powershell 时无法 ssh-copy-id,改用 git bush 就行。

二是有可能这么做了还是无法免密连接,可以尝试在服务器上,修改 ssh 的配置。详情参考 Ref-1。

本地机器的公钥,其实是复制到了服务器 .ssh/authorized_keys

2. GitServer

假设服务器上已经安装了 git 和 git乌龟(乌龟不是必须,但既然用了 windows 还是习惯装个乌龟),不需要再安装第三方的 git server 了。

2.1 创建版本库并使用钩子

新建一个文件夹,右键使用 git乌龟 在这里创建版本库。正常创建就行,直接确定。(不需要制作纯版本库,除非像让 .git 和代码的地方分开,不是很有必要)

在 .git/hooks 目录新建一个名为 post-receive 的文件。这是个钩子,会在服务器接受到推送来的文件时触发。说明:

  1. 如果没有这个钩子,推送后项目不会更新,只有 .git/objects 的内容会更新
  2. hooks 文件夹中的 sample 可能没有 post-receive,但这不影响我们使用这个类型的钩子
  3. git乌龟没有这个类型的钩子

post-receive 的内容是:

#!/bin/sh
unset GIT_DIR
echo 'hook work'
exec git --work-tree=C:/blog --git-dir=C:/blog/.git checkout -f

也许少几行也行。

2.2 git clone

右键使用 git乌龟 的 Git克隆,URL 是 服务器用户名@服务器ip:服务器版本库路径。例如我这里是 Administrator@x.x.x.x:C:/blog。

确认并输入密码,克隆成功。

2.3 git push

在服务器版本库的 .git/config 中,新增一行,避免因为分支不同引起的错误:

[receive]
    denyCurrentBranch = ignore

在本地机器上提交并推送,成功。并打印了 romote: hook work,说明钩子正常调用了。服务器的仓库中文件也更新了。

如果出现错误 “cannot spawn hooks/post-receive: No such file or directory”,这是由于linux和windows空格不兼容,手动敲一遍。

这次推送的时候,还是手动输了密码。右键进入 git乌龟 的设置,在网络中修改 SSH客户端 为 git 的 ssh.exe。再尝试推送,就不需要密码了,现在体验就很好了。

3. Hexo + Nginx

在上文《Hexo-Nginx-阿里云建站1》中已经记录了如何使用 Hexo + Nginx 建站,这里再记录一下,如何使用 Hexo 部署。

3.1 hexo init

在本地机器,把 .git 文件夹暂时移到别处,对项目文件夹使用 hexo init,生成 hexo 项目,再把 .git 文件夹移回来。

安装部署插件 hexo-deployer-git。npm install hexo-deployer-git --save

修改 _config.yml 文件,增加部署的设置。

修改 package.json 文件,增加脚本 a 和 start 。

使用 npm run start(或者 npm start),在本地机器上生成网站,可以使用 localhost:4000 查看效果。

使用 npm run a,在本地机器上生成,并部署到服务器。可以查看服务器上版本库中的内容如下。

3.2 nginx config

距离最终目标,就差最后一步了。就是修改一下 nginx 的 root 路径,让其指向服务器网站仓库。

这样就可以在服务器上通过 localhost 访问网站了。

也可以在任意机器上,通过公网,使用 ip 或者域名访问网站。


综上,后续就可以在本地写文章,使用 npm run a 一键部署到服务器。避免了频繁操作云服务器,毕竟卡…

另外,网站备案审核时间不短,在一周以上,急用的话请预留时间。

一切准备就绪,可能会再写篇文章记录 Hexo 的具体用法。

999. Ref

  1. Cdd的庇护之地:https://www.ahucd.cn
  2. gitee-win10上用默认OpenSSH部署git server:https://gitee.com/wag173/win10_git_server
  3. CSDN-带你跳过各种坑,一次性把Hexo博客部署到自己的服务器:https://blog.csdn.net/qq_35561857/article/details/81590953
  4. CSDN-cannot run hooks/post-receive: No such file or directory:https://blog.csdn.net/qq_48736958/article/details/113444533
  5. 博客园-已经在Git Server服务器上导入了SSH公钥,可用TortoiseGit同步代码时,还是提示输入密码?:https://www.cnblogs.com/andy65007/p/7266257.html
  6. Hexo文档-Deployment:https://hexo.io/docs/one-command-deployment
  7. git-book:https://git-scm.com/book/en/v2
  8. 堆栈溢出-Git-post-receive not running on window:https://stackoverflow.com/questions/48519719/git-post-receive-not-running-on-windows
  9. CSDN-GIT使用hooks的post-receive进行自动远程部署:https://blog.csdn.net/zxp3817100/article/details/86607344
  10. 简书-手把手教你搭建git服务器:https://www.jianshu.com/p/0c939f63af41

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 cdd@ahucd.cn

×

喜欢就点赞,疼爱就打赏

B站 cdd的庇护之地 github itch