用家里服务器 + 云服务器 + frp搭建公网docker based gitlab

搭建gitlab,很吃配置(至少4G内存),不然可能在启动的过程中就卡死了,买不起那么高配的主机,于是打算在家里搭建,然后通过 frp 放到公网。

首先基于 docker based 搭建 gitlab 教程网上已经很多了,这里就不多说了

问题是难在以下几点: 1. gitlab 使用到ssh功能的时候,如果不使用默认的22端口,会有很丑的加端口的git clone 的链接(而且还需要额外配置,才能 git clone 成功),参考这篇文章:

https://blog.zzsqwq.cn/posts/docker-gitlab-ssh/

  1. 但是我们比他的更难,我们还通过了一道frp中转。

初步解决方案,大致和那个老哥类似,通过ssh用户为git的,做流量中转。但是问题是,gitlab用户的公钥是是存放在docker里,即便做了文件映射,也是在frp的客户端宿主机的。

serverAddr = "tinyfeng.com"
serverPort = 8084
transport.protocol = "quic"

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 10022
remotePort = 10022

[[proxies]]
name = "gitlab"
type = "http"
localIP = "127.0.0.1"
localPort = 10080
customDomains = ["gitlab.tinyfeng.com"]
healthCheck.type = "http"
healthCheck.path = "/"
healthCheck.timeoutSeconds = 1
healthCheck.maxFailed = 2
healthCheck.intervalSeconds = 1

[[proxies]]
name = "p2p_ssh"
type = "xtcp"
secretKey = "xxx"
localIP = "127.0.0.1"
localPort = 22

这里我们通过frp,将本地10022端口(gitlab的ssh端口)转发到云主机的10022端口

后续配置好ssh key:在云主机生成git用户的对钥,把公钥放在本地gitlab,比如我的是 /srv/gitlab/data/.ssh/authorized_keys

然后在云主机,git 用户下,ssh -p 10022 git@127.0.0.1 就可以登录成功到gitlab的宿主机

然后我发现这一步完成以后,在gitlab上的用户的ssh里加入自己的公钥,gitlab存放的公钥里就有了上面博客里 command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-105"开头的用户公钥,然后这个公钥要同步到云主机的git用户的公钥下,才能成功认证。

然后就有了我的下步操作:同步 /srv/gitlab/data/.ssh/authorized_keys 到云主机的 git 用户的 .ssh 目录下。

尝试同步过程中,试过很多方法,其中最容易踩坑的是:因为 /srv/gitlab/data/.ssh/authorized_keys 权限只有root(sudo)和 gitlab 有,修改文件/目录权限会造成 gitlab 宕机(不要问我怎么知道的),增加其他用户读取权限会造成 gitlab 的 sshd 服务宕机(也不要问我怎么知道的)。

最后解决办法:使用 root 用户,同步过去,把 root 用户的 公钥同时加在云主机的 git 用户下,同时加到 /srv/gitlab/data/.ssh/authorized_keys 下(不加的话,同步过去就没了,下次 root 就 ssh 不上云主机了)

同步脚本自己写一个: /usr/local/bin/rrsync

#!/bin/bash

while true
do
    echo "sync start"
    rsync /srv/gitlab/data/.ssh/authorized_keys git@your_server:/home/git/.ssh/authorized_keys
    echo "sync done"
    sleep 3
done

记得加执行权限 chmod +x /usr/local/bin/rrsync

每3秒rsync做一次同步,基本就没啥问题了。

最后记得加入 ssh 远程认证程序,也就是command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-105"这段公钥里前面的一段:

在云主机里写入文件(这里我们用了frp,和上面大哥文章里略有不同)

# /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell

ssh -i /home/git/.ssh/id_rsa -p 10022 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"

值得一提的是,这里我想把它加进 systemd 里,依旧指定 root 运行,但是实际执行下来没有这个 /srv/gitlab/data/.ssh/authorized_keys 文件权限,最后在root用户下直接挂了后台运行,问题也不大,毕竟不是经常重启,这里有懂哥可以教教我(我试了gitlab 指定的owner 998用户,也没权限,好像只有docker gitlab 和root有)。

然后再 gitlab 里用户设置,加入新的 ssh key,就会自动同步到云主机的 git 用户下了,gitlab 用户就可以在加入自己的 ssh 公钥后,使用ssh git clone了。

最后再提一句,如果你自己有nginx 设置了https,gitlab 的 external_url 不要设置为https开头,用 http 就行,不然 nginx 可能会因为自动申请 letsencrypt 证书失败一直宕机!

发表于 2023.10.29