软硬件环境
- 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
系统无关