本篇文章更新時間:2021/08/07
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
由於有業主要求他的網站程式碼不能使用 GitHub 這類型雲端代管,怕有資安疑慮。那自架一個 Git Server 代管就勢在必行了!
好幾年前接觸到 GitLab 這套開源的儲存庫代管服務得時後就覺得如果要選一個替代品,非他莫屬。
不過運作效能與建置需求條件都不小是硬傷。這次試用了由 Go 語言撰寫的 Gogs 發現這套輕量快速,整個很合我意。
下方開始筆記這次架設的方法,環境是 Ubuntu 21.04 Server,使用 Nginx 做反向代理 (Reverse proxy)。
內容目錄
下載編譯好的執行檔案
由於只是要用,不是要改,自然就不抓原始程式碼自己編譯了。
所以到 Gogs 的版本釋出頁面,選擇 gogs_0.12.3_linux_amd64.zip
寫文當前最新的版本下載。
建立一個 Linux 使用者身份提供 Gogs 運作
Gogs 會使用當前執行者的身份來做系統的檔案管理,雖說不一定要建立過一個使用者,當前登入 SSH 的使用者也行(但強烈不建議使用 root
權限)。
adduser git
git
這使用者名稱隨意,自己記得就好。
建立一個資料夾存放 Gogs 相關資料
網路上的教學是說乾脆就是登入那個使用者建立資料夾,解壓縮下載回來的 Gogs 執行包。
但通常 SSH 登入情況下(帳號不同)且伺服器管理的角度,這類型 Web 服務會放在 Web 的相關目錄下,不會就這樣放在使用者的家目錄。為了避免與當前帳號混淆,還是建立過一個使用者保險!
所以如果放置在其他目錄下,要記得把檔案與資料夾權限改過,讓 git
這個使用者可以讀取。
mkdir -p /home/wwwroot/gogs
chown git:git -R /home/wwwroot/gogs
開啟 Gogs 進行設定
設定的方式有兩種,執行 Gogs,用瀏覽器瀏覽設定:
./gogs web
預設開啟 3000
的 Port,所以就是瀏覽: http://IP.IP.IP.IP:3000/install
做基礎配置。
如果知道且有設定經驗了,可以從新增 gogs/custom/conf/app.ini
這設定檔案下手。我的設定檔案如下:
BRAND_NAME = Gogs
RUN_USER = git
RUN_MODE = prod
[database]
TYPE = mysql
HOST = 127.0.0.1:3306
NAME = 資料庫名稱
USER = 資料庫使用者
PASSWORD = 資料庫密碼
SSL_MODE = disable
PATH = /home/wwwroot/gogs/data/gogs.db
[repository]
ROOT = /home/wwwroot/gogs/gogs-repositories
[server]
DOMAIN = git.mxp.tw
HTTP_PORT = 1229
EXTERNAL_URL = https://git.mxp.tw/
DISABLE_SSH = false
SSH_PORT = 2222
START_SSH_SERVER = true
OFFLINE_MODE = false
[mailer]
ENABLED = true
HOST=smtp.mailgun.org:587
[email protected]
[email protected]
PASSWD=***********-*******-********
[user]
ENABLE_EMAIL_NOTIFICATION = true
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = true
ENABLE_CAPTCHA = false
REQUIRE_SIGNIN_VIEW = false
[picture]
DISABLE_GRAVATAR = false
ENABLE_FEDERATED_AVATAR = false
[session]
PROVIDER = file
[log]
MODE = file
LEVEL = Info
ROOT_PATH = /home/wwwroot/gogs/log
[security]
INSTALL_LOCK = true
SECRET_KEY = 4s**********4q
[auth]
ACTIVATE_CODE_LIVES = 10
RESET_PASSWORD_CODE_LIVES = 10
REQUIRE_EMAIL_CONFIRMATION = true
ENABLE_CAPTCHA = true
ENABLE_NOTIFY_MAIL = true
[webhook]
SKIP_TLS_VERIFY=true
主要是設定檔案所有人 git
、檔案路徑 /home/wwwroot/gogs
、對外開放網域 git.mxp.tw
與連結網站的 Port 1229
、資料庫連線方式、Email 發信是套用 MailGun、不開放註冊、獨立 SSH Server START_SSH_SERVER
並設定 SSH_PORT
為 2222
Port 為連結端口(預設 22 Port 已經有 SSH 服務佔用)
如果不想開獨立 SSH Server 可以與 22 Port 共用,但必須要建立過一個使用者(如本文
git
),Gogs 會去動態修改/home/git/.ssh/authorized_keys
這個檔案,所以不要用當前 SSH 登入操作的使用者做為預設。
設定 Nginx 反向代理
不論是用 IP 來瀏覽 Gogs 的服務,還是瀏覽時網址後面帶一個 Port 端口號碼 1229
都不好。這時候就是使用 Nginx 的反向代理來處理。
設定組態如下:
server {
listen 80;
server_name git.mxp.tw;
location / {
proxy_pass http://localhost:1229;
}
}
這是 HTTP 的版本,至於需要掛上憑證就是再補上憑證的設定,關鍵是那個 proxy_pass
。而如果是用目錄架構來處理的話 location
的設定要像下方:
location /gogs/ {
proxy_pass http://localhost:1229/;
}
多一個 /
很重要!
防火牆設定
由於是套用 Nginx 來設定反向代理,本來主機還是會開放 1229
這個改過的 Port 端口。所以下一條指令把這個端口外部請求給封鎖。
iptables -A INPUT -p tcp -m tcp --dport 1229 -j DROP
設定 SEO 索引檔案 robots.txt
建立一個 robots.txt
檔案,放置 Gogs 的 custom
目錄,內容如下:
User-agent: *
Disallow: /
意思就是對所有搜尋引擎都不開放索引。
設定重開機能自動重新啟動
在這邊首先要使用 daemonize 這個工具,把 Gogs 的 Go 執行檔運作的模式包成像是系統常駐軟體。
Ubuntu 安裝方式就是 apt install daemonize
,安裝後寫一個 Bash Script 檔案 git-server.sh
,內容如下:
#!/bin/bash
pgrep -x gogs >/dev/null && kill -9 $(pgrep -x gogs) || echo "Process not found"
sleep 1
/usr/bin/daemonize -p /var/run/gogs.pid -c /home/wwwroot/gogs -u git -e /home/wwwroot/gogs/error.log -o /home/wwwroot/gogs/run.log /home/wwwroot/gogs/gogs web
用做是啟動 Gogs 的方式。
然後把這檔案連結到 /etc/init.d
目錄下: ln -s /home/wwwroot/gogs/git-server.sh /etc/init.d/git-server.sh
接著輸入: update-rc.d git-server.sh defaults
將這執行檔加入啟動排程。
移除則使用
update-rc.d -f git-server.sh remove
預設 Gogs 也有提供一個加入系統服務管理的描述檔案在 gogs/scripts/systemd/gogs.service
使用這檔案前先根據環境改檔案內容後,將檔案連結到 /etc/systemd/system/
使用 systemctl start gogs
與 systemctl enable gogs
啟動服務。查看運作狀態的指令是: systemctl status gogs
上述兩種方法則一即可。
後記
看到這沒意外就已經正式上線服務。操作介面跟 GitHub 實在有 87% 像XD 也正是如此,這樣就滿快上手了。
由於檔案結構簡單,安裝啟用方式也容易,如果 Gogs 有更新要套用就是留下資料與設定檔案,其他更新替換就可以。
app.ini
裡的設定參數可以參考這份原始檔案,而樣式要調整可以參考這份文件。
如果從獨立 SSH Server 模式改為與預設 SSH Server 22 端口共用的話,除了改參數、建立系統使用者外,還要到 /admin
頁面使用「重新生成 .ssh/authorized_keys 文件
」功能,就可以完成整合,去除額外的 Port 端口,連結看起來漂亮不少!