常用的私有 Git 服务器解决方案

根据不同的需求和场景推荐:

以下是一些常用的私有 Git 服务器解决方案,根据不同的需求和场景推荐:

GitLab CE(社区版)

  • 特点:功能全面(支持 CI/CD、项目管理、代码审查等),适合中大型团队或企业。
  • 优点:
    • 集成 DevOps 工具链,支持自动化部署。
    • 细粒度的权限管理和审计功能。
    • 活跃的社区和持续更新。
  • 缺点:

    • 资源消耗较高(建议至少 4GB 内存)。
    • 部署相对复杂,依赖较多。
  • 部署方式:支持 Docker、Linux 包(如 apt/yum)、云镜像等。

Gitea

  • 特点:轻量、易部署,适合个人或小团队。

  • 优点:

    • 单二进制文件,占用资源极少(1GB 内存即可运行)。
    • 界面简洁,支持基础 Git 仓库管理、Issue 和 Wiki。
    • 支持多语言(中文友好)。
  • 缺点:高级功能(如 CI/CD)需通过插件或第三方工具实现。

  • 部署方式:Docker、二进制直接运行、源码编译。

  • 官网https://gitea.io/

Gogs

  • 特点:Gitea 的前身,更轻量但功能较少。

  • 优点:

    • 极简设计,适合对性能要求低的场景。
    • 部署简单,配置快速。
  • 缺点:

    • 更新频率较低,社区活跃度不如 Gitea。
  • 官网https://gogs.io/

Bitbucket Server(Atlassian Server)

  • 特点:企业级解决方案,适合与 Jira、Confluence 等工具集成。

  • 优点:

    • 深度支持企业工作流和权限管理。
    • 商业支持,稳定性高。
  • 缺点:

    • 需要付费订阅(免费仅限小团队)。
    • 部署和维护成本较高。
  • 官网https://www.atlassian.com/software/bitbucket/server

OneDev

  • 特点:内置 CI/CD,界面现代化,开源免费。

  • 优点:

    • 集成 CI/CD、代码搜索、可视化工作流。
  • 支持 Kubernetes 部署。

  • 缺点:

    • 社区相对较小,文档不如 GitLab 完善。
  • 部署方式:Docker、Java JAR 包。

  • 官网https://onedev.io/

GitBucket

  • 特点:基于 JVM(Scala 编写),插件扩展性强。

  • 优点:

    • 兼容 GitHub 的 API 和插件体系。
    • 支持 Markdown、Issue 跟踪等基础功能。
  • 缺点:

    • 性能一般,适合小型团队。
  • 部署方式:直接运行 JAR 包。

  • 官网https://gitbucket.github.io/

自建 Git 服务器(SSH + Git 原生)

  • 特点:完全手动控制,适合极简需求。

  • 步骤:

    1. 在服务器上安装 Git:sudo apt install git
  1. 创建裸仓库:git init --bare /path/to/repo.git
  2. 通过 SSH 或 HTTPS 访问(需配置 Nginx/Apache)。
  • 优点:无额外依赖,资源占用极低。

  • 缺点:缺乏 Web 界面和高级管理功能。

选择建议

  • 个人/小团队:优先选 Gitea(轻量)或 GitLab CE(功能全)。
  • 企业级需求:考虑 GitLab CEBitbucket Server(付费支持)。
  • 极简主义:直接通过 SSH 搭建原生 Git 服务器。
  • 集成 CI/CDGitLab CEOneDev

部署小贴士

  • 数据备份:定期备份仓库目录和数据库(如 GitLab 使用 gitlab-rake gitlab:backup:create)。
  • HTTPS 配置:使用 Let’s Encrypt 免费证书提升安全性。
  • 容器化:推荐通过 Docker 或 Kubernetes 部署,便于迁移和扩展。

根据团队规模、技术栈和资源情况选择最适合的方案即可。

使用Docke-Compose部署Gitlab CE

由于我们需要平替**Gitee(码云)**,所以选择 GitLab CE(社区版),它功能全面(支持 CI/CD、项目管理、代码审查等)刚好适合团队。

安装Docker及DockerCompose

自行百度安装

创建 docker-compose.yml 文件

创建一个目录(如 gitlab-docker),并在其中新建 docker-compose.yml 文件:

version: '3'

services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: '192.168.18.159' #域名或者IP
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.18.159' #域名或者IP
ports:
- "80:80" # 直接通过IP的80端口访问
- "2222:22" # SSH端口映射(避免与宿主机冲突)
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
shm_size: '1024m'

启动 GitLab 服务

docker-compose.yml 所在目录执行以下命令:

# 启动容器(后台运行)
docker-compose up -d

# 查看启动日志(等待初始化完成,约1-5分钟)
docker-compose logs -f

访问 GitLab

  1. 首次访问:浏览器打开 http://gitlab.example.com(或你的服务器IP)。

  2. 初始用户名/密码:

    • 用户名:root
    • 密码: 从容器中自动生成的随机密码(通过以下命令获取):
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

如果没有输出可以去挂载目录下找到initial_root_password,密码就在文件里

配置 HTTPS(可选)

若需启用 HTTPS,修改 docker-compose.yml

  1. external_url 改为 https://gitlab.example.com

  2. 将 SSL 证书文件(gitlab.example.com.keygitlab.example.com.crt)放入 ./config/ssl/ 目录。

  3. 重启服务:

    docker-compose down && docker-compose up -d

