【Docker】gitea的ssh容器直通

news2024/12/27 10:25:12

本文首发于 ❄️慕雪的寒舍

1.跟着文档走

gitea的安装比较简单,直接使用官方文档中的docker-compose文件即可。如果想实现ssh容器直通,需要对这个docker-compose文件做一定修改。

如果你还没有安装docker,参考本站教程 linux安装docker;

gitea的官方文档上有关于docker容器ssh直通的教程,但是写的不够清晰,有些问题我没有搞懂。本文基于我的折腾记录和docker安装的gitea 1.21.4文档

使用 Docker 安装 | Gitea Documentation

image.png

首先是跟着文章里面的步骤做,先创建一个git子用户。wsl中创建子用户的命令参考本站博客,ubuntu下使用adduser命令来添加。

sudo adduser git

注意创建的git用户的uid和gid是可能不是1000,可以用id 用户名的方式查看信息

$ id git
uid=1002(git) gid=1002(git) groups=1002(git)

为了保证权限一致,docker-compose中的环境变量需要对应修改。

	environment:
      - USER_UID=1001
      - USER_GID=1001

还需要新增一个路径映射,在子用户git的家目录下创建一个.ssh目录。

	- /home/git/.ssh/:/data/git/.ssh

注意:为了避免文件读写权限问题,我建议在创建git子用户后,在该子用户中操作docker-compose和新建gitea的映射文件夹,这样能保证git用户和gitea容器一定能访问到文件夹且具有权限。

在git用户中执行如下命令,出现的提示框全部回车即可。因为git用户是新创建的,必须把用户git加入sudoers文件中才能执行sudo命令,具体可以参考博客中第八点的介绍。

sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"

随后执行如下命令,即把/home/git/.ssh/id_rsa.pub写入/home/git/.ssh/authorized_keys文件。执行完毕后请不要再手动修改authorized_keys文件。

echo "$(cat /home/git/.ssh/id_rsa.pub)" >> /home/git/.ssh/authorized_keys

还需要创建一个脚本来执行ssh信息转发

sudo vim /usr/local/bin/gitea

写入如下内容,可以通过CTRL+SHIFT+V直接粘贴。这里假设你将gitea容器的22端口转发到宿主机的2222端口(如果你的宿主机映射端口不同,可以修改脚本中的端口号)

ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"

写入脚本后,一定要把这个文件添加可执行权限

sudo chmod 777 /usr/local/bin/gitea

因为ssh容器直通都是本机处理的操作,所以我们可以在docker-compose中端口映射的时候限制来源IP地址为本地回环地址,这样就能保证只有宿主机中能访问2222端口到gitea中,而2222端口无法直接被外界访问。

ports:
  # [...]
  - "127.0.0.1:2222:22"

gitea的ssh直通流程

配置完毕ssh直通后,git操作流程如下:

  1. 用户使用git@IP地址访问主机,默认访问22端口;
  2. 主机验证git用户下.ssh/authorized_keyscommand开头的公钥中,发现用户公钥;
  3. 主机执行command指定的脚本,将此次请求的信息转发给gitea容器的ssh端口;
  4. gitea容器执行ssh请求处理;

如果不使用容器直通,你可以选择用https来进行git操作,或者在ssh使用时添加端口号。二者都会比直接使用ssh麻烦一些。

2.安装ssh服务

另外,默认情况下wsl中是没有ssh服务的,你会发现22端口无人使用

[root:~]# netstat -nltp | grep 22
tcp        0      0 127.0.0.1:2222          0.0.0.0:*               LISTEN      2816/docker-proxy

需要安装一下ssh服务

sudo apt install -y openssh-server
sudo systemctl start sshd

使用如下命令查看服务状态以及是否启用了开机自启

[root:~]# systemsystemctl status sshd
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-02-07 14:59:06 CST; 9min ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 5202 (sshd)
      Tasks: 1 (limit: 9527)
     Memory: 1.7M
     CGroup: /system.slice/ssh.service
             └─5202 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

Feb 07 14:59:06 wsl-ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
Feb 07 14:59:06 wsl-ubuntu sshd[5202]: Server listening on 0.0.0.0 port 22.
Feb 07 14:59:06 wsl-ubuntu sshd[5202]: Server listening on :: port 22.
Feb 07 14:59:06 wsl-ubuntu systemd[1]: Started OpenBSD Secure Shell server.
[root:~]# sudo systemctl is-enabled sshd
alias
[root:~]# sudo systemctl is-enabled ssh
enabled

