网站首页 > 基础教程 正文
Gogs:一款极易搭建的自助 Git 服务,相比 GitLab 更加轻便,对于开发团队人数不多的情况下,有 版本管理 / 问题管理 / wiki 基本上就能满足需要了,功能太多,反而显得臃肿,运行慢。
拉取镜像
docker pull gogs/gogs
创建 Git 用户
[root] useradd git
创建完成后查看 git id,本机的运行结果为: uid=1000(git) gid=1000(git) groups=1000(git)
docker 在运行 gogs 时, 生成的 git 用户 uid 默认为 1000,请在运行时进行指定,否则 git 用户下的文件夹内容不会同步映射
运行 Gogs
# 切换用户
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
添加软链
若存在的情况下,可先删除
[git] cd ~/.ssh
[git] ssh-keygen -t rsa -C "makeit@makeit.vip"
生成 SSH Key
执行如下命令后,不进行其它设置的情况下,直接按几次回车即可。需要注意的是此处的 email 为 gogs 内 ID=1 的用户对应的邮箱地址, 即初始化 gogs 时所填写的首个用户信息。
[git] vi ~/.ssh/config
Host gogs.makeit.vip
HostName gogs.makeit.vip
Port 10022
User git
注意: 此处生成的 ssh key,稍后在初始化完 gogs 之后,需要通过页面配置,将公钥添加至 SSH 管理的(web UI)。通过页面添加该公钥后,会在 ~/.ssh 下生成 authorized_keys 文件,且经过 Gogs 处理,加了 command 指令,所以刚刚生产的密钥将不可以作为 git 的登录凭证,需要另外再生成一个密钥对,该密钥用于 git 用户 ssh 登录时验证使用,如下:
[git] ssh-keygen -t rsa -C "git@gogs.makeit.vip" -f id_rsa_gogs
私钥交与 ssh-agent 管理
eval "$(ssh-agent -s)"
ssh-add -k id_rsa
ssh-add -k id_rsa_gogs
配置 ~/.ssh/config
[git] vi ~/.ssh/config
Host gogs.makeit.vip
HostName gogs.makeit.vip
Port 10022
User git
配置 Gogs
浏览器输入 http://ip:3000,首次运行,根据自身需求,配置相关信息。ip 即为你的服务器 ip 地址。另外,可以配置 app.ini 文件进行相关信息的配置,具体路径在( /运行时 -v 指定的映射目录/gogs/conf/app.ini )
安装完成
配置 SSH KEY
# 运行如下命令, 复制该命令, 将内容添加至 [ 用户设置 > SSH 密钥 ]
[git] cat id_rsa.pub
接下来就是重中之重的配置了,配置成功后即可共享主机 SSH 的 22 端口,而无需在 Git 拉取 / 推送之类操作的 URL 后面,添加丑陋的端口号了。
切回 root 用户
su root
后台添加 SSH密钥 之后,会在 ~/.ssh/ 目录下生成 authorized_keys 文件,文件在 ssh-rsa 前附加了 command 执行指令,如下所示
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
实际执行的是 /app/gogs/gogs 该文件,当前没有,则可按如下操作
# 创建文件夹
[root] mkdir -p /app/gogs
# 新增 gogs 文件
[root] cat >/app/gogs/gogs<<'END'
#!/bin/sh
ssh -p 10022 -o StrictHostKeyChecking=no git@127.0.0.1 \
SSH_ORIGINAL_COMMAND=$(printf '%q' "$SSH_ORIGINAL_COMMAND") "$0" "$@"
END
# 修改权限
[root] chmod 755 /app/gogs/gogs
切换至 Git 用户
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 git@gogs.makeit.vip
# 另外需要注意的是各文件夹的权限问题
# ~/.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 git@gogs.makeit.vip:makeit/api.git
# 如果 clone 不正常, 运行如下命令后, 根据相应提示进行问题修复
[git] ssh -v git@gogs.makeit.vip
登录 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 的配置
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 ^/(.*) /$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;
}
}
大功告成,试试 ~
猜你喜欢
- 2024-10-12 Docker方式部署Nextcloud docker部署项目的两种方式
- 2024-10-12 一起学docker-可视化管理01-Portainer
- 2024-10-12 牛掰!Docker从入门到上手的终极指南,看这一篇文章就够了
- 2024-10-12 Docker进阶---使用网络 docker的网络连接方式
- 2024-10-12 开源&Docker :再说自动化了,一个docker搞定你90%的登录与签到
- 2024-10-12 干货分享:Docker实战中一些技巧 docker基础实战教程一:入门
- 2024-10-12 Linux 安装docker linux 安装docker 没图标
- 2024-10-12 跟我一起学docker(七)--网络 docker网络管理
- 2024-10-12 松勤软件测试:详解Docker,如何用portainer管理Docker容器
- 2024-10-12 Docker之6 网络管理 docker网络类型 以及特点
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)