备份与恢复

# 手动备份(数据存储在 ./data 目录)
docker exec -it gitlab gitlab-rake gitlab:backup:create

# 恢复备份(将备份文件放入 ./data/backups 后执行)
docker exec -it gitlab gitlab-backup restore BACKUP=备份文件名

注意事项

  1. 资源需求:GitLab 至少需要 4GB 内存,否则可能启动失败(可通过 docker stats 查看资源占用)。

  2. SSH 端口冲突:如果宿主机已占用 22 端口,需修改 ports 中的 2222:22 并配置 GitLab:

    # 修改 ./config/gitlab.rb 文件
    gitlab_rails['gitlab_shell_ssh_port'] = 2222
  3. 性能优化:若访问缓慢,可调整 ./config/gitlab.rb 中的 unicorn['worker_processes'] 或增加内存。

Gitee迁移到GitLab

通过 Git 镜像迁移

适合需要保留 所有分支、标签和提交历史 的项目。

克隆 Gitee 仓库到本地

# 克隆原始仓库
git clone --mirror https://gitee.com/your-username/your-repo.git
cd your-repo.git

添加 GitLab 远程仓库

# 在 GitLab 上创建同名空项目(不要初始化 README)
# 获取 GitLab 仓库的 URL(如 https://gitlab.example.com/your-username/your-repo.git)

# 添加 GitLab 远程地址
git remote add gitlab https://gitlab.example.com/your-username/your-repo.git

推送所有分支和标签到 GitLab

# 推送所有内容(含分支、标签和提交历史)
git push --mirror gitlab

# 完成后删除本地临时仓库
cd ..
rm -rf your-repo.git

备份设置

修正docke-compose.yml配置

version: '3'

services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: '192.168.18.164'
environment:
GITLAB_OMNIBUS_CONFIG: |
# 基础配置
external_url 'http://192.168.18.164:8001'
nginx['listen_port'] = 80

# 新增备份配置
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" # 备份目录
gitlab_rails['backup_keep_time'] = 604800 # 保留7天
gitlab_rails['backup_archive_permissions'] = 0644 # 文件权限
ports:
- "8001:80"
- "2222:22"
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
- ./backups:/var/opt/gitlab/backups # 新增备份目录挂载
shm_size: '1024m'

关键修改说明

  1. 挂载备份目录:通过 ./backups:/var/opt/gitlab/backups 将备份持久化到宿主机。
  2. 备份保留策略backup_keep_time = 604800 表示自动删除7天前的备份。
  3. 文件权限控制0644 确保备份文件可读但不可执行。

应用配置并验证

# 重建容器
docker-compose down && docker-compose up -d

# 等待初始化完成(约5分钟)
docker-compose logs -f gitlab | grep "gitlab Reconfigured!"

# 手动执行备份测试
docker exec gitlab gitlab-backup create

# 检查宿主机备份文件
ls -lh ./backups/*_gitlab_backup.tar

编写备份脚本

gitlabdocker-compose.yml同目录下新建backup.sh文件,文件内容如下:

#!/bin/bash
# 定义关键路径(基于当前目录)
BACKUP_DIR="/home/gitlab/backups"
CONFIG_DIR="/home/gitlab/config"
LOG_FILE="/home/gitlab/backup.log"

# 执行 GitLab 备份
docker-compose exec -T gitlab gitlab-backup create >> $LOG_FILE 2>&1

# 备份配置文件
cp $CONFIG_DIR/gitlab.rb $CONFIG_DIR/gitlab-secrets.json $BACKUP_DIR/ >> $LOG_FILE 2>&1

# 打包备份文件(含时间戳)
TIMESTAMP=$(date +%Y%m%d%H%M)
tar czvf $BACKUP_DIR/gitlab-$TIMESTAMP.tar.gz \
$BACKUP_DIR/*_gitlab_backup.tar \
$BACKUP_DIR/gitlab.rb \
$BACKUP_DIR/gitlab-secrets.json >> $LOG_FILE 2>&1

# 清理旧备份(保留7天原始文件 + 30天压缩包)
find $BACKUP_DIR -name "*.tar" -mtime +7 -exec rm {} \; >> $LOG_FILE 2>&1
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -exec rm {} \; >> $LOG_FILE 2>&1

定时任务配置

# 编辑当前用户的 cron 任务
crontab -e

# 每天凌晨2点执行备份
0 2 * * * /bin/bash /home/gitlab/backup.sh

验证与测试

cd /home/gitlab
./backup.sh

# 检查备份文件
ls -lh backups/*.tar.gz

# 查看日志
tail -f backup.log

最终效果

  • 停止服务:

    docker-compose stop gitlab
  • 备份文件路径/home/gitlab/backups/gitlab-20231010.tar.gz
  • 恢复命令示例

    #解压备份文件
    tar xzvf backups/gitlab-20231010.tar.gz -C backups/

    #解压后文件:1744620347_2025_04_14_17.10.4_gitlab_backup.tar,其中1744620347_2025_04_14_17.10.4就是备份时间戳

    docker-compose exec gitlab gitlab-backup restore BACKUP=解压后的备份文件名字时间戳