gogs私服搭建

发布于:2025-03-30 ⋅ 阅读:(29) ⋅ 点赞:(0)


一.介绍:

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版本:gogs_0.13.2_linux_amd64.tar.gz

ubuntu版本:Ubuntu 24.04 LTS 

在gogs官方有介绍,不建议直接使用root账户运行,这样风险太高了,平时我们发布应用也不建议这样

sudo adduser git

添加用户后需要修改一下/etc/sudoers 在文件以下位置加入,修改/etc/sudoers文件前需要把它改为可读写状态,不然编辑了无法保存,该文件默认是只读。

sudo chmod u+w /etc/sudoers 改为读写
root    ALL=(ALL)       ALL  # 这个是系统原有的
git     ALL=(ALL)       ALL


编辑完成后,建议把/etc/sudoers改为只读状态

sudo chmod u-w /etc/sudoers 只读

切换为git用户,

su git

修改home/git的属组

sudo chown git:git -R /home/git/**

安装基础环境,需要安装一下git

sudo apt-get install git

官网下载gogs压缩包并 解压到对应的目录,这里建议把文件解压到git用户的home里面,因为gogs里面很多的配置都是放在git用户的home里面,这样可以减少我们修改的成本。

sudo tar xvf gogs_0.13.2_linux_amd64.tar.gz -C /home/git/

解压完成后,建议创建目录及文件custom/conf/app.ini,custom属于gogs文件的子目录,官方有解释为什么要创建这样一个目录及配置文件,这个配置文件是让我们修改默认配置而建立的,因为不建议直接修改原配置文件。具体的配置模板见GitHub app.ini

touch -c custom/conf/app.ini # 使用该命令即可

配置完成后我们可以在gogs目录下执行 ./gogs web,看到以下信息就可以经行安装了,但是不建议这样启动,因为命令行一关闭,gogs服务就停止了,官方已经给出了很多的守护线程执行脚本,在scripts文件夹下。
配置使用systemctl方式启动gogs,可以很方便的在任何目录下执行启动。
使用官方的启动脚本gogs.service(gogs.service脚本文件在gogs/scripts/systemd/安装目录下),
使用以下命令,把启动脚本复制到Linux system目录下

cp /home/git/gogs/scripts/systemd/gogs.service /etc/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

然后就可以很方便的在任何目录下启动和停止Gogs服务了。

复制好启动脚本后,就执行它

sudo systemctl daemon-reload
sudo systemctl enable gogs
sudo systemctl start gogs

启动成功则无任何信息!!!
启动后通过客户端网页访问:192.168.127.130:3000  即可登录

首次配置客户端网页需要匹配IP、账户用git,数据库选择sqlite3,数据库使用绝对路径/home/git/gogs/data,其他保持默认设置即可

 

三.特殊需求及实现方法

特殊需求:

Gogs支持通过组织(organization)和团队(team)来管理项目,并且可以为每个团队分配不同的仓库权限。
然而,当前的需求是将两个团队的文件分别存储到两个不同的物理盘中,以实现更高效的资源管理和隔离。
具体需求,项目分组:

将所有项目分为两个组织(例如:组织org_server_sw和组织org_embedded_sw),每个组织下可以包含多个团队。
每个团队可以拥有自己的管理员,负责管理团队成员及权限分配。
文件存储要求:
组织A的文件存储在物理盘1(例如:/server_sw_data)中。
组织B的文件存储在物理盘2(例如:/embedded_sw_data)中。
权限与管理:
确保每个团队的管理员能够独立管理其团队成员和仓库权限。
需要支持对不同存储路径的配置,以便将文件正确地存储到指定的物理盘中。

四.绑定挂载(Bind Mount)的详细配置说明


绑定挂载(Bind Mount)是一种将同一物理存储目录挂载到多个位置的技术,通过此方法可以实现目录的透明映射,类似于软链接但更底层。
使得两个路径访问相同的数据。在Gogs的场景中,可以通过绑定挂载将不同组织的仓库根目录映射到不同的物理盘,从而实现存储隔离。

五.绑定挂载(Bind Mount)的永久挂载方法

通过 /etc/fstab 实现绑定挂载(推荐)

假设物理盘1对应设备 /dev/sdb,物理盘2对应设备 /dev/sdc;

两个物理盘永久挂载到目标路径( 挂载物理盘1到/server_sw_data和 挂载物理盘2到/embedded_sw_data)的具体操作如下;

为了避免设备名变动导致挂载失败,建议使用 UUID 

使用 blkid 查看 UUID,并记录后边用
sudo blkid /dev/sdb
sudo blkid /dev/sdc

编辑 /etc/fstab在文件末尾添加绑定挂载配置:

sudo vim /etc/fstab
UUID=78f7c472-2474-494d-ba13-c2306c6cd7ac  /server_sw_data  ext4  defaults  0  2
UUID=f33aaf2e-a43e-43a6-9c6d-8f5e8eb228c2  /embedded_sw_data  ext4  defaults  0  2

确保源目录和目标目录存在

sudo mkdir -p  /server_sw_data/org_server_sw               # 源目录(实际数据存储位置)
sudo mkdir -p  /embedded_sw_data/org_embedded_sw           # 源目录(实际数据存储位置)
sudo mkdir -p /home/git/gogs-repositories/org_server_sw    # 目标目录(绑定挂载点)
sudo mkdir -p /home/git/gogs-repositories/org_embedded_sw  # 目标目录(绑定挂载点)

Gogs的默认仓库根目录为 /home/git/gogs-repositories,需将物理盘目录绑定到该路径下的子目录:

将 /server_sw_data/org_server_sw绑定到/home/git/gogs-repositories/org_server_sw,使两者内容同步;

将 /embedded_sw_data/org_embedded_sw绑定到/home/git/gogs-repositories/org_embedded_sw,使两者内容同步。

编辑 /etc/fstab在文件末尾添加绑定挂载配置:

sudo vim /etc/fstab
/server_sw_data/org_server_sw /home/git/gogs-repositories/org_server_sw none bind,rw,exec,suid 0 0
/embedded_sw_data/org_embedded_sw /home/git/gogs-repositories/org_embedded_sw none bind,rw,exec,suid 0 0

重启验证

sudo reboot

重启后测确认

mount

输出如下内容说明挂载成功

/dev/sdb on /server_sw_data type ext4 (rw,relatime,stripe=192)
/dev/sdb on /home/git/gogs-repositories/org_server_sw type ext4 (rw,relatime,stripe=192)
/dev/sdc on /embedded_sw_data type ext4 (rw,relatime,stripe=192)
/dev/sdc on /home/git/gogs-repositories/org_embedded_sw type ext4 (rw,relatime,stripe=192)

Gogs组织与仓库配置
创建组织
登录Gogs,进入 「用户设置」→「组织管理」;创建组织 org_server_sw 和org_embedded_sw。

创建仓库
在组织 org_server_sw下创建仓库时,Gogs会自动将其存储在 /home/git/gogs-repositories/org_server_sw,实际数据位于 /server_sw_data/org_server_sw。

在组织 org_embedded_sw下创建仓库时,Gogs会自动将其存储在 /home/git/gogs-repositories/org_embedded_sw,实际数据位于 /embedded_sw_data/org_embedded_sw。

 如果还需要将gogs中的某个成员xiaozhang的个人账户下项目同样方式永久挂载,如果还需要将gogs中的某个成员xiaozhang的个人账户下的组织org_xiaozhang项目同样方式永久挂载,则操作方法一样

确保源目录和目标目录存在

sudo mkdir -p  /server_sw_data/xiaozhang                  # 源目录(实际数据存储位置)
sudo mkdir -p /home/git/gogs-repositories/xiaozhang       # 目标目录(绑定挂载点)

sudo mkdir -p  /embedded_sw_data/org_xiaozhang            # 源目录(实际数据存储位置)
sudo mkdir -p /home/git/gogs-repositories/org_xiaozhang   # 目标目录(绑定挂载点)

 将 /server_sw_data/xiaozhang绑定到/home/git/gogs-repositories/xiaozhang,使两者内容同步;

将 /embedded_sw_data/org_xiangzhang绑定到/home/git/gogs-repositories/org_xiaozhang,使两者内容同步。

编辑 /etc/fstab在文件末尾添加绑定挂载配置:

sudo vim /etc/fstab
/server_sw_data/xiaozhang /home/git/gogs-repositories/xiaozhang none bind,rw,exec,suid 0 0
/embedded_sw_data/org_xiaozhang /home/git/gogs-repositories/org_xiaozhang none bind,rw,exec,suid 0 0

编辑完保存退出后,执行如下命令

sudo systemctl daemon-reload
sudo systemctl enable gogs
sudo systemctl start gogs

 然后重启服务器。

六.实际部署过程中可能用到的操作与命令

gogs关闭注册按钮的方法
将app.ini中得以下参数的false改成 true,重启,再次登录页面,注册按钮已隐藏

DISABLE_REGISTRATION = false

添加用户错误时的相关操作:
添加错了用户,删除操作:
# 强制终止所有属于 git 的进程

sudo pkill -u git

# 删除用户及其主目录、邮件池

sudo userdel -r git

# 如果仍有残留,强制删除(慎用)

sudo userdel -f -r git

使用命令停止gogs服务

sudo systemctl stop gogs

Ubuntu绑定挂载永久生效与fstab挂载选项详解-CSDN博客

linux系统中fstab 各字段详细说明-CSDN博客