一、背景介紹
如果想可視化地查看文件的變更,查看每次提交的細節,那么可以搭建一個帶 Web 的git服務器
目前的選擇是 gitlib 和 gogs、gitea。個人使用選后者,公司的話一般會選gitlib
這是幾個代碼托管工具的對比:https://docs.gitea.io/zh-cn/comparison/
Gogs Gitea的相同點和區別
-
二者都是使用go語言開發的輕量級(相比gitlib)自建 Git 服務
-
gitea出自gogs項目(2014.2- ),因內部想法不一致,16年11月gitea派生獨立,參考官方B站視頻
-
gogs相比gitea更輕量,配置更簡單,但是功能和細節不到位
比如gogs開啟登錄才能訪問后,游客只能訪問登錄頁面,連介紹頁都點不了。比如gogs沒有貢獻日歷
-
gitea的設計更用心,但是應用會復雜一些
體現在二者docker鏡像gogs 40M,gitea 60M,以及gitea提供了超多的可配置項
二者的安裝差不多,正常使用的安裝配置步驟毫無差別,故博主選gitea為例
二、安裝 - 2023更新
2.1 安裝
最新1.20.5版本
官方文檔 - 使用 Docker 安裝 (rootless)
rootless版本是使用docker內置ssh,因為容器以gitea用戶運行,普通版本似乎無法調用宿主機的ssh?
博主選的rootless版本,但是完全按照官方文檔運行似乎不行,博主結合兩個版本弄出了自己的docker-compose.yml
安裝步驟:
需要提前安裝docker、docker-compose、git(會創建git用戶)
mkdir -p /var/gitea/{data,config}
cd /var/gitea
chown 1000:1000 config/ data/
vi docker-compose.yml
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.20.5-rootless
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- ./data:/var/lib/gitea
- ./config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "3022:22"
depends_on:
- db
db:
image: mysql:8
restart: always
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=gitea
- MYSQL_DATABASE=gitea
networks:
- gitea
volumes:
- ./mysql:/var/lib/mysql
rootless和普通版的區別是映射的卷不一樣 ./data:/var/lib/gitea
2.2 啟動
# 啟動容器,必須在docker-compose.yml目錄下
docker-compose up -d
# 查看日志
docker-compose logs
# 停止並移除容器
docker-compose down
2.3 配置
安裝好后啟動,在config里設置ini
[repository]
DEFAULT_BRANCH = master
[migrations]
;; Allow private addresses defined by RFC 1918, RFC 1122, RFC 4632 and RFC 4291 (false by default)
;; If a domain is allowed by ALLOWED_DOMAINS, this option will be ignored.
;; 允許從局域網遷移
ALLOW_LOCALNETWORKS = true
ALLOWED_DOMAINS = github.com,*.github.com,gitee.com,*.gitee.com,gitlab.com,*.gitlab.com
[service]
;; 注冊用戶需要審核
REGISTER_MANUAL_CONFIRM = true
[picture]
;; 頭像使用gravatar在國內的鏡像
;; https://cdn.sep.cc/avatar/
;; https://gravatar.kuibu.net/avatar/
GRAVATAR_SOURCE = https://gravatar.loli.net/avatar/
2.4 使用
和github一樣的用法:
在個人的設置-賬號中,添加你git config user.email
中的email,才能識別為你的commit
git認證需要在設置-應用中添加token,作為密碼,來push
2.5 遷移
將整個gitea目錄打包即可
二、安裝
因為搭建go環境,編譯安裝挺麻煩的,所以我選擇docker安裝,docker的優點:
-
鏡像相對其它鏡像來說已經很小了
-
可以通過掛載卷把容器里的目錄放在宿主機上,這和在宿主機上直接跑Gitea沒什么區別,git倉庫都能在目錄中找到
-
安全,如果Gitea被挖出漏洞,容器也能給我們一層防護
但是數據庫的話還是得自己安裝,放容器里不符合數據庫設計的初衷
2.1 創建數據庫和數據庫用戶
參考:Rocky Linux 8系統介紹、安裝、配置、軟件安裝步驟,Rocky Linux 8 可以當作 CentOS 8
建立數據庫,創建用戶,授權用戶:
# 登錄
mysql -u root -p
CREATE DATABASE `gitea` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'gitea'@'%' IDENTIFIED BY 'your_password';
GRANT ALL ON gitea.* TO 'gitea'@'%';
2.2 Gogs Gitea安裝
安裝gogs docker
參考:官方GitHub
安裝gitea docker
參考:官方文檔
官方文檔說用docker-compose,其實單個容器沒必要,我們參照gogs用docker run
docker pull gitea/gitea:latest
docker run -d -p 3000:3000 -p 3022:22 -v /var/gitea:/data --restart=always --name=gitea gitea/gitea
# 后續啟動重啟
docker start|restart gitea
這樣一來就安裝好了,本機的3000端口就是gitea web,3022端口就是gitea ssh,本機的/var/gitea就是gitea容器里的/data
2.3 Gogs Gitea Web安裝
訪問3000端口,進行配置,如果是nginx代理,初始化時建議不要有前綴,就轉發端口,初始化web頁面設置前綴,初始化完成后,方可添加前綴
二者一樣,gogs參考: https://learnku.com/articles/36255
值得注意的是,數據庫地址,如果不是docker-compose,則要填對ip
都可以是默認,建議修改的選項有:
-
應用url,后續會顯示在你倉庫的clone地址中。如果你設置了前綴如
http://127.0.0.1:3000/xxxxxgitea/
,那么網站根目錄也會帶前綴,包括js等靜態資源,這個設置了可以方便后續nginx代理.除了前綴,其余的都不會影響實際請求的url,比如ip、端口、http/https,這些都只影響倉庫中克隆地址的顯示
-
建議勾選
禁止用戶自主注冊
和啟用登錄訪問限制
,后者設置后游客只能訪問登錄頁面,不設置游客可以看到用戶、公開倉庫 -
在最后填寫管理員賬戶的賬戶密碼,如果不填寫,第一個注冊的用戶是管理員
此時不設置,后續只能通過配置文件設置,無法在web更改設置
三、配置
在宿主機上 vi /var/gitea/gitea/conf/app.ini
即可修改容器中的配置
修改配置后:docker restart gitea
三、安全設置
3.1 暴力破解
gogs顯然不是很重視安全,需求提了很久,仍未實現 issue #2384
比如登錄處無驗證碼,無登錄失敗次數限制
日志不記錄登錄失敗的IP
那么防暴力破解大神給的辦法是:
- 用nginx代理,用fail2ban檢查nginx access log來ban IP
我給出的簡單辦法:如果你不想公開你的gogs地址讓大伙知道的話,在配置中設置一個超長超復雜的前綴,配合nginx代理,那么沒人能知道你的url
一定要配合nginx代理,否則你前綴再長,訪問也會自動跳轉到登錄頁面
使用nginx代理后,如果沒輸對前綴,就會404
# gogs配置
[server]
EXTERNAL_URL = http://IP:Port/gogsxxxxxxxxxxx/
# nginx 配置
location / {
root html;
index 404.html;
}
location ^~ /gogsxxxxxxxxxxx/ {
proxy_pass http://127.0.0.1:3000/;
}
3.2 docker -v權限
奇怪的是,gogs掛載的目錄在宿主機中是git用戶所有,而gitea是root用戶所有