0%

用Nginx搭建自己的私有Git服务器

用Nginx搭建自己的私有Git服务器

背景

现在Github的私有仓库已经无限制免费了,但是Geek精神总是在召唤我似乎可以自己搭建一台自己的私有Git服务器?(你甚至可以写个后台前端搭建一个自己的Github!额,貌似是Gitlab?)

说干就干!

环境

  • Ubuntu 20.04 LTS
  • git version 2.25.1
  • nginx version: nginx/1.17.10 (Ubuntu)

目标

  • 搭建自己的私有Git仓库
  • 通过http访问
  • 增加ssl

搭建Git仓库

个人习惯用root用户操作,不用每个命令前增加sudo。可以先切到root用户操作

1
sudo -i
  • 安装 git

    1
    apt install git -y
  • 创建 git 用户

    1
    adduser git
  • 初始化仓库

    初始化你的Git仓库根目录,例如我放在/home/git/wudinaonao/这个目录

    1
    2
    cd /home/git/wudinaonao/
    git init --bare test.git

    这样我们创建了一个测试仓库test.git

  • 禁用Git用户登录Shell

编辑/etc/passwd文件找到这行

1
git:x:1001:1001:,,,:/home/git:/bin/bash

改为

1
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
  • 克隆远程仓库

格式

1
git clone <user>@<host>:<path>

例如根据刚才我们创建的仓库我们输入

1
git clone git@172.16.105.203:/home/git/wudinaonao/test.git

然后输入密码

20200430162047

这样就克隆到了本地。

20200430162118

使用Nginx通过HTTP访问Git仓库

  • 安装软件包

    1
    apt-get install git-core nginx fcgiwrap
  • 配置 Nginx

    例如我想通过/wudinaonao/xxx.git这样的路径来访问服务器上xxx.git仓库,我们可以修改nginx默认网站配置文件/etc/nginx/sites-available/default
    修改信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #  wudinaonao 的 Git 仓库
    location ~ /wudinaonao(/.*) {
    # 使用 Basic 认证
    auth_basic "Restricted";
    # 认证的用户文件
    auth_basic_user_file /etc/nginx/passwd;
    # FastCGI 参数
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
    fastcgi_param GIT_HTTP_EXPORT_ALL "";
    # git 库在服务器上的跟目录
    fastcgi_param GIT_PROJECT_ROOT /home/git/wudinaonao;
    fastcgi_param PATH_INFO $1;
    # 将认证用户信息传递给 fastcgi 程序
    fastcgi_param REMOTE_USER $remote_user;
    # 包涵默认的 fastcgi 参数;
    include fastcgi_params;
    # 将允许客户端 post 的最大值调整为 100 兆
    # max_client_body_size 100M;
    }

  • 创建Nginx认证用户文件

    参考 nginx ngx http auth basic module , 用户认证文件格式如下:

    1
    2
    3
    4
    # comment
    name1:password1
    name2:password2:comment
    name3:password3

    推荐使用htpasswd命令创建用户,可以通过apt install apache2-utils安装

    创建文件

    1
    touch /etc/nginx/passwd

    创建一个用户 user

    1
    htpasswd /etc/nginx/passwd user

    根据提示输入密码。

  • 重启Nginx测试

    1
    nginx -s reload

    格式

    1
    git clone http://<your hostname or ip>/<your path>/<your repository>.git

    例如

    1
    git clone http://172.16.105.205/wudinaonao/test.git
  • 成功

20200430165326

增加SSL证书

申请证书

  • 找你的域名提供商申请一个证书,或者用免费的letsencrypt证书。
  • 申请过程不赘述

配置Nginx

  • 配置 ssl

    默认配置文件/etc/nginx/sites-available/default修改server

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 监听 443 端口, https 协议的默认端口
    listen 443 ssl;

    # 绑定证书的域名
    server_name git.wudinaonao.com;

    # 证书路径
    ssl_certificate /etc/nginx/ssl/git.wudinaonao.com.crt;

    # 私钥路径
    ssl_certificate_key /etc/nginx/ssl/git.wudinaonao.com.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
  • 成功

可能出现的问题

Nginx

  • FastCGI sent in stderr: “fatal: GIT_PROJECT_ROOT is set but PATH_INFO is not” while reading response header from upstream,

克隆仓库时候服务器响应 code 5000

20200430164727

查看nginx日志

20200430164843

  • 可能的原因,设置了GIT_PROJECT_ROOT但是没有获取到PATH_INFO,网站路径设置错误

20200430165055

1
location ~ /wudinaonao

这里改成

1
location ~ /wudinaonao(/.*)
  • 问题解决

20200430165259

error: remote unpack failed: unable to create temporary object directory

在 git push 的时候有时候会无法 push 上去的情况。

20200430193047

错误显示无法创建对象。这种错误一般是目录权限设置的问题。重新设置一下目录权限即可。

  • 例如如果我通过http的方式push,那么我需要设置目录的用户组和你web服务器的用户组一样。

  • 例如我的nginx用户为www-data,那么远程主机的blog.wudinaonao.com.git目录的用户也要是www-data.

  • 使用 chmod 设置权限,直接 chmod -R 777

20200430193424

  • 问题解决

20200430193439

参考链接

https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664

https://beginor.github.io/2016/03/12/http-git-server-on-nginx.html

https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-Smart-HTTP