:doodle { @grid: 22 / 100vmax; background: #12152f; } :after { font-family: devicons; content: '\@hex(@rand(58894, 59050))'; font-size: 3.6vmax; color: hsla( @rand(360), 70%, 70%,@rand(.9) ); } @keyframes turn { 0, 30% { transform: rotate(0deg); } 30% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } :hover { animation: turn 1.4s 0s ease-out infinite; }

Gogs与主机共享22端口

在使用Docker安装Gogs时,一般会把容器的22端口映射到主机的其它端口(比如10022)
在以SSH方式clone项目时,URL长这样

ssh://git@git.example.com:10022:username/project.git

但我们想要的是类似于GitHub那样的,这时需要把Gogs的SSH端口设置为22

git@git.example.com:username/project.git

下面说一下主要步骤

创建git用户

1
2
3
4
5
6
[root]$ useradd git
[root]$ id git # 获取uid和gid
uid=1002(git) gid=1002(git) groups=1002(git)
[root]$ usermod -aG docker git # 把git用户加入docker组
[root]$ su git
[git]$ mkdir -p ~/gogs/data # 在git用户下创建gogs/data文件夹,作为gogs容器主要数据的挂载目录

安装Gogs

1
2
[git]$ docker run -d --name=gogs -p 10022:22 -p 10080:3000 -v ~/gogs/data:/data -e "PUID=1002" -e "PGID=1002" --restart=always gogs/gogs     # PUID PGID与上面获取的uid gid保持一致
[git]$ ln -s ~/gogs/data/git/.ssh ~/ # 将gogs的.ssh目录软连接到本地的.ssh

现在可以通过服务器外网ip:10080进入安装页面,也可以等反代设置好后通过域名进行访问
我用的数据库是Sqlite3,不需要额外配置,如果你选择的是其它数据库,可以参考这篇文章
相关配置可以参考官方文档

生成SSH key

1
2
3
4
[git]$ ssh-keygen -t rsa -b 4096 -C "git@git.example.com"
[git]$ cd ~/.ssh
[git]$ cat id_rsa.pub >> authorized_keys
[git]$ chmod 600 authorized_keys

在authorized_keys最前面添加

1
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1y..........YGedddqAN6w== git@git.example.com

Caddy反向代理

1
[root]$ mkdir caddy && cd $_

在caddy目录下创建Caddyfile文件,下面是参考配置

1
2
3
4
5
6
git.example.com {
tls git@example.com # 填写你的邮箱,用于申请证书
proxy / your-ip:10080
header / Strict-Transport-Security "max-age=31536000;" # 开启HSTS
gzip
}

启动caddy

1
[root]$ docker run -d --name=caddy -v ~/caddy/Caddyfile:/etc/Caddyfile -v ~/.caddy:/root/.caddy -p 80:80 -p 443:443 --restart=always abiosoft/caddy

配置git用户登录问题

1
2
3
4
5
6
7
[root]$ mkdir -p /app/gogs/
[root]$ cat >/app/gogs/gogs <<'END'
#!/bin/sh
ssh -p 10022 -o StrictHostKeyChecking=no git@127.0.0.1 \
"SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
END
[root]$ chmod 755 /app/gogs/gogs

这样就差不多完成了,下面需要在本地生成SSH密匙,然后在web端把密匙添加到Gogs
如果需要修改Gogs的配置,比如安装的时候DOMAIN写的IP现在要修改为域名,可以到/home/git/gogs/data/gogs/conf/找到app.ini,修改完后重启gogs容器

参考文章

安装Gogs并共享主机22端口
Share port 22 between Gogs inside Docker & the local system

新年快乐 (゜-゜)つロ