一.介紹:
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