一直想搭一个私有Git,加上刚刚加了个项目组,组内希望用私有Git做版本控制——这个任务就落到我头上来了。

本来想搭Gitlab的,然后我看了看Requirements: Minimal 4GB of RAM。

See you!!!!!!!!

在这个时候,我看到了Gogs,用Go语言写的轻量Git系统。很棒,因为就我们项目组在使用,短期内这个东西够用了,如果后期需要的话去租一个内存更大的VPS搭了Gitlab然后全部git push上去就完了。

其实也没搭过多少项目,这次也是折腾了一段时间,就写点东西记录一下吧。

主机是腾讯云的学生一元主机,跑的是Debian 8.2 64位。

搭建过程

  1. 安装依赖

    1
    2
    
    sudo apt-get update
    sudo apt-get install git mysql-server mysql-client

    Gogs用MySQL做数据库,所以要装一下MySQL。在安装MySQL的时候会要求设置root密码,注意一下。

  2. 新建用户

    不要把所有东西拿到root下面跑,不然很吓人的。

    1
    2
    
    sudo adduser git
    su - git

    我们新建一个git用户并且切换到这个用户,确保之后的所有操作都是在这个用户下。

  3. 下载Gogs

    直接访问下载页面选择合适的下载方式下载并解压就行。

    这边因为我直接用的二进制版本,就没有编译的事情了。如果想自己编译并安装,请看文档

    我是放在了git这个用户的home文件夹下面。

    1
    
    cd ~/gogs
  4. 配置MySQL

    官方在包里面写好了一份表,我们直接导入就行。

    1
    
    mysql -u root -p < scripts/mysql.sql

    然后是配置一下MySQL

    1
    2
    3
    4
    5
    
    mysql -u root -p
    > CREATE USER 'gogs'@'localhost' IDENTIFIED BY '<password>';
    > GRANT ALL PRIVILEGES ON gogs.* TO 'gogs'@'localhost';
    > FLUSH PRIVILEGES;
    > EXIT;
  5. 运行配置

    现在差不多弄完了,直接执行./gogs web就能开起来了。访问 http://ip:3000/install 进行一下基本配置就能使用了。

额外设置

Nginx反向代理配置

服务是跑起来了,但是有个很奇妙的问题,当我用80端口来跑的时候Log报错Permission Denied,用root是没问题的,但是如果用root跑就和我的初衷违背了。以前有用过nginx,所以这次我也是用nginx做一个反代。

  1. 安装nginx

    很简单,直接跑这个命令就行:

    1
    
    sudo apt-get install nginx
  2. nginx配置

    切换到/etc/nginx/sites-available/,新建任意一个文件,输入:

    1
    2
    3
    4
    5
    6
    7
    8
    
    server {
      server_name <your_domain>;
      listen 80;
    
      location / {
        proxy_pass http://127.0.0.1:<localport>/
      }
    }

    保存,然后来到/etc/nginx/sites-enabled,执行一下ln -s ../sites-available/<config>

  3. Gogs配置

    1
    
    $ cd /home/git/gogs/custom/conf

    Gogs的配置就存在这个目录下面的app.ini文件里面,改一下如下字段:

    1
    2
    
    HTTP_ADDR = 127.0.0.1
    HTTP_PORT = <localport>

    这里要注意一下,上下两个文件的<localport>部分要相同而且要本地没有占用的端口。建议设置完了后直接把这个端口封死在内网。可以用iptables,我是直接腾讯云安全组搞定了。

  4. 重启nginx

    这个时候就ok了,直接重启一下nginx就能用了:

    1
    
     udo service nginx restart

全站SSL

既然都用了Nginx,为什么不直接搞一个全站SSL呢?

服务用的Let’s Encrypt,之前也用过很多次了。怎么获取一个证书就不谈了,倒是获取的时候要记得使用stand-alone,方便取用。

  1. 修改nginx配置文件

    回到刚才的nginx配置文件,改成这个样子:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    server {
      server_name <your_domain>;
      listen 443; # SSL认证是通过443端口
      ssl on;
      ssl_certificate /etc/letsencrypt/live/<your_domain>/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/<your_domain>/privkey.pem;
    
      location / {
        proxy_pass http://127.0.0.1:<localport>;
      }
    }
    
    # 给80端口做301重定向
    server {
      server_name <your_domain>;
      listen 80;
      return 301 https://<your_domain>$request_uri;
    }
  2. 修改Gogs配置文件

    1
    
    ROOT_URL = https://<your_domain>

好了,重启一下nginx,就能看到大大的绿锁了~。

服务启动Gogs

Gogs的默认逻辑还是本地程序,kill了当前的SSH seesion就没了,不过官方写好了脚本,就在scripts目录下面,各种各样的很全,我用的是systemd,直接改一下就行,注意是这一行:

1
After=mysqld.server

其他的没啥可谈的,直接把gogs.service整个复制到/etc/systemd/system/目录下面,然后service gogs start就ok了。

以后就有私有git啦哈哈哈哈哈哈哈哈

(其实DDM的服务器被占了,还是比较难受的