自建远程Git仓库服务 -- Gitea

自建远程Git仓库服务 -- Gitea

参考 项目源码:GitHub - go-gitea/gitea 项目文档:关于Gitea | Gitea Documentation 部署流程 数据库准备 首先要准备好数据库环境,这里使用mysql 创建一个将被 Gitea 使用的数据库用户,并使用密码进行身份验证。 CREATE USER 'gi

参考

项目源码:GitHub - go-gitea/gitea

项目文档:关于Gitea | Gitea Documentation

部署流程

数据库准备

首先要准备好数据库环境,这里使用mysql

创建一个将被 Gitea 使用的数据库用户,并使用密码进行身份验证。

CREATE USER 'gitea' IDENTIFIED BY '替换成你的密码';

使用 UTF-8 字符集和大小写敏感的排序规则创建数据库。

CREATE DATABASE giteadb CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin';

将数据库上的所有权限授予上述创建的数据库用户。

GRANT ALL PRIVILEGES ON giteadb.* TO 'gitea';  
FLUSH PRIVILEGES;

配置 SSH 直通

由于使用容器,SSH 的端口一般不是22,因此需要将 SSH 连接从主机转发到容器,文档链接 SSH 容器直通

需要在主机创建一个用户 git ,后续 SSH 容器直通有用

sudo useradd git

查看用户 uid 和 gid

id git 
#输出: 用户id=1001(git) 组id=1001(git) 组=1001(git)

递归创建目录 /home/git/.ssh

mkdir -p /home/git/.ssh

设置 git 用户家目录

usermod -d /home/git git

在主机使用 git 用户创建 SSH 密钥对

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

递归授予 git 用户权限

这一步很重要,因为以 root 身份创建的文件 git 用户没法随便读写,这样可以确保 git 用户拥有自己的权限

chown git:git -R /home/git

创建文件 /usr/local/bin/gitea

sudo vim /usr/local/bin/gitea

在该文件写入如下内容,注意 222 改成你部署时映射的端口

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

输入 :wq 保存退出

授予可执行权限

chmod a+x /usr/local/bin/gitea

添加密钥

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

通过Docker部署

services:
  gitea:
    image: commitgo/gitea-ee
    container_name: gitea
    environment:
      - USER_UID=1001 # 填写上一步输出的 uid
      - USER_GID=1001 # 填写上一步输出的 gid
      - GITEA__database__DB_TYPE=mysql
      - GITEA__database__HOST=mysql57:3306
      - GITEA__database__NAME=giteadb
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=替换成你的密码
      - SSH_PORT=22 # 克隆 URL 中显示的 SSH 端口,填写容器对外暴露的ssh端口,如果配置 ssh 直通可以忽视
      - DOMAIN=example.com # http方式克隆的域名
      - SSH_DOMAIN=example.com # ssh方式克隆的域名
      - ROOT_URL="http://example.com/" # 外部访问url
    restart: always
    networks:
      - mysql
      - gitea
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro  
      - /etc/localtime:/etc/localtime:ro
      - /home/git/.ssh/:/data/git/.ssh # ssh 容器直通
    ports:
      - "3000:3000"
      - "127.0.0.1:222:22" # 因为 222 端口不需要暴露给外界,所以将其映射到主机的 `localhost`
networks:
  mysql:
    external: true
  gitea:
    name: gitea

配置反向代理

部分配置文件如下,参考了官方文档:反向代理 | Gitea Documentation

server {  
    ...  
    location / {  
        client_max_body_size 512M;  
        proxy_pass http://localhost:3000;  
        proxy_set_header Connection $http_connection;  
        proxy_set_header Upgrade $http_upgrade;  
        proxy_set_header Host $host;  
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        proxy_set_header X-Forwarded-Proto $scheme;  
    }  
}

效果演示

部署成功

image.png

image.png

踩过的坑

配置直通时没注意用户权限问题,导致个人的 SSH 密钥添加不上去,这是由于使用了 root 用户创建的目录 git 用户无法访问所致

Comment