
1. 为什么选择Gitea作为自托管Git服务在开源代码托管领域Gitea凭借其轻量级特性和易部署优势已经成为许多开发团队的首选方案。作为一个完全开源的Git服务它用Go语言编写单二进制即可运行资源占用仅为同类产品的1/3。我最初选择Gitea是因为团队需要在内网搭建代码仓库经过对比测试在2核4G的CentOS虚拟机上Gitea能稳定支持20人团队的日常开发而GitLab在相同配置下经常出现响应延迟。与GitHub Enterprise相比Gitea的安装过程简单到令人惊讶——不需要复杂的依赖环境不需要专业的运维知识甚至不需要数据库内置SQLite3。对于中小团队来说这种开箱即用的特性大幅降低了自建Git服务的门槛。去年我们公司服务器迁移时整个Gitea的迁移过程只用了15分钟包括数据备份、传输和恢复。提示虽然Gitea支持SQLite3但在正式生产环境中建议使用MySQL或PostgreSQL当仓库数量超过100个时性能差异会非常明显。2. CentOS 8环境下的Gitea部署实战2.1 基础环境准备在CentOS 8上部署前需要确保系统已安装必要组件。以下命令会安装EPEL仓库并更新系统sudo dnf install -y epel-release sudo dnf update -y sudo dnf install -y git wget创建专用用户是安全部署的关键步骤。我习惯使用git用户来运行服务这样可以有效隔离权限sudo adduser --system --shell /bin/bash --comment Git Version Control --user-group --create-home git sudo passwd git # 设置密码用于SSH访问2.2 二进制安装与配置从官网下载最新稳定版当前为1.17.3sudo su - git wget -O gitea https://dl.gitea.io/gitea/1.17.3/gitea-1.17.3-linux-amd64 chmod x gitea创建必要的目录结构mkdir -p ~/gitea/{custom,data,log}初始化配置时我强烈建议使用systemd管理服务。创建/etc/systemd/system/gitea.service文件[Unit] DescriptionGitea Aftersyslog.target network.target [Service] Usergit Groupgit WorkingDirectory/home/git/gitea ExecStart/home/git/gitea/gitea web --config /home/git/gitea/custom/conf/app.ini Restartalways [Install] WantedBymulti-user.target2.3 数据库配置技巧虽然SQLite3可以快速上手但MySQL才是生产环境的最佳选择。安装MariaDB并创建数据库sudo dnf install -y mariadb-server sudo systemctl enable --now mariadb sudo mysql_secure_installation mysql -u root -p CREATE DATABASE giteadb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON giteadb.* TO gitealocalhost IDENTIFIED BY 你的密码; FLUSH PRIVILEGES;在app.ini配置文件中数据库连接部分应该这样配置[database] DB_TYPE mysql HOST 127.0.0.1:3306 NAME giteadb USER gitea PASSWD 你的密码3. Gitea的核心功能深度解析3.1 仓库管理实战技巧创建第一个仓库时Gitea提供了丰富的初始化选项。我建议始终勾选初始化README文件这可以避免创建空仓库导致的后续问题。在团队协作中分支保护功能尤为重要进入仓库设置 → 分支添加分支保护规则如main分支勾选要求拉取请求前通过CI检查设置代码审核人数通常2人注意Gitea的.gitignore模板比GitHub少但可以通过在/home/git/gitea/custom/options目录下添加自定义模板来扩展。3.2 工单系统与项目管理Gitea的工单系统支持Markdown格式和标签分类。在实际项目中我建立了这样的工作流使用模板创建工单缺陷报告/功能请求设置优先级标签P0-P3关联里程碑版本计划通过#123引用提交一个实用的技巧是在提交信息中自动关闭工单git commit -m 修复登录异常问题 fix #453.3 CI/CD集成方案虽然Gitea没有内置CI但可以通过Webhook与Drone、Jenkins等工具集成。以下是一个典型的Webhook配置仓库设置 → Web钩子 → 添加Web钩子选择Gitea类型填写目标URL如Jenkins的Git插件地址触发事件选择推送事件和拉取请求在Jenkins端需要安装Gitea插件并在项目配置中启用Gitea触发器。4. 安全加固与漏洞防范4.1 常见漏洞应对策略2023年Gitea曾曝出过CVE-2023-29447路径穿越漏洞。防范措施包括及时更新到最新版本禁用不必要的功能如Wiki、外部工单定期检查日志中的异常请求使用以下命令检查当前版本/home/git/gitea/gitea --version更新步骤sudo systemctl stop gitea sudo su - git wget -O gitea https://dl.gitea.io/gitea/最新版本号/gitea-最新版本号-linux-amd64 chmod x gitea exit sudo systemctl start gitea4.2 备份与恢复方案我采用双备份策略每日增量每周全量。备份脚本示例#!/bin/bash # 全量备份 mysqldump -u gitea -p giteadb /backup/gitea_db_$(date %Y%m%d).sql tar czvf /backup/gitea_data_$(date %Y%m%d).tar.gz /home/git/gitea/data恢复时需要特别注意权限问题sudo systemctl stop gitea mysql -u gitea -p giteadb gitea_db_20230801.sql tar xzvf gitea_data_20230801.tar.gz -C / sudo chown -R git:git /home/git/gitea sudo systemctl start gitea5. 高级配置与性能调优5.1 邮件服务配置正确的邮件配置能确保通知及时送达。在app.ini中添加[mailer] ENABLED true HOST smtp.yourdomain.com:465 FROM giteayourdomain.com USER giteayourdomain.com PASSWD 你的密码 PROTOCOL smtps测试配置是否生效sudo su - git cd ~/gitea ./gitea admin user create --username test --password test --email youremail.com5.2 性能优化参数对于100人以上的团队这些调整可以显著提升性能[server] PROTOCOL http DOMAIN git.yourcompany.com HTTP_PORT 3000 ROOT_URL http://git.yourcompany.com:3000 DISABLE_SSH false SSH_PORT 22 OFFLINE_MODE false ENABLE_GZIP true [database] LOG_SQL false MAX_OPEN_CONNS 100 MAX_IDLE_CONNS 20在Nginx反向代理配置中添加缓存策略能进一步提升响应速度location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 30d; add_header Cache-Control public; }6. 日常使用中的高效技巧6.1 命令行快捷操作Gitea的CLI工具gitea非常强大。常用命令包括# 列出所有用户 ./gitea admin user list # 创建组织 ./gitea admin user create-org --username 组织创建者 --orgname 新组织名 # 重置用户密码 ./gitea admin user change-password --username 用户名 --password 新密码6.2 批量处理脚本当需要迁移大量仓库时这个Python脚本可以节省时间import requests from requests.auth import HTTPBasicAuth auth HTTPBasicAuth(admin, 密码) base_url http://localhost:3000/api/v1 # 创建组织 org_data {username: new_team} requests.post(f{base_url}/orgs, jsonorg_data, authauth) # 批量导入仓库 repos [project1, project2, project3] for repo in repos: repo_data { name: repo, auto_init: True, private: True } requests.post(f{base_url}/org/new_team/repos, jsonrepo_data, authauth)6.3 移动端适配方案虽然Gitea没有官方App但可以通过PWA实现接近原生体验在Nginx配置中添加add_header Service-Worker-Allowed /;注册Service Workerif (serviceWorker in navigator) { navigator.serviceWorker.register(/sw.js); }创建manifest.json{ name: 公司Git服务, short_name: Gitea, start_url: /, display: standalone, background_color: #ffffff, icons: [...] }