「 原创 」《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>

大功告成,试试 ~


分享到:


相關文章: