Git是非常流行的版本管理系统,很多的网站也提供了免费的Git服务,如全球知名的最大源代码托管服务Github。但是大部分的Git源代码托管服务都只对开放的代码托管免费,对私有的代码托管需要收取一定费用。同时,个人的一些代码有时由于各种原因可能并不适合开放,比如:练习用代码,对Git服务提供商的隐私性及安全性有所担忧,包含一些商业机密等等。此时可以搭建自己的Git服务器来托管代码。 应用最广泛的Git托管程序要数Gitlab,它采用Ruby on Rails,可以实现一个自托管的Git项目仓库,并可以通过网页对公开的或者私人项目进行访问。其功能与Github相似,但搭建过程稍复杂且对系统的配置要求较高。因此我选用了另一个方案Gogs。

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。

mysql
1
2
3
4
5
6
mysql -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
3
su git
cd ~
mkdir go

写入环境变量:

.bashrc
1
2
3
4
export GOROOT=$HOME/go
export GOARCH=386 #系统位数,386表示32位系统,amd64表示64位系统。
export GOOS=linux #系统类型
export PATH=$PATH:$GOROOT/bin
使环境变量生效:
1
source ~/.bashrc

安装Go

Go语言官网可以获取最新的二进制安装包:

1
2
3
wget 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二进制安装包。

git@computer:~
1
2
3
4
mkdir 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
Gogs程序就安装到了~/goapp目录下,可以直接运行gogs。
git@computer:~/goapp
1
cd gogs
./gogs web
Gogs默认监听3000端口,此时用浏览器打开服务器IP的3000端口(服务器IP:3000),在网页中进行初始配置。 需要注意的是,首次运行时建议设置Gogs的管理员账户,拖动到网页最下方填写管理员用户及密码即可。

设置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

写入以下配置:

/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运行时还有以下注意事项:

  1. Gogs的自定义配置文件位于gogs/custom/conf/app.ini,具体的参数配置可以参考官方的配置文件手册。比如,如果修改了ssh的默认端口,就需要在自定义配置文件中指定修改后的ssh端口:

    1
    SSH_PORT: 8888
  2. 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的自动启动。

  3. 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 keyApp sercet,保存这两行字符。

获取并设置DropBox上传下载脚本

Dropbox-Uploader是一个第三方的DropBox上传下载脚本。首先获取该脚本并为其设置可执行权限:

1
2
wget https://raw.githubusercontent.com/tennfy/Dropbox-Uploader/master/dropbox_uploader.sh
chmod a+x dropbox_uploader.sh

直接运行该脚本,第一次运行时会连接DropBox验证权限。

1
./dropbox_uploader.sh

按照提示输入上文中保存的App keyApp sercet,Permission type选择a。然后在浏览器中打开给出的连接地址,给予权限。以后运行时就不用再次验证了。 注意:这个授权的过程只是针对当前登陆ssh的用户,并非全局,如果切换用户运行脚本,会提示再次进行授权,因此应提前切换到需要运行该脚本的用户进行授权。其实当前用户的授权信息保存在~/.dropbox_uploader文件中,因此切换用户后会提示首次运行需要进行授权。

备份脚本

参考定时备份VPS数据至Dropbox教程给出的备份脚本,修改相应参数即可。

backup.sh
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
2
su root # 切换到合适用户执行定时任务
crontab -e

编辑定时任务,文件注释中有十分详细的说明:

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
以上命令表示每天早上3:00执行命令/bin/bash /root/backup/backup.sh。 如果没有设置服务器时区或者不知道服务器时间,可以通过命令date来查看服务器的当前时间。 设置完成后,重启cron服务:
1
sudo service cron restart

然后,定时任务就会自动执行了。

参考文章:

  1. 使用 Gogs 搭建自己的 Git 服务器
  2. How To Set Up Gogs on Ubuntu 14.04
  3. 阿里云上Ubuntu14.04-64位安装Gogs
  4. 自动定时备份VPS – 如何搭建个人网站
  5. 定时备份VPS数据至Dropbox教程