企業級最流行的私有程式碼倉庫是 Gitlab
, 一開始我也打算部署 Gitlab
作為私有程式碼倉庫。
但部署完成後發現, Gitlab
資源佔用太大了。優化之後也要佔用 3g 記憶體,最後只好放棄這一方案。
隨後發現了 Gitea
、Gogs
這兩個輕量級的私有倉庫,兩個都是優秀的輕量級私有倉庫。
後對它們進行了對比,發現 Gitea
是從 Gogs
專案 fork 出的專案。
官方給出了 fork 理由:https://blog.gitea.io/2016/12/welcome-to-gitea/,有興趣的看看
也就是 Gitea
專案 是優於 Gogs
專案的,最後就選擇了 Gitea
Gitea
雖然是輕量級,但也具有強大的功能,可以放心使用。
Gitea
資料庫選擇
Gitea
支援mysql
, postgres
, mssql
, tidb
、sqlite3
多種資料庫。
最簡單的是直接使用 sqlite3
,作為一個文件性資料庫,不需要單獨部署服務。
在此使用 postgres
資料庫,現在 postgres
也是主流的資料庫,很多企業都從 mysql
轉向了 postgress
至於 postgress
與 mysql
之間的對比,有興趣的朋友可以自行查詢
DockerFile
version: '3.9'
# 建立自定義網路
networks:
gitea:
name: gitea
driver: bridge
services:
## 資料庫服務
db:
image: postgres:latest
container_name: gitea_db
restart: always
networks:
- gitea # 加入到gitea網路
ports:
- 3003:5432
environment:
- POSTGRES_USER=gitea # PGSQL預設使用者
- POSTGRES_PASSWORD=gitea # PGSQL預設密碼
- POSTGRES_DB=gitea # PGSQL預設資料庫
volumes:
- /volumes/gitea/db:/var/lib/postgresql/data
#gitea服務
server:
image: gitea/gitea:latest
container_name: gitea_server
restart: always
networks:
- gitea # 加入到gitea網路
ports:
- '3000:3000' # HTTP服務埠
- '3001:22' # SSH伺服器埠
environment:
- USER_UID=1000 # 執行容器使用的 UID UID和GID是用於匿名資料卷掛載,
- USER_GID=1000 # 執行容器使用的 GID
- APP_NAME=gitea
- PROTOCOL=http # 服務使用的訪問協議
- HTTP_PORT=3000 # HTTP 偵聽埠 預設為3000
- SSH_PORT=22 # 克隆 URL 中顯示的 SSH 埠
- DOMAIN=82.157.55.94:3000 # UI顯示的 HTTP克隆URL
- LANDING_PAGE=explore
- ROOT_URL=http://82.157.55.94:3000 # 伺服器的對外 URL
- DB_TYPE=postgres # 資料庫型別
- DB_HOST=db # 資料庫連線地址, 使用network形式連線, serverName或者 containerName
- DB_NAME=gitea # 資料庫名稱
- DB_USER=gitea # 資料庫連線使用者
- DB_PASSWD=gitea # 資料庫連線密碼
- DISABLE_REGISTRATION=true # 禁用使用者註冊,啟用後只允許管理員新增使用者
- SHOW_REGISTRATION_BUTTON=false # 是否顯示註冊按鈕
- REQUIRE_SIGNIN_VIEW=true # 是否所有頁面都必須登入後才可訪問
volumes:
- /volumes/gitea/server/data:/data
- /volumes/gitea/server/config:/etc/config
- /volumes/gitea/server/timezone:/etc/timezone:ro
- /volumes/gitea/server/localtime:/etc/localtime:ro
depends_on:
- db
在Dockerfile
配置檔案中部署了兩個容器: 一個是 Postgres
(資料庫)服務,一個是 Gitea
服務。
使用 networks 新增了一個自定義網路。 兩個容器都加入這個自定義網路中,使用自定義網路進行通訊。
PS:
Docker
中, 提供了一個network
模組。同屬於一個network
下的容器可以使用 容器名稱、服務名稱 直接通訊。
Postgres
服務中通過環境變數設定了預設的資料庫、使用者名稱稱和使用者密碼資訊。
Gitea
服務中通過環境變數設定了 執行容器的 UID
、GID
,HTTP 監聽埠、UI 上顯示的克隆 URL。連線資料庫、禁用註冊等資訊,至於還有其它引數,可以自行查詢
Gitea
埠號對映了兩個 3000、3001,分別是 HTTP
訪問和 SSH
訪問,不過現在基本上都使用 HTTP ,
SSH` 可以使用引數禁用
在配置檔案中有一個 depends_on 屬性,這個屬性是控制部署順序的。意思是 Gitea
部署依賴 postgres
部署
使用這個配置安裝成功後,會成功部署兩個容器
和建立一個 network
,成功後可以進行訪問Gitea
安裝引導
第一次訪問會進入安裝嚮導頁面,該頁面是用於設定安裝配置資訊,
嚮導頁面會帶入 environment 中填寫的設定,很多資訊不需要進行設定。
不過其中有一個 管理員賬號設定,
這個是設定管理員的。如果不設定管理員,預設第一個註冊使用者將自動成為管理員,
但是在禁止註冊的情況下必須設定管理員
設定管理員後點選安裝,便會使用當前頁面配置進行安裝 Gitea
。安裝完畢後會自動跳轉到主頁
推送程式碼
成功之後可以建立一個倉庫將之前的 web 專案推送到此倉庫。
PS 圖中
HTTP
顯示的 IP 地址是部署時 DOMAIN 屬性設定的那個。
閘道器代理
配置閘道器
下一步就配置 Gitea
的閘道器代理。
首先還是配置閘道器,閘道器配置就不再介紹
server {
#SSL 訪問埠號為 443
listen 443 ssl http2;
#填寫繫結證書的域名
server_name gitea.mwjz.live;
#日誌
error_log /var/log/nginx/gitea/error.log;
access_log /var/log/nginx/gitea/access.log;
#證書檔案
ssl_certificate /etc/nginx/conf.d/ssl/gitea/gitea.mwjz.live_bundle.crt;
#證書金鑰檔案
ssl_certificate_key /etc/nginx/conf.d/ssl/gitea/gitea.mwjz.live.key;
ssl_ciphers SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://10.0.24.12:3000;
}
}
配置完閘道器後,還需要配置 Gitea
服務中的配置。
此時重新部署的話會很麻煩,所以可以修改 Gitea
的配置檔案修改置
配置檔案是 /data/gitea/conf/app.ini。只需要修改此配置檔案中 ROOT_URL、DOMAIN、 SSH_DOMAIN,隨後重啟容器就可以
作為一個強迫症,我還會將 Portainer
視覺化工具中的環境變數進行改動。
Portainer
視覺化工具是支援修改配置然後重啟部署
PS: 注意,直接改動
Portainer
視覺化工具中環境變數是不行。環境變數所設定的配置已經寫入了檔案。
設定上傳大小限制
Nginx
有一個上傳檔案大小限制,上傳大於限制大小的檔案會返回 403 錯誤,其大小限制預設值為 1MB。
所以預設當使用 閘道器(Nginx)
push 到 Gitea
,如果檔案大於 1MB 就會報錯。
解決這個問題,只需要修改 閘道器(Nginx)
中 client_max_body_size 屬性就可以。
server {
#SSL 訪問埠號為 443
listen 443 ssl http2;
#填寫繫結證書的域名
server_name gitea.mwjz.live;
#上傳大小限制
client_max_body_size 100M;
#日誌
error_log /var/log/nginx/gitea/error.log;
access_log /var/log/nginx/gitea/access.log;
#證書檔案
ssl_certificate /etc/nginx/conf.d/ssl/gitea/gitea.mwjz.live_bundle.crt;
#證書金鑰檔案
ssl_certificate_key /etc/nginx/conf.d/ssl/gitea/gitea.mwjz.live.key;
ssl_ciphers SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://10.0.24.12:3000;
}
}
修改並重啟 閘道器(Nginx)
後就可以上傳大於 1MB 的檔案。