草稿阶段, 还有变更
官方文档 https://docs.gitea.cn/
源码仓库 https://github.com/go-gitea/gitea
简述
这个项目最开始是 fork gogs 的,看资讯说是 gogs 的作者控制欲太强, 很多功能和社区期望功能都不愿意加入进来,于是才有的分支。
目前看起来 gitea 的发展得更好,因为大家确实需要一个私有的 github, 而 gitlib 又太重量级了。
功能
核心的代码管理方面相关功能都有,如工单、软件包注册中心,Wiki、钩子等。
硬件需求很低, 1G 内存的主机就够了。
安装方式
支持 二进制部署, docker 部署, k8s 部署, 基本各平台都支持。
详细的这里就不介绍了,看官方文档就行,下面只是简单的介绍一下
基本过程如下
- 提前一个数据库和用户帐号, 如 mysql, pg
- 使用 docker 或 k8s yml 文件进行部署
docker-compose 方式
参考 附录文件的 docker-compose.yml 的配置文件说明
或者点击此链接下载文件 docker-compose.yml
说明,因为数据持久化用的外部命名卷, 所以这里提前创建一下
docker volume create gitea
docker-compose up -d
k8s 环境内部署
方法一: helm
1
2
|
helm repo add gitea <https://dl.gitea.io/charts/> \
helm pull gitea/gitea --untar
|
下载下来后修改一下 values 文件的相关配置在安装
方法二: 资源文件方式安装
更灵活一些
或者点击此链接下载我的文件 k8s.yml
-
准备 pv 和 pvc 文件, 持久化存储, 我的 pvc 名字是 pvc-nfs-gitea
-
statefulset 方式部署, 参考附件的 statefulset.yml
-
初始配置, 因为需要前置的几个配置也比较少, 所以没有准备 configmap, 直接用的环境变量;
还有个原因, gitea 会将中途修改的内容持久化到 配置文件中, 而配置文件又在卷路径下;
所以最好还是不使用 configmap 来管理初始化配置
-
services 采用的 traefik 的 IngressRoute IngressRouteTCP 方式进行的暴露
参考附件的
service.yml IngressRoute.yml IngressRouteTCP.yml
部署完成后事项
-
使用自己配置的域名地址进行访问
https://git.services.wait/
-
第一个用户是超级管理员
-
然后就是正常的使用了
附录文件
直接下载文件
docker-compose.yml
k8s.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
71
72
73
74
75
76
77
78
79
80
81
82
|
version: "3"
services:
gitea:
# 镜像提前从 docker hub 下载好了, 上传到的私有仓库
image: registry.services.wait/cwx/gitea:1.18.5
restart: always
environment:
# 自定义运行用户id, 如果是数据卷和新装,就没有必要指定;
# 因为以前是 bind 挂载所以文件已经有了属主, 所以这里指定只是为了兼容
- USER_UID=1000
- USER_GID=1000
# 指定数据库类型和帐号密码
- DB_TYPE=mysql
- DB_HOST=10.2.1.5:3306
- DB_NAME=gitea
- DB_USER=gitea
- DB_PASSWD=passw0rd
# 随便取一个应用名字
- APP_NAME=WaitCode
- RUN_MODE=prod
# 项目主域,和后续页面上看到的 http 项目地址有关系
- DOMAIN=git.services.wait
# 和 ssh clone 时页面看到的地址有关系
- SSH_DOMAIN=git.services.wait
# 如果 ssh 使用 22 端口的话,需要宿主机让出22端口或配置 ssh透传
# 这里简单使用就避开端口就行
- SSH_PORT=10022
# 禁止用户注册
- DISABLE_REGISTRATION=true
# 需要登陆才能查看项目
- REQUIRE_SIGNIN_VIEW=true
# 最终实际的 http 服务地址
- ROOT_URL=https://git.services.wait/
# 离线模式, 也就不会用到一些 cdn 或外部的 js 文件等
- OFFLINE_MODE=true
volumes:
- gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
# 挂了一个私有CA证书, 因为有向外的 webhook https 请求
- ./config/cwxCA.pem:/etc/ssl/certs/cwxCA.pem:ro
ports:
- "3000:3000"
# - "10022:10022"
depends_on:
- mysql
labels:
- "service_name=gitea"
# 我之前采用的 traefik 做的统一网关, 如果不需要则直接将这一段删除, 并修改一下 ports
- "traefik.enable=true"
- "traefik.http.routers.giteaHttps.entrypoints=https"
- "traefik.http.routers.giteaHttps.service=giteaWeb"
- "traefik.http.routers.giteaHttps.rule=Host(`git.services.wait`)"
- "traefik.http.routers.giteaHttps.tls=true"
- "traefik.http.services.giteaWeb.loadbalancer.server.port=3000"
- "traefik.tcp.routers.giteaSSH.entrypoints=port10022"
- "traefik.tcp.routers.giteaSSH.service=giteaSSH"
- "traefik.tcp.routers.giteaSSH.rule=HostSNI(`*`)"
- "traefik.tcp.services.giteaSSH.loadbalancer.server.port=10022"
logging:
options:
labels: "service_name"
volumes:
gitea:
external: true
|
statefulset.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: gitea
namespace: cwx
spec:
selector:
matchLabels:
app: gitea
serviceName: gitea
replicas: 1
template:
metadata:
labels:
app: gitea
spec:
containers:
- name: gitea
image: registry.services.wait/cwx/gitea:1.20.2
env:
- name: USER_UID
value: "1000"
- name: USER_GID
value: "1000"
- name: DB_TYPE
value: mysql
- name: DB_HOST
value: wcn7:3306
- name: DB_NAME
value: gitea
- name: DB_USER
value: gitea
- name: DB_PASSWD
value: passw0rd
- name: APP_NAME
value: WaitCode
- name: RUN_MODE
value: prod
- name: DOMAIN
value: git.services.wait
- name: SSH_DOMAIN
value: git.services.wait
- name: SSH_PORT
value: "10022"
- name: SSH_LISTEN_PORT
value: "10022"
- name: DISABLE_REGISTRATION
value: "true"
- name: REQUIRE_SIGNIN_VIEW
value: "true"
- name: ROOT_URL
value: https://git.services.wait/
- name: OFFLINE_MODE
value: "true"
volumeMounts:
- name: data
mountPath: /data
- name: timezone
mountPath: /etc/timezone
readOnly: true
- name: localtime
mountPath: /etc/localtime
readOnly: true
- name: ca
mountPath: /etc/ssl/certs/cwxCA.pem
subPath: cwxCA.pem
readOnly: true
resources:
limits:
cpu: "200m"
memory: "300Mi"
ports:
- containerPort: 3000
name: web
- containerPort: 10022
name: ssh
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-nfs-gitea
- name: timezone
hostPath:
path: /etc/timezone
- name: localtime
hostPath:
path: /etc/localtime
- name: ca
secret:
secretName: cwx-ca-pem
|
service.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
apiVersion: v1
kind: Service
metadata:
name: gitea
namespace: cwx
spec:
selector:
app: gitea
clusterIP: None
ports:
- port: 80
name: web
targetPort: 3000
- port: 22
name: ssh
targetPort: 10022
|
IngressRoute.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: giteaweb
namespace: cwx
annotations:
kubernetes.io/ingress.class: "traefik-class"
spec:
entryPoints:
- https
routes:
- match: Host(`git.services.wait`)
kind: Rule
services:
- name: gitea
namespace: cwx
port: 80
tls:
secretName: key-services-wait
|
ingressRouteTcp.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: giteassh
namespace: cwx
annotations:
kubernetes.io/ingress.class: "traefik-class"
spec:
entryPoints:
- giteassh
routes:
- match: HostSNI(`*`)
services:
- name: gitea
port: 22
namespace: cwx
|