用Gogs搭建自己的Git服务器
Git是非常流行的版本管理系统,很多的网站也提供了免费的Git服务,如全球知名的最大源代码托管服务Github。但是大部分的Git源代码托管服务都只对开放的代码托管免费,对私有的代码托管需要收取一定费用。同时,个人的一些代码有时由于各种原因可能并不适合开放,比如:练习用代码,对Git服务提供商的隐私性及安全性有所担忧,包含一些商业机密等等。此时可以搭建自己的Git服务器来托管代码。 应用最广泛的Git托管程序要数Gitlab,它采用Ruby on Rails,可以实现一个自托管的Git项目仓库,并可以通过网页对公开的或者私人项目进行访问。其功能与Github相似,但搭建过程稍复杂且对系统的配置要求较高。因此我选用了另一个方案Gogs。
Table of Contents
Gogs简介
Gogs是一款极易搭建的自助Git服务,在官网介绍中它有以下优点:
- 易安装:除了可以根据操作系统平台下载二进制运行,还可以通过Docker或Vagrant,以及包管理安装。
- 跨平台:任何Go语言支持的平台都可以运行Gogs,包括Windows、Mac、Linux 以及ARM。
- 轻量级:一个廉价的树莓派的配置足以满足Gogs的最低系统硬件要求。有些用户甚至还将Gogs运行在NAS设备上。
- 开源化:所有的代码都开源在GitHub。
具体的界面可以到官方提供的在线体验界面查看。 需要注意的是,Gogs现在还在开发中,在某些具体功能上还不及Gitlab,但相信随着后续的开发功能一定会越来越完备的。
Gogs依赖环境
安装Gogs之前需要配置相应的依赖环境,官网介绍的依赖环境如下:
- 数据库(选择以下一项):
- MySQL:版本 >= 5.5.3
- PostgreSQL
- 或者 什么都不安装 直接使用 SQLite3 或 TiDB
- git(bash):
- 服务端和客户端均需版本 >= 1.7.1
- Windows 系统建议使用最新版
- SSH 服务器:
- 如果您只使用 HTTP/HTTPS 或者内置 SSH 服务器的话请忽略此项
- 推荐 Windows 系统使用 Cygwin OpenSSH 或 Copssh
- Nginx反向代理(可选)
以下以Ubuntu服务器为例安装Gogs。
安装Git
安装Git:
1
sudo apt-get install git
检查Git是否安装成功:
1
git --version
安装及配置MySQL数据库
安装MySQL
1 | sudo apt-get install mysql-server |
安装时需要配置MySQL的root用户及密码。
检查MySQL是否安装成功
1
mysql --version
配置MySQL
创建gogs数据库,配置数据库编码为utf8,数据库引擎为InnoDB。
1
2
3
4
5
6mysql -u root -p
mysql> SET GLOBAL storage_engine = 'InnoDB';
mysql> CREATE DATABASE gogs CHARACTER SET utf8 COLLATE utf8_bin;
mysql> GRANT ALL PRIVILEGES ON gogs.* TO ‘root’@‘localhost’ IDENTIFIED BY ‘password’;
mysql> FLUSH PRIVILEGES;
mysql> QUIT;
新建git用户
为运行Gogs创建一个新的用户git:
1
sudo adduser git
然后按照提示设置相关用户信息及密码。在后文中运行Gogs时需要以该用户身份运行。
安装Go语言运行环境
Gogs由Go语言编写,运行时需要安装Golang运行环境。如果系统中其他程序并不需要运行Go语言程序,可以只为上文创建的git用户配置运行环境,也可以选择配置全系统所有用户的Go语言运行环境。
配置环境变量
切换到用户git,并只为该用户配置Go运行环境。
1
2
3su git
cd ~
mkdir go
写入环境变量:
1
2
3
4export GOROOT=$HOME/go
export GOARCH=386 #系统位数,386表示32位系统,amd64表示64位系统。
export GOOS=linux #系统类型
export PATH=$PATH:$GOROOT/bin1
source ~/.bashrc
安装Go
Go语言官网可以获取最新的二进制安装包:
1
2
3wget https://storage.googleapis.com/golang/go1.5.2.linux-386.tar.gz
tar xzvf go1.5.2.linux-386.tar.gz
mv go $GOROOT
Go语言运行环境就安装完成了,测试Golang是否安装成功:
1
go env
安装Gogs
访问Gogs官网可以获取最新的Gogs二进制安装包。
1
2
3
4mkdir goapp
cd goapp
wget https://storage.googleapis.com/golang/go1.5.2.linux-386.tar.gz
tar xzvf go1.5.2.linux-386.tar.gz~/goapp
目录下,可以直接运行gogs。
1
cd gogs
./gogs web
设置Nginx反向代理
Gogs默认监听3000端口,使用Nginx将80端口的访问代理至3000端口即可直接通过IP访问Gogs,绑定域名后还可以通过域名访问。
安装Nginx
1 | sudo apt-get install nginx |
配置Nginx代理
为Gogs创建一个Nginx配置文件:
1
sudo vi /etc/nginx/sites-available/gogs
写入以下配置:
1
server {
listen 80;
server_name your_server_ip; # your_server_ip为服务器IP或绑定的域名
location / {
proxy_pass http://127.0.0.1:3000;
}
}
sites-enabled
中。
1
sudo ln -s /etc/nginx/sites-available/gogs /etc/nginx/sites-enabled/gogs
重启nginx:
1
sudo service nginx restart
然后就可以直接通过域名或IP访问Gogs了。
Gogs运行的其他注意事项
至此Gogs服务就安装完成了。Gogs运行时还有以下注意事项:
Gogs的自定义配置文件位于
gogs/custom/conf/app.ini
,具体的参数配置可以参考官方的配置文件手册。比如,如果修改了ssh的默认端口,就需要在自定义配置文件中指定修改后的ssh端口:1
SSH_PORT: 8888
在
gogs/scripts
文件目录中针对不同服务管理软件的已经配置好的Gogs启动脚本文件,比如supervisor
脚本的内容如下:gogs/scripts/supervisor/gogs 1
[program:gogs] directory=/home/git/go/src/github.com/gogits/gogs/ command=/home/git/go/src/github.com/gogits/gogs/gogs web autostart=true autorestart=true startsecs=10 stdout_logfile=/var/log/gogs/stdout.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB stderr_logfile=/var/log/gogs/stderr.log stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 stderr_capture_maxbytes=1MB user = git environment = HOME="/home/git", USER="git"
修改一些文件路径及参数后就能够直接使用该文件在supervisor中设置Gogs的自动启动。
- Gogs的托管的仓库文件默认位于
~/gogs-repositories/
文件夹中。
利用DropBox备份服务器文件
通过自建的Git服务器来托管代码后,定时备份数据文件就显得格外重要了。一旦服务器出现故障而无法恢复,所有已上传的代码库也将丢失。DropBox是国外非常受信赖的云同步服务,虽然DropBox提供的免费空间较小,但用来备份个人代码文件还是足够的。而且DropBox提供了完善的API接口,可以通过命令行直接上传下载文件,当服务器位于海外时同步速度也十分令人满意。下面介绍如何将服务器中的数据备份至DropBox中。
创建DropBox应用
首先需要创建一个DropBox应用来利用DropBox的API,直接点击该网址创建:https://www.dropbox.com/developers/apps/create。 创建应用时的一些选项如下:
- Choose an API(应用类型):DropBox API
- Choose the type of access you need(数据访问类型):App folder
- Name your app(应用名称,取一个喜欢的即可):GogsBackup
应用创建后就可以获得App key
和App sercet
,保存这两行字符。
获取并设置DropBox上传下载脚本
Dropbox-Uploader是一个第三方的DropBox上传下载脚本。首先获取该脚本并为其设置可执行权限:
1
2wget https://raw.githubusercontent.com/tennfy/Dropbox-Uploader/master/dropbox_uploader.sh
chmod a+x dropbox_uploader.sh
直接运行该脚本,第一次运行时会连接DropBox验证权限。
1
./dropbox_uploader.sh
按照提示输入上文中保存的App key
和App sercet
,Permission type选择a
。然后在浏览器中打开给出的连接地址,给予权限。以后运行时就不用再次验证了。
注意:这个授权的过程只是针对当前登陆ssh的用户,并非全局,如果切换用户运行脚本,会提示再次进行授权,因此应提前切换到需要运行该脚本的用户进行授权。其实当前用户的授权信息保存在~/.dropbox_uploader
文件中,因此切换用户后会提示首次运行需要进行授权。
备份脚本
参考定时备份VPS数据至Dropbox教程给出的备份脚本,修改相应参数即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#!/bin/bash
# 指定dropbox_uploader.sh脚本的保存目录
SCRIPT_DIR="/root/backup"
# 上传到DropBox的文件夹
DROPBOX_DIR="/backup/$(date +"%Y.%m.%d")"
# 需要保存的服务器文件夹,可以用空格隔开多个文件夹
BACKUP_SRC="/home/git/gogs-repositories"
# 服务器上临时的备份保存文件夹
LOCAL_BAK_DIR="/root/backup"
# MySQL相应配置
MYSQL_SERVER="localhost"
MYSQL_USER="root"
MYSQL_PASS="1325xlg"
# 数据备份压缩后的文件名称
DBBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +"%Y%m%d").tar.gz
# 已过期备份数据的名称(3天前的数据会被删除)
Old_DROPBOX_DIR="/backup/$(date -d -3day +"%Y.%m.%d")"
OldDBBakName=Data_$(date -d -3day +"%Y%m%d").tar.gz
OldWebBakName=Web_$(date -d -3day +"%Y%m%d").tar.gz
# 导出MySQL数据库备份(所有数据库),并压缩为指定文件名
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS --events --all-databases > $LOCAL_BAK_DIR/Database.sql
tar zcvf $LOCAL_BAK_DIR/$DBBakName $LOCAL_BAK_DIR/Database.sql
rm -rf $LOCAL_BAK_DIR/Database.sql
# 压缩需要保存的文件夹为指定文件名
tar zcvf $LOCAL_BAK_DIR/$WebBakName $BACKUP_SRC
# 上传压缩后的备份文件到指定的DropBox目录
$SCRIPT_DIR/dropbox_uploader.sh upload $LOCAL_BAK_DIR/$DBBakName $DROPBOX_DIR/$DBBakName
$SCRIPT_DIR/dropbox_uploader.sh upload $LOCAL_BAK_DIR/$WebBakName $DROPBOX_DIR/$WebBakName
echo -e "upload done!"
# 上传完成后删除服务器上及DropBox中已经过期的备份数据,节省空间
rm -rf $LOCAL_BAK_DIR/$OldDBBakName $LOCAL_BAK_DIR/$OldWebBakName
$SCRIPT_DIR/dropbox_uploader.sh delete $Old_DROPBOX_DIR/
echo -e "delete old backup done"1
sudo chmod +x ./backup.sh
现在可以直接运行该脚本,测试其是否能够成功备份文件并上传至DropBox。
设置备份脚本定时运行
通过cron程序可以设定程序定时运行。需要注意的是cron运行是分用户的,某个用户设定的定时任务运行时会以该用户的权限运行。因此要注意上文中提到的dropbox_uploader运行用户的问题。
1
2su root # 切换到合适用户执行定时任务
crontab -e
编辑定时任务,文件注释中有十分详细的说明:
1
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command#
0 3 * * * /bin/bash /root/backup/backup.sh
/bin/bash /root/backup/backup.sh
。
如果没有设置服务器时区或者不知道服务器时间,可以通过命令date
来查看服务器的当前时间。
设置完成后,重启cron服务:
1
sudo service cron restart
然后,定时任务就会自动执行了。
参考文章: