「 原創 」《Docker基礎》- 部署 Gogs,共享主機 SSH 22 端口號


「 原創 」《Docker基礎》- 部署 Gogs,共享主機 SSH 22 端口號

Gogs 一款極易搭建的自助 Git 服務

Gogs:一款極易搭建的自助 Git 服務,相比 GitLab 更加輕便,對於開發團隊人數不多的情況下,有 版本管理 / 問題管理 / wiki 基本上就能滿足需要了,功能太多,反而顯得臃腫,運行慢。

拉取鏡像

<code>docker pull gogs/gogs/<code>


「 原創 」《Docker基礎》- 部署 Gogs,共享主機 SSH 22 端口號

git

創建 Git 用戶

<code>[root] useradd git/<code>

創建完成後查看 git id,本機的運行結果為: uid=1000(git) gid=1000(git) groups=1000(git)

docker 在運行 gogs 時, 生成的 git 用戶 uid 默認為 1000,請在運行時進行指定,否則 git 用戶下的文件夾內容不會同步映射

運行 Gogs

<code># 切換用戶
su git

# 運行 gogs
[git] docker run -d --name=gogs \\
-p 10022:22 -p 3000:3000 \\
-e PUID=1000 \\
-e PGID=1000 \\
-v /makeit/web/gogs:/data \\
--restart=always \\
--link mysql:mysql gogs/gogs/<code>


添加軟鏈

若存在的情況下,可先刪除

<code>[git] cd ~/.ssh
[git] ssh-keygen -t rsa -C "[email protected]"/<code>


生成 SSH Key

執行如下命令後,不進行其它設置的情況下,直接按幾次回車即可。需要注意的是此處的 email 為 gogs 內 ID=1 的用戶對應的郵箱地址, 即初始化 gogs 時所填寫的首個用戶信息。

<code>[git] vi ~/.ssh/config
Host gogs.makeit.vip
HostName gogs.makeit.vip
Port 10022
User git/<code>

注意: 此處生成的 ssh key,稍後在初始化完 gogs 之後,需要通過頁面配置,將公鑰添加至 SSH 管理的(web UI)。通過頁面添加該公鑰後,會在 ~/.ssh 下生成 authorized_keys 文件,且經過 Gogs 處理,加了 command 指令,所以剛剛生產的密鑰將不可以作為 git 的登錄憑證,需要另外再生成一個密鑰對,該密鑰用於 git 用戶 ssh 登錄時驗證使用,如下:

<code>[git] ssh-keygen -t rsa -C "[email protected]" -f id_rsa_gogs/<code>


私鑰交與 ssh-agent 管理

<code>eval "$(ssh-agent -s)"
ssh-add -k id_rsa
ssh-add -k id_rsa_gogs/<code>


配置 ~/.ssh/config

<code>[git] vi ~/.ssh/config
Host gogs.makeit.vip
HostName gogs.makeit.vip
Port 10022
User git/<code>


配置 Gogs

瀏覽器輸入 http://ip:3000,首次運行,根據自身需求,配置相關信息。ip 即為你的服務器 ip 地址。另外,可以配置 app.ini 文件進行相關信息的配置,具體路徑在( /運行時 -v 指定的映射目錄/gogs/conf/app.ini )


「 原創 」《Docker基礎》- 部署 Gogs,共享主機 SSH 22 端口號

Gogs 配置頁面


安裝完成


「 原創 」《Docker基礎》- 部署 Gogs,共享主機 SSH 22 端口號

Gogs 安裝完成的首頁


配置 SSH KEY

<code># 運行如下命令, 複製該命令, 將內容添加至 [ 用戶設置 > SSH 密鑰 ]
[git] cat id_rsa.pub/<code>


「 原創 」《Docker基礎》- 部署 Gogs,共享主機 SSH 22 端口號

Gogs SSH 密鑰管理頁面


