目录
0 前言
在此前的文章《在 Ubuntu 18.04 中搭建 GitLab 环境》中,笔者尝试了在 2 核 + 4G 的阿里云 ECS 上搭建 GitLab,无奈由于 GitLab 太占性能,最后只能卸载放弃。本文中,将使用更加轻量的开源解决方案 Gitea 来完成私有 Git 托管服务的搭建,并通过搭建好的 Gitea 管理 Hexo 博客工程的源码。
同时,还将通过 Git Hook 将 Hexo 博客的构建过程转移到线上,本地只需专注于创作与推送。借助 Gitea 仓库的在线编辑提交,还可实现 Hexo 博客的跨平台异地更新。
在实践本文内容前,读者应具备以下前提条件:
- 一台云服务器
- 域名 + ICP 备案 + DNS 解析
- SSL 证书
关于前提条件,可以参考此前的文章《将 Hexo 搭建的博客站点从 GitHub Pages 迁移到腾讯云 VPS》。
1 安装 Gitea
1.1 安装前置依赖
1 | sudo apt update |
配置 Nginx 服务自启动:
1 | sudo systemctl enable nginx |
1.2 创建工作用户
1 | sudo adduser \ |
上面的命令将分别创建一个名为 git
的新用户和组,并将其主目录设置为 /home/git
。
1.3 下载 Gitea 二进制文件,并添加可执行权限
1 | cd /usr/local/bin |
1.4 创建 Gitea 工作目录,并修改用户组及权限
1 | sudo mkdir -p /var/lib/gitea/{custom,data,log} |
1.5 配置 Gitea 服务自启动
编辑 /etc/systemd/system/gitea.service
,将官方模板中的内容粘贴进去:
1 | sudo vim /etc/systemd/system/gitea.service |
配置 Gitea 服务自启动:
1 | sudo systemctl daemon-reload |
查看 Gitea 服务运行状态:
1 | sudo systemctl status gitea |
重启 Gitea:
1 | sudo systemctl restart gitea |
1.6 初始化安装
若服务器的 3000 端口已经暴露到外部访问,那么通过在浏览器中访问 IP:3000
我们会来到 Gitea 的初始化安装页面,参考下述图片进行配置(大多数内容是我们在上文中编辑 Gitea 的 service 文件时写入的):
所有的配置最终会写入 /etc/gitea/app.ini
中,完成初始化安装后,我们随时可以通过编辑该文件修改配置。
1.7 配置 Nginx 反向代理
本节的内容将实现通过自有域名访问 Gitea 服务。
首先,参考以下内容编辑 /etc/nginx/nginx.conf
文件:
1 | user www-data; |
Nginx 默认监听 80 端口,但笔者服务器的 80 端口和 81 端口都已经分配给了其它服务,所以这里选择监听 82 端口。
然后,创建 /etc/nginx/ssl
目录并将自有域名的 SSL 证书上传到该目录。
其次,创建 SSL 配置文件 /etc/nginx/ssl/ssl.conf
,并参考以下内容对其进行编辑:
1 | # for gitea |
从两个配置文件的内容我们不难发现,对 IP:82
和 gitea.shipengx.com
的访问都将被重定向到 443 端口,对 443 端口的访问又会被代理到 localhost:3000
,最终实现通过 82 端口和域名访问云服务器的 Gitea 服务。
最后,重启 Nginx 服务,并在浏览器中输入域名我们便可访问自建 Gitea:
1 | sudo systemctl restart nginx.service |
1.8 为数据安全再加一道锁:配置 Nginx 登录验证
虽然我们可以设置 Gitea 的登录账户及密码,但为了安全,我们还可以再加一道 Nginx 登录验证,实现只有通过该验证才可以访问到 Gitea 登录界面的效果。
首先,安装 apache2-utils
工具:
1 | sudo apt install apache2-utils |
然后,创建 Gitea 登录账户并为其设置密码:
1 | sudo htpasswd -c /etc/nginx/.htpasswd new_user_name |
回车后会要求为新建用户设置密码。
其次,编辑 /etc/nginx/ssl/ssl.conf
文件,在 location /
项中添加 auth_basic
指令打开身份验证,并添加 auth_basic_user_file
指令指定我们上文中创建的登录凭证文件 /etc/nginx/.htpasswd
:
1 | # for gitea |
最后,重启 Nginx 服务:
1 | sudo systemctl restart nginx.service |
此时通过IP:82
或域名访问 Gitea 时首先会来到 Nginx 的登录验证页面,只有输入 /etc/nginx/.htpasswd
中存在的用户名及密码才可通过验证:
但还有个问题,此前我们配置了 3000 端口作为 Gitea 服务的外部访问端口,因此通过访问 IP:3000
可以直接绕过 Nginx 的登录验证:
所以为确保安全,我们需要在云服务器的安全策略设置中拒绝外部对 3000 端口的访问请求:
1.9 导入本地裸仓
如果服务器中已经有了此前建立的裸仓,我们可以将其直接导入到 Gitea 中进行管理。
首先,将已有的裸仓拷贝到 Gitea 的仓库存储目录下,并将其所有权变更为上文中所建立的 git:git
用户:
1 | cp -r ~/blog_test.git /var/lib/gitea/data/gitea-repositories/shipeng/ |
然后,依次执行下述图片中的步骤即可:
导入到 Gitea 中的裸仓与原裸仓将不再有任何关联。
2 为服务器安装 Node.js 与 Hexo
实现 Hexo 博客的线上管理与持续集成前,我们需要先为服务器配置好 Node.js 与 Hexo 环境,为确保稳定可靠,请尽量使用本文中对应的版本。
2.1 安装 Node.js
下载二进制文件(本文中使用 v12.14.1 版本)并上传到服务器的 /usr/local
目录下,然后解压:
1 | tar -zxvf node-v12.14.1-linux-x64.tar.gz |
为 node
和 npm
添加可执行权限并创建软链接:
1 | sudo chmod +x /usr/local/node-v12.14.1-linux-x64/bin/node |
2.2 安装 Hexo
通过 npm
安装 Hexo(本文中使用 4.2.0 版本):
1 | sudo npm install -g hexo@4.2.0 |
为 Hexo 可执行程序创建软链接:
1 | sudo ln -s /usr/local/node-v12.14.1-linux-x64/lib/node_modules/hexo/bin/hexo /usr/local/bin/hexo |
3 创建 Hexo 博客仓库并配置 Git Hook 钩子
完成上述步骤后,我们已经可以开始进行 Hexo 博客仓库的创建,并为其配置 Git Hook 钩子,并最终实现从线下创作到线上更新的自动化流程:
1 | 线下创作并推送提交 → 触发远程 Git Hook → 线上构建部署 → 站点更新 |
通过将博客的构建过程移到线上,不仅节约了本地的运算资源,而且可以让我们更专注于本地创作。
3.1 创建 Hexo 博客仓库
直接通过 Web 界面完成 Hexo 博客仓库的创建,并通过 https 克隆链接或 ssh 克隆链接将仓库克隆到本地,然后将本地仓库初始化(hexo init
)为 Hexo 工程或将已有的 Hexo 工程拷贝到本地仓库。我们应该为仓库添加一个 .gitignore
文件,并添加一些不应被 git 管理的忽略项:
1 | *.log |
最好再创建一个部署脚本,方便后面线上构建时直接被 Git Hook 钩子脚本调用,下面是笔者的部署脚本 deploy.sh
,该脚本被调用时会构建出博客的 HTML 静态页面,并将构建日志同时输出到终端和文件:
1 |
|
3.2 配置 Git Hook 钩子
创建 /var/lib/gitea/data/gitea-repositories/shipeng/blog.git/hooks/post-receive.d/post-receive
钩子脚本,输入下述内容:
1 |
|
其中,blog_dir
指代的是博客站点的 Nginx 代理目录,需要提前将其所有权设定为上文中所创建的 git:git
用户:
1 | sudo chown -R git:git /var/www/blog |
Git Hook 的具体工作原理是,每发生一个推送提交的行为,会首先调用 Gitea 创建的钩子脚本 /var/lib/gitea/data/gitea-repositories/shipeng/blog.git/hooks/post-receive
,该钩子脚本会调用上文中我们自定义的钩子脚本,自定义钩子脚本执行时,会将博客裸仓克隆出一个实体仓,并进入到实体仓中执行部署脚本 deploy.sh
,若博客构建成功,则会将实体仓中生成的 public
目录下的博客站点内容拷贝到博客站点的 Nginx 代理目录,最终实现从本地创作到博客更新的自动化。
4 后记
生命不息,折腾不止!
参考
- 在 Ubuntu20.04 上怎样安装 Gitea
- 在 Ubuntu20.04 上怎样添加和删除用户
- GIT 仓库、源码管理服务器 gitea 的安装、htttps 访问
- gitea 安装
- Gitea 官方文档
- gitea
- 如何在 Ubuntu 上使用 Nginx 设置密码验证