GitHub 低代码
发布于 

Gitea代码仓库

docker-compose安装

本节已假定, 已安装Docker和docker-compose

准备一个用户 (以git用户为例)

该用户满足以下条件

  • 可以 sudo 到 root(管理用户)
  • 可以 ssh 登陆

创建用户

  • 使用 adduser 快速创建git用户
  • 记录用户的GID和UID
1
2
3
4
5
6
sudo adduser git

# ... 省略用户创建过程

# 获取用户的GID和UID, 后续使用
cat /etc/passwd | grep git

将 git 用户提升为管理用户

1
2
3
4
5
6
7
8
# 在文件最下方添加
git ALL=(ALL:ALL) NOPASSWD: ALL
# 解析:
# git: 用户名或者用户组
# 第一个ALL: 表示来源地,即从哪执行这条命令。ALL表示所有计算机
# 第二个ALL: 表示sudo可以切换到什么用户。ALL表示所有用户
# 第三个ALL: 表示sudo可以切换到哪些组下的用户。ALL表示所有组
# NOPASSWD:ALL 表示执行任意命令都不需要密码

ps: 若权限不足需要修改权限

配置允许 SSH 登录

  • 配置如下:
1
2
3
PermitRootLogin yes # 是否允许ssh远程登录root帐号, AllowUsers上没用root也不能登陆
AllowUsers git #允许ssh登录用户
AllowUsers ubuntu #原本的ubuntu用户别忘了

重启使其生效

安装Gitea

  • 配置 docker-compose 文件
1
2
3
4
5
6
# 创建gitea的专属目录
mkdir /home/git/gitea
cd /home/git/gitea

# 写入配置
vi docker-compose.yml
  • docker-compose.yml 配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# gitea 的 docker-compose
version: "3"

# 配置gitea的网络
networks:
gitea:
name: gitea
driver: bridge
external: false

services:
server:
image: gitea/gitea:latest # 镜像
container_name: gitea_server # 服务名称
restart: always # 重启方式
networks:
- gitea # 加入gitea网络
ports:
- "3333:3000" # 映射http地址
# 宿主机的2222端口映射, gitea的ssh服务监听的端口
- "2222:22"
environment:
# 配置网址: https://docs.gitea.io/zh-cn/config-cheat-sheet/
# --- 运行用户配置 ---
# 运行应用程序的用户
- RUN_USER=git # 上面操作创建的用户
# 运行容器使用的 UID和GID 是用于匿名数据卷挂载
- USER_UID=1002 # 运行用户的UID
- USER_GID=1002 # 运行用户的GID

# --- gitea基础配置 ---
- APP_NAME=o2packs-git
- RUN_MODE=prod
- DISABLE_REGISTRATION=true # 禁用用户注册,启用后只允许管理员添加用户
- SHOW_REGISTRATION_BUTTON=false # 是否显示注册按钮
- REQUIRE_SIGNIN_VIEW=true # 是否所有页面都必须登录后才可访问
# 是否允许运行安装向导
# - INSTALL_LOCK=false
# 禁用头像
# - DISABLE_GRAVATAR=true

# --- 服务配置 ---

# 访问协议的
- PROTOCOL=http
# HTTP服务侦听端口的端口
- HTTP_PORT=3000
# URL克隆展示的ssh端口
# - SSH_PORT=2222 (后面直接修改app.ini)
- DOMAIN=175.178.177.191
# 未登录用户的默认页面 home 或 explore
- LANDING_PAGE=home
# 服务器的对外 URL ( 覆盖自动生成的公共 URL。如果内部 URL 和外部 URL 不匹配(例如在 Docker 中),这很有用。
- ROOT_URL=http://175.178.177.191:3333
# 启用 git-lfs 支持 (大文件存储服务)
- LFS_START_SERVER=true

# --- 数据库配置 ---

# 数据库类型[mysql,postgres,mssql,sqlite3]
- DB_TYPE=sqlite3

volumes:
# gitea所有数据存储的位置
- ./gitea:/data
# 时区的配置映射
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
# gitea服务和git用户共用 .ssh (否则,SSH 身份验证将无法在容器内运行)
- /home/git/.ssh/:/data/git/.ssh
  • 将目录所有权改成git用户
  • 安装gitea并启动服务

安装引导 (初始化Gitea)

初始配置

管理员账号设置

完善Gitea配置

  • 修正gitea的配置
1
2
3
4
5
6
7
8
9
# 修改gitea配置
vi ./gitea/gitea/conf/app.ini

# 在 [server] 配置区块, 添加如下配置
SSH_PORT = 2222 # 原 22 改 2222

# 扩展, 启动内置的ssh服务 (使用容器的ssh就不需要)
# START_SSH_SERVER = true
# SSH_LISTEN_PORT = 222 # 如果使用了内置ssh则需要修改端口映射 - "2222:222"
  • 重启docker-compose
1
2
docker-compose down
docker-compose up -d

验证安装(http和ssh链接)

  • 方式1: 创建一个空的测试项目

  • 方式2: ssh密钥验证

SSH密钥配置不在本文档的范围之内, 「已假定密钥已配置」

1
2
3
4
5
6
7
ssh git@124.222.237.29 -p 2222

# 出现如下信息
PTY allocation request failed on channel 0
Hi there, root! You've successfully authenticated with the key named 879515820@qq.com, but Gitea does not provide shell access.
If this is unexpected, please log in with password and setup Gitea under another user.
Connection to 124.222.237.29 closed.

配置SSH直通 (可选)

