在 linux 树莓派上使用 nginx + http搭建一个简易 git 服务器

在 linux 树莓派上使用 nginx + http搭建一个简易 git 服务器

所有命令均在 root用户下执行

如果搭建 gitlab ,则可能带不动,因为对于内存 1G 的树莓派来说。gitlab 太重了

那么,可以搭建一个简易的服务器,首页可以查看仓库列表,使用 http 进行拉取提交

创建空的仓库

首先创建一个空的仓库

例如我的仓库路径放在

/media/pi/storage/codes

在该目录下使用命令:git init --bare test.git

创建一个空的主仓库

安装 nginx

apt-get install nginx

安装 fcgiwrap

apt-get install fcgiwrap

编辑 nginx 配置

vim /etc/nginx/nginx.conf

http{} 里面添加如下配置

server{
    listen 80;
    server_name git.zwc365.com;

    auth_basic "web-check-user";
    auth_basic_user_file /media/nginx/web.db;

    error_page 404 /tip.txt;

    location / {
        fastcgi_intercept_errors on;

        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 root dir
        fastcgi_param GIT_PROJECT_ROOT /media/pi/storage/codes;
        fastcgi_param PATH_INFO $uri;

        # user info
        fastcgi_param REMOTE_USER $remote_user;
        include fastcgi_params;
        client_max_body_size 100M;
    }

    location = / {
        root /media/pi/storage/codes;
        autoindex on;
        autoindex_exact_size on;
        autoindex_localtime on;
    }
    location = /tip.txt {
        charset utf-8;
        root /media/pi/storage/codes;
    }
}

注意 server_name 换成你自己的域名

上面是目前我的完整配置

如果直接复制的话,需要继续执行下面的操作

添加验证用户

auth_basic "web-check-user";
auth_basic_user_file /media/nginx/web.db;

在刚才的配置文件中,有这两行
这两个的目的是,不让用户直接访问,而需要通过账号密码,才可以访问到页面

/media/nginx/ 目录下,执行下面的命令

printf "account:$(openssl passwd -crypt YourPassword)\n" >>web.db

account 改成自己的账户, YourPassword 改成密码

可以多次执行创建多个用户

创建提示文件

也可以不创建提示文件,但会直接显示 404 ,不友好

在项目根目录 /media/pi/storage/codes 下执行

vim tip.txt

放入以下内容

内容可随意修改

该网站仅支持首页查看仓库列表,如果需要克隆仓库,请执行

git clone https://git.zwc365.com/xxxxxx

然后输入账户密码即可

说明

server{} 中 location 块的作用

配置

    location = / {
        root /media/pi/storage/codes;
        autoindex on;
        autoindex_exact_size on;
        autoindex_localtime on;
    }

让用户使用浏览器访问的时候,可以看到仓库列表

配置

    location = /tip.txt {
        charset utf-8;
        root /media/pi/storage/codes;
    }

如果用户想访问仓库文件,则禁止,并显示 tip.txt 中的文字

配置块 location / 的作用

将所有请求都转发到 fscgi 处理,使 git 可以拉取代码


至此就已经搭建好了

执行命令重启 nginx 服务器

nginx -t
nginx -s reload

使用 https://git.zwc365.com/test.git 就可以拉取代码了

账号密码就是刚才执行 printf 输出到 web.db 的账号密码

效果

浏览器访问仓库主页:

主页

如果想使用浏览器查看仓库,则会显示上面 tip.txt 文件中的内容

tip

其它

注意:我git仓库的路径 /media/pi/storage/codes 目录的权限是 777 ,所以可以正常 pull 和 push
如果你使用的目录权限不是 777 的话,那么会导致无法 push ,因为可能没有写入权限

如果出现无法拉取和推送的情况,需要设置目录权限,或者将用户 www-data 添加到这个目录的用户组里面

因为拉取和推送的时候,fcgi 使用的用户是 www-data

可以查看 vim /etc/init.d/fcgiwrap 文件,里面的 FCGI_USER 默认用户就是 www-data 用户

所以有三种解决方案

  • 修改目录权限为777 (不推荐)
  • 修改目录的所有者为 www-data (推荐)
  • 将www-data 添加到目录所有者的组中,并且修改目录权限为用户组可写 (有点麻烦)
# 第一种:修改目录权限
chmod -R 777 xxxx
# 第二种:修改文件夹所有者
chown -R www-data:www-data xxxxx
# 第三种:添加用户到 组中,然后修改用户组权限,使其可写
usermod -a -G xxx www-data
chmod -R 774 xxxx

第三种一般来说还要在 .bashrc 里面 umask 002 命令,防止后面创建项目后,用户组没有权限推送
使其可以自动的设置初始用户组权限为可写

综合来说,推荐第二种方式,将文件夹所有者修改成 www-data 用户

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2019/10/31/nginx-git-server