接下來就是重中之重的配置了,配置成功後即可共享主機 SSH 的 22 端口,而無需在 Git 拉取 / 推送之類操作的 URL 後面,添加醜陋的端口號了。

切回 root 用戶

<code>su root/<code> 

後臺添加 SSH密鑰 之後,會在 ~/.ssh/ 目錄下生成 authorized_keys 文件,文件在 ssh-rsa 前附加了 command 執行指令,如下所示

<code>command="/app/gogs/gogs serv key-1 --config='/data/gogs/conf/app.ini'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa/<code>

實際執行的是 /app/gogs/gogs 該文件,當前沒有,則可按如下操作

<code># 創建文件夾
[root] mkdir -p /app/gogs

# 新增 gogs 文件
[root] cat >/app/gogs/gogs<#!/bin/sh
ssh -p 10022 -o StrictHostKeyChecking=no [email protected] \\
SSH_ORIGINAL_COMMAND=$(printf '%q' "$SSH_ORIGINAL_COMMAND") "$0" "$@"
END

# 修改權限
[root] chmod 755 /app/gogs/gogs/<code>


切換至 Git 用戶

<code>su git

# 測試;

# 如果沒有 ~/.ssh/config, 運行如下命令將提示:
# Gogs: Repository owner does not exist

# 正確的提示為:
# Hi there, You've successfully authenticated, but Gogs does not provide shell access.
# If this is unexpected, please log in with password and setup Gogs under another user.

[git] ssh -T [email protected]


# 另外需要注意的是各文件夾的權限問題
# ~/.ssh >> 700 或 755
# ~/.ssh/authorized_keys >> 600
# docker run 中 -v 映射的目錄所屬為 git


# 新建一個項目, 複製地址,測試 clone 是否正常, 出現如下提示則一切都 OK 啦
# Cloning into 'api'...
# remote: Enumerating objects: 5, done.
# remote: Counting objects: 100% (5/5), done.
# remote: Compressing objects: 100% (5/5), done.
# remote: Total 5 (delta 0), reused 0 (delta 0)
# Receiving objects: 100% (5/5), done.
[git] git clone [email protected]:makeit/api.git

# 如果 clone 不正常, 運行如下命令後, 根據相應提示進行問題修復
[git] ssh -v [email protected]/<code>


登錄 SSH

如果在後臺執行 [ 重新生成 '.ssh/authorized_keys' 文件 ] 操作,authorized_keys 將被覆蓋,生成的內容都包含了 command 指令,相當於成了 gogs 的專用,而 git 通過 ssh 登錄的時候,也是讀取該文件來進行驗證,但是包含 command 指令後將無法驗證通過,這該如何是好?

如上面所述的,另外生成的 id_rsa_gogs 專為 git 用戶通過 ssh 登錄時所用,嘗試在 PHPStorm 配置了一個 Deployment,將 id_rsa_gogs 下載至電腦本地,配置時選擇 [Key pair OpenSSH or PuTTY],選擇 [Private key path],點擊 [Test Connection] Successfully connected to xxx.xxx.xxx.xxx 成功了 ......


域名配置(Nginx)

注意:開啟防火牆的 3000 和 10022 端口

附上 nginx 的配置

<code>server{
listen 80;
server_name git.makeit.vip;
rewrite ^(.*) https://$server_name$request_uri permanent;
}
server {
listen 443 ssl;
server_name git.makeit.vip;

access_log /var/log/nginx/gogs.access.log main;
error_log /var/log/nginx/gogs.error.log warn;

ssl_certificate letsencrypt/live/git.makeit.vip/fullchain.pem;
ssl_certificate_key letsencrypt/live/git.makeit.vip/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
ssl_session_tickets on;
ssl_dhparam ssl/private/dhparam.pem;

location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /www/gogs;
}

location = /.well-known/acme-challenge/ {
return 404;
}

location / {
rewrite\t\t ^/(.*) /$1 break;
proxy_pass http://你的服務器ip:3000/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}/<code>

大功告成,試試 ~


分享到:


相關文章: