一.介绍:
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 /home/git/gogs/scripts/systemd/gogs.service /etc/systemd/system/ 然后就可以很方便的在任何目录下启动和停止Gogs服务了。 复制好启动脚本后,就执行它 ``` sudo systemctl daemon-reload sudo systemctl enable gogs sudo systemctl start gogs ``` 启动成功后会看到以下信息 ● 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 挂载物理盘
确保两个物理盘已正确挂载到目标路径(例如 /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.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)
- 持久化挂载配置
绑定挂载默认在系统重启后失效,需将配置写入 /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'
- 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