Gogs配置使用详解

/

图片来自https://www.deviantart.com/urnambot/art/Code-307159867

软硬件环境

  • 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语言支持的所有平台,包括LinuxmacOSWindows以及ARM平台。

Gogs是一个类似githubgitlab的基于git的代码托管平台,是一款开源软件,配置非常简单,中文支持得非常好,你完全可以在你的服务器上搭建,而且它还是轻量级的,占用的资源较gitlab少了很多,对于一些使用vps的用户来讲,绝对是个福音(配置高的买不起啊),还有一点比较吸引人的是,在Gogs上新建仓库,可以选择私有项目,这点要想在github上实现,就必须出点美刀了。

Gogs安装

首先我们创建一个新的系统用户,专门用于git相关的操作

  1. sudo apt install git mysql-server
  2. sudo adduser git
  3. su git
  4. cd /home/git/

我们这里全程以新创建的git用户来安装Gogs,当然也可以root来操作,最后做一下chown,防止系统权限问题。

下载地址 https://github.com/gogs/gogs/releases,由于我的vps是32位的ubuntu系统,所以选择下载的是linux_386.tar.gz,

  1. cd /home/git
  2. tar xvf linux_386.tar.gz
  3. cd gogs
  4. mysql -u root -p < scripts/mysql.sql
  5. ./gogs web

安装过程傻瓜化,将对应的信息填上就可以了

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

全站HTTPS

首先我的主域名跑了个博客程序,是基于nginxtomcat的,现在想增加一个二级域名,比如code.xugaoxiang.com来跑Gogs,证书呢还是想用之前用过的let's encrypt

Gogs自签名

Gogs自带自签名证书的功能,但是,市面上大多数的浏览器都不信任,chromefirefox都是,如果没有其它特殊需要,不建议使用。生成证书的方法如下

  1. cd /home/git/gogs
  2. ./gogs cert -ca=true -duration=8400h0m0s -host=code.xugaoxiang.com

生成了2个文件,cert.pemkey.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,内容如下

  1. server {
  2. listen 80;
  3. server_name code.xugaoxiang.com;
  4. return 301 https://$server_name$request_uri;
  5. }
  6. server {
  7. listen 443 ssl;
  8. server_name code.xugaoxiang.com;
  9. ssl on;
  10. root /home/git;
  11. ssl_certificate /home/git/gogs/cert.pem;
  12. ssl_certificate_key /home/git/gogs/key.pem;
  13. ssl_session_timeout 5m;
  14. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  15. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  16. ssl_prefer_server_ciphers on;
  17. location / {
  18. proxy_set_header X-Real-IP $remote_addr;
  19. proxy_set_header Host $host;
  20. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  21. proxy_set_header X-Forwarded-Proto $scheme;
  22. rewrite ^/gogs/(.*) /$1 break;
  23. rewrite ^/gogs$ /$1 break;
  24. proxy_pass http://localhost:3000;
  25. }
  26. }

注意到上面的ssl_certificatessl_certificate_key用到了Gogs自签名文件,没有关系,这个配置文件会在接下来的let's encrypt证书申请过程中被更新。

Gogs配置文件

编辑gogs/custom/conf/app.ini中的server字段

  1. [server]
  2. DOMAIN = code.xugaoxiang.com
  3. HTTP_PORT = 3000
  4. ROOT_URL = https://code.xugaoxiang.com
  5. DISABLE_SSH = true
  6. OFFLINE_MODE = false
let’s encrypt的多域名证书

首先安装let's encryptnginx插件

  1. apt-get install python-certbot-nginx

证书申请

  1. certbot --nginx

按照提示一步步安装,注意我们这里需要对多个域名进行https配置,在选择域名那一项时,直接按回车键,一切OK之后,相应的key文件也是存放在了/etc/letsencrypt/live/你的域名下,同时呢,certbot还会直接修改/etc/nginx/conf.d/下的各子域的配置文件,就是上步中的code.xugaoxiang.com.conf

  1. server {
  2. if ($host = code.xugaoxiang.com) {
  3. return 301 https://$host$request_uri;
  4. } # managed by Certbot
  5. listen 80;
  6. server_name code.xugaoxiang.com;
  7. return 301 https://$server_name$request_uri;
  8. }
  9. server {
  10. listen 443 ssl;
  11. server_name code.xugaoxiang.com;
  12. ssl on;
  13. root /home/git;
  14. ssl_certificate /etc/letsencrypt/live/code.xugaoxiang.com/fullchain.pem; # managed by Certbot
  15. ssl_certificate_key /etc/letsencrypt/live/code.xugaoxiang.com/privkey.pem; # managed by Certbot
  16. ssl_session_timeout 5m;
  17. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  18. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  19. ssl_prefer_server_ciphers on;
  20. location / {
  21. proxy_set_header X-Real-IP $remote_addr;
  22. proxy_set_header Host $host;
  23. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  24. proxy_set_header X-Forwarded-Proto $scheme;
  25. rewrite ^/gogs/(.*) /$1 break;
  26. rewrite ^/gogs$ /$1 break;
  27. proxy_pass http://localhost:3000;
  28. }
  29. }

一切就绪后,重启nginx服务

  1. /etc/init.d/nginx restart

再次访问https://code.xugaoxiang.com,浏览器地址栏的左边已经出现了小绿锁。

验证git仓库的下载和提交

比如https://code.xugaoxiang.com/xugaoxiang/BasicAPIs.git,用户名及密码就是注册时使用的用户名和密码。

使用中发现如果提交大文件会报错

  1. Username for 'https://code.xugaoxiang.com': xugaoxiang
  2. Password for 'https://xugaoxiang@code.xugaoxiang.com':
  3. Counting objects: 13, done.
  4. Delta compression using up to 4 threads.
  5. Compressing objects: 100% (13/13), done.
  6. Writing objects: 100% (13/13), 14.43 MiB | 11.12 MiB/s, done.
  7. Total 13 (delta 4), reused 0 (delta 0)
  8. error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large
  9. fatal: The remote end hung up unexpectedly
  10. fatal: The remote end hung up unexpectedly
  11. Everything up-to-date

解决方法是

  • 编辑/etc/nginx/nginx.conf,在http字段内添加client_max_body_size 60m;
  • 配置git, git config --global http.postBuffer 60000000

参考资料

转载请注明作者和出处,并添加本页链接。
原文链接: blog.xugaoxiang.com/149