一.介绍:
gogs是一个用Go语言开发的自助Git服务,目标是简单、快速搭建Git服务,
支持多种平台,包括Linux、Windows等。它类似于GitHub,但更轻量,适合个人或小团队使用,
在简化git服务搭建流程的同时,平衡资料消耗和功能完整性 ,是轻量级私有代码托管的优质方案
gogs的作用
2.1.私有化代码托管:gogs提供与GitHub类似的仓库管理功能,支持本地化部署,适合存放敏感或私有项目代码。
2.2.灵活权限控制:支持仓库、组织、团队三级权限管理,可细化到读写、审查、合并请求等操作;
同时也提供分支功能,防止未经授权的代码提交。
2.3.协作开发支持:内置工单(Issue)、合并请求(Pull Request)、Wiki等功能,满足代码审查和文档协作
需求、支持通过组织管理多仓库,方便团队划分项目模块。
2.4.持续集成/部署:通过Web钩子与Jenkins、Drone等工具集成,实现自动化构建和测试。
二.部署:
在gogs官方有介绍,不建议直接使用root账户运行,这样风险太高了,平时我们发布应用也不建议这样
sudo adduser git
添加用户后需要修改一下/etc/sudoers 在文件以下位置加入
## Allow root to run any commands anywhere
root ALL=(ALL) ALL # 这个是系统原有的
git ALL=(ALL) ALL
修改/etc/sudoers文件前需要把它改为可读写状态,不然编辑了无法保存,该文件默认是只读。
sudo chmod u+w /etc/sudoers 改为读写
sudo chmod u-w /etc/sudoers 只读
编辑完成后,建议把/etc/sudoers改为只读状态
su git 切换为git用户,我操作的时候发现切换为git用户,默认的home 属于root 组及root用户,
git用户没有操作权限,这个时候我们就需要把home改为git及对应的组
sudo chown git:git -R /home/git/**
安装基础环境
这里需要安装一下git
sudo apt-get install git
tar xvf 解压对应的目录
sudo tar xvf gogs_0.11.86_linux_amd64.tar.gz -C /home/git/
这里建议把文件解压到git用户的home里面,因为gogs里面很多的配置都是放在git用户的home里面,这样可以减少我们修改的成本。
解压完成后,建议创建目录及文件custom/conf/app.ini,custom属于gogs文件的子目录。
touch -c custom/conf/app.ini # 使用该命令即可
官方有解释为什么要创建这样一个目录及配置文件,这个配置文件是让我们修改默认配置而建立的。
因为不建议直接修改原配置文件。具体的配置模板见GitHub app.ini
配置完成后我们可以在gogs目录下执行 ./gogs web,看到以下信息就可以经行安装了,但是建议这样启动,
因为命令行一关闭,gogs服务就停止了,官方已经给出了很多的守护线程执行脚本,在scripts文件夹下
[git@VM_1_2_centos gogs]$ ./gogs web
2019/04/03 17:42:39 [TRACE] Custom path: /home/git/gogs/custom
2019/04/03 17:42:39 [TRACE] Log path: /home/git/gogs/log
2019/04/03 17:42:39 [TRACE] Log Mode: Console (Trace)
2019/04/03 17:42:39 [ INFO] Gogs 0.11.86.0130
2019/04/03 17:42:39 [ INFO] Cache Service Enabled
2019/04/03 17:42:39 [ INFO] Session Service Enabled
2019/04/03 17:42:39 [ INFO] SQLite3 Supported
2019/04/03 17:42:39 [ INFO] Run Mode: Development
2019/04/03 17:42:39 [ INFO] Listen: http://0.0.0.0:8002
设置systemctl启动原因
每次使用 nohup ./gogs web & 进行后台启动比较麻烦,不仅需要进入安装目录,还得敲这么麻烦的命令。
配置使用systemctl方式启动gogs,可以很方便的在任何目录下执行启动。
设置systemctl启动
这里,使用官方的启动脚本gogs.service(这里gogs.service脚本文件在你的gogs安装目录下),
使用以下命令,把启动脚本复制到Linux system目录下
cp /usr/local/gogs/scripts/systemd/gogs.service /usr/lib/systemd/system/
然后就可以很方便的在任何目录下启动和停止Gogs服务了。
复制好启动脚本后,就执行它
sudo systemctl start gogs.service # 启动服务
如果需要开机启动话执行(设置永久启动):
sudo systemctl enable gogs.service
查看服务运行状态
sudo systemctl status gogs.service
启动成功后会看到以下信息
● gogs.service - Gogs
Loaded: loaded (/etc/systemd/system/gogs.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2019-04-03 17:49:14 CST; 5s ago
Main PID: 32650 (gogs)
CGroup: /system.slice/gogs.service
└─32650 /home/git/gogs/gogs web
Apr 03 17:49:14 VM_1_2_centos systemd[1]: Started Gogs.
Apr 03 17:49:14 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:14 [TRACE] Custom path: /home/git/gogs/custom
Apr 03 17:49:14 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:14 [TRACE] Log path: /home/git/gogs/log
Apr 03 17:49:14 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:14 [TRACE] Log Mode: Console (Trace)
Apr 03 17:49:14 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:14 [ INFO] Gogs 0.11.86.0130
Apr 03 17:49:14 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:14 [ INFO] Cache Service Enabled
Apr 03 17:49:14 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:14 [ INFO] Session Service Enabled
Apr 03 17:49:14 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:14 [ INFO] SQLite3 Supported
Apr 03 17:49:14 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:14 [ INFO] Run Mode: Development
Apr 03 17:49:15 VM_1_2_centos gogs[32650]: 2019/04/03 17:49:15 [ INFO] Listen: http://0.0.0.0:8002
/usr/lib/systemd/system/gogs.service文件内容:
[Unit]
Description=Gogs
After=syslog.target
After=network.target
After=mariadb.service mysqld.service postgresql.service memcached.service redis.service
[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/gogs
ExecStart=/home/git/gogs/gogs web
Restart=always
Environment=USER=git HOME=/home/git
# Some distributions may not support these hardening directives. If you cannot start the service due
# to an unknown option, comment out the ones not supported by your version of systemd.
ProtectSystem=full
PrivateDevices=yes
PrivateTmp=yes
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
启动后通过客户端网页访问:192.168.127.130:3000 即可登录
首次配置需要匹配IP、账户用git,数据库选择sqlite3,数据库使用绝对路径/home/git/gogs/data,其他保持默认设置即可
三.特殊需求及实现方法
特殊需求:
Gogs支持通过组织(organization)和团队(team)来管理项目,并且可以为每个团队分配不同的仓库权限。
然而,当前的需求是将两个团队的文件分别存储到两个不同的物理盘中,以实现更高效的资源管理和隔离。
具体需求,项目分组:
将所有项目分为两个组织(例如:组织A和组织B),每个组织下可以包含多个团队。
每个团队可以拥有自己的管理员,负责管理团队成员及权限分配。
文件存储要求:
组织A的文件存储在第一个物理盘(例如:/data1)中。
组织B的文件存储在第二个物理盘(例如:/data2)中。
权限与管理:
确保每个团队的管理员能够独立管理其团队成员和仓库权限。
需要支持对不同存储路径的配置,以便将文件正确地存储到指定的物理盘中。
实现方法:
绑定挂载(Bind Mount)的详细配置说明
绑定挂载(Bind Mount)是一种将同一物理存储目录挂载到多个位置的技术,通过此方法可以实现目录的透明映射,
使得两个路径访问相同的数据。在Gogs的场景中,可以通过绑定挂载将不同组织的仓库根目录映射到不同的物理盘,
从而实现存储隔离。以下是具体步骤:
1. 准备工作
1.1 挂载物理盘
确保两个物理盘已正确挂载到目标路径(例如 /data1 和 /data2)。
假设物理盘1对应设备 /dev/sdb1,物理盘2对应设备 /dev/sdc1:
# 挂载物理盘1到/data1
sudo mkdir -p /data1
sudo mount /dev/sdb1 /data1
# 挂载物理盘2到/data2
sudo mkdir -p /data2
sudo mount /dev/sdc1 /data2
1.2 创建组织目录
在物理盘上为每个组织创建专用目录:
# 在/data1中为组织A创建目录
sudo mkdir -p /data1/orgA
# 在/data2中为组织B创建目录
sudo mkdir -p /data2/orgB
1.3 设置目录权限
确保Gogs运行用户(通常为 git)对目录有读写权限:
sudo chown -R git:git /data1/orgA /data2/orgB
sudo chmod -R 750 /data1/orgA /data2/orgB # 仅允许git用户及所属组访问
2. 配置绑定挂载
2.1 挂载到Gogs仓库目录
假设Gogs的默认仓库根目录为 /home/git/gogs-repositories,需将物理盘目录绑定到该路径下的子目录:
# 绑定/data1/orgA到Gogs仓库目录下的orgA
sudo mount --bind /data1/orgA /home/git/gogs-repositories/orgA
# 绑定/data2/orgB到Gogs仓库目录下的orgB
sudo mount --bind /data2/orgB /home/git/gogs-repositories/orgB
2.2 验证挂载
使用 mount 或 df -h 检查挂载状态:
# 查看绑定挂载点
mount | grep -E 'orgA|orgB'
# 输出示例:
# /dev/sdb1 on /home/git/gogs-repositories/orgA type ext4 (rw,relatime)
# /dev/sdc1 on /home/git/gogs-repositories/orgB type ext4 (rw,relatime)
3. 持久化挂载配置
绑定挂载默认在系统重启后失效,需将配置写入 /etc/fstab 实现开机自动挂载:
# 编辑/etc/fstab文件
sudo vim /etc/fstab
# 添加以下两行:
/data1/orgA /home/git/gogs-repositories/orgA none bind 0 0
/data2/orgB /home/git/gogs-repositories/orgB none bind 0 0
验证持久化配置
# 重新挂载所有fstab条目
sudo mount -a
# 再次检查挂载点
mount | grep -E 'orgA|orgB'
4. Gogs组织与仓库配置
4.1 创建组织
登录Gogs,进入 「用户设置」→「组织管理」。
创建组织 orgA 和 orgB。
4.2 创建仓库
在组织 orgA 下创建仓库时,Gogs会自动将其存储在 /home/git/gogs-repositories/orgA,实际数据位于 /data1/orgA。
同理,组织 orgB 的仓库数据实际位于 /data2/orgB。
四.其他
gogs关闭注册按钮的方法
将app.ini中得以下参数的false改成 true,重启,再次登录页面,注册按钮已隐藏
DISABLE_REGISTRATION = false
添加用户错误时的相关操作:
添加错了用户,删除操作:
# 强制终止所有属于 git 的进程
sudo pkill -u git
# 删除用户及其主目录、邮件池
sudo userdel -r git
# 如果仍有残留,强制删除(慎用)
sudo userdel -f -r git
使用命令停止gogs服务
systemctl stop gogs.service