此时再看看22端口,就有人干活了,sshd服务启动成功

[root:~]# netstat -nltp | grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      5202/sshd: /usr/sbi
tcp        0      0 127.0.0.1:2222          0.0.0.0:*               LISTEN      2816/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      5202/sshd: /usr/sbi

3.web界面添加用户ssh公钥

随后就是和github一样的操作, 在gitea的web页面添加用户的公钥。

【Linux】如何使用 ssh 密钥配置 git

image.png

添加完毕后,检查一下git用户里面的/home/git/.ssh/authorized_keys文件是否有变动,文件应该如下格式,会有一个command=存放了你刚刚在gitea web页面添加的用户公钥。

ssh-rsa <Gitea Host Key>

# other keys from users
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-1",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty <user pubkey>

文档中关于这一块的描述不够清楚(我感觉是机翻的问题)

原文:重要提示:来自 git 用户的公钥需要“按原样”添加,而通过 Gitea 网络界面添加的所有其他公钥将以 command="/app [...] 作为前缀。

其实这个说明的意思是,默认情况下的authorized_keys文件中应该只有下面的内容(即“按原样”添加),而gitea web页面添加的其他公钥应该都是以command=" 作为前缀,自动添加到authorized_keys文件之后的。

ssh-rsa <Gitea Host Key>

说白了就是,在执行完毕上文提到的将/home/git/.ssh/id_rsa.pub文件的内容写入/home/git/.ssh/authorized_keys的操作后,我们就不要手动修改authorized_keys这个文件了!如果出现问题,再依照文档中的这个提示检查该文件中的公钥格式是否正确。

官网文档中还提到了下面几个注意事项,我们全都不用管!只要你没有修改过配置文件和gitea容器中的环境,这些配置项都是默认情况下就OK了的。

image.png

4.验证是否直通成功

尝试验证ssh是否成功,这里的ip是wsl的本机ip,可以在wsl中通过ifconfig命令查看。

ssh -T git@172.26.39.91

如果出现下面的情况,说明22端口没有被成功开放,请检查:

  • 宿主机中的22端口是否已经配置了sshd服务,并正常监听22端口;
  • 在web页面添加的用户公钥是否添加到了/home/git/.ssh/authorized_keys文件中;
  • /usr/local/bin/gitea脚本中的命令无误。
PS D:\test-git> git clone git@172.26.39.91:musnows/test-action.git
Cloning into 'test-action'...
ssh: connect to host 172.26.39.91 port 22: Connection refused
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

如果看到了下面的内容,可以说明我们wsl中的的ssh服务已经成功启动了,但是没有成功通过脚本验证git用户。

PS D:\test-git> ssh -T git@172.26.39.91
The authenticity of host '172.26.39.91 (172.26.39.91)' can't be established.
ED25519 key fingerprint is SHA256:xRPtWVSIsHrqmP3VaBD+ZR24nE6SWmgjWUYENN0IfB8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.26.39.91' (ED25519) to the list of known hosts.
bash: line 1: /usr/local/bin/gitea: Permission denied

这是因为我们的git用户没有办法执行/usr/local/bin/gitea脚本,还记得吗,这个脚本是通过sudo创建的,默认情况下是一个文本文件,且只有root用户有权限访问

[root:~]# ll /usr/local/bin/gitea
-rw-r--r-- 1 root root 109 Feb  7 14:47 /usr/local/bin/gitea

解决办法很简单,将其权限改成777即可。

[root:~]# chmod 777 /usr/local/bin/gitea
[root:~]# ll /usr/local/bin/gitea
-rwxrwxrwx 1 root root 109 Feb  7 14:47 /usr/local/bin/gitea*

此时再次测试,发现成功直通gitea容器内ssh!这里会显示你在web页面中添加的ssh密钥的名字user from windows

PS D:\test-git> ssh -T git@172.26.39.91
Warning: Permanently added '[127.0.0.1]:2222' (ED25519) to the list of known hosts.
Hi there, musnows! You've successfully authenticated with the key named user from windows, but Gitea does not provide shell access.
If this is unexpected, please log in with password and setup Gitea under another user.

