Git服务器搭建(HTTP方式,Rocky 9)
背景
为了保证公司代码安全,私密git服务器是必需的。GitHub免费私密代码库只能最多3个贡献者,显然是不能用的。其他服务也一样并不可靠。
于是查看各大开源项目的git仓库,发现大家都用GitLab CE,经过一番周折(官网疯狂推销他们的云上服务,导致self-host下载入口很难找到),在虚拟机上安装了GitLab CE。安装过程比较漫长,因为GitLab确实很大,而且配置项也很多。安装好后只需简单配置即可使用。
但是好景不长,我的虚拟机上马上就出现了warning,说内存不足导致进程退出。我的虚拟机分配了4GB内存,没开swap,一看htop
内存确实爆满。开了swap也只是短暂解决问题。询问朋友得知他的GitLab备份服务器装了8GB内存才开起来。项目参与人数多了之后,GitLab肯定会要求更多的硬件,而目前公司提供的4核4GB内存VPS显然无法满足需要,升级VPS价格又极其高昂。所以要么手动关闭GitLab的功能,要么另想办法。手动配置GitLab可能会很麻烦,而且不一定有效,所以还是看看GitLab出现之前大家都在用什么吧。
经过简单的搜索,发现git本身就可以作为服务器使用。于是本文就记录一下搭建git服务器的过程。
准备工作
- 虚拟机:Rocky Linux 9.2(我做了错误的选择,RH系麻烦多了)
- 官方文档:https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols
- 协议的选择:根据官方文档,很显然直接选择http(s)协议
- 本地协议:需要挂载网络驱动器,只能小范围使用
- http(s)协议:最好的选择,但设置最麻烦
- ssh协议:设置很容易,但会给用户ssh权限
- git协议:没有任何身份验证,不知道为什么要做
操作步骤
-
在虚拟机中安装系统并进行基本配置
-
安装软件包
git
nginx
:http(s)服务器fcgiwrap
:CGI脚本用的FastCGI包装(需要epel仓库)httpd-tools
:需要里面用于生成密码hash的工具htpasswd
,如果是deb系包名是apache2-tools
-
启动
fcgiwrap
服务-
RH系
sudo systemctl enable --now fcgiwrap@nginx
-
deb系
sudo systemctl enable --now fcgiwrap
-
-
(RH系)设置SELinux策略
-
创建文件
nginx-server.te
module nginx-server 1.0; require { type unconfined_service_t; type var_run_t; type httpd_t; class sock_file write; class unix_stream_socket connectto; } allow httpd_t unconfined_service_t:unix_stream_socket connectto; allow httpd_t var_run_t:sock_file write;
-
执行命令
sudo checkmodule -m -M -o nginx-server.mod nginx-server.te sudo semodule_package --outfile nginx-server.pp --module nginx-server.mod sudo semodule -i nginx-server.pp
-
-
启动
nginx
服务(用于测试)sudo systemctl enable --now nginx
-
配置防火墙(我用的是
firewalld
)sudo firewall-cmd --add-service http sudo firewall-cmd --add-service https sudo firewall-cmd --runtime-to-permanent
然后用
ip a
命令查看虚拟机的IP,这时候输入浏览器访问应该可以看到测试页面了。 -
创建git服务器根目录,我选择了
/var/git
-
创建bare仓库用于服务器配置(我不知道中文应该翻译成什么)
cd /var/git sudo mkdir testrepo cd testrepo sudo git init . --bare --shared sudo git update-server-info
-
默认情况下push操作是禁用的,所以要开一下
-
进入
/var/git/testrepo
,编辑config
文件(里面已经有内容了),在末尾加入[http] receivepack = true
-
保存后执行
sudo git config --bool core.bare true
-
-
设置目录权限,让
nginx
可以读写仓库sudo chown -R nginx:nginx /var/git
如果是deb系,默认情况下的
nginx
用户组和用户名是www-data
。 -
配置
nginx
- RH系:我比较建议把
nginx.conf
默认配置文件里面server
那一段注释掉,然后新建配置文件放在conf.d
文件夹里(后缀为.conf
) - deb系:在
/etc/nginx/sites-available
里面新建一个配置文件,然后在/etc/nginx/sites-enabled
里面创建刚才那个配置文件的软链接,再把这里的default
软链接删掉 - 当然能用就行,怎么搞无所谓
服务器配置文件:
server { listen 80; server_name git.mydomain.com; # 这里可以写“_”,如果没有域名的话 root /var/git; location ~ (/.*) { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.gitpasswd; fastcgi_pass unix:/var/run/fcgiwrap/fcgiwrap-nginx.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend; fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param GIT_PROJECT_ROOT /var/git; fastcgi_param PATH_INFO $1; } }
注意这个配置文件里的两个路径,在deb系和RH系里是不一样的。自己用
ls
看一下再写。 - RH系:我比较建议把
-
添加用户
sudo htpasswd -c /etc/nginx/.gitpasswd <用户名>
然后会让你输入并确认密码。
-
测试配置文件
sudo nginx -t
如果没报错那就没问题了。
-
重新启动
nginx
服务sudo systemctl restart nginx
使用
git clone http://192.168.122.210/testrepo
这样写就会提示输入用户名密码。也可以用http
用户名密码标准格式user:pass@host
。
尾注
- 发行版和发行版之间、发行版的不同版本之间可能会有所差异,请务必根据实际情况自行调整命令和配置。
- 这么操作会让浏览器直接访问给一个404,如果可以的话在
nginx
配置文件里面加个index
。 - 我不太确定
httpd
用户和自己设置的git用户有什么关系……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