版权说明:本文为博主原创,如果转载请注明来源。作为学习笔记,不能保证所有知识点是完全正确以及表达无误,用于生产环境配置时请斟酌。如有错误或建议请联系。侵删联系:linuxops@foxmail.com。感谢各位!
一、 系统概述
代码托管系统是开发中一个不可缺少的工具,通过代码托管系统可以方便协同开发,代码权限控制,代码异地灾备、版本管理、问题跟踪、项目文档管理等等项目管理所必须的工具。在项目的任何一个过程中,代码托管系统始终有着重要的地位。
A. 代码管理工具
目前市面上开源的代码管理工具主要有两大体系:
- SVN:集中式代码版本控制系统
- GIT:分布式代码版本控制系统
集中式和分布式有其优缺点,简单而言,集中式需要一台中心服务器,中心服务器故障服务不可用,但是集中式对权限控制比较严格,粒度细,而分布式相反,它没有严格的中心服务器概念,托管系统服务器故障依然可以使用,但是权限控制相对较弱。
一般而言,开源的项目比较喜欢使用git
基于git和svn衍生出来的管理系统也有很多,例如基于git的github,阿里云code,码云等等,gitlab、Gogs也是其中之一,不同的是gitlab、gogs需要自己搭建,而github等以服务的形式提供给公众使用。
B. 为什么是gogs?
说到自建代码管理系统,首先想到的是gitlab,gitlab是基于ruby开发的一套功能丰富的代码管理系统,但是gitlab资源消耗异常大,在低配置的服务器中无法支撑大用户量的使用,安装维护也异常麻烦。 Gogs是基于go语言开发的开源代码管理系统,go语言有其天生的高并发高性能的特点,在低配置的服务器中也能支持大用户量愉快的玩耍,Gogs起步晚,功能没有gitlab丰富,但是提供了基本的功能,并且安装维护比gitlab更为简单方便,在我们的评估了gogs的功能以后得出结论完全符合我司的需要。 于是选择了gogs
二、 安装Gogs
安装gogs之前,必须要要先安装git,可以通过yum install git命令安装
A. 环境配置
先准备好服务器。
- 供应商:阿里云
- CPU:2核
- 内存:4G
- 硬盘:40G系统盘,100G数据盘(挂在点 /data)
- 带宽:100M(按量)
- 系统:Centos 7.4
- Gogs:0.11.43
- 下载地址:https://dl.gogs.io/0.11.43/gogs_0.11.43_linux_amd64.tar.gz
- GITHUB:https://github.com/gogits/gogs
B. 安装Gogs
1. 下载gogs:
[root@Gogs ~]# wget https://dl.gogs.io/0.11.43/gogs_0.11.43_linux_amd64.tar.gz
--2018-04-03 15:31:02-- https://dl.gogs.io/0.11.43/gogs_0.11.43_linux_amd64.tar.gz
Resolving dl.gogs.io (dl.gogs.io)... 138.68.27.161
Connecting to dl.gogs.io (dl.gogs.io)|138.68.27.161|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19214809 (18M) [application/x-gzip]
Saving to: 'gogs_0.11.43_linux_amd64.tar.gz'
100%[===========================================================>] 19,214,809 341KB/s in 31s
2018-04-03 15:31:34 (607 KB/s) - 'gogs_0.11.43_linux_amd64.tar.gz' saved [19214809/19214809]
[root@Gogs ~]#
2. 解压和复制:
[root@Gogs ~]# tar -zxvf gogs_0.11.43_linux_amd64.tar.gz
将解压得到的文件夹复制到目标路径:
[root@Gogs ~]# cp -rf gogs /usr/local/gogs
解压得到的文件如下:
[root@Gogs ~]# cd /usr/local/gogs/
[root@Gogs gogs]# ls
gogs LICENSE public README.md README_ZH.md scripts templates
[root@Gogs gogs]#
其中 gogs
文件为启动命令
Public
为公共文件目录
Scripts
为脚本文件
Templates
为web的模版文件
3. 准备用户和仓库目录
不建议使用root用户来运行gogs,我们准备一个用户用于运行gogs
[root@Gogs ~]# groupadd gogs
[root@Gogs ~]# useradd -g gogs -s /bin/bash gogs
[root@Gogs ~]# passwd gogs
Changing password for user gogs.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@Gogs ~]#
准备仓库目录和日志目录
[root@Gogs ~]# mkdir -p /data/gogs/repositories
[root@Gogs ~]# mkdir -p /data/gogs/logs
修改相关文件权限
[root@Gogs ~]# chown -R gogs:gogs /data/gogs/
[root@Gogs ~]# chown -R gogs:gogs /usr/local/gogs/
4. 启动
启动前先切换到gogs用户
[root@Gogs ~]# su gogs
[gogs@Gogs root]$ cd /usr/local/gogs/
[gogs@Gogs gogs]$ ./gogs web
2018/04/04 10:22:41 [ WARN] Custom config '/usr/local/gogs/custom/conf/app.ini' not found, ignore this if you're running first time
2018/04/04 10:22:41 [TRACE] Custom path: /usr/local/gogs/custom
2018/04/04 10:22:41 [TRACE] Log path: /usr/local/gogs/log
2018/04/04 10:22:41 [TRACE] Log Mode: Console (Trace)
2018/04/04 10:22:41 [ INFO] Gogs 0.11.43.0330
2018/04/04 10:22:41 [ INFO] Cache Service Enabled
2018/04/04 10:22:41 [ INFO] Session Service Enabled
2018/04/04 10:22:41 [ INFO] SQLite3 Supported
2018/04/04 10:22:41 [ INFO] Run Mode: Development
2018/04/04 10:22:41 [ INFO] Listen: http://0.0.0.0:3000
如上,gogs已经启动了,启动信息直接打印在了屏幕,可以到gogs的各种信息,版本,路径,启动模式,监听端口等等。当然以上信息都是gogs的默认的,并不适合正式使用。我们后期在更改。
如上信息提示,gogs监听了一个3000端口,通过这个端口我们可以访问gogs的web服务。访问http://ip:3000
或者http://domain:3000
就可以了,首次访问会引导我们安装。
安装页面选项说明:
项目 | 说明 | 示例 |
---|---|---|
数据库类型 | Gogs提供了多种数据库的选择,mysql、postgresql、mssql、sqlite3。 建议使用mysql和postgresql,我们这里选择mysql。 |
MySQL |
数据库主机 | 填写数据库地址。 格式[ip:port] or [domain:port] |
127.0.0.1:3306 Mysql.test.com:3306 |
数据库用户 | 填写数据库用户名。 建议不要使用root,新建一个用户,只授权给gogs的库 |
gogs |
数据库用户密码 | 填写数据库密码,建议密码强度为高 | m3j828rdJUY4 |
数据库名称 | Gogs的数据库名称 | gogs |
应用名称 | 填写应用的名称,会显示在web页面上 | GOGS代码管理平台 |
仓库根目录 | 填写仓库存放的路径。我们挂载了一个100G的硬盘,挂载点为/data | /data/gogs/repositories |
运行系统用户 | 运行gogs的用户 为了安全不建议使用root用户运行,用户必须要对仓库目录和运行目录有权限。 |
gogs |
域名 | 填写域名,此域名会体现在ssh克隆地址上,请事先规划好 | git.test.com |
SSH 端口号 | SSH 服务器的监听端口号,留空表示禁用 SSH 功能 | 2222 |
使用内置SSH服务器 | 勾选此项将使用内置的SSH服务器,否则使用系统自带的,为了隔离系统SSH服务我们勾选此项 | 勾选 |
HTTP 端口号 | http监听地址,此端口号影响web访问 | 3000 |
应用 URL | 该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。 | http://git.example.com:3000/ |
日志路径 | Gogs运行的日志文件存储路径 | /data/gogs/logs |
邮件服务配置 | 如果需要邮件通知或者用户自行修改密码的话,需要配置邮件服务 | 默认 |
服务器和其他服务设置 | 其他设置,包括是否启用注册等。可以事后配置 | 默认 |
管理员帐号设置 | 管理员帐号可以在安装页面设置,也可以不设置,如果不设置,ID为1的用户将自动获得管理员的权限 | 默认 |
配置好了点击安装,如果没有报错安装成功。
注意:
1、如果在安装页面没有配置管理员帐号,那么安装完成后点击注册按钮注册用户,用户ID为1的用户即为管理员。
2、情特别注意权限问题,gogs目录、仓库目录、日志目录请给足权限。
三、 Gogs配置
A. 官方配置项
Gogs安装好了以后会在custom/conf/
下面生成一个app.ini
的配置文件,通过修改此文件我们可以对gogs进行配置。
详细配置项目如下:
1. 概览
名称 | 描述 |
---|---|
APP_NAME | 应用名称,可以改成您的组织或公司名称 |
RUN_USER | 运行应用的用户名称,我们建议您使用 git,但如果您在个人计算机上运行 Gogs,请修改为您的系统用户名称。如果没有正确设置这个值,很可能导致您的应用崩溃 |
RUN_MODE | 鉴于性能和其它考虑,建议在部署环境下修改为 prod 模式。在您完成安装操作时,该值也会被设置为 prod |
2. 服务器 (server)
名称 | 描述 |
---|---|
PROTOCOL | http 或 https |
DOMAIN | 服务器域名 |
ROOT_URL | 公开的完整 URL 路径 |
HTTP_ADDR | 应用 HTTP 监听地址 |
HTTP_PORT | 应用 HTTP 监听端口号 |
UNIX_SOCKET_PERMISSION | Unix 套接字文件的权限 |
LOCAL_ROOT_URL | 用于 Gogs 工作进程(如:SSH)回访应用的本地(DMZ)URL,一般情况下请保持默认值,除非您的 SSH 服务器节点与 HTTP 并不是同一个节点入口 |
DISABLE_SSH | 当 SSH 功能不可用时可以禁用 |
START_SSH_SERVER | 启用该选项来启动内置 SSH 服务器 |
SSH_DOMAIN | 允许公用网络访问 SSH 的域名 |
SSH_PORT | SSH 端口号,如果不为 22 的话可以在此修改 |
SSH_LISTEN_HOST | 内置 SSH 服务器监听的地址 |
SSH_LISTEN_PORT | 内置 SSH 服务器监听的端口 |
SSH_ROOT_PATH | SSH 根目录,一般为 ~/.ssh,但必须填写为 /home/git/.ssh |
REWRITE_AUTHORIZED_KEYS_AT_START | 激活该选项以在应用启动时自动重写 authorized_keys 文件,该选项在使用内置 SSH 服务器时将会被自动禁用 |
SSH_KEY_TEST_PATH | 用于测试 SSH 公钥的临时目录 |
SSH_KEYGEN_PATH | ssh-keygen 程序的路径,默认为 ssh-keygen 即通过系统路径查找 |
MINIMUM_KEY_SIZE_CHECK | 指定不同类型的公钥的最小密钥大小 |
OFFLINE_MODE | 激活该选项来禁止从 CDN 获取静态资源,同时 Gravatar 服务也将被自动禁用 |
DISABLE_ROUTER_LOG | 激活该选项来禁止打印路由日志 |
CERT_FILE | HTTPS 授权文件路径 |
KEY_FILE | HTTPS 的密钥文件路径 |
STATIC_ROOT_PATH | 模板文件和静态文件的上级目录,默认为应用二进制所在的位置 |
APP_DATA_PATH | 应用内部数据的存放目录 |
ENABLE_GZIP | 激活该选项来启用应用级别 GZIP 支持 |
LANDING_PAGE | 未登录用户的默认首页,可以是 home 或 explore(探索页) |
3. 仓库 (repository)
名称 | 描述 |
---|---|
ROOT | 用户仓库存储根目录,必须为绝对路径,默认为 ~/ |
SCRIPT_TYPE | 系统脚本类型,一般情况下均为 bash,但有些用户反应只能使用 sh |
ANSI_CHARSET | 当遇到无法识别的字符集时使用的默认字符集 |
FORCE_PRIVATE | 强制要求所有新建的仓库都是私有的 |
MAX_CREATION_LIMIT | 全局默认的每个用户可创建创建仓库上限,-1 表示无限制 |
PREFERRED_LICENSES | 建议用户首选的授权类型 |
DISABLE_HTTP_GIT | 激活该选项来禁止用户通过 HTTP 对 Git 仓库进行交互操作,即用户只能通过 SSH 操作 |
ENABLE_LOCAL_PATH_MIGRATION | 激活该选项来启用本地路径迁移仓库功能。启动后默认只有管理员可以使用,普通用户必须经由管理员授权 |
4. 仓库 - 编辑器 (repository.editor)
名称 | 描述 |
---|---|
LINE_WRAP_EXTENSIONS | 需要显示为行包装的文件名后缀,通过逗号分隔。如果是无后缀名的文件,则单独放置一个逗号,例如:.txt, |
5. 仓库 - 文件上传 (repository.upload)
名称 | 描述 |
---|---|
ENABLED | 激活该选项来启用仓库文件上传功能 |
TEMP_PATH | 文件上传的临时存放目录 |
ALLOWED_TYPES | 允许上传的文件类型(例如:”image/jpeg|image/png”),留空表示允许上传任意类型的文件 |
FILE_MAX_SIZE | 单个上传的文件的最大体积,以 MB 为单位 |
MAX_FILES | 单次同时上传的最多文件个数 |
6. 版本发布 - 附件 (release.attachment)
名称 | 描述 |
---|---|
ENABLED | 激活该选项来启用版本发布附件功能 |
PATH | 存放附件的路径 |
ALLOWED_TYPES | 允许上传的 MIME 类型,例如 “image/jpeg|image/png”,使用 / 允许所有类型的文件 |
MAX_SIZE | 最大允许上传的附件体积,单位为 MB,例如 32 |
MAX_FILES | 最大允许一次性上传的附件个数,例如 10 |
7. Markdown (markdown)
名称 | 描述 |
---|---|
ENABLE_HARD_LINE_BREAK | 指示是否启用硬性换行扩展 |
CUSTOM_URL_SCHEMES | 允许被解析为链接的自定义 URL 方案,例如 git(用于 git://)和magnet(用于 magnet://) |
FILE_EXTENSIONS | 需要被渲染为 Markdown 格式的文件名后缀,通过逗号分隔。如果是无后缀名的文件,则单独放置一个逗号,例如:.markdown, |
8. Smartypants (smartypants)
名称 | 描述 |
---|---|
ENABLED | 指示是否启用 Smartypants 扩展 |
9. HTTP (http)
名称 | 描述 |
---|---|
ACCESS_CONTROL_ALLOW_ORIGIN | 头信息 Access-Control-Allow-Origin 的自定义值,默认为空,即不响应此头信息 |
10. 数据库 (database)
名称 | 描述 |
---|---|
DB_TYPE | 数据库类型,可以是 mysql、postgres、mssql 或 sqlite3 |
HOST | 数据库主机地址与端口 |
NAME | 数据库名称 |
USER | 数据库用户名 |
PASSWD | 数据库用户密码 |
SSL_MODE | 仅限 PostgreSQL 使用 |
PATH | 仅限 SQLite3 使用,数据库文件路径 |
11. 应用管理 (admin)
名称 | 描述 |
---|---|
DISABLE_REGULAR_ORG_CREATION | 激活该选项来禁止普通用户(非管理员)创建组织 |
12. 安全 (security)
名称 | 描述 |
---|---|
INSTALL_LOCK | 用于指示是否允许访问安装页面(该页面可以设置管理员帐号,因此该选项非常重要) |
SECRET_KEY | 全局的加密密钥,务必修改该值以确保您的服务器安全(会在每次安装时自动生成随机字符串) |
LOGIN_REMEMBER_DAYS | 记住登录的天数 |
COOKIE_USERNAME | 记录用户名的 Cookie 名称 |
COOKIE_REMEMBER_NAME | 记录用户自动登录信息的 Cookie 名称 |
REVERSE_PROXY_AUTHENTICATION_USER | 反向代理认证用户的 Header 字段名 |
13. 服务 (service)
名称 | 描述 |
---|---|
ACTIVE_CODE_LIVE_MINUTES | 激活码的有效期,单位为分钟 |
RESET_PASSWD_CODE_LIVE_MINUTES | 重置密码的有效期,单位为分钟 |
REGISTER_EMAIL_CONFIRM | 激活该选项来要求注册用户必须验证邮箱,要求已启用 Mailer |
DISABLE_REGISTRATION | 激活该选项来禁止用户注册功能,只能由管理员创建帐号 |
SHOW_REGISTRATION_BUTTON | 用于指示是否显示注册按钮 |
REQUIRE_SIGNIN_VIEW | 激活该选项来要求用户必须登录才能浏览任何页面 |
ENABLE_CACHE_AVATAR | 激活该选项来缓存 Gravatar 的头像 |
ENABLE_NOTIFY_MAIL | 激活该选项来发送通知邮件给关注者,例如创建 issue 时,要求已启用 Mailer |
ENABLE_REVERSE_PROXY_AUTHENTICATION | 激活该选项来开启反向代理用户认证,请从 #165了解更多信息 |
ENABLE_REVERSE_PROXY_AUTO_REGISTRATION | 激活该选项来开启反向代理用户认证的自动注册功能 |
DISABLE_MINIMUM_KEY_SIZE_CHECK | 激活该选项来禁止检查响应类型的密钥最小长度 |
ENABLE_CAPTCHA | 激活该选项以在用户注册时要求输入验证码 |
14. Web 钩子 (webhook)
名称 | 描述 |
---|---|
TYPES | 启动的 Web 钩子类型,可以是 gogs、slack 或 discord |
DELIVER_TIMEOUT | 发送通知的超时时间,以秒为单位 |
SKIP_TLS_VERIFY | 指示是否允许向具有非信任证书的地址发送通知 |
PAGING_NUM Web | 钩子历史页面每页显示记录条数 |
15. 邮件 (mailer)
名称 | 描述 |
---|---|
ENABLED | 启用该选项以激活邮件服务 |
SUBJECT_PREFIX | 邮件标题的前缀 |
HOST | SMTP 主机地址与端口 |
DISABLE_HELO | 禁用 HELO 操作 |
HELO_HOSTNAME | HELO 操作的自定义主机名 |
SKIP_VERIFY | 不验证自签发证书的有效性 |
FROM | 邮箱的来自地址,遵循 RFC 5322规范,可以是一个单纯的邮箱地址或者 "名字" email@example.com 的形式 |
USER | 邮箱用户名 |
PASSWD | 邮箱密码 |
USE_PLAIN_TEXT | 使用 text/plain 作为邮件内容格式 |
备注:Gogs 仅支持使用 STARTTLS 的 SMTP 协议
16. 缓存 (cache)
名称 | 描述 |
---|---|
ADAPTER | 缓存引擎适配器,可以为 momery、redis 或 memcache。如果您使用 redis 或 memcache,请确保使用 -tags 选项重新构建所有依赖,例如:go build -tags='redis' |
INTERVAL | 仅限内存缓存使用,GC 周期,单位为秒 |
HOST | 仅限 redis 和 memcache 使用,主机地址和端口号 |
Redis:network=tcp,addr=127.0.0.1:6379,password=macaron,db=0,pool_size=100,idle_timeout=180 | |
Memache:127.0.0.1:9090;127.0.0.1:9091 |
17. 会话 (session)
名称 | 描述 |
---|---|
PROVIDER | Session 引擎提供者,可以是 memory、file、redis 或 mysql |
PROVIDER_CONFIG | 如果提供者为 file,则为文件根目录;如果为其它提供者,则为主机地址和端口号 |
COOKIE_SECURE | 激活该选项以要求所有 session 操作均通过 HTTPS |
GC_INTERVAL_TIME | GC 周期,单位为秒 |
18. 图片 (picture)
名称 | 描述 |
---|---|
AVATAR_UPLOAD_PATH | 存放用户上传头像的目录 |
GRAVATAR_SOURCE | 可以是 gravatar、duoshuo 或任何 URL,例如:http://cn.gravatar.com/avatar/ |
DISABLE_GRAVATAR | 激活该选项来仅使用本地头像 |
ENABLE_FEDERATED_AVATAR | 激活该选项来启用 Federated 头像服务(http://www.libravatar.org),当Gravatar 被禁用时此选项无法生效 |
19. 附件 (attachment)
名称 | 描述 |
---|---|
ENABLED | 激活该选项以允许用户上传附件 |
PATH | 存放附件的路径 |
ALLOWED_TYPES | 允许上传的 MIME 类型,例如 “image/jpeg|image/png”,使用 / 允许所有类型的文件 |
MAX_SIZE | 最大允许上传的附件体积,单位为 MB,例如 4 |
MAX_FILES | 最大允许一次性上传的附件个数,例如 5 |
20. 时间 (time)
名称 | 描述 |
---|---|
FORMAT | 指定日期的输出格式,默认为 RFC1123,其它可选的格式为 ANSIC、UnixDate、RubyDate、RFC822、RFC822Z、RFC850、RFC1123、RFC1123Z、RFC3339、RFC3339Nano、Kitchen、|Stamp、StampMilli、StampMicro 和 StampNano。访问 http://golang.org/pkg/time/#pkg-constants 查看详情 |
21. 日志 (log)
名称 | 描述 |
---|---|
ROOT_PATH | 日志文件的根目录 |
MODE | 日志记录模式,默认为 console。如果想要开启多模式,请使用逗号分割,例如:"console, file" |
LEVEL | 基本日志级别,默认为 Trace |
22. 日志 - 控制台 (log.console)
名称 | 描述 |
---|---|
LEVEL | 控制台日志级别,留空则继承父值 |
23. 日志 - 文件 (log.file)
名称 | 描述 |
---|---|
LEVEL | 控制台日志级别,留空则继承父值 |
LOG_ROTATE | 激活该选项以启用日志文件自转 |
DAILY_ROTATE | 激活该选项以进行日常自转 |
MAX_SIZE_SHIFT | 自转需要达到的最大文件体积,使用位左移,默认为 28 即 1 << 28,表示 256MB |
MAX_LINES | 自转需要达到的最大文件行数,默认为 1000000 |
MAX_DAYS | 保留自转文件的最长期限,默认为 7 天后删除 |
24. 日志 - Slack (log.slack)
名称 | 描述 |
---|---|
LEVEL | 控制台日志级别,留空则继承父值 |
URL | Slack Web 钩子 URL |
25. Cron (cron)
名称 | 描述 |
---|---|
ENABLED | 激活该选项以允许周期性运行 Cron 任务 |
RUN_AT_START | 激活该选项以允许在启动时执行 Cron 任务 |
26. Cron - 更新镜像 (cron.update_mirrors)
名称 | 描述 |
---|---|
SCHEDULE | 定时更新仓库镜像的 Cron 语法,例如:@every 1h |
27. Cron - 仓库健康检查 (cron.repo_health_check)
名称 | 描述 |
---|---|
SCHEDULE | 定时进行仓库健康检查的 Cron 语法,例如:@every 24h |
TIMEOUT | 仓库健康检查超时的定义语法,例如:60s |
ARGS | git fsck 命令的参数,例如:--unreachable --tags |
28. Cron - 仓库统计检查 (cron.check_repo_stats)
名称 | 描述 |
---|---|
RUN_AT_START | 激活该选项以在启动时执行仓库统计检查 |
SCHEDULE | 定时进行仓库统计检查的 Cron 语法,例如:@every 24h |
29. Cron - 仓库归档清理 (cron.repo_archive_cleanup)
名称 | 描述 |
---|---|
RUN_AT_START | 激活该选项以在启动时执行仓库归档清理 |
SCHEDULE | 定时进行仓库归档清理的 Cron 语法,例如:@every 24h |
OLDER_THAN | 仓库归档的文件有效期,过期的归档将被清理,例如:24h |
30. Git (git)
名称 | 描述 |
---|---|
DISABLE_DIFF_HIGHLIGHT | 激活该选项以禁用行内差异高亮 |
MAX_GIT_DIFF_LINES | 差异对比页面单个文件显示的最大行数 |
MAX_GIT_DIFF_LINE_CHARACTERS | 差异对比页面单行显示的最大字符数 |
MAX_GIT_DIFF_FILES | 差异对比页面文件显示的最多个数 |
GC_ARGS | git gc 命令的参数,例如:--aggressive --auto |
31. Git - 超时 (git.timeout)
名称 | 描述 |
---|---|
MIGRATE | 仓库迁移操作超时,默认为 600 秒 |
MIRROR | 仓库镜像同步操作超时,默认为 300 秒 |
CLONE | 仓库克隆操作超时,默认为 300 秒 |
PULL | 仓库拉取操作超时,默认为 300 秒 |
GC | 仓库垃圾回收操作超时,默认为 60 秒 |
32. UI (ui)
名称 | 描述 |
---|---|
EXPLORE_PAGING_NUM | 探索页面每页显示仓库的数量 |
ISSUE_PAGING_NUM | 每页显示工单(Issue)的数量(应用到所有以列表形式显示工单的页面) |
FEED_MAX_COMMIT_NUM | 一条最新活动中显示代码提交(Commit)的最大数量 |
THEME_COLOR_META_TAG | 被用于 Android >= 5.0 版本 “theme-color” 标记的值,无效的值将被忽略并使用默认值(查看详情) |
MAX_DISPLAY_FILE_SIZE | 显示到页面的最大文件体积(Byte) |
UI - Admin (ui.admin)
名称 | 描述 |
---|---|
USER_PAGING_NUM | 用户管理页面每页显示记录条数 |
REPO_PAGING_NUM | 仓库管理页面每页显示记录条数 |
NOTICE_PAGING_NUM | 系统提示管理页面每页显示记录条数 |
ORG_PAGING_NUM | 组织管理页面每页显示记录条数 |
33. 其他 (other)
名称 | 描述 |
---|---|
SHOW_FOOTER_BRANDING | 激活该选项以在页脚显示 Gogs 推广信息 |
SHOW_FOOTER_VERSION | 激活该选项以在页脚显示 Gogs 版本信息 |
SHOW_FOOTER_TEMPLATE_LOAD_TIME | 激活该选项以在页脚显示 Gogs 模板加载时间 |
按照如上配置项目修改配置文件,重启后生效。
B. 当前使用配置
我们使用如下配置:
APP_NAME = GOGS代码托管平台
RUN_USER = gogs
RUN_MODE = prod
[database]
DB_TYPE = mysql
HOST = 127.0.0.1:3306
NAME = gogs
USER = gogs
PASSWD = gogs@123
SSL_MODE = disable
PATH = data/gogs.db
[admin]
DISABLE_REGULAR_ORG_CREATION = true
[repository]
ROOT = /data/gogs/repositories
MAX_CREATION_LIMIT = 0
ENABLE_LOCAL_PATH_MIGRATION = true
FORCE_PRIVATE = true
DISABLE_HTTP_GIT = false
[server]
DOMAIN = git.example.com
HTTP_PORT = 3000
ROOT_URL = https://git.example.com/
DISABLE_SSH = false
SSH_PORT = 2222
START_SSH_SERVER = true
OFFLINE_MODE = false
ENABLE_GZIP = true
[mailer]
ENABLED = false
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = true
ENABLE_CAPTCHA = false
REQUIRE_SIGNIN_VIEW = false
[picture]
DISABLE_GRAVATAR = true
ENABLE_FEDERATED_AVATAR = false
[session]
PROVIDER = file
[log]
MODE = file
LEVEL = Trace
ROOT_PATH = /data/gogs/logs
[security]
INSTALL_LOCK = true
SECRET_KEY = QSL4Bv87UrgzZsK
LOGIN_REMEMBER_DAYS = true
COOKIE_USERNAME = true
COOKIE_REMEMBER_NAME = true
REVERSE_PROXY_AUTHENTICATION_USER = true
[webhook]
TYPES = gogs
DELIVER_TIMEOUT = 300
SKIP_TLS_VERIFY = true
PAGING_NUM = true
[cron]
ENABLED = true
在如上配置中,我们启动了内置的SSH服务,并且不允许用户注册,用户也不允许创建仓库,具体请参考使用约定。
四、 系统服务配置
通过运行 ./gogs web
可以启动gogs,但是此种启动方式并不是以daemon
的方式运行,终端退出后gogs也就退出了,显然这不是我们想要的。
我们需要gogs在后台运行。
A. gogs.service配置
[Unit]
Description=Gogs
After=network.target
[Service]
Type=simple
User=gogs
Group=gogs
WorkingDirectory=/usr/local/gogs
ExecStart=/usr/local/gogs/gogs web
Restart=always
[Install]
WantedBy=multi-user.target
以上配置写入到/usr/lib/systemd/system/gogs.service
文件。
如果使用的是本地的数据库,建议在After配置数据库启动后再启动gogs。
因为我们使用阿里云的RDS服务,可以不管。
要注意user
和group
的配置,必须要和gogs
的运行用户一致,否则启动失败,另外还需要关注git是否加入到环境变量中,如果没有可以通过Environment=
传入环境变量
B. 通过systemctl启用gogs
[root@Gogs gogs]# systemctl enable gogs.service
Created symlink from /etc/systemd/system/multi-user.target.wants/gogs.service to /usr/lib/systemd/system/gogs.service.
[root@Gogs gogs]# systemctl start gogs.service
[root@Gogs gogs]# systemctl status gogs.service
● gogs.service - Gogs
Loaded: loaded (/usr/lib/systemd/system/gogs.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2018-04-04 11:20:35 CST; 5s ago
Main PID: 2445 (gogs)
CGroup: /system.slice/gogs.service
└─2445 /usr/local/gogs/gogs web > /data/gogs/logs/output.log 2>&1 &
Apr 04 11:20:35 Gogs systemd[1]: Started Gogs.
Apr 04 11:20:35 Gogs systemd[1]: Starting Gogs...
Apr 04 11:20:35 Gogs nohup[2445]: 2018/04/04 11:20:35 [TRACE] Custom path: /usr/local/gogs/custom
Apr 04 11:20:35 Gogs nohup[2445]: 2018/04/04 11:20:35 [TRACE] Log path: /data/gogs/logs
Apr 04 11:20:35 Gogs nohup[2445]: 2018/04/04 11:20:35 [TRACE] Log Mode: File (Trace)
Apr 04 11:20:35 Gogs nohup[2445]: 2018/04/04 11:20:35 [ INFO] 最牛逼的代码管理平台 0.11.43.0330
如上,gogs以daemon
的方式运行成功了。
C. Nginx代理
Gogs默认使用3000
做为web的监听端口,因为权限的问题gogs无法创建1024以下的端口,具体原因可以自行百度谷歌搜索,不再这里展开了。
如果需要直接通过域名访问,我们还需要使用nginx做一下代理。Nginx做代理给我们带来两个好处:
1、 可以使用域名直接访问,而不用加端口号。
2、 可以配置SSL证书。
安装好nginx之后,添加如下配置:
server {
listen 80;
server_name git.example.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
# HTTPS server
server {
listen 443 ssl;
server_name git.example.com;
ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
index index.php index.html index.htm;
autoindex off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:3000;
access_log logs/git.access.log;
}
}
如上,所有http的访问都将跳转到https的访问。
Nginx的安装配置和证书的签证这里就不展开了,详情请参考《服务器SSL证书生成、配置、续约手册》
五、 Gogs的API接口
Gogs提供了api接口,可以方便我们管理gogs,因API接口信息量大,详情请移步到wiki
六、 迁移其他平台仓库
在gogs之前,我们使用的是阿里云的CODE,因为各种原因,我们迁移到了gogs。
阿里云CODE的迁移工作已经完成,这里记录如何迁移的过程以及迁移的脚本,以便于下一次遇到类似情况有得参考。
注意:在开始迁移之前必须先做以下两件事:
1、先在配置文件中的[repository]
配置项目中配置 ENABLE_LOCAL_PATH_MIGRATION = true
以开启运行迁移外部仓库的功能。
2、管理员账户必须要在授权应用中生成令牌
A. 获取阿里云所有的仓库地址
阿里云CODE没有提供API接口,无法通过API接口获取到帐号下面的所有仓库,有两个方法可以解决,一个是手动复制,另外一个通过python爬虫爬取,我们迁移的时候将近百个仓库,所以我用了爬虫,具体爬虫代码这里不详细展现,爬到的仓库的https链接存放在https_git.txt文件中,每行一个仓库。
B. 编写python迁移脚本
Python脚本如下:
# -*- coding: utf-8 -*-
import urllib2
import urllib
f = open("/root/https_git.txt")
for git_https in f.readlines():
clone_addr = git_https.replace("\n","").replace("\r","")
repo_name = git_https.split("/")[4].split(".")[0]
data='''{"clone_addr" : "%s",
"uid" : 1,
"repo_name" : "%s",
"auth_username" : "linuxops",
"auth_password" : "linuxops@2018",
"private" : true }'''%(clone_addr,repo_name)
url="http://localhost:3000/api/v1/repos/migrate?token=36d125718c911a4afcbbd409ac9d0ff0a6c44e4c"
headers={"User-Agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",'Content-Type':'application/json'}
req=urllib2.Request(url,headers=headers,data=data)
resul=urllib2.urlopen(req)
print resul.read()
此脚本仅使用阿里云CODE ,如果想要迁移其他系统请修改clone_addr和repo_name的变量
C. 执行迁移
运行python脚本,如下创建成功会以json的格式返回信息。
[root@Gogs ~]# python git_migrate.py
{"id":15,"owner":{"id":1,"login":"root","full_name":"","email":"linuxops@foxmail.com","avatar_url":"https://secure.gravatar.com/avatar/ba7fb301e420c8ea24fd9f942b817100?d=identicon","username":"root"},"name":"linuxops_admin_php","full_name":"root/linuxops_admin_php","description":"","private":false,"fork":false,"parent":null,"empty":false,"mirror":false,"size":275456,"html_url":"http://git.test.com:3000/root/linuxops_admin_php","ssh_url":"ssh://gogs@git.test.com:2222/root/linuxops_admin_php.git","clone_url":"http://git.test.com:3000/root/linuxops_admin_php.git","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"default_branch":"master","created_at":"0001-01-01T00:00:00Z","updated_at":"0001-01-01T00:00:00Z","permissions":{"admin":true,"push":true,"pull":true}}
自此,gogs基本迁移成功。
D. 后续工作
Gogs和其他的托管系统一样,提供了一个wiki的功能,wiki也是一个仓库,命名的格式是仓库名加wiki。例如,一个仓库的名称是admin,存放仓库的目录名称为admin.git,这个仓库的wiki目录就是admin.wiki.git,每一个wiki也是一个仓库。
通过迁移功能迁移其他平台的库,如果其他平台库没有wiki或者没有提供wiki的功能,那么gogs对wiki的操作就会报错,可能没有生成wiki的库,也可能生成了,因为没有内容导致访问失败,这些都将会在web端体现为500错误。
要解决这个问题很简单,可以通过python遍历所有的库,如果没有wiki库,那么创建,并且吸入一个文件提交即可,如果存在wiki库,创建一个文件提交即可。
具体的python代码不再这里展示。
七、 使用约定
A. 权限规定
Gogs代码托管平台用于企业内部的代码管理,不对外,为了更好的管理我们约定如下:
服务配置:
- 禁止用户注册。
- 禁止创建仓库,只允许超级管理员能创建。
- 不允许需要用户名和昵称(通过需要页面实现)
代码库管理:
- 所有代码库都在一个组织下。
- 禁止对组织授权,组织内只有超级管理员
- 对需要权限的开发者,添加到协作者中,默认可写权限(可写权限包含了读写)
- 分支管理中默认分支为master。
- 开启对maste的分支保护,开启通过合并请求提交代码。
- 开启对master的分支保护,开启限制推送代码成员,仅允许小组负责人推送到master
代码发布:
- 发布前,负责人需要提交合并到master,并且负责对代码冲突解决和代码评审。
- 涉及到版本更迭需要负责人打标签。
- 无论是测试或是正式环境,只发布master分支的代码或者tag标签