--- title: gitea 自部署使用体验 tags: [git, docker] date: 2025-11-29T00:00:00Z summary: 本文基于 Docker Compose 一键启动 Gitea + Gitea Runner 的实战记录。 --- > 注意:本文基于 Docker Compose 一键启动 Gitea + Gitea Runner 的实战记录。 ## 为什么使用 gitea 使用 gitea,主要原因是它的内存占用低,只有100 M 左右,而 gitlab 官方推荐的最小配置是 4 G 内存。github 在大多数区域访问速度较慢,而 gitea 可以在自部署的情况下,提供与 github 相同的功能。 ## 架构速览 Gitea 采用微内核 + 插件扩展的轻量架构,核心组件如下: 1. **Web 服务层** - 基于 Go 的 HTTP 服务(Gin 框架) - 提供 Web UI、REST & Git 协议入口 2. **业务逻辑层** - 路由与中间件(鉴权、CSRF、Session) - 仓库管理(Git 命令封装、钩子触发) - 组织/用户/权限模型(RBAC) 3. **存储层** - **SQLite**(默认,单文件零配置) - **MySQL / PostgreSQL**(生产推荐) - 文件系统:Git 裸仓库、LFS 对象、头像、日志 4. **后台任务** - 定时器:镜像同步、归档清理、统计更新 - 队列:邮件、WebHook、索引构建 5. **可选扩展** - **Gitea Runner**:基于 act(兼容 GitHub Actions)的 CI 执行器 - **包管理**:npm、maven、nuget、docker registry 统一入口 ### 架构图(Mermaid) ```mermaid graph TD %% 客户端层 Client_Web[Web浏览器] Client_Git[Git客户端] Client_API[API客户端] %% 负载层 Proxy[Nginx / 反向代理] %% 核心服务层 subgraph Gitea核心服务 Web[Web服务 / Gin] API[RESTful API] Git[Git协议处理器] Auth[认证授权 / Session / OAuth] end %% 业务逻辑层 subgraph 业务逻辑层 Repo[仓库管理] User[用户与组织] ACL[权限控制 RBAC] Hook[WebHook] Mail[邮件服务] end %% 存储层 subgraph 数据存储层 DB[(数据库
SQLite/MySQL)] FS[(Git仓库文件)] LFS[(LFS对象)] Cache[(Redis缓存)] end %% 扩展 Runner[[Gitea Runner
CI/CD]] Pack[[包管理
npm/docker]] %% 关系连线 Client_Web --> Proxy Client_Git --> Proxy Client_API --> Proxy Proxy --> Web Proxy --> API Proxy --> Git Web --> Auth API --> Auth Git --> Auth Auth --> Repo Auth --> User Auth --> ACL Repo --> DB Repo --> FS Repo --> LFS User --> DB ACL --> DB Repo --> Hook Hook --> Mail Runner -.-> API Pack -.-> FS ``` ### 架构说明 **Gitea** 采用分层架构设计,各层职责清晰: 1. **客户端层**:支持 Web 浏览器、Git 客户端和 API 客户端访问 2. **负载均衡层**:可通过 Nginx/Apache 实现反向代理和负载均衡 3. **核心服务层**:提供 Web UI、API 接口和 Git 协议支持 4. **业务逻辑层**:处理仓库、用户、组织管理和权限控制 5. **数据存储层**:支持多种数据库和文件系统存储 6. **后台任务**:负责定时任务、队列处理和同步操作 7. **扩展功能**:提供 CI/CD、包管理和代码搜索等可选功能 这种架构设计使得 Gitea 具有轻量级、高可用和易扩展的特点。 ### 架构特点说明 **1. 轻量级设计** - 单二进制文件部署,内存占用仅100M左右 - 内置Web服务器,无需额外HTTP服务 - SQLite零配置支持,适合个人和小团队 **2. 模块化架构** - 核心服务与业务逻辑分离 - 插件化扩展机制 - 可选组件按需启用 **3. 数据一致性** - Git裸仓库直接存储,保证数据完整性 - 数据库存储元数据,支持快速查询 - LFS支持大文件存储 **4. 高可用支持** - 支持数据库主从复制 - 文件系统可对接分布式存储 - 会话和缓存支持外部存储 ## docker compose 部署 > docker 和 docker compose 的安装可以参考 [docker 官方文档](https://docs.docker.com/get-docker/) ```yaml networks: gitea: external: false services: gitea: image: gitea/gitea:latest container_name: gitea environment: - USER_UID=1000 - USER_GID=10 - GITEA__database__DB_TYPE=mysql - GITEA__database__HOST=db:3306 - GITEA__database__NAME=gitea - GITEA__database__USER=gitea - GITEA__database__PASSWD=xxxxx restart: always networks: - gitea volumes: - ./data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "23000:3000" - "22222:22" depends_on: - db db: image: mysql:8 container_name: mysql-gitea restart: always environment: - MYSQL_ROOT_PASSWORD=gitea - MYSQL_USER=gitea - MYSQL_PASSWORD=xxxxxx - MYSQL_DATABASE=gitea networks: - gitea volumes: - ./mysql:/var/lib/mysql runner: image: gitea/act_runner:latest container_name: runner restart: always depends_on: - gitea volumes: - ./runner/data:/data - ./runner/cache:/root/.cache - ./runner/config.yaml:/config.yaml - /var/run/docker.sock:/var/run/docker.sock networks: - gitea environment: - GITEA_INSTANCE_URL=http://gitea:3000/ - GITEA_RUNNER_REGISTRATION_TOKEN=xxxxxxx - CONFIG_FILE=/config.yaml - GITEA_RUNNER_NAME=docker-runner - GITEA_RUNNER_LABELS=docker ``` 其中,runner 的 token可以先随便填一个,后面在 gitea 中注册时会替换。