很久没动服务器了,准备在上面安装个git服务。
因为上面已经有docker了
那么先安装docker -compose
运行
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
查看docker-compose版本
docker-compose --version
起初我还运行了个pip install docker-compose
但这个安装后查看docker-compose会报错,我也没卸载直接用上面的安装方法可以。
然后创建docker-compose.yml 文件
内容为
version: "3" networks: gitea: external: false services: server: image: gitea/gitea:1.21.3 container_name: gitea environment: - USER_UID=1000 - USER_GID=1000 - GITEA__database__DB_TYPE=mysql - GITEA__database__HOST=xxxxxx:3306 - GITEA__database__NAME=gitea - GITEA__database__USER=xxxxx - GITEA__database__PASSWD=xxxxx restart: always networks: - gitea volumes: - ./gitea:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "3000:3000" - "222:22"
然后运行
docker-compose up -d
然后cd到 docker-compose.yml 这个文件所在目录运行
docker-compose ps
用来查看是否启动
5.22
备份与恢复
参考官方文档备份与恢复 | Gitea Documentation
docker exec -u git -it -w /tmp 32adc16692a5 bash -c '/usr/local/bin/gitea dump'
32adcxxx 是容器ID
我找了半天没找到备份的文件,原来是在docker的容器中,我没有映射docker容器中的/tmp
下面命令可以看到
docker exec -it 32adc16692a5 ls /tmp
用下面命令进入bash
docker exec --user git -it 32adc16692a5 bash
用以下命令将docker容器中的文件复制到主机
docker cp 32adc16692a5:/tmp/gitea-dump-1716367822.zip /root/gitea_backup/gitea-dump-1716367822.zip
解压这个zip 可以看到两个文件夹 data 和repos 其中repos 是git项目,其实直接 git clone 这个repose 中的项目也是可以的。
实际上git项目也存在于 docker-compose.yml 所在目录下的gitea/git/repositories/....... 也是可以直接clone的
由于我是用nginx 配置了代理,拉取推送大的仓库时候会报错
error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413
fatal: the remote end hung up unexpectedly
这是因为采用http https推送git的时候默认http.postBuffer是1MB,使用以下命令修改为500MB
git config --global http.postBuffer 524288000
但我在docker容器中和本机上都试了还是无效?
后来查找到需要配置nginx
修改/etc/nginx/nginx.conf 在server节点中增加
client_max_body_size 500m;
改完这个配置之后,执行nginx -t,验证配置文件的合规性;再执行nginx -s reload 重新加载配置文件。
当然用ssh 方式拉取代码不会出现以上错误。
5.23 配置SSH
先生成ssh密钥对
我起初是在阿里云的密钥对管理中生成的,但没看到公钥,后来又在腾讯云密钥对管理中生成,可以看到公钥。但导入到gitea中会报错
无法验证您的 SSH 密钥: key length is not enough: got 2048, needs 3071
这个意思看来是腾讯云中生成的密钥是2048位 但gitea中至少需要3071 位
那么用命令生成一个4096 位的,linux和windows下都可以运行此命令
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
按三次回车,注意第二次如果输入了不包含路径文件名那么会在当前目录中生成公钥和私钥
三次回车后在/root/.ssh/下生成了id_rsa.pub 公钥和id_rsa 私钥
然后将id_rsa.pub的内容添加到gitea中
最开始我用 ssh://git@git.kecq.com/yuanjun/CoreLib.git
提示要求输入密码,这个显然不是 gitea账户的密码,实际上分析这个是连接到宿主机ssh 22端口的而不是gitea容器中的22端口,还需要修改gitea容器中的app.ini 文件
我的路径在/root/gitea/gitea/gitea/conf
将SSH_PORT 和SSH_LISTEN_PORT 改为docker-compose.yml 中一样的,我的是8222
然后重启容器,可以看到gitea网站中的ssh 路径已经带端口号了
ssh://git@git.kecq.com:8222/yuanjun/CoreLib.git
windows中ssh 访问
右键选择 Open Git GUI Here 再点击Help 菜单下的Show SSH Key这里也可以生成密钥对,实际上它是读取的.ssh路径下的id_rsa
如果在用ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 生成的时候第二步输入了文件名,那么需要将生成的公钥和私钥改名为id_rsa 放到本机的.ssh 路径下,我的是C:\Users\fyj\.ssh
如果不想更改名称或者为git客户端配置多个ssh,可以采用如下方法
新建一个SSH配置文件 ~/.ssh/config,添加如下内容
其中 Host 和 HostName 填写 git 服务器的域名,IdentityFile 填写对应的私钥的路径
Host git.kecq.com
HostName git.kecq.com
Port 8222
User git
IdentityFile ~/.ssh/myssh
这样就可以通过ssh 使用git clone 了,注意上面的host 不能改为名称如myssh这样的名称git clone 会报Permission denied (publickey).
另外我还想将这个密钥对加入阿里云服务器连接,继续在此文件中加入
Host aliyun
HostName kecq.com
Port 22
User root
IdentityFile ~/.ssh/myssh
然后先用密码连接上阿里云 运行
ssh-copy-id -i ~/.ssh/id_rsa.pub kecq.com
注意上面的kecq.com 不能改为myssh不然会报
ERROR: ssh: Could not resolve hostname myssh: Name or service not known
第一次添加可能会出现ED25519 key fingerprint is SHA256
输入yes 回车 再输入密码就可以了
然后在windows cmd中输入 ssh aliyun 就可以连接了
分别测试SSH连通性
ssh -T git.kecq.com
ssh -T aliyun
但用下面的无法通过测试
ssh -T root@kecq.com
ssh -T git@git.kecq.com
会报错
Could not resolve hostname git.kecq.com:8222: \262\273\326\252\265\300\325\342\321\371\265\304\326\367\273\372\241\243
ssh 访问git代码库
但用TortoiseGit 小乌龟不能clone 会报错,因为它默认不是使用系统的ssh
需要设置中将ssh路径由C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe 改为C:\Program Files\Git\usr\bin\ssh.exe
如第一次连接出现
The authenticity of host 'gitea.com (IP ADDRESS)' can't be established.
RSA key fingerprint is SHA256:Fo6Tm/SLyse8uglFB1JShqQWchU0kcPzSRueD1O9K0I.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
这种的话需要输入 yes回车
Linux 访问ssh git
如果直接执行git clone ssh:xxxxxxxxxxxxxxxxxxx
会报出
Permissions 0644 for '/root/.ssh/id_rsa' are too open.
需要执行
chmod 600 /root/.ssh/id_rsa
然后就可以git clone 了