【Linux从入门到精通】第39篇:版本控制Git服务器搭建——Gitea/GitLab私有化部署
目录一、引言为什么需要私有Git服务器二、Git底层协议三种通信方式2.1 本地协议file://2.2 HTTP/HTTPS协议2.3 SSH协议2.4 Git协议原生协议2.5 三种协议对比总结三、搭建Gitea3.1 环境准备3.2 创建数据库3.3 下载并配置Gitea3.4 注册为systemd服务3.5 Web界面初始化3.6 创建仓库并推送代码四、配置SSH免密推送4.1 Gitea的SSH设计4.2 配置步骤4.3 如果SSH不通的排查五、备份与维护5.1 Gitea备份5.2 升级Gitea六、本篇小结动手练习七、下篇预告一、引言为什么需要私有Git服务器GitHub很好用但在某些场景下你需要把代码放在自己手里代码合规金融、政务等行业要求代码不得出境访问速度内网开发时GitHub偶尔抽风会影响整个团队完全控制自定义备份策略、集成公司SSO单点登录、审计所有操作日志市面上有两个主流选择平台定位资源要求适合场景Gitea轻量级自托管Git服务1核1G即可流畅运行小型团队、个人项目GitLab企业级DevOps平台最低4核4G大型团队、需要CI/CDGitea是Go语言编写的一个开源Git托管平台安装包只有几十MB内存占用极低。GitLab功能更全面内置CI/CD、Docker Registry等但资源消耗是Gitea的5倍以上。对于学习和中小型项目Gitea是最佳起点。二、Git底层协议三种通信方式在搭建Git服务器之前先理解git clone底层用了什么协议。Git支持三种传输协议2.1 本地协议file://bashgit clone /path/to/repo.git git clone file:///path/to/repo.git直接从本地文件系统克隆。几乎不用网络但只能在同一台机器上操作。2.2 HTTP/HTTPS协议bashgit clone https://github.com/user/repo.git认证方式用户名密码或Token。企业防火墙通常放行HTTPS端口因此最通用。智能HTTPGit 1.6.6引入的优化服务端能主动选择只发送客户端需要的对象而不是整个仓库大幅减少数据传输量。2.3 SSH协议bashgit clone gitgithub.com:user/repo.git认证方式SSH密钥对我们在第19篇详细学过。这是开发者最常用的方式因为配置免密后推送代码无需每次输入密码。2.4 Git协议原生协议使用端口9418无加密且不要求认证。由于缺乏安全性和实际部署困难实际项目中极少使用。2.5 三种协议对比总结协议认证方式加密防火墙友好适用场景HTTPS密码/Token✅ TLS加密✅ 通常放行443通用首次使用者友好SSH密钥对✅ SSH加密⚠️ 部分防火墙拦截22开发者日常使用免密本地无依赖文件系统权限❌N/A单机测试实际项目中的最佳实践日常工作用SSH免密推送只在首次克隆或CI/CD自动化脚本中使用HTTPS。这两种方式可以同时配置共用同一个远程仓库。三、搭建Gitea3.1 环境准备Gitea官方提供了编译好的二进制文件下载即可运行。它支持SQLite、MySQL、PostgreSQL作为数据库。生产环境推荐MySQL。bash# 创建运行Gitea的系统用户 sudo adduser --system --group --disabled-password --home /home/git git # 安装MySQL参考第33篇 sudo apt update sudo apt install mysql-server -y sudo mysql_secure_installation3.2 创建数据库sqlsudo mysql -u root -psqlCREATE DATABASE gitea CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER gitealocalhost IDENTIFIED BY GiteaStrongPassword123!; GRANT ALL PRIVILEGES ON gitea.* TO gitealocalhost; FLUSH PRIVILEGES; EXIT;3.3 下载并配置Giteabash# 下载最新稳定版以1.21为例实际请访问 https://dl.gitea.com 获取最新版本号 wget -O /usr/local/bin/gitea https://dl.gitea.com/gitea/1.21/gitea-1.21-linux-amd64 sudo chmod x /usr/local/bin/gitea # 创建工作目录 sudo mkdir -p /var/lib/gitea/{custom,data,log} sudo chown -R git:git /var/lib/gitea/ sudo chmod -R 750 /var/lib/gitea/3.4 注册为systemd服务使用第15篇学过的systemd技能将Gitea注册为系统服务bashsudo vim /etc/systemd/system/gitea.serviceini[Unit] DescriptionGitea (Git with a cup of tea) Aftersyslog.target Afternetwork.target Aftermysql.service [Service] Typesimple Usergit Groupgit WorkingDirectory/var/lib/gitea/ ExecStart/usr/local/bin/gitea web --config /etc/gitea/app.ini Restartalways EnvironmentUSERgit HOME/home/git GITEA_WORK_DIR/var/lib/gitea [Install] WantedBymulti-user.targetbashsudo systemctl daemon-reload sudo systemctl enable --now gitea3.5 Web界面初始化浏览器访问http://服务器IP:3000进入首次安装向导配置项建议值说明数据库类型MySQL选择你之前创建的数据库数据库主机127.0.0.1:3306本地数据库数据库用户gitea之前创建的用户数据库密码GiteaStrongPassword123!之前设置的密码数据库名gitea之前创建的数据库站点名称My Team Git自定义域名服务器IP或域名生成克隆URL时使用SSH端口22保持不变基础URLhttp://服务器IP:3000/对外提供服务的地址点击“安装Gitea”后自动完成数据库初始化和配置写入。3.6 创建仓库并推送代码安装完成后注册第一个用户自动成为管理员然后创建仓库bash# 在本地项目目录中 git init git add . git commit -m Initial commit git remote add origin http://服务器IP:3000/用户名/仓库名.git git push -u origin main四、配置SSH免密推送4.1 Gitea的SSH设计Gitea通过/home/git/.ssh/authorized_keys管理所有用户的SSH公钥。当你在Web界面添加SSH公钥时Gitea会自动写入这个文件并配合内部的gitea serv命令来区分不同用户的权限。4.2 配置步骤第一步生成密钥对在你的本地电脑上bashssh-keygen -t ed25519 -C your_emailexample.com第二步在Gitea Web界面添加公钥登录Gitea → 右上角头像 → 设置 → SSH/GPG密钥 → 添加密钥bash# 复制公钥内容 cat ~/.ssh/id_ed25519.pub粘贴到文本框保存。第三步用SSH地址克隆bashgit clone git服务器IP:用户名/仓库名.git # 或者在仓库页面直接复制SSH地址4.3 如果SSH不通的排查bash# 测试SSH连接 ssh -vT git服务器IP # 正常情况应该看到 Hi there, 用户名! Youve successfully authenticated... # 如果没有检查 /home/git/.ssh/authorized_keys 中是否有你的公钥五、备份与维护5.1 Gitea备份Gitea的数据包含两个部分数据库存元数据和仓库目录存Git对象和附件。备份时需要同时备份两者bash# 备份数据库 sudo mysqldump -u root -p gitea gitea_db_backup.sql # 备份仓库目录 sudo rsync -av /var/lib/gitea/data/repositories/ /backup/gitea-repos/使用第38篇学到的定时同步利器rsync配合crontab定时执行bash0 3 * * * /opt/scripts/gitea_backup.sh5.2 升级GiteaGitea的升级非常简洁——下载新版本二进制文件替换即可bash# 1. 停止服务 sudo systemctl stop gitea # 2. 备份重要 # 执行上面的备份步骤 # 3. 下载新版本并替换 wget -O gitea_new https://dl.gitea.com/gitea/版本号/gitea-版本号-linux-amd64 sudo mv gitea_new /usr/local/bin/gitea sudo chmod x /usr/local/bin/gitea # 4. 启动服务 sudo systemctl start gitea六、本篇小结Git协议选择协议特点使用场景SSH密钥认证免密推送开发者日常工作推荐HTTPS密码/Token认证CI/CD脚本、首次使用本地无网络需求单机测试Gitea搭建流程创建MySQL数据库和用户下载Gitea二进制文件创建工作目录注册为systemd服务Web界面完成初始化配置添加SSH公钥用git clone git服务器:用户/仓库.git推送代码核心优势二进制文件几十MB资源占用极低内置Wiki、Issue跟踪、Pull Request、ActionsCI/CD维护简单升级就是替换一个文件动手练习bash# 1. 下载并运行Gitea使用内置SQLite快速体验无需装MySQL wget -O gitea https://dl.gitea.com/gitea/1.21/gitea-1.21-linux-amd64 chmod x gitea ./gitea web # 使用SQLite作为数据库默认跳过MySQL安装 # 在另一终端或浏览器访问 http://localhost:3000 # 初始配置选SQLite3路径填任意可写目录即可 # 2. 创建一个测试仓库 # 在Web界面创建后本地测试推送 mkdir test-repo cd test-repo git init echo # Test README.md git add . git commit -m first commit git remote add origin http://localhost:3000/你的用户名/test-repo.git git push -u origin main # 3. 配置SSH免密 # 在Web界面 → 设置 → SSH密钥 → 添加 ~/.ssh/id_ed25519.pub git remote set-url origin gitlocalhost:你的用户名/test-repo.git git pull # 测试SSH免密是否生效 # 4. 如果只想临时体验体验后停止并清理 # CtrlC 停止 ./gitea web # rm -rf gitea gitea.db test-repo七、下篇预告Gitea让团队有了私有代码仓库但Web应用还没部署到生产环境。下一篇我们将搭建LAMP/LNMP环境——Linux Nginx/Apache MySQL PHP/Python这是运行Web应用的经典组合。与前面各篇文章零散安装不同这次我们将用一篇Shell脚本把Nginx、MySQL、PHP从安装到配置全部自动化真正把第二阶段学到的脚本技能用到生产实战中。延伸思考Git与rsync都是“增量传输”但思路完全不同。rsync用校验和匹配找到变化的部分Git在最初的设计中依靠对象模型——如果两个文件内容相同它们共享同一个对象的哈希从根本上避免了重复存储。Git的pack文件进一步把多个对象增量压缩接近rsync的效果但实现更复杂。这是同一问题的两种不同解法rsync面向通用同步Git面向版本历史。