一、基于gogs搭建Git私有服务
1、Git远程通信详解
在我的上一篇文章里面说Git是一个分布式的系统,既然它是一个分布式的系统那就肯定会涉及到远程通信,那么Git是采用什么协议来进行远程通信呢?
a、Local(本地协议)
Local本地协议就是基于本地文件系统进行的共享。比如说公司的一个服务器,在服务器上拿出一个文件夹进行共享,那我们就可以把源码存储在这个共享文件夹里面,那么开发人员就可以基于这个本地协议直接访问这个共享文件夹来实现这个文件的commit和checket。如下图所示:
优点:简单,直接并且使用了现有的文件权限和网络访问权限。如果是小团队或者小项目建立一个这样的版本管理系统就很轻松。
缺点:这种协议本身受制于文件系统共享的局限性,只能在局域网访问并且速度比较慢。
b、ssh协议
git支持利用ssh协议进行通信,这是绝大部分的Linux系统和Unix系统都支持的,所以利用该协议搭建Git服务是非常方便的。
优点: SSH架构相对于比较简单,通过ssh访问比较安全,在进行文件传输的时候会进行压缩,传输效率会高一些。
缺点: 使用ssh必须将用户ip,服务器的用户名、密码、账号给开发人员,权限体系不灵活。
c、http
Git的http协议实现是依赖WEB容器(apache、nginx)及cgi组件进行通信交互,并且利用WEB容器本身的一个权限体系进行授权验证。http Dump协议,在Git1.6.6版本之前该协议是只能下载不能提交的,也就是说这种协议值提供只读账号。再Git1.6.6版本之后提供了git-http-backend的CGI用于实现接收远程推送功能。
优点:解决了local和ssh权限验证单一的问题、可基于http url提供匿名服务,从而可以放到公网上去。而local与ssh是很难做到这一点的。
缺点:架设复杂,需要部署一些WEB服务器,和https证书之类的配置。
应用场景:大型团队,需要对权限进行精准控制,需要把服务部署到公网上去。
d、Git协议
Git协议是包含在Git软件中的一种特殊的守护进程。它监听在一个特定的端口(9418),类似于SSH服务,但是访问不需要任何授权。
优点:传输速度快,是这四个协议里面最快的。如果你的项目很大并且不需要为写进行用户授权,架设Git守护进程是一个很不错的选择。它还使用了SSH相同的数据传输机制,但是它省去了加密和授权的开销。
缺点:Git协议缺乏授权机制并且9418端口不是一个标准端口,防火墙一般不会开放。
2、基于gogs搭建web管理服务
a、gogs的介绍与安装
gogs是一款开源的轻量级Git Web服务,其特点是简单易用文档齐全国际化做的很好。其主要功能如下:
1、提供http与ssh两种协议访问源码服务
2、提供可以用Web界面可查看修改源码代码
3、提供完善的权限管理功能、其中包括组织、团队、个人等仓库权限
4、提供简单的项目viki功能
5、提供工单管理与里程碑管理
第一步:去官网下载gogs这个软件官网下载,选择如下图所示:
下载完成后使用xftp这个工具将其上传到Linux,我在Linux上新建了一个名叫data的文件夹,将其上传到了这个文件下。如下图所示:
第二步:使用tar -xzvf gogs_0.11.66_linux_amd64.tar.gz
解压gogs_0.11.66_linux_amd64.tar.gz,解压成功后如下图所示:
第三步:在Linux上安装Git服务:
1、使用yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
命令安装依赖环境;
2、使用wget https://github.com/git/git/archive/v2.3.0.zip
下载Git源码,unzip v2.3.0.zip
命令解压Git源码;
3、进入解压后的Git目录,使用make prefix=/usr/local/git all
编译Git源码,使用make prefix=/usr/local/git install
安装Git服务;
4、添加Git环境变量,使用vim /etc/profile
打开profile文件,将以下内容复制到该文件
export PATH=/usr/local/git/bin:$PATH
source /etc/profile
5、输入git --version
验证Git是否安装成功,如果出现版本号则表示成功,如图所示:
6、创建Git仓库,在data文件夹里面创建一个git-resp的文件夹,这个文件夹专门用来放Git仓库,然后再git-resp内创建一个git仓库叫demo.git,如下图所示:
第四步:配置nginx服务器(Nginx再Linux环境安装),nginx.conf文件配置如下:
user root; ###添加一个root账户
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
###日志打印格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
###日志文件的路径以及用什么格式打印
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name git.resp.com; ###配置服务器ip地址
location / {
root /data/git-resp; ###指定git仓库的路径,这个路径下的所有仓库都能访问
}
}
}
配置后使用./sbin/nginx -t
检测nginx.conf文件是否配置错误,配置无误的效果如图所示:
第五步:进入gogs目录并且使用./gogs web
命令启动gogs,如下图所示:
启动成功后我们可以看到上面的图片里面有一个地址http://0.0.0.0:3000,这个地址是不能访问的。我们需要访问的是我们再nginx里面配置的那个地址为git.resp.com:3000
。第一次访问会进入一个引导设置页面,设置完成后会进入如下页面:
到此,gogs搭建私有git服务就完成了。
b、gogs定时备份与恢复
gogs还可以对数据进行备份和恢复,对数据进行备份和恢复的相关命令如下:
#查看备份相关参数
./gogs backup -h
#默认备份,备份在当前目录
./gogs backup
#参数化备份 --target 输出目录 --database-only 只备份 db
./gogs backup --target=./backupes --database-only --exclude-repos
#恢复。执行该命令前要先删除 custom.bak
./gogs restore --from=gogs-backup-20180411062712.zip
#自动备份脚本
#!/bin/sh -e
gogs_home="/home/apps/svr/gogs/"
backup_dir="$gogs_home/backups"
cd `dirname $0`
#执行备份命令
./gogs backup --target=$backup_dir
echo 'backup sucess'
day=7
#查找并删除 7天前的备份
find $backup_dir -name '*.zip' -mtime +7 -type f |xargs rm -f;
echo 'delete expire back data!'
#添加定时任务 每天4:00执行备份
#打开任务编辑器
crontab -e
#输入如下命令 00 04 * * * 每天凌晨4点执行 do-backup.sh 并输出日志至 #backup.log
00 04 * * * /home/apps/svr/gogs/do-backup.sh >> /home/apps/svr/gogs/backup.log 2>&1