gogs 使用简介

2021-08-26 develop git

Gogs 的功能类似于 GitHub 或者 GitLab ,不过相比来说是一款极易搭建的 Git 服务,其目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务,通过 Go 语言开发,使得 Gogs 能够通过独立二进制分发,支持平台包括了 Linux、Mac OS、Windows 以及 ARM 。

git gogs logo

安装

可以直接从 gogs.io 下载相关的二进制包解压即可,其中包含了所需的二进制文件,以及启动服务配置。

# cd /usr/local/gogs
# cp scripts/systemd/gogs.service /usr/lib/systemd/system/

注意,在 gogs 启动的时候,默认会访问当前目录下的 custom/conf/app.ini 配置文件,并创建 log 目录用于保存日志,所以,最好放到一个固定的目录下,一般就是在 /home/git 目录中。

然后编辑 gogs.service 文件,默认包含了一些数据库的依赖,这里直接使用 SQLite,所以只需要保存简单配置,其示例如下。

[Unit]
Description=Gogs
After=syslog.target network.target

[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/gogs
ExecStart=/home/git/gogs/gogs web
Restart=always
Environment=USER=git HOME=/home/git

[Install]
WantedBy=multi-user.target

通过 systemctl daemon-reload 命令加载配置文件,然后使用 systemctl start gogs 启动进程,启动日志可以通过 journalctl -fu gogs.service 命令查看,此时会监听 3000 端口,直接通过 http://localhost:3000 访问即可。

配置

为了方便实用,做一些基础的配置:

  • 创建 git 用户,用来处理 git 相关的内容,直接执行 adduser git 命令即可,此时会在 /home 下创建目录。
  • 配置域名,可以使用 /etc/hosts 文件配置域名,例如使用 127.0.0.1 gogs.cargo.com 即可。

如果上述的工作目录定义的是 /home/git/gogs,那么需要提前创建,同时需要设置目录的用户,现在可以直接访问 gogs.cargo.com:3000 链接即可。

配置文件

如上所述,配置文件默认保存在 custom/conf/app.ini 文件中,首次启动时,如果不存在该文件,那么会启动一个配置页面用来修改配置,如果仓库不大,直接使用 SQLite 即可。

其中服务端相关的配置如下,如果不确定具体含义,可以直接使用界面进行配置。

[server]
DOMAIN           = gogs.cargo.com
HTTP_PORT        = 3000
ROOT_URL         = http://gogs.cargo.com:3000/
DISABLE_SSH      = false
SSH_PORT         = 22
START_SSH_SERVER = false
OFFLINE_MODE     = false

在创建时可以设置一个 admin 用户用于管理,例如 root 用户。

另外,gogs 提供了一个基本的 ssh 服务端,不过不太好用,所以还是用 OpenSSH 吧,在使用时,需要通过 systemctl start sshd 启动 ssh 服务端即可。

免密码登陆可以参考 Git 免登陆设置 中的相关介绍。

备份

只需要备份配置、数据库、仓库数据即可。

#!/bin/bash

TMP__PATH="/tmp/gogs"
APP__PATH="/usr/local/gogs"
REPO_PATH="/home/git/gogs-repositories"
CURR_DATE=`date "+%Y%m%d%H%M%S"`

if [[ $# -lt 1 ]]; then
	echo "Usage: $0 <backup|restore>"
	exit 1
fi

if [[ ! -d "${TMP__PATH}" ]]; then
	mkdir -p "${TMP__PATH}"
fi

if [[ "${1}" == "backup" ]]; then
	echo "Start to backup '${REPO_PATH}'."

	pushd "${TMP__PATH}"
	#----- 数据库备份,使用的是SQLite可以直接复制文件
	cp "${APP__PATH}/data/gogs.db" .
	#----- 备份配置文件
	cp "${APP__PATH}/custom/conf/app.ini" .
	#----- 备份仓库,这里使用的是git账户
	cp -rf "${REPO_PATH}" "gogs-repo"

	popd
	tar zcf "gogs-backup-${CURR_DATE}.tar.gz" -C "${TMP__PATH}" .
	rm -rf "${TMP__PATH}"
elif [[ "${1}" == "restore" ]]; then
	if [[ $# -lt 2 ]]; then
		echo "Usage: $0 restore <backup file>"
		exit 1
	fi
	echo "Start to restore '${2}'."

	umask 022
	tar -xf "${2}" -C "${TMP__PATH}"
	pushd "${TMP__PATH}"

	#----- 数据库恢复,使用的是SQLite可以直接复制文件
	cp "gogs.db" "${APP__PATH}/data/gogs.db"
	#----- 恢复配置文件
	cp "app.ini" "${APP__PATH}/custom/conf/app.ini" .
	#----- 恢复仓库,这里使用的是git账户
	cp -rf "gogs-repo" "${REPO_PATH}"
	chown git:git "${REPO_PATH}"
else
	echo "Unsupport method."
	exit 1
fi

使用技巧

版本发布

----- 打标签并发布到远端
$ git tag -a v1.0.0 -m "first release version"
$ git push origin --tags

然后在也页面的 Release 处编辑即可。

常见问题

页面打开慢

主要是因为要访问 Gravatar 服务,而国内可能已经被墙,可以在安装界面禁用 Gravatar 服务,或者在配置文件中禁用 Gravatar 服务,使用本地头像,配置如下。

[picture]
DISABLE_GRAVATAR        = true
ENABLE_FEDERATED_AVATAR = true

迁移后报错

如果直接拷贝 gogs-repositories 目录,可能会导致项目中 hooks 目录里下的 post-receive pre-receive update 三个脚本中的调用路径与实际不符,可以直接修改使用相对路径。

权限报错

当通过 ssh -T git@gogs.cargo.com 方式进行测试时,可能会看到 Hi there, You've successfully authenticated, but Gogs does not provide shell access. 类似的错误,这是因为 gogs 在 git 用户目录下的 ~/.ssh/authorized_keys 文件中添加了额外的信息。

主机上的 git 服务使用的也是 git 用户,这样可以阻止拥有该私钥的用户直接以 git 用户登陆该主机,如果想通过 git 用户登陆该主机,那么可以相关的记录删除,这也会导致无法直接访问代码库。

所以,修改开发机器上的 ~/.ssh/config 文件,添加如下内容:

Host gogs.yourdomain.com
    IdentityFile ~/.ssh/gogs_id_rsa
    IdentitiesOnly yes
Host yourdomain.com
    IdentityFile   ~/.ssh/id_rsa
    IdentitiesOnly yes

这样可以通过 git@gogs.yourdomain.com:username/project.git 访问代码库,通过 ssh git@yourdomain.com 登陆机器。