* add error info * change readme * change readme * add docker getting api
devcontainer.json parser, WeChat QR Expiration Mask, Zombie Process Mitigation
devcontainer.json parser, WeChat QR Expiration Mask, Zombie Process Mitigation
DevStar Studio
DevStar Studio 是 Gitea 发行版
1. 快速开始
1.1 单机版
1.1.1 Linux部署
1.1.2 Docker容器部署
- 数据库准备(可选sqlite不需要配置),参考网址
- 环境准备
- 镜像准备(可选镜像文件方式或远程拉取方式)
- 下载镜像文件压缩包
- tar -xzvf 解压缩得到镜像文件
- 加载镜像:docker load -i <镜像文件名>
- docker images 验证
- docker pull devstar.cn/devstar/devstar-studio:latest
- 下载镜像文件压缩包
- 运行容器(区分windows和linux)
- windows
- cmd运行docker run --restart=always --name <容器名> -d -p 3000:3000 <镜像名/ID> ,docker ps 验证
- 浏览
http://localhost:3000进行数据库配置,配置成功即可看到登录注册页面 - docker desktop配置打开
Expose daemon on tcp://localhost:2375 without TLS选项 - docker desktop在容器界面找到文件系统中 /etc/gitea/app.ini修改配置文件(见下表)
- 重启容器
- docker desktop对应容器页面的log页面可见日志
- linux
- docker run --restart=always --name <容器名> -d -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock <镜像名>
- 浏览
http://localhost:3000进行数据库配置,配置成功即可看到登录注册页面 - sudo chmod 666 /var/run/docker.sock修改host文件权限
- docker cp <容器名/ID>:/etc/gitea/app.ini ./app.ini 修改配置文件(见下表) docker cp ./app.ini <容器名/ID>:/etc/gitea/app.ini
- docker restart <容器名/ID>重启容器
- docker logs -f <容器名/ID> 可见日志
- windows
配置文件添加/修改 下列小节键:
[database]
CHARSET_COLLATION = utf8mb4_bin
[devstar.ssh_key_pair]
KEY_SIZE = <写入希望生成的SSH密钥长度,比如 4096 ,默认值 2048>
[cors]
ENABLED = true
ALLOW_DOMAIN = *
METHODS = GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS
HEADERS = Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
MAX_AGE = 10m
[ui.admin]
;; Dev Container 分页参数(每页展示 DevContainer 个数),若未指定,默认值 50
DEV_CONTAINERS_PAGING_NUM = 50
[devstar.devcontainer]
ENABLED = true
AGENT = docker
TIMEOUT_SECONDS = 120
;; 修改为部署host地址
HOST = 192.168.88.88
;; docker desktop必须添加,linux docker环境删除
DOCKER_HOST = tcp://host.docker.internal:2375
1.1.3 开发容器功能使用
- 添加publickey:用户-设置-SSH / GPG 密钥-管理 SSH 密钥
- 创建仓库,新增 .devcontainer/devcontainer.json文件添加 image 字段,例如:"image":"..."(必须是自带OpenSSH服务的镜像)
- 创建开发容器:仓库-开发容器-创建开发容器
1.2 Kubernetes 集群部署
DevStar Studio 在 Kubernetes集群中部署需要使用 Helm Charts,可参考 官方示例 。
推荐将 DevStar Studio 与 Dev Container 进行基于 namespace 的资源 隔离: 由于 k8s RBAC 限制,建议将 DevStar Studio 的主应用程序,数据库和缓存 与 Dev Container 部署在同一个 namespace 下
devstar-studio-ns:- 指定方式:部署 Helm Charts 时候执行
helm install devstar-studio . --namespace devstar-studio-ns --create-namespace - 引用方式:
{{ .Release.Namespace }},例如:apiVersion: v1 kind: ConfigMap metadata: name: devstar-studio-gitea-repository-app-ini-configmap namespace: {{ .Release.Namespace }} data: repository: | MAX_CREATION_LIMIT = 0
- 指定方式:部署 Helm Charts 时候执行
1.2.1 client-go 版本适配 Kubernetes 集群
注意:部署在 k8s 之上要根据 Kubernetes 版本调整 k8s.io/client-go 版本。例如部署在 Kubernetes 1.23.10 之上,需要执行下列指令调整 go packages:
# 移除旧版本 client-go 的信息
go get k8s.io/client-go@none
# 安装适配于 Kubernetes 1.23.10 版本的 client-go
go get k8s.io/client-go@kubernetes-1.23.10
1.2.2 应用配置 app.ini 信息挂载
在 Helm Charts 目录下创建文件夹 templates/devstar-studio-app.ini/,用于存储 Gitea 配置信息,请参考 Docker 版 ini 配置文件字段,使用 ConfigMaps 或者 Secrets 类型资源描述。
对于 ConfigMaps 类型,参考:
apiVersion: v1
kind: ConfigMap
metadata:
name: devstar-studio-gitea-app-ini-configmap
namespace: {{ .Release.Namespace }}
data:
database: |
CHARSET_COLLATION = utf8mb4_bin
cors: |
CONTENT_SECURITY_POLICY = default-src 'self' data: 'unsafe-inline' https://mp.weixin.qq.com; img-src * data:
ui.admin: |
DEV_CONTAINERS_PAGING_NUM = 50
devstar.devcontainer: |
ENABLED = true
AGENT = k8s
TIMEOUT_SECONDS = 120
HOST = <k8s 暴露访问域名或IP,比如 devcontainer.devstar.cn >
NAMESPACE = <k8s DevStar Studio 部署 namespace,比如 devstar-studio-ns >
devstar.ssh_key_pair: |
KEY_SIZE = <写入希望生成的SSH密钥长度,比如 4096 ,默认值 2048>
devstar.cloud: |
ENABLED = true
PROVIDER = tencent
对于 Secrets 类型,参考:
apiVersion: v1
kind: Secret
metadata:
name: devstar-studio-gitea-app-ini-secrets
namespace: {{ .Release.Namespace }}
type: Opaque
stringData:
wechat: |
WECHAT_OFFICIAL_ACCOUNT_TEMP_QR_EXPIRE_SECONDS=60
WECHAT_OFFICIAL_ACCOUNT_APP_ID=<微信公众号APPID>
WECHAT_OFFICIAL_ACCOUNT_APP_SECRET=<微信公众号SECRET>
WECHAT_OFFICIAL_ACCOUNT_MESSAGE_TOKEN = <微信公众号自定义Token>
WECHAT_OFFICIAL_ACCOUNT_MESSAGE_AES_KEY = <微信公众号AES加密密钥>
devstar.cloud.tencent: |
ENDPOINT = <API访问端点名称,例如 vpc.tencentcloudapi.com>
REGION = <区域代码,例如 ap-shanghai>
NAT_GATEWAY_ID = <腾讯云控制台使用的 NAT网关 ID>
PUBLIC_IP_ADDRESS = <公网IP>
PRIVATE_IP_ADDRESS = <内网IP>
IP_PROTOCOL = TCP
SECRET_ID = <腾讯云密钥ID>
SECRET_KEY = <腾讯云密钥内容>
为了使 Gitea启动时,能将配置信息同步到 app.ini 文件中,需要在 Helm Charts /values.yaml 中的 additionalConfigSources 中挂载创建的 ConfigMaps 与 Secrets 资源,示例格式:
## @param gitea.additionalConfigSources Additional configuration from secret or configmap
additionalConfigSources:
- secret:
secretName: devstar-studio-gitea-app-ini-secrets
- configMap:
name: devstar-studio-gitea-app-ini-configmap
1.2.3 Kubernetes RBAC 配置
为了能够在运行时创建 Dev Container,需要配置基于角色的访问控制(Role-Based Access Control, RBAC)。
首先需要再 DevStar Studio 的 Helm Chart 中指定名称为 devstar-studio-gitea-serviceaccount 的 ServiceAccount
修改 values.yaml 文件内容如下:
## @section ServiceAccount
## @param serviceAccount.create Enable the creation of a ServiceAccount
## @param serviceAccount.name Name of the created ServiceAccount, defaults to release name. Can also link to an externally provided ServiceAccount that should be used.
## @param serviceAccount.automountServiceAccountToken Enable/disable auto mounting of the service account token
## @param serviceAccount.imagePullSecrets Image pull secrets, available to the ServiceAccount
## @param serviceAccount.annotations Custom annotations for the ServiceAccount
## @param serviceAccount.labels Custom labels for the ServiceAccount
serviceAccount:
create: true
name: "devstar-studio-gitea-serviceaccount"
automountServiceAccountToken: true
imagePullSecrets: []
# - name: private-registry-access
annotations: {}
labels: {}
当 Helm Chart 部署成功后,可通过下列命令查看 devstar-studio-gitea-serviceaccount 的实际内容:
kubectl get serviceaccount -n devstar-studio-ns devstar-studio-gitea-serviceaccount -o yaml
apiVersion: v1
automountServiceAccountToken: true
kind: ServiceAccount
metadata:
annotations:
meta.helm.sh/release-name: devstar-studio
meta.helm.sh/release-namespace: devstar-studio-ns
creationTimestamp: "2024-10-01T06:49:56Z"
labels:
app: gitea
app.kubernetes.io/instance: devstar-studio
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: gitea
app.kubernetes.io/version: rootless-dev-1fa57bca2dc6922b093157e17f16d5652de1420d
helm.sh/chart: gitea-0.0.0
version: rootless-dev-1fa57bca2dc6922b093157e17f16d5652de1420d
name: devstar-studio-gitea-serviceaccount
namespace: devstar-studio-ns
resourceVersion: "92197844"
uid: 71960972-c76e-4b6a-98b5-9f66f90aefca
secrets:
- name: devstar-studio-gitea-serviceaccount-token-d499q
下一步,需要创建关联该 ServiceAccount 的 RoleBinding
- ClusterRole
通过运行命令查看编辑 DevcontainerApp 的 ClusterRole
kubectl get clusterrole devcontainer-operator-devcontainerapp-editor-role -o yaml
显示结果如下
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
app.kubernetes.io/managed-by: kustomize
app.kubernetes.io/name: devcontainer-operator
name: devcontainer-operator-devcontainerapp-editor-role
rules:
- apiGroups:
- devcontainer.devstar.cn
resources:
- devcontainerapps
verbs:
- create
- delete
- get
- list
- patch
- update
- watch
- apiGroups:
- devcontainer.devstar.cn
resources:
- devcontainerapps/status
verbs:
- get
上述结果表明,ClusterRole devcontainer-operator-devcontainerapp-editor-role 具有如下权限:
- 对于 k8s CRD 资源
DevcontainerApp:创建、删除、获取、列举、部分更新、全量更新、监听 - 对于 k8s CRD 资源
DevcontainerApp的 status 域: 获取
- 创建 ClusterRoleBinding
在 Helm Charts 目录下 创建文件夹 templates/devstar-devcontainer-rbac/,创建下列 ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
app.kubernetes.io/name: devcontainer-operator
app.kubernetes.io/managed-by: kustomize
name: devstar-devcontainerapps-editor-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: devcontainer-operator-devcontainerapp-editor-role
subjects:
- kind: ServiceAccount
name: {{ include "gitea.serviceAccountName" . }}
namespace: {{ .Release.Namespace | quote }}
注意: RBAC 应当对 Gitea 透明,即不得将 RBAC 信息挂载到 /values.yaml 中如 1.2.2 小节所示的 additionalConfigSources 字段
至此,DevStar Studio 已被赋予 k8s CRD 资源 DevcontainerApp 的操作权限,即可操作集群,创建或修改 DevContainer
补充: DevStar Studio 获取集群的控制权限
// GetKubernetesClient func GetKubernetesClient(ctx *context.Context) (dynamicclient.Interface, error) { // 1. 尝试从集群外获取 kubectl 配置信息 config, err := clientcmd.BuildConfigFromFlags("", clientgocmdtools.RecommendedHomeFile) if err != nil { // 1.1 集群外尝试失败,改从集群内获取 kubectl 配置信息 log.Warn("Failed to obtain Kubernetes config outside of cluster: " + clientgocmdtools.RecommendedHomeFile) config, err = clientgorest.InClusterConfig() if err != nil { log.Error("Failed to obtain Kubernetes config both inside/outside of cluster, the DevContainer is Disabled") setting.Devstar.Devcontainer.Enabled = false return nil, err } } // 2. 根据 k8s 配置信息构建 ClientSet dynamicClient, err := dynamicclient.NewForConfig(config) if err != nil { return nil, err } return dynamicClient, err }上述代码考虑了集群内、外两种情况配置 k8s 连接信息:
- 集群之外/Pod 之外:通过
~/.kube/config获取 Token 与 CA 证书文件- 集群 Pod 之内:通过 Pod 内部密钥挂载目录
/var/run/secrets/kubernetes.io/serviceaccount/获取 Token 与 CA 证书文件
Gitea
目标
Gitea 的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言,这使我们只要生成一个可执行程序即可。并且他还支持跨平台,支持 Linux, macOS 和 Windows 以及各种架构,除了 x86,amd64,还包括 ARM 和 PowerPC。
如果你想试用在线演示和报告问题,请访问 demo.gitea.com。
如果你想使用免费的 Gitea 服务(有仓库数量限制),请访问 gitea.com。
如果你想在 Gitea Cloud 上快速部署你自己独享的 Gitea 实例,请访问 cloud.gitea.com 开始免费试用。
提示
- 开始贡献代码之前请确保你已经看过了 贡献者向导(英文).
- 所有的安全问题,请私下发送邮件给 security@gitea.io。谢谢!
- 如果你要使用API,请参见 API 文档.
文档
关于如何安装请访问我们的 文档站,如果没有找到对应的文档,你也可以通过 Discord - 英文 和 QQ群 328432459 来和我们交流。
贡献流程
Fork -> Patch -> Push -> Pull Request
翻译
作者
授权许可
本项目采用 MIT 开源授权许可证,完整的授权说明已放置在 LICENSE 文件中。
截图
![]() |
![]() |
![]() |
|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |











