在家用机上搭建 Git https 服务器

今天主要叙述在家里台式机的虚拟机上搭建支持
https 的 ubuntu git 服务器。

实际上,从一个用户请求家里
git 服务器代码,最终完成代码的传输,主要是通过以下的过程:

首先,从外界寻找到连接上互联网的家里的路由器,由路由器发送请求到虚拟机的
host,由 host 发送到虚拟机,由虚拟机的 apache 服务器将 https 请求转化为 git 数据请求发送给 git 服务程序,git 服务器程序拿到数据以后原路返还,下面一点一点的将这个过程说清楚。

第一步:从外界找到家里的路由器

由于家里的网络是动态拨号,没有固定
ip,所以想实现这个需求,就必须使用动态 DNS

可以使用花生壳的 DDNS,这一步每一个路由器都不同,所以不再详述。

第二步:从路由器发送到 host

发送到 host 的过程主要用到路由器的端口映射功能,并且需要配置 host 的防火墙以保证入站是通畅的。

  1. 规划好路由器对外暴露的端口和主机暴露的端口,以及主机的局域网
    ip

    路由器对外暴露的端口,最后我们会以
    https://XXXX.YYYYY.CCCCC:路由器对外端口/XX的形式访问到内部服务,这里假设为 10086

    Host 暴露的接口,路由器会将请求发送给这个端口,以提供服务,这里假设为 56789。

    主机的局域网 ip 用来配置端口映射时,让路由器知道应该将请求发送到哪个机器去,这里假设为 192.168.3.50

  2. 配置主机
    ip

    有两个方法,一个是主机直接在 ip 设置里面手动配置,但是这种配制方法不一定能完全消除 ip 冲突(虽然家庭局域网的 ip 冲突不常见),所以可以利用路由器的 ip 分配功能,每个路由器不一样,在我的路由器界面如下:

    为特定
    mac 地址分配了特定的 ip

  3. 配置路由器到主机的端口映射

    这一步每个路由器的界面都不一样,但是配置的原理是共通的

    我使用的是
    netgear orbi,其配置界面如下(高级——高级设置——端口映射/端口触发——添加自定义服务),外部端口组指的是路由器对外开放的端口,内部端口组是局域网提供服务主机的端口。

    1. 为主机添加防火墙规则

    进入以上界面,点击"入站规则"后,再点击右侧栏的"新建规则",出现以下界面:

    至此,第二步配置完毕

第三步:从
host 转发到虚拟机

这一步需要配置虚拟机 NAT 模式的端口转发,并且设置虚拟机的
ip 地址,还要配置虚拟机 apache 服务器 https git 服务的端口

  1. 规划虚拟机
    ip、服务端口、网段等

    这里假设子网
    ip 为 192.168.158.0,掩码是 255.255.255.0

    虚拟机 ip 是 192.168.158.20

    给虚拟机分配的 git 服务端口是 5000

  2. 设置虚拟机软件


    vmware 为例(其他虚拟机软件也有类似功能),点击"编辑"——"虚拟网络编辑器",按照如下界面配置

    之所以
    dhcp 从 128 开始,是因为保证 .20 这个地址没有自动分配到别的虚拟机去。

  3. 配置主机虚拟机软件的端口转发规则

    注意这里的网关
    ip,下面要用到

  4. 设置虚拟机

    开启虚拟机,这里以
    ubuntu 16.04 LTS 英文版版本为例,其他版本大同小异

    "system settings"——"network"

    注意,这里的 DNS Server 和上面的网关 ip 设置一样,也可以设置为家里路由器的地址,比如 192.168.3.1

    然后关闭并打开下图的开关,重新让虚拟机连一下网,使之分配到新的 ip 去

    尝试在虚拟机里连接一下网络,测试一下。

    至此,第三步已经全部完毕。

    关于第三步,实际上可以使用虚拟机的桥接模式,使之成为局域网中的一个独立机器,这样,直接从路由器就可以给虚拟机分配一个
    ip(详见步骤二),并且配置端口转发。这种方法省去了配置 host 防火墙的步骤,容易维护(不用修改虚拟机 NAT 规则,也不用在虚拟机里面配置静态 ip,直接使用路由器的预留 ip,虚拟机使用 dhcp 获得就可以了)

    但是我这里之所以使用了 NAT 模式,是因为我上一个路由器这样做有
    bug(吐槽荣耀 pro……),在如此配置之后,路由器只能识别虚拟机的网卡,却不能识别主机的网卡,导致分配到主机的其他服务全都用不了了,所以只能使用 NAT 模式,如果路由器能支持识别桥接的虚拟机,那当然要用桥接。我这里就不改了,算是提供一个桥接不行的时候的思路。

第四步:从
apache 服务器将 https 请求转化为 git 数据请求发送给数据程序

这一步需要配置
apache 的服务器,开启 https 支持,开启 git 支持,增加 Git 账户名和密码。

进入虚拟机:

  1. 安装
    apache2 的相关工具

    sudo apt-get install apache2 apache2-utils openssl

  2. Create git repository folder

    创建一个用于存储代码仓库的文件夹,后面配置服务器主机的时候会用到

    cd /opt

    sudo mkdir git

    sudo chown youraccountname:www-data git

    之所以将 owner 变为当前登录服务器的用户名,是因为这样好管理,后来管理代码库时,用不着每一次都 sudo

  3. 创建
    CA 证书,这里以 self signed 为例

    这里创建的是自己签名的 CA 证书,实际上网上也有很多免费的
    CA 证书,比如腾讯云的。之所以这里选择自己签名的,是因为大多数情况下这种方法够用(毕竟是自己的服务器,几乎只有自己用),不过,自己签名的 CA 证书在 git clone 的时候可能遇到问题,后面步骤会有解决方案。

    我们假设把证书存储在了 /opt/sites_conf 目录中

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /opt/sites_conf/apache.key -out /opt/sites_conf/apache.crt

    运行以后,填写方法大概如下:

    Country Name (2 letter code) [AU]:CN

    State or Province Name (full name) [Some-State]:Beijing

    Locality Name (eg, city) []:Beijing

    Organization Name (eg, company) [Internet Widgits Pty Ltd]:这里随便填

    Organizational Unit Name (eg, section) []:这里随便填

    Common Name (e.g. server FQDN or YOUR name) []:这里一定要填写个人服务器的域名,在本例中,就是 XXXX.YYYYY.CCCCC,如果不一致,后面的 ssl 验证会失败

    Email Address []:随便填

  4. Enable apache modules

    sudo a2enmod cgi alias env rewrite

  5. Listen port 5000

    sudo gedit /etc/apache2/ports.conf

    在这个文件里面加入一行:

    Listen 5000

    然后保存退出

  6. Config virtual machine

    cd /etc/apache2/sites-available

    创建新的配置文件并且填入内容:

    sudo gedit git_server.conf

    填入如下内容

    <VirtualHost *:5000>

    ServerAdmin [email protected]

    ServerName RukaCode

    SetEnv GIT_PROJECT_ROOT /opt/git

    SetEnv GIT_HTTP_EXPORT_ALL

    SSLEngine on

    SSLCertificateFile /opt/sites_conf/apache.crt

    SSLCertificateKeyFile /opt/sites_conf/apache.key

    DocumentRoot /opt/git

    <Files "git-http-backend">

    AuthType Basic

    AuthName "Git Access"

    AuthUserFile /opt/sites_conf/htpasswd

    Require valid-user

    Order deny,allow

    Deny from env=AUTHREQUIRED

    Satisfy any

    </Files>

    <Location />

    AuthType Basic

    AuthName "Git Repositories"

    AuthUserFile /opt/sites_conf/htpasswd

    Require valid-user

    Order allow,deny

    Allow from all

    </Location>

    ScriptAlias / /usr/lib/git-core/git-http-backend/

    RewriteEngine On

    RewriteCond %{QUERY_STRING} service=git-receive-pack [OR]

    RewriteCond %{REQUEST_URI} /git-receive-pack$

    RewriteRule ^/ - [E=AUTHREQUIRED]

    </VirtualHost>

    这里的配置阻止了 invalid user 的 clone,并且也阻止了 http 的访问。如果不需要阻止 invalid user 的 clone(比如开源项目),那么可以将 <Location> 那一段去掉。此时 invalid user 可以 clone 但是不能 push。

    接着,需要将此配置
    link 到 enable 文件夹里面去

    cd ../sites-enabled

    sudo ln -s ../sites-available/git_server.conf .

  7. 启动虚拟机

    sudo apachectl start

    或者如果已经启动了虚拟机的话,那就

    sudo apachectl restart

  8. 在 /opt/git 里面创建需要的代码库

    cd /opt/git

    mkdir test_repo.git

    cd test_repo.git

    git init --bare

    sudo chgrp www-data -R .

  9. 在 /opt/sites_conf 里面创建用户名、密码文件

    htpasswd -c /opt/sites_conf/htpasswd yourusername

    这里的文件路径一定要和上面配置文件里面的

    AuthUserFile /opt/sites_conf/htpasswd

    对应

至此,服务器端已经配置完毕。接下来还需要有两个步骤,一个步骤是创建一个
git 代码库,并且 push 到服务器上去,因为此时创建的 test_repo.git 是空的,其他用户 clone 下来是一个空的 repo,其 HEAD、upstream 等都没有设置好,所以此步骤解决这个问题。还有一个步骤,是将服务器的 self signed 的 CA 证书添加到 git 的信任 sites 里面,这一步主要是因为我们的证书是自签名的,因此 git 在 clone 的时候验证其合法性时,会直接 deny 掉这个请求,需要将其添加到信任证书里。

  1. 在任意机器上,创建一个本地
    repo,假设这个 repo 在 ~/my_test_repo 文件夹下

    mkdir ~/my_test_repo

    cd my_test_repo

    git init

    touch README.txt

    git add .

    git commit -m ‘add read me file‘

  2. 添加服务器证书到
    git 信任列表里

    git 信任列表由 http.sslCAInfo 来控制,设置这个值为一个文件,git 就会在这个文件里面查找是否是一个受信任的主机,所以我们要做的就是将服务器的 crt 文件内容复制到这里的文件里面。

    要显示服务器的
    crt 文件内容,最简单的就是使用浏览器,但是由于我们并没有给 git 服务器配置网页以供浏览(可以用 Gitweb 实现),所以浏览器如果直接键入网址的话会 deny

    那么只好用命令行,输入以下命令:

    openssl s_client -showcerts -connect yoursitedomain:yoursiteport|sed -ne ‘/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p‘

    注意,要将
    yoursitedomain:yoursiteport 转化为你的 git 服务器的网址和端口,回到第一步可以看到,这里的例子为 XXXX.YYYYY.CCCCC:10086

    如果连接没问题,就会看到如下的信息

    -----BEGIN CERTIFICATE-----

    MIIEGTCCAwGgAwIBAgIJAISj2sI7kbd3MA0GCSqGSIb3DQEBCwUAMIGiMQswCQYD

    VQQGEwJDTjEQMA4GA1UECAwHQmVpamluZzEQMA4GA1UEBwwHQmVpamluZzEVMBMG

    A1UECgwMU25pcGVyIFN3b3JkMRUwEwYDVQQLDAxTbmlwZXIgU3dvcmQxHDAaBgNV

    BAMME3NuaXBlcnN3b3JkLnFpY3AuaW8xIzAhBgkqhkiG9w0BCQEWFGNsY3ZhbXBp

    cmVAZ21haWwuY29tMB4XDTE3MDExNTEzMzgzMFoXDTE4MDExNTEzMzgzMFowgaIx

    CzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5n

    MRUwEwYDVQQKDAxTbmlwZXIgU3dvcmQxFTATBgNVBAsMDFNuaXBlciBTd29yZDEc

    MBoGA1UEAwwTc25pcGVyc3dvcmQucWljcC5pbzEjMCEGCSqGSIb3DQEJARYUY2xj

    dmFtcGlyZUBnbWFpbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB

    AQDmrlk2Y3k9OJOg3YPOkJf2f1QcvYwsiRcdSemtWAqNGyXVdGlrXPQNpRgDfOPs

    Qmb5V/ELX6Gl+0rSiKS7N+tKlmru8oJgGvADGUTTU9gMDeGR5ztUmqhik57C3E+V

    AL+Oq2TaJqWoseDB1KdF4/4p3PmFDfeGg+vdWEaSihWG/p2lfRPjH+hr9mH/R2Pn

    ZO7Y+TvNevU8pBVmdhh88nHYorIZ0m1/Zk11ADyVuCBVF3ygt4QYv7Lb/N67SiyT

    uqlfifEZR+CEVfaBkaIqhC21YG6NtnQ40LFa2uqr7Hbx2xz30yYrUmlhcHtEop5w

    ZxdsM7iXvt4aYOyOjhljZ4gXAgMBAAGjUDBOMB0GA1UdDgQWBBTbbonTeEU+JIls

    axkFePsbFVqsjzAfBgNVHSMEGDAWgBTbbonTeEU+JIlsaxkFePsbFVqsjzAMBgNV

    HRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQARaDGHn9/9RT0Qk0AcztRMyjrU

    KOcxgad5SAGmG/8BNJR5zEmgeUm+Az31qKBT1m2JNy16cD1+3ulNTKVkZ7j8judt

    EZiUEzsJxgZ4seQ5eQIeORS1IKuadyQevnjMvubzPOmDzOt4DdQNuHcq+Xmv4XP/

    2afrtYseGTWJl66qH2ssQ9ilkg8ju7G/7MGiFpF+pBve3tWyvcltsmgcDEcJotJq

    BY4uqrVAko+28aPhwVyR63CIk52G7WwJcoJ1sCm0SCzbHbTTNJLqRCbuYBWgXCrb

    kyHbS7ACz8onV219sghBQpsyHjVsIg6nFem9pufa1xbwkI1R3wMEfCqZZZM1

    -----END CERTIFICATE-----

    将这个信息复制到一个文件里(注意,--BEGIN CERTIFICATE— 和 –END CERTIFICATE— 也要一并复制),比如
    ~/git_trust_ca.crt,并保存

    然后设置:

    git config --global http.sslCAInfo ‘/home/xxxxxx/git_trust_ca.crt‘

  3. 第1小步已经创建好了 repo,这一步将其 up 到服务器上去:

    git remote add origin https://XXXX.YYYYY.CCCCC:10086/test_repo.git

    git push origin master

    此时出现输入用户名和密码的地方,直接输入即可
    push

至此,git 个人服务器已经全部搭建完毕,实际上接下来还可以给 git 服务器增加 web 界面,便于管理项目等

时间: 2024-10-20 03:03:10

在家用机上搭建 Git https 服务器的相关文章

使用gitolite-3.6搭建git镜像服务器

需求: 在外网搭建一台git服务器,大家在任何联网的地方可以向git服务器提交.clone,如果一个仓库特别大,在公司clone一个仓库的时候会使用时间过长,带宽占用等不利的因素,那我们在公司内网搭建一台镜像服务器,clone代码的时候可以从镜像服务器clone,会省很多时间,下面我们开始. 我是参照gitolite官网文档搭建的:http://gitolite.com/gitolite/mirroring.html 环境: 总共3台机器,一台在外网git主服务器(以下称为servser1),一

【小程序】搭建本地https服务器(windows)

(一)用json-server搭建简单的服务器 (搭建出来的服务器地址为localhonst:3000) 1.新建Mockjson文件夹,进入该文件夹目录,运行命令 npm install -g json-server    2.在该目录中新建news.json文件 { "news":{ "type":1, "title":"新闻资讯", "url":"", "list&quo

Centos下搭建 tomcat https服务器详解

一 .安装java jdk配置环境变量 1. 卸载原有openjdk yum -y remove java-1.7.0-openjdk* yum -y remove tzdata-java.noarch 2. 下载新的jdk 并解压 [[email protected] java]# curl -O http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz [[email protected] j

搭建git代码服务器

在代码管理中,通常需要使用版本管理工具,git就是一个不错的选择,这里简单罗列一下git服务器的搭建过程. 1. 安装git工具包 2. 初始化git库:在代码服务器上,通常只需要创建一个不含有工作目录的空仓库,使用命令, git --bare init 创建完成之后,可以看到生成的文件 HEAD  branches    config    description  hooks  info  objects  refs 3. git库创建OK之后,可以将空库clone到本地 git clone

利用树莓派3b搭建git代码服务器

在树莓派上3b的操作,可以利用ssh进行登陆操作: 添加一个"Git"用户和组 增加git用户和组 adduser --system --shell /bin/bash --gecos 'git version control by pi' --group --home /home/git git 注意:/home/git是这个例子里我使用的文件夹.如果你想使用别的路径,替换下面命令里的"/home/git". 修改Git 用户密码 passwd git 切换到gi

搭建git linux 服务器

假设你已经有sudo权限的用户账号,下面,正式开始安装. 第一步,安装git: for Ubuntu或Debian $ sudo apt-get install git for Centos 更新一下 yum 源yum list git 查看可安装版本yum install git 安装 第二步,创建一个git用户,用来运行git服务: $ sudo adduser git 第三步,创建证书登录: 收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/

为嵌入式开发板客户端自己动手在虚拟机上搭建时间同步NTP服务器

网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某些时间标准.目前采用的时间标准是世界协调时 UTC(Universal Time Coordinated).NTP的主要开发者是美国特拉华大学的David L. Mills教授.NTP对于我们个人来说有什么用呢,简单的讲,当你的计算机时间不准确了,你可以接入到互联网,从网上同步一下时间,看多方便. 对于企业来说,当你有成百上千的计算机,都不能直接连接互联网,

自己搭建git 代码服务器

使用git服务器的工程师都需要生成一个ssh的公钥 ~/.ssh$ ssh-keygen Generating public/private rsa key pair. …………………… …………………… 然后一律按回车,完成后会在home目录下的.ssh目录中生成两个文件id_rsa(私有密钥)和id_rsa.pub(公钥). 将生成的公钥id_rsa.pub发给git仓库的管理者. 然后在服务器端: sudo adduser git su git cd ~ mkdir .ssh 在git用户

mac os 利用ssh 搭建git server服务器详细教程,以及git基本用法

详细讲mac 连接mac的git操作 首先在服务端上 第一:新建一个仓库 1, cd /Users/userName/projects 用linux命令进入一个你想要创建与他人共享的文件夹. 2,sudo git --bare init 建立一个git仓库. ”git init –bare”方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must b