腾讯云CentOS7安装基于gogs的git平台

github大家都已经很熟悉了,但是github上面不能免费建私有仓库;如果你需要开发一些不适宜公开的项目,那么便需要自己搭建代码版本管理平台。

而由于gitlab相对要复杂一点,所以我选择了超级简单的一个私有git仓库工具—gogs。

gogs没有CI的功能,需要配合其他CI工具例如 jenkins 进行使用(一般是配置git钩子来自动启动CI)。而gitlab平台自带了CI能力(GitLab 8.0 开始),自带CI能力的话只需要像github一样在仓库中添加 .gitlab-ci.yml 这样的配置文件即可自动启动CI, 而且gitlab自带了私有docker仓库从而可以让你方便地把代码制作成镜像push到他的私有docker仓库里。不过由于我没有采用gitlab方案,所以本文我来讲解的是gogs的安装过程。

安装mysql

为了使得mysql可以通过yum升级,所以我们这里采用mysql官方提供的添加yum仓库源的方式进行MySQL安装。文档可参考这里,或根据我的步骤操作:

  • 第一步: 下载最新版 MySQL Community Server的yum源
    https://dev.mysql.com/downloads/repo/yum/

  • 第二步: 上传到腾讯云服务器并rpm安装。

    1
    2
    scp ./mysql80-community-release-el7-1.noarch.rpm root@yourip:/root/software
    sudo rpm -Uvh mysql80-community-release-el7-1.noarch.rpm
  • 第三步: 检查yum源,是否已经有mysql的源了
    可以看到可用的源有如下3个:

    1
    2
    3
    mysql-connectors-community/x86_64 MySQL Connectors Community                  51
    mysql-tools-community/x86_64 MySQL Tools Community 63
    mysql80-community/x86_64 MySQL 8.0 Community Server 17

    其实MySQL56,MySQL57都被禁用了,如果你希望安装一个低版本的MySQL可以将他们打开。

  • 第四步: 执行yum安装

    1
    yum install mysql-community-server

    由于mysql.com域名的yum访问速度超级慢,最终我妥协了选择提前下载rpm包,然后手工的方式来安装

    手工安装的命令也比较简单,如下:

    1
    2
    3
    4
    5
    6
    # 获取mysql8的工具集合tar打包文件(是一些rpm包)
    wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-1.el7.x86_64.rpm-bundle.tar
    # 解压
    tar xvf ./mysql-xxx.bundle.tar
    # 执行rpm方式的安装
    yum install mysql-community-{server,client,common,libs}-*
  • 第五步: 启动MySQL系统服务, 对于EL7系列的Linux发行版来说,现在是使用systemctl命令

    1
    2
    systemctl start mysqld.service
    systemctl status mysqld.service
  • 第六步: 打开防火墙,使其可通过外网访问腾讯云的mysql

    1
    2
    3
    firewall-cmd --permanent --zone=public --add-port=3306/tcp
    firewall-cmd --permanent --zone=public --add-port=3306/udp
    firewall-cmd --reload(使最新的防火墙规则生效)
  • 第七步: 使用root登录并修改密码

    1
    2
    3
    sudo grep 'temporary password' /var/log/mysqld.log // 获取首次临时密码
    mysql -uroot -p // 登录
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; // 修改密码

mysql基本配置

  • 添加一个具有远程读的权限的用户
    1
    2
    3
    CREATE USER dbreader IDENTIFIED BY 'test';
    grant select on tq.* to dbreader@"%" identified by "test";
    flush privileges; // 立即刷新权限
  • 设置/etc/my.cnf里的绑定地址为0.0.0.0,从而可以允许远程主机连接
    1
    bind-address=0.0.0.0
    这里修改后需要重启mysqld
  • 在本机mac电脑上尝试连接
    1
    mysql -usheldoncui -p -hcvm.cuiyongjian.com -Dlimegou
    如果遇到密码加密方式的报错,可以参考本文末尾的 踩坑记录 来解决

gogs安装

为gogs运行建立专门的git用户

因为gogs像gitlab/github一样,是在一个git账户下来支持多用户登录的一套系统。所以的代码仓库都放在服务器的git用户下,所以我们要提前建立一个不能shell登录的用户 git. 然后将gogs安装在git用户下

1
2
3
4
useradd -g git -d /home/git git
passwd git
chown -R git:git /home/git
chmod -R 755 /home/git

安装gogs

gogs安装过程很简单,只需要按照官方的gogs教程
https://gogs.io/docs/installation
下载解压执行安装命令即可。

由于官方引导的第三方yum包管理中心的版本不是最新版,所以我采用了官网中提到的直接 下载二进制 解压 的方式进行安装。

我把gogs包放置到了git用户的 /home/git目录下。

开机自启动

由于CentOS7建议采用 systemd 进行服务管理,所以gogs其实目录下已经放置了一个 systemd 脚本,我们可以把它移动到 systemd 的启动脚本目录下,就能使用 systemctl 命令了.

1
cp ./script/systemd/gogs.service /lib/systemd/system/

然后修改 gogs.service 文件中的gogs安装目录,同时修改其中的运行用户为 git,然后执行

1
2
systemctl start gogs.service
systemctl enable gogs.service

当然,也可以使用以往的init脚本的方式来实现开机自启动, 请参考官网这篇文章

查看是否启动且正在监听端口

通过 ps -ef | grep gogs 可以查看运行该程序的用户身份
通过执行 netstat -nutpl查看gogs的https服务是否已经开始监听端口

1
2
3
4
5
6
7
8
9
$ netstat -nutpl
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 772/mysqld
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6545/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 704/sshd
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 6545/nginx: master
tcp6 0 0 :::22 :::* LISTEN 704/sshd
tcp6 0 0 :::8020 :::* LISTEN 10612/gogs
tcp6 0 0 :::33060 :::* LISTEN 772/mysqld

对外暴露gogs服务: nginx https转发配置

如果你的gogs是自托管且直接对外提供服务的,那么你需要对gogs进行https证书的配置:

1
2
3
4
5
[server]
PROTOCOL = https
ROOT_URL = https://try.gogs.io/
CERT_FILE = custom/https/cert.pem
KEY_FILE = custom/https/key.pem

如果是通过nginx暴漏给外网,那么只需要配置nginx的https即可,这里我选择了免费的 Let's Encrypt. nginx的配置参考了 给你的博客加一把锁 最终配置如下:

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
server {
listen 80;
server_name git.limefe.com;
return 301 https://git.limefe.com$request_uri;
}
server {
listen 443;
server_name git.limefe.com;
keepalive_timeout 70;
ssl on;
ssl_certificate /root/.acme.sh/limefe.com/fullchain.cer;
ssl_certificate_key /root/.acme.sh/limefe.com/limefe.com.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
access_log /root/weblogs/nginxlog/git.limefe.com.access.log main;
error_log /root/weblogs/nginxlog/git.limefe.com.error.log;

# gogs监听的是8020端口
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx_proxy true;
proxy_pass http://127.0.0.1:8020;
}

# error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

执行 systemctl reload nginx 重新热加载nginx的配置

gogs初始化

启动后,需要通过界面进行数据库等的设置

初始化gogs数据库

gogs的初始化sql脚本放置在scripts目录下

1
mysql -uroot -p你的密码 < ./scripts/mysql.sql

这里要注意一个坑: 在MySQL8当中:

In MySQL 8.0, the option innodb_file_format is removed.

也就是说 innodb_file_format 这个变量已经被移除了。所以gogs官方提供的 mysql.sql 里面这样进行设置是会报错的:

1
2
3
4
5
SET GLOBAL innodb_file_per_table = ON,
innodb_file_format = Barracuda,
innodb_large_prefix = ON;
DROP DATABASE IF EXISTS gogs;
CREATE DATABASE IF NOT EXISTS gogs CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

innodb_large_prefix其实也不支持了, 所以,我们需要删掉这2句语句,重新进行执行mysql.sql.

初始化gogs站点

gogs安装并执行mysql.sql脚本后,便可以打开你配置的域名访问gogs站点。首次访问会进入gogs安装配置页面,在此页面需要填写gogs站点的各种配置信息。 这些配置会存储在gogs安装目录的 custom/conf/app.ini 文件中,后期可以进行手工修改。

邮箱设置

在界面或者 custom/conf/app.ini 里可以进行邮箱设置,这里可以使用免费的腾讯企业邮箱,把SMTP服务器地址填写为:
smtp.exmail.qq.com:465

修改gogs依赖的的ssh配置

如果你在web界面安装时勾选了”使用内置ssh服务器”,那么gogs启动时会没有权限监听22端口(因为gogs是使用git用户启动的)。所以我们需要去修改 START_SSH_SERVER 为false,即使用操作系统默认的ssh提供服务.

踩坑

  • mysql安装报错:

    试图安装 mysql-community-server-minimal-8.0.11-1.el7.x86_64mysql-community-server-8.0.11-1.el7.x86_64 会导致文件 /etc/my.cnf 冲突

    这个报错是因为,我从MySQL官网下载的是所有组件都打包在一起的 bundle.tar, 然后解压到了同一个文件夹,此时再使用mysql官网给的

    1
    yum install mysql-community-{server,client,common,libs}-*

    这个命令其实是有问题的,因为 server-mininalserver 这两个rpm是同一个功能,只能选其一个,不可以同时安装哦。

    解决方案: 把mininal那个rpm删掉, 再执行yum安装

  • mysqld无法登陆

    因为mysql8修改了默认的密码加密方式,你本地电脑mysql客户端如果比较低的版本话是[不行的]。所以我们需要把服务器端mysql账户的默认加密方式修改为原来的加密方式. 一个是直接修改my.cnf里面mysqld的默认加密方式:

    1
    default_authentication_plugin=mysql_native_password

    另一个是要把你的账户的加密方式改过来:

    1
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password value'

    MySQL8更多坑请见这里: https://kn007.net/topics/the-road-to-mysql-8-0-11-update/

  • gogs邮件设置格式

    邮件设置可以使用腾讯企业邮箱,不过记得设置SMTP时要如下这样的格式进行设置,并且邮箱账号要使用邮箱地址.

    1
    2
    3
    4
    5
    6
    [mailer]
    ENABLED = true
    HOST = smtp.exmail.qq.com:465
    FROM = "noreply" <git@limefe.com>
    USER = git@limefe.com
    PASSWD = *******

refer

mysql官方yum安装文档
从 GitHub 到 GitLab,打造私有项目 CI/CD 工作流
GitLab CI 之前端 Webpack 实践