本文成文于 2019年9月,将介绍如何使用 Traefik v1 搭建易于维护管理的 Gogs 。

原计划是替换家中 HomeLab 的代码仓库,但由于 GitLab CI 的良好体验,家里的 HomeLab 最终还是选择继续使用 GitLab。

这篇文章也就沉入了草稿箱,最近在折腾 Traefik 升级和测试服务器,遇到了一些相关的小需求,故将内容更新了一些后发布出来,希望能帮到有需要的同学。

写在前面

一直以来,都在使用 GitLab 作为团队/个人的仓库工具,随着版本的不断升级,GitLab 的界面功能越来越强大,消耗的服务器资源也越来越多。

最近将 GitLab Community Edition 升级到了 12.3+ ,服务器上依旧是丝般顺滑,但是家里 UPS 显示服务器待机功率默默上去了 10w。

这 10w 消耗的电费是小,但是原本静音的服务器,开始了轻微的风扇转动,这就有些不能忍了,于是有了使用更轻量应用替换 GitLab 的想法。

前置准备

Gogs 自身支持 HTTPS、支持挂在 SSL 证书,但是考虑到可维护性,这个事情交托给 Traefik 来处理。

Gogs 默认数据库使用的是 SQLite,轻量有余,但是作为重要数据的数据后端却不是那么安全,从官方网站的“如何修复数据库”可以看到挂掉的可能性还是不少的,所以我们要将其替换。

Gogs 默认的缓存方案是应用本身的内存,一般来说足够应付个人/小团队使用,但是为了进一步提高性能和健壮性,我们将缓存功能从应用主体解耦,交托于 Redis 进行处理。

那么开始配置 Gogs 依赖的软件和环境吧。

配置 MySQL 数据库

使用 compose 配置数据库非常简单,二十行以内解决战斗:

配置 Redis 内存缓存

使用 compose 搞定 Redis 更为简单,因为我们不需要将缓存持久化,所以不到二十行就完事了:

配置 Gogs 应用

不需要 Traefik 、MySQL、Redis 的 Gogs 编排文件显得十分简单:

但是这样配置的应用,显然少了“应用健康检查”、“仓库数据安全存储”、“页面高性能响应”的能力。

定制网络环境

想让 Gogs 、Redis、MySQL 作为一个整体一起正常工作,又不受到其他应用干扰,需要做几件事:

  • 将它们放置相同的网段
  • 仅对外暴露 Gogs ,对外隐藏 MySQL、Redis

想要达到这个效果,需要修改 docker-compose.yml 文件,定义 networks

上面的示例代码中,我们声明了两个网络环境,分别为私有网络 gogs,用于 Gogs 和 MySQL、Redis 互通;外部的网络 traefik,用于暴露 Web 服务、Git SSH 服务给用户。

配置服务域名

应用网路互通后,Gogs 可以通过 Docker 赋予的容器名称访问 MySQL、Redis,或者使用 gogs 随机分配的内网地址进行数据交互。

然而这两种方案都不是特别利于维护,一旦容器扩展/重建后,容器名称会发生变化、分配的 IP 地址也会发生变化。

所以这里可以使用 compose 组网声明 MySQL、Redis 的内网域名。

然后在 Gogs 容器中访问上面的域名就能够直接访问到 MySQL、Redis 啦。

解决 Gogs 启动时因为依赖服务未就绪报错

如果你直接启动包含三个应用的编排文件,可能会遇到 Gogs 报错,所以可以配合给三个应用都添加健康检查,以及启动依赖关系来解决问题:

解决多网卡情况下 Traefik 概率不工作的问题

现在,你可能会发现一贯很灵敏的 Traefik 出现了偶尔不工作的问题,原因是 Traefik 有时将端口暴露到了 gogs 私有网络网卡上,解决方案很简单,声明 Traefik 工作使用的网卡就成:

避免反代情况下 Gogs 寻找服务域名

根据之前的经验,反代的应用有可能会向公网 DNS 寻求帮助,查找服务域名,比如 gogs.lab.com ,为了避免这种情况发生,应用出现转半天转不开的情况,我们可以选择让 Gogs 容器的服务域名的解析地址映射为本地:

持久化数据文件

相比较“默认方案”直接映射 /data 整个大目录,如果将子目录单独映射,则可以更好的控制应用数据迁移、配置更新。

定制页面模版

官方文档中提到我们可以修改 custom/templates/inject/public/css 下的文件,来定制页面展示。

但是容器中,这块实际的目录却有一些变化,如果你有定制模版的需求,可以参考下面的配置解决问题。

限制 Gogs 的日志文件大小

加上了健康检查的 Gogs ,日志会随着时间慢慢变大,而这里日志对于我们解决问题没有丝毫帮助,因该被丢弃:

配置 Gogs 应用日志输出选项,给出一个“最大尺寸”限制即可:

完整配置

将上述所有内容合并,完整的 docker-compose.yml 配置文件如下:

和配置文件搭配使用的 .env 环境变量文件内容如下:

Gogs 使用的 app.ini 配置文件内容:

启动应用

使用 docker-compose up 启动应用,稍等片刻可以看到日志类似下面:

访问 gogs.lab.com 打开页面,就可以开始使用啦。

gogs 默认界面

备份数据

备份数据需要使用 gogs backup ,不论是在 容器内执行,还是在容器外使用 docker exec 都是可以的。

最后

比较巧合的是,去年九月开始,gogs 的更新开始了休眠模式,随后它的 fork 版本 Gitea 开始了茁壮成长。

下一篇聊聊,怎么使用 Traefik v2 TCP 模式搭建 Gitea 。

–EOF