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看一下再写。

  • 添加用户

    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用户有什么关系……
posted @   Secant1006  阅读(427)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
点击右上角即可分享
微信分享提示