软硬件环境
- ubuntu 16.04 on vps
- nginx 1.10.3
- tomcat 8.5.23
- gogs 0.11.53
- godaddy
- mysql 5.7.23
视频看这里
Gogs是什么
Gogs官方的定义是这样的
Gogs的目标是打造一个最简单、最快速和最轻松的方式搭建自助Git服务。使用Go语言开发使得Gogs能够通过独立的二进制分发,并且支持Go语言支持的所有平台,包括Linux、macOS、Windows以及ARM平台。
Gogs是一个类似github和gitlab的基于git的代码托管平台,是一款开源软件,配置非常简单,中文支持得非常好,你完全可以在你的服务器上搭建,而且它还是轻量级的,占用的资源较gitlab少了很多,对于一些使用vps的用户来讲,绝对是个福音(配置高的买不起啊),如果还没有VPS的话,建议购买搬瓦工VPS,综合性价比很高。
Gogs安装
首先我们创建一个新的系统用户,专门用于git相关的操作
sudo apt install git mysql-server
sudo adduser git
su git
cd /home/git/
我们这里全程以新创建的git用户来安装Gogs,当然也可以root来操作,最后做一下chown,防止系统权限问题。
下载地址 https://github.com/gogs/gogs/releases,由于我的vps是32位的ubuntu系统,所以选择下载的是linux_386.tar.gz,
cd /home/git
tar xvf linux_386.tar.gz
cd gogs
mysql -u root -p < scripts/mysql.sql
./gogs web
安装过程傻瓜化,将对应的信息填上就可以了



安装完毕后,就可以直接登录站点使用了,如下图

全站HTTPS
首先我的主域名跑了个博客程序,是基于nginx和tomcat的,现在想增加一个二级域名,比如code.xugaoxiang.com来跑Gogs,证书呢还是想用之前用过的let's encrypt。
Gogs自签名
Gogs自带自签名证书的功能,但是,市面上大多数的浏览器都不信任,chrome和firefox都是,如果没有其它特殊需要,不建议使用。生成证书的方法如下
cd /home/git/gogs
./gogs cert -ca=true -duration=8400h0m0s -host=code.xugaoxiang.com
生成了2个文件,cert.pem和key.pem。
A和CNAME
域名解析中的A记录是IP解析,直接将域名指向某个IP,如果IP有所变动,那么A记录就必须更改。
CNAME是别名解析,是先将域名解析到主机别名再转跳到IP,这样就算主机IP改变了也不用重新解析。
由上可知,经常换IP的,建议用CNAME别名解析,不经常换IP,建议用A记录直接解析到IP。多线空间,必须用CNAME别名解析。
另外,CNAME解析的生效时间要比A记录快,A记录往往要几个小时至48小时,CNAME几分钟即可。
在Godaddy中添加二级域名如下

由于生效需要一定时间,可以通过去ping你的二级域名来确定是否设置成功。
nginx配置文件
进入/etc/nginx/conf.d目录,新建对应二级域名的配置文件,如code.xugaoxiang.com.conf,内容如下
server {
listen 80;
server_name code.xugaoxiang.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name code.xugaoxiang.com;
ssl on;
root /home/git;
ssl_certificate /home/git/gogs/cert.pem;
ssl_certificate_key /home/git/gogs/key.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^/gogs/(.*) /$1 break;
rewrite ^/gogs$ /$1 break;
proxy_pass http://localhost:3000;
}
}
注意到上面的ssl_certificate和ssl_certificate_key用到了Gogs自签名文件,没有关系,这个配置文件会在接下来的let's encrypt证书申请过程中被更新。
Gogs配置文件
编辑gogs/custom/conf/app.ini中的server字段
[server]
DOMAIN = code.xugaoxiang.com
HTTP_PORT = 3000
ROOT_URL = https://code.xugaoxiang.com
DISABLE_SSH = true
OFFLINE_MODE = false
let’s encrypt的多域名证书
首先安装let's encrypt的nginx插件
sudo apt-get install python-certbot-nginx
证书申请
certbot --nginx
按照提示一步步安装,注意我们这里需要对多个域名进行https配置,在选择域名那一项时,直接按回车键,一切OK之后,相应的key文件也是存放在了/etc/letsencrypt/live/你的域名下,同时呢,certbot还会直接修改/etc/nginx/conf.d/下的各子域的配置文件,就是上步中的code.xugaoxiang.com.conf
server {
if ($host = code.xugaoxiang.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name code.xugaoxiang.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name code.xugaoxiang.com;
ssl on;
root /home/git;
ssl_certificate /etc/letsencrypt/live/code.xugaoxiang.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/code.xugaoxiang.com/privkey.pem; # managed by Certbot
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^/gogs/(.*) /$1 break;
rewrite ^/gogs$ /$1 break;
proxy_pass http://localhost:3000;
}
}
一切就绪后,重启nginx服务
/etc/init.d/nginx restart
再次访问https://code.xugaoxiang.com,浏览器地址栏的左边已经出现了小绿锁。

验证git仓库的下载和提交
比如https://code.xugaoxiang.com/xugaoxiang/BasicAPIs.git,用户名及密码就是注册时使用的用户名和密码。

使用中发现如果提交大文件会报错
Username for 'https://code.xugaoxiang.com': xugaoxiang
Password for 'https://xugaoxiang@code.xugaoxiang.com':
Counting objects: 13, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 14.43 MiB | 11.12 MiB/s, done.
Total 13 (delta 4), reused 0 (delta 0)
error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
Everything up-to-date
解决方法是
- 编辑
/etc/nginx/nginx.conf,在http字段内添加client_max_body_size 60m; - 配置
git,git config --global http.postBuffer 60000000
备份与恢复
系统备份
执行命令
su git
cd /home/git/gogs
./gogs backup
备份完毕后,会在当前目录下生成带日期的压缩包,如gogs-backup-20190716012053.zip。通过ftp或者sftp这样的方式下载到本地保存
系统恢复
gogs系统恢复,折腾了好几个小时,最后终于搞定。命令是
./gogs restore --config custom/conf/app.ini -v --from ../gogs-backup-20190716012053.zip -t tmp
这里有几点需要注意:
git用户权限问题app.ini问题,这里我使用的安装完后gogs自己生成的,如果用备份的则会失败- 不建议使用备份包解压的默认路径
/tmp,可以在当前路径下自己创建一个然后加-t参数制定 - 备份恢复与
32bit/64bit系统无关