作用: 建立SSH直通, 可以在克隆的时候不带端口 (无需修改app.ini配置)
PS: 配置SSH直通其实挺折腾的, 但是能够了解更多SSH知识.

官网教程: https://docs.gitea.io/en-us/install-with-docker/#ssh-container-passthrough

步骤:

  • 在上述的yml配置中, gitea的SSH认证和git用户SSH认证已经公用认证文件 「/home/git/.ssh/authorized_keys」
  • 建立SSH直通 「宿主机和Docker 直通」
  • 将密钥对加入认证信息
  • 创建gitea可执行文件
  • 确认准确性

建立SSH直通

1
2
3
4
5
6
# 在宿主机上生成密钥
sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"

# 使用密钥对
eval `ssh-agent -s`
ssh-add /home/git/.ssh/id_rsa

将密钥对加入认证信息(authorized_keys)

1
2
3
4
5
# 加了认证信息
sudo -u git cat /home/git/.ssh/id_rsa.pub | sudo -u git tee -a /home/git/.ssh/authorized_keys
# 或 echo "$(cat /home/git/.ssh/id_rsa.pub)" >> /home/git/.ssh/authorized_keys
# 修改权限
sudo -u git chmod 600 /home/git/.ssh/authorized_keys

创建gitea可执行文件

1
2
3
4
5
cat <<"EOF" | sudo tee /usr/local/bin/gitea
#!/bin/sh
ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
EOF
sudo chmod +x /usr/local/bin/gitea

确认准确性

  • 理解和说明
    • 公用authorized_keys认证文件
    • 使用公钥 o2packs_rsa 进行链接时, 因为有command=选项, 会直接执行 /usr/local/bin/gitea 二进制文件
  • 当客户端向SSH服务发起请求时 如: git clone git@domain:user/repo.git
    • 客户端将尝试与服务器进行身份验证,依次将一个或多个公钥传递给主机
    • 假设匹配公钥 o2packs_rsa , 执行 command= 中的指令
    • 宿主机SSH服务器 创建一个 用户为 git 的会话 并打开宿主机到容器的SSH
    • 将其余命令参数直接传递给容器中
    • 整体意思: git用户SSH链接的部分SSH命令将由gitea服务器验证和授权
  • 确认密钥对是否正确:
1
2
3
4
5
# 宿主机上生成密钥的公钥信息 (大概长这样)
ssh-rsa AAAAB3....xxx....v4Q== Gitea Host Key

# gitea上的SSH添加的公钥信息 (大概长这样)
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,no-user-rc,restrict ssh-rsa AAAA...xxx... o2packs_rsa
  • 验证 (此时SSH不需要带端口)
  • 修改docker-compose的端口映射 (可选)
1
2
3
# 修改完成之后, 外部只能22端口访问, 外部2222端口无法访问
ports:
- "127.0.0.1:2222:22"

二进制安装

步骤:

  1. 下载二进制包
  2. 移动包至 bin 目录并修改权限
  3. 建立 Gitea 的专属目录
  4. 为 Gitea 创建专属用户(git)及分配权限
  5. 创建 Gitea 服务, 设置开机自启
  6. 配置 Gitea

下载和移动文件

1
2
3
4
5
6
7
8
9
# https://dl.gitea.io/gitea 获取最新版本
# 下载
wget -O gitea https://dl.gitea.io/gitea/1.16.4/gitea-1.16.4-linux-amd64

# 添加可执行权限
sudo chmod +x gitea

# 将下载的文件移动到 /usr/local/bin
sudo mv gitea /usr/local/bin

建立 Gitea 的专属目录

1
2
3
4
5
6
# 选用 /var/lib/gitea 作为专属目录
mkdir /var/lib/gitea
# 创建gitea应用必须的文件夹
mkdir /var/lib/gitea/{custom,data,log}
# 创建配置存放目录
sudo mkdir /etc/gitea

为 Gitea 创建专属用户(git)及分配权限

使用独立的 git 用户, 可以确保服务器更安全

1
2
3
4
5
6
7
# 创建git用户, 指定用户登入所使用的shell、用户群组、用户home目录, 关闭用户秘密
sudo adduser git --system --shell /bin/bash --group --disabled-password --home /home/git

# 给git用户分配gitea相关的权限
sudo chown -R git:git /var/lib/gitea
# 分配 /etc/gitea 目录权限
sudo chown -R git:git /etc/gitea

创建 Gitea 服务, 设置开机自启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 创建gitea服务文件
sudo touch /etc/systemd/system/gitea.service
# 分配可执行权限
sudo chmod +x /etc/systemd/system/gitea.service
# 编辑服务文件
sudo vi /etc/systemd/system/gitea.service
# 复制以下内容
## -------分割线------- ##
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target

## -------分割线------- ##

# 启动服务
systemctl start gitea
# 设置开机自启动
systemctl enable gitea

# 查看服务状态, 为 active (running)
systemctl status gitea

配置 Gitea

官网配置详解 https://docs.gitea.io/zh-cn/config-cheat-sheet/

初始配置

管理员账号设置

修正 app.ini 的一些不准确性 「PS」

1
2
3
4
5
vi /etc/gitea/app.ini

# 修正如下 (使用IP配置会存在一些问题, 可以使用域名, 以及使用nginx代理)
SSH_DOMAIN = 124.222.237.29 # 修正SSH克隆的不准确地址
START_SSH_SERVER = true # 开启内置SSH服务器

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @Kocher 创建,使用 Stellar 作为主题。