再试试能不能通过ssh克隆仓库,搞定!

PS D:\test-git> git clone git@172.26.39.91:musnows/test-action.git
Cloning into 'test-action'...
remote: Enumerating objects: 80, done.
remote: Counting objects: 100% (80/80), done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 80 (delta 22), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (80/80), 56.15 KiB | 9.36 MiB/s, done.
Resolving deltas: 100% (22/22), done.

5.docker-compose文件

下面给出本文所用的gitea容器docker-compose文件,只在官方文档所提供的版本上做了少量修改。

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.21.4
    container_name: gitea
    environment:
      - USER_UID=1001
      - USER_GID=1001
    restart: always
    networks:
      - gitea
    volumes:
      - /home/git/data:/data
      - /home/git/.ssh/:/data/git/.ssh
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "30000:3000"
      - "127.0.0.1:2222:22"

注意,在初始化gitea的时候不要修改web界面和ssh的监听端口(对应的是容器内的端口),否则上文的ssh直通可能会失败!

The end

如果有疑问,欢迎在评论区交流。

相关参考:如何通过Docker搭建Gitea并配置SSL和SSH直通 - 莫乔多博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT-贪吃蛇小游戏

QT-贪吃蛇小游戏 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "Food.h" #include <QTime> #include <time.h> #include "Snake.h"Food::Food(int foodSize):foodSize(foodSize) {coordinate.x -1;coordinate.…

多线程(4)——单例模式、阻塞队列、线程池、定时器

1. 多线程案例 1.1 单例模式 单例模式能保证某个类在程序中只存在唯一一份实例&#xff0c;不会创建出多个实例&#xff08;这一点在很多场景上都需要&#xff0c;比如 JDBC 中的 DataSource 实例就只需要一个 tip&#xff1a;设计模式就是编写代码过程中的 “软性约束”&am…

系统稳定性建设的深度剖析与未来展望

一、系统稳定性的重要意义 系统稳定性是系统正常运行的关键&#xff0c;其缺失会导致严重后果&#xff0c;如经济损失、用户流失等。 以在线学习平台为例&#xff0c;如果系统频繁出现卡顿、掉线等问题&#xff0c;影响用户的学习体验&#xff0c;导致用户流失&#xff0c;平…

【HTML】从0开始构建HTML页面

1、HTML文档基本格式 1.1、!DOCTYPE:文档类型声明 1.2、html:根标签 1.3、head:头部标签 1.4、body:主体标签 2、头部相关标签 2.1、< title> < title>标签用于定义HTML页面的标题&#xff0c;即给网页取一个名字&#xff0c;必须位于< head>标签之内。 …

Programmatically add website content to OpenAI with C#

题意&#xff1a;使用 C# 以编程方式将网站内容添加到 OpenAI。 问题背景&#xff1a; Our goal is to have a ChatGPT answer questions about our websites content. 我们的目标是让 ChatGPT 回答关于我们网站内容的问题。 We are trying to integrate something similar t…

设计模式笔记01(java版)

文章目录 设计模式概述学习设计模式的必要性设计模式分类创建型模式结构型模式行为型模式 UML类图概述类图的作用类图表示法类的表示方式类与类之间关系的表示方式1&#xff0c;单向关联2&#xff0c;双向关联3&#xff0c;自关联聚合关系组合关系依赖关系继承关系实现关系 软件…

【hot100篇-python刷题记录】【买卖股票的最佳时机】

摆烂几天,又来了。 R5-贪心篇(不像) 贪心的常规思路是找到贪心切入点,例如最经典的算法是安排最多活动问题,需要以结束时间排序,然后遍历不冲突,计算最大数即可(每次都选择最早结束的活动)。 贪心算法的使用需要满足贪心特征。即局部最优解等于全局最优解。 对于本…

Docker 修改容器端口映射(以 Portainer 为例)

文章目录 背景解决第1步:找到容器id第2步:查找docker根目录第3步:停止docker服务第4步:修改容器的hostconfig.json配置文件第5步:启动docker服务第6步:验证参考背景 项目中有个服务也使用了9000端口,而Portainer的默认端口也是9000。结果可想而知,端口冲突,肯定有一个…

stable diffusion inpainting(img2img+inpaint/inpaint-model)

https://zhuanlan.zhihu.com/p/681250295https://zhuanlan.zhihu.com/p/681250295AIGC专栏4——Stable Diffusion原理解析-inpaint修复图片为例_diffusion inpaint-CSDN博客文章浏览阅读1.7w次,点赞42次,收藏79次。Inpaint是Stable Diffusion中的常用方法,一起简单学习一下。…

CAS-ViT实战:使用CAS-ViT实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

springer 投稿系统中返修注意点

初次提交 初次提交时&#xff0c; manuscript 提交的是 pdf 文件 返修后提交 在经过返修之后需要提交的是注意一下几点&#xff1a; 此时提交的Blined manuscript &#xff0c;虽然名字没变&#xff0c;但不能再提交pdf 文件&#xff0c; 而需要提交的是可编辑的源文件 .te…

Sketch-gen模型部署教程

一、介绍 SketchGen: 一种图像转草图工具&#xff0c;主要用于制作合成数据集或生成参考图。它能够帮助研究人员和开发者快速地从真实图像中提取出线稿轮廓&#xff0c;这对于计算机视觉任务如物体识别、场景理解等非常有用。通过使用这种工具&#xff0c;可以更方便地创建训练…

【科技赋能教育】电路仿真软件:解锁电路教学新篇章,让知识触手可及!

教育领域正经历着一场前所未有的变革。电路学&#xff0c;作为理工科学生必修的一门基础课程&#xff0c;其抽象性、复杂性和实验条件的高要求&#xff0c;曾让无数学生望而却步。然而&#xff0c;随着电路仿真软件的出现&#xff0c;这一切正悄然发生着变化&#xff0c;它不仅…

Java面试-基础

1. 面向对象 什么是面向对象 什么是面向对象&#xff1f; 对比面向过程&#xff0c;是两种不同的处理问题的角度 面向过程更注重事情的每一个步骤及顺序&#xff0c;面向对象更注重事情有哪些参与者 &#xff08;对象&#xff09;、及各自需要做什么 封装、继承、多态 2. …

yum 安装 MySQL 8.0【2024最新教程】

文章目录 第 1 步:添加 MySQL Yum Repository第 2 步:【可选】选择 MySQL 版本第 3 步:安装 MySQL Community Server第 4 步:启动 MySQL第 5 步:修改 root 密码第 6 步:【可选】修改配置文件默认配置修改数据目录和日志文件添加更多配置第 7 步:【可选】修改 root 可外部…

【应急响应】-linux日志被删除?

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 在 Linux 应急响应中&#xff0c;攻击者清理日志的行为给追踪和分析带来了巨大挑战。本文将介绍在日志被…

【STM32项目】在FreeRtos背景下的实战项目的实现过程(三)

个人主页~ 实战项目的实现过程&#xff08;一&#xff09;~ 实战项目的实现过程&#xff08;二&#xff09;~ 实战项目的实现过程 五、读例程1、初始化函数2、while函数3、头文件4、源文件 六、移植程序 五、读例程 将一些特定的模块调试好&#xff0c;就是那些使用别的软件…

在Windows Server上安装typecho博客程序(基于IIS)

Typecho Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&#xff0c;是一款内核强健﹑扩展方便﹑体验友好﹑运行流畅的轻量级开源博客程序。 网上大多在Windows下安装Typecho的教程都是基于Apache服…

铁电随机存取存储器(FeRAM):前景黯淡,难以突破

铁电随机存取存储器&#xff08;FeRAM&#xff09;是一种快速、非易失性存储器&#xff0c;但它面临着与Optane相似的困境——目前的发展停滞不前。 ### 快速非易失性存储器技术 存在多种快速、非易失性存储器技术&#xff0c;理论上可以填补NAND和NOR与DRAM之间的存储层级空…

ArgoCD 启用Web终端,实现命令行进容器【详细步骤】

文章目录 Terminal 简介启用 Terminal第 1 步:启用 UI第 2 步:设置 Role 或 ClusterRole第 3 步:授权 API扩展知识 - ArgoCD RBACArgoCD 内置用户内置角色匿名/已认证用户 PolicyRBAC 模型结构应用相关 Policy项目级别配置页面配置ArgoCD CLI 配置扩展argocd-cm 示例argocd-…