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