Gitea搭配MySQL实战:从Docker Compose一键部署到团队权限精细化管理
Gitea与MySQL容器化协作企业级代码仓库部署与权限管控指南当团队规模突破5人时Git仓库管理就会从能用就行升级为如何高效协作的工程问题。上周我帮一个8人手游团队迁移到自建Gitea平台时发现多数教程只教到安装完成却没人说清楚怎么配置SSH证书轮换、如何设置跨项目权限组这些实际痛点。本文将用生产环境的标准演示如何用Docker Compose构建带MySQL的Gitea服务重点解决三个核心问题服务如何持久化不丢数据多人协作时权限怎么分配合理Webhook如何对接CI流水线1. 容器编排架构设计1.1 容器拓扑方案对比单容器部署Gitea虽然简单但存在两个致命缺陷SQLite数据库性能随提交量下降明显且容器重建时容易丢失配置。我们采用双容器方案version: 3 services: gitea: image: gitea/gitea:1.21 depends_on: db: condition: service_healthy volumes: - ./gitea/data:/data - ./gitea/config:/etc/gitea ports: - 3000:3000 - 222:22 environment: - USER_UID1000 - USER_GID1000 db: image: mysql:8.0 command: --default-authentication-pluginmysql_native_password volumes: - ./mysql/data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORDgitea_root_pw - MYSQL_USERgitea - MYSQL_PASSWORDgitea_db_pw - MYSQL_DATABASEgitea healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 5s timeout: 3s retries: 10关键设计要点数据卷映射将容器内/data和/etc/gitea映射到宿主机即使容器销毁配置也不丢失健康检查MySQL服务就绪后才启动Gitea容器SSH端口分离将22端口映射到宿主机的222端口避免与系统SSH冲突1.2 网络性能优化默认的bridge网络会产生NAT开销建议创建自定义网络并固定IP段docker network create --subnet172.20.0.0/24 gitea_net然后在compose文件中添加networks: default: ipam: config: - subnet: 172.20.0.0/242. 生产环境初始化配置2.1 首次安装参数首次访问http://localhost:3000 时会进入安装页面有几个关键配置项容易踩坑配置项推荐值说明数据库连接字符串db:3306使用Docker服务名而非IPSMTP服务器smtp.exmail.qq.com:465必须配置正确才能发送issue通知管理员账号避免使用admin建议用team-admin这类不易被爆破的名称服务域名git.yourcompany.com后续修改需要重建容器2.2 邮件服务验证在/etc/gitea/app.ini中添加测试配置[mailer] ENABLED true HOST smtp.exmail.qq.com:465 FROM gityourcompany.com USER gityourcompany.com PASSWD your_password SKIP_VERIFY false重启容器后执行docker exec -it gitea bash -c gitea admin user create --email testyourcompany.com检查是否收到验证邮件这是后续协作通知的基础。3. 团队权限精细化管理3.1 组织结构设计中小团队推荐采用项目组特殊角色的混合模式基础组别按职能划分前端组只读核心库可写组件库后端组全权限微服务仓库测试组issue管理权限特殊权限按能力授予架构师跨项目访问权限实习生受限push权限3.2 权限矩阵配置通过设置 - 权限管理可以创建细粒度规则仓库模式读权限写权限管理员权限公开项目所有人团队成员项目负责人内部项目全公司开发组技术总监私有项目项目成员核心开发CTO实际案例给手游项目组配置特殊权限创建mobile-game组织添加client-unity、server-go仓库设置美术组只有client-unity/Assets/Art目录的写权限4. 自动化集成实践4.1 Webhook配置指南在仓库设置中添加Jenkins触发器{ url: http://jenkins.yourcompany.com/gitea-webhook/, content_type: json, secret: your_shared_secret, events: [ push, pull_request ] }4.2 CI/CD流水线示例在.gitea/workflows/build.yaml中定义name: Unity Build Pipeline on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Setup Unity uses: game-ci/unity-setupv2 with: unity_version: 2022.3.11f1 - name: Build APK uses: game-ci/unity-builderv2 with: targetPlatform: Android5. 运维监控与灾备5.1 日志收集方案修改compose文件添加日志驱动services: gitea: logging: driver: json-file options: max-size: 10m max-file: 3常用诊断命令# 查看实时日志 docker compose logs -f gitea # 数据库连接检查 docker exec -it gitea bash -c gitea doctor --all5.2 备份恢复策略创建每日备份任务#!/bin/bash docker exec db mysqldump -u root -pgitea_root_pw gitea /backups/gitea-db-$(date %Y%m%d).sql tar czvf /backups/gitea-data-$(date %Y%m%d).tar.gz /var/lib/docker/volumes/gitea_{data,config}恢复时执行反向操作mysql -u root -pgitea_root_pw gitea gitea-db-20230801.sql tar xzvf gitea-data-20230801.tar.gz -C /建议搭配NAS的快照功能实现版本化备份。最近一次迁移中这个方案帮我们在17分钟内完成了200GB仓库数据的全量恢复。