如何使用docker部署git托管平台
对于不同开源库的对比,可以根据自己的实际情况选择适合你的一款; docs.gitea.com/zh-cn/insta...
这里介绍一下 gitLab & gitea
docker 部署 gitLab 社区版本
使用 Docker Compose 部署 GitLab
置条件你的docker安装了Docker Compose
如果你想使用 Docker Compose 来管理 GitLab,可以使用下面的 docker-compose.yml 配置文件
创建 Docker Compose 文件
- 在你的服务器上创建一个目录用于存放 GitLab 的配置:
 
            
            
              bash
              
              
            
          
          mkdir -p /srv/gitlab
cd /srv/gitlab
        - 创建 
docker-compose.yml文件,内容如下: 
            
            
              yaml
              
              
            
          
          version: '3.6'
services:
  gitlab:
    # 安装的版本信息, 选择社区版本
    image: gitlab/gitlab-ce:<version>-ee.0
    container_name: gitlab
    restart: always
    # your docker adress
    hostname: 'gitlab.example.com'
    # 环境变量, 这里配置的端口是你gitlab仓库项目的地址端口
    environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://gitlab.example.com:8929' gitlab_rails['gitlab_shell_ssh_port'] = 2424
    # 与容器的端口映射关系
    ports:
      - '80:80'
      - '443:443'
      - '22:22'
    # 卷映射
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    # 最大运行内存
    shm_size: '256m'
        - volumes:映射 GitLab 配置、日志和数据目录到宿主机的目录,以保证数据持久化。
 - ports:将容器内的端口映射到宿主机的端口。
 - hostname:设置 GitLab 的主机名,可以使用你自己的域名。
 - external_url:GitLab 访问的 URL,建议使用 HTTP 或 HTTPS 协议。
 
- 启动 GitLab 服务: 使用以下命令启动 GitLab 容器:
 
            
            
              bash
              
              
            
          
          docker-compose up -d
        该命令会在后台启动 GitLab 服务,所有的配置会根据 docker-compose.yml 文件自动执行。
访问 GitLab
一切配置好后,打开浏览器并访问以下地址(根据你的配置修改域名或 IP):
http://gitlab.example.com(如果是 HTTP)https://gitlab.example.com(如果配置了 SSL)
第一次登录时,GitLab 会要求你设置管理员密码,默认的管理员用户名是 root,密码就是你设置的密码。
root密码管理
- 
初始密码
/gitlab/config/password文件 - 
忘记密码,重置密码
shsudo gitlab-rake "gitlab:password:reset" - 
修改密码
在左侧边栏上,选择您的头像 => 个人资料 => 侧边栏上,选择密码 => 即可修改
 
配置 GitLab 邮件服务
如果你希望 GitLab 能够发送邮件通知(如注册、密码重置等),你需要配置 SMTP 服务器。
在 GitLab 配置中,添加以下内容来启用 SMTP 配置:
- 
修改
/srv/gitlab/config/gitlab.rb配置文件(这个路径需要根据你的实际挂载路径进行调整)。 - 
找到并修改如下配置:
rubygitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.yourdomain.com" gitlab_rails['smtp_port'] = 587 gitlab_rails['smtp_user_name'] = "user@yourdomain.com" gitlab_rails['smtp_password'] = "password" gitlab_rails['smtp_domain'] = "yourdomain.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = false - 
配置好后,重新配置并重启 GitLab:
bashdocker exec -it gitlab gitlab-ctl reconfigure 
备份 GitLab 数据
为了防止数据丢失,建议定期备份 GitLab 数据。在容器内运行以下命令来创建备份:
            
            
              bash
              
              
            
          
          docker exec -t gitlab gitlab-rake gitlab:backup:create
        备份文件会存放在 /var/opt/gitlab/backups 目录下,确保你将该目录映射到宿主机的某个安全位置。
GitLab 数据恢复
如果需要恢复备份,可以使用以下命令:
            
            
              bash
              
              
            
          
          docker exec -t gitlab gitlab-rake gitlab:backup:restore BACKUP=<timestamp_of_backup>
        其中,<timestamp_of_backup> 是备份文件的时间戳。
根据path的升级,建议写sh脚本实现;
升级的路径可以根据这个tool
 按照这个顺序依次进行升级; 
upgrade_gitlab.sh这个脚本下面会介绍;
            
            
              bash
              
              
            
          
          ./upgrade_gitlab.sh 16.11.10-ce.0
        脚本说明:
- 传入的新版本号:通过命令行参数传递。
 - 获取旧版本号 :通过读取 
docker-compose.yml文件中image配置来获取当前使用的版本号。 - 备份当前数据:使用 GitLab 提供的备份命令进行备份。
 - 修改版本号 :根据传入的新版本号修改 
docker-compose.yml中的 GitLab 镜像版本。 - 重新部署 :使用 
docker-compose重启服务以应用新版本。 - 删除备份:升级成功后删除备份文件。
 
脚本代码:
            
            
              bash
              
              
            
          
          #!/bin/bash
# 检查是否传入新版本号
if [ -z "$1" ]; then
  echo "请传入新的 GitLab 版本号"
  exit 1
fi
NEW_VERSION=$1
# 定义 GitLab 容器和备份目录
COMPOSE_FILE="docker-compose.yml"
BACKUP_DIR="/srv/gitlab/backups"
GITLAB_CONTAINER_NAME="gitlab"
# 获取当前 GitLab 版本
CURRENT_VERSION=$(grep "image: 'gitlab/gitlab-ce" $COMPOSE_FILE | awk -F: '{print $3}' | sed "s/'//g")
# 打印当前版本和新版本
echo "当前 GitLab 版本: $CURRENT_VERSION"
echo "将升级到的 GitLab 版本: $NEW_VERSION"
# 备份当前 GitLab 数据
echo "开始备份当前 GitLab 数据..."
docker exec -t $GITLAB_CONTAINER_NAME gitlab-rake gitlab:backup:create
# 确认备份是否成功
if [ $? -eq 0 ]; then
  echo "备份成功"
else
  echo "备份失败,脚本终止"
  exit 1
fi
# 修改 docker-compose.yml 文件中的 GitLab 版本
echo "正在升级 GitLab 镜像版本..."
sed -i "s|image: 'gitlab/gitlab-ce:$CURRENT_VERSION'|image: 'gitlab/gitlab-ce:$NEW_VERSION'|" $COMPOSE_FILE
# 启动新版本
echo "正在拉取新的 GitLab 镜像并重启容器..."
docker-compose pull
docker-compose up -d
# 等待容器启动完成
echo "GitLab 升级中,请稍等..."
sleep 30  # 等待 30 秒,给容器足够时间启动
# 检查 GitLab 容器是否成功启动
if docker ps | grep -q "$GITLAB_CONTAINER_NAME"; then
  echo "GitLab 升级成功!"
else
  echo "GitLab 升级失败,请检查日志。"
  exit 1
fi
# 删除备份
echo "删除旧的备份文件..."
rm -rf $BACKUP_DIR/*
echo "升级过程完成,备份已删除。"
        脚本的详细步骤:
- 检查版本号参数 :脚本会检查是否传入新的 GitLab 版本号(
$1)。如果没有传入版本号,脚本会退出并提示用户输入。 - 获取当前版本号 :通过 
docker-compose.yml文件,脚本读取当前使用的 GitLab 镜像版本号。 - 备份当前 GitLab 数据 :通过 
docker exec执行 GitLab 内部的gitlab-rake gitlab:backup:create命令进行数据备份。 - 修改版本号 :使用 
sed命令修改docker-compose.yml文件中的 GitLab 镜像版本号为新的版本。 - 拉取新版本并重启容器 :使用 
docker-compose pull拉取新版本的镜像,然后使用docker-compose up -d重启容器。 - 检查容器是否正常启动 :脚本通过 
docker ps检查 GitLab 容器是否正常运行。 - 删除备份:在升级成功后,脚本会删除备份文件以释放空间。
 
使用方式:
- 
将此脚本保存为
upgrade_gitlab.sh文件。 - 
给脚本添加可执行权限:
bashchmod +x upgrade_gitlab.sh - 
运行脚本并传入新的版本号:
bash./upgrade_gitlab.sh 14.9.2-ce.0其中
14.9.2-ce.0是你要升级到的 GitLab 版本号。 
docker 部署 gitea
部署步骤
可以根据官方步骤进行,有中文文档,这里就不阐述了
数据的备份恢复以及定期清理
在 Gitea 中进行数据的备份和恢复,可以通过脚本自动化管理。为了确保数据的安全性,并且避免长期积累过多的备份,我们可以创建一个脚本来定期备份 Gitea 数据、保存 7 天内的备份文件并清理过期的备份。
目标
- 定期备份 Gitea 数据(例如数据库、配置、存储等)。
 - 每次备份时保留最近 7 天的备份,删除超过 7 天的备份文件。
 
思路
- 备份 Gitea 数据 :使用 
docker exec或相应的命令对 Gitea 的数据库和配置文件进行备份。 - 压缩备份文件:为了节省空间,可以将备份文件压缩。
 - 保留 7 天的备份:在每次备份时,检查备份目录中哪些文件已经超过 7 天,并删除它们。
 - 定期执行备份:可以通过定时任务(cron)来定期执行该备份脚本。
 
脚本实现
            
            
              bash
              
              
            
          
          #!/bin/bash
# 配置路径和备份目录
GITEA_CONTAINER_NAME="gitea"           # Gitea 容器的名称
BACKUP_DIR="/srv/gitea/backup"        # 备份文件存放的路径
DATE=$(date +"%Y%m%d_%H%M%S")         # 当前日期时间,用于备份文件的命名
BACKUP_FILE="$BACKUP_DIR/gitea_backup_$DATE.tar.gz"  # 备份文件名
GITEA_DATA_DIR="/data/gitea"          # Gitea 数据目录(可能存储数据库、存储、配置等)
# 备份目录检查和创建
mkdir -p $BACKUP_DIR
# 获取 Gitea 数据库类型(假设你使用的是 SQLite 或 MySQL)
DB_TYPE=$(docker exec $GITEA_CONTAINER_NAME cat /data/gitea/conf/app.ini | grep -i "DB_TYPE" | cut -d'=' -f2 | tr -d '[:space:]')
# 备份 Gitea 数据
echo "开始备份 Gitea 数据..."
if [ "$DB_TYPE" == "sqlite3" ]; then
    # 对于 SQLite 数据库,直接复制数据库文件
    docker exec $GITEA_CONTAINER_NAME cp /data/gitea/gitea.db /tmp/gitea.db
    docker cp $GITEA_CONTAINER_NAME:/tmp/gitea.db $BACKUP_FILE
    rm -f /tmp/gitea.db  # 删除临时文件
elif [ "$DB_TYPE" == "mysql" ]; then
    # 对于 MySQL 数据库,使用 mysqldump 备份
    docker exec $GITEA_CONTAINER_NAME mysqldump -u root -p<your_password> gitea > /tmp/gitea_backup.sql
    docker cp $GITEA_CONTAINER_NAME:/tmp/gitea_backup.sql $BACKUP_FILE
    rm -f /tmp/gitea_backup.sql  # 删除临时文件
else
    echo "不支持的数据库类型:$DB_TYPE"
    exit 1
fi
# 备份 Gitea 配置和存储目录
echo "正在备份 Gitea 配置和存储文件..."
tar -zcvf $BACKUP_DIR/gitea_data_$DATE.tar.gz -C /srv/gitea backup
# 删除超过 7 天的备份文件
echo "删除超过 7 天的备份文件..."
find $BACKUP_DIR -type f -mtime +7 -exec rm -f {} ;
# 输出备份信息
echo "备份完成: $BACKUP_FILE"
        脚本说明:
- 
Gitea 容器名称与备份路径 :在脚本中,我们指定了 Gitea 容器的名称
gitea和备份文件存储的路径/srv/gitea/backup。可以根据实际情况修改这两个路径。 - 
数据库类型识别 :脚本通过检查 Gitea 配置文件(
app.ini)来自动识别数据库类型。支持sqlite3和mysql,可以根据实际情况修改脚本以支持其他数据库类型。 - 
备份数据库:
- 对于 SQLite,直接从容器中复制数据库文件。
 - 对于 MySQL,使用 
mysqldump命令备份数据库。 
 - 
备份 Gitea 配置与存储 :使用
tar命令将 Gitea 的配置和存储目录进行备份。 - 
清理过期备份 :使用
find命令查找并删除超过 7 天的备份文件。 - 
备份文件命名:备份文件的命名包含了当前日期和时间,确保备份文件的唯一性。
 
自动化定期备份
为了定期执行该脚本,可以使用 cron 来设置定时任务。以下是设置每日备份的步骤:
- 
编辑 crontab: 使用以下命令打开 cron 配置文件:
bashcrontab -e - 
添加定时任务 : 在
crontab文件中添加如下行,使得该脚本每天凌晨 2 点执行一次备份:bash0 2 * * * /path/to/your/backup_script.sh将
/path/to/your/backup_script.sh替换为你的脚本实际路径。 - 
保存并退出 :保存并退出
crontab文件后,cron 会自动根据你设置的计划执行备份任务。 
恢复备份的脚本
恢复 Gitea 数据的脚本主要是根据备份文件恢复数据库、配置文件和存储目录。以下是一个恢复备份的简单脚本:
            
            
              bash
              
              
            
          
          #!/bin/bash
# 配置路径和备份文件
BACKUP_DIR="/srv/gitea/backup"
BACKUP_FILE="$1"  # 从命令行参数传入备份文件名
if [ -z "$BACKUP_FILE" ]; then
  echo "请提供备份文件路径"
  exit 1
fi
# 恢复数据库
echo "恢复数据库..."
if [[ "$BACKUP_FILE" =~ .*gitea_backup_.*.tar.gz$ ]]; then
  # 对 SQLite 恢复
  docker cp $BACKUP_FILE $GITEA_CONTAINER_NAME:/tmp/gitea.db
  docker exec $GITEA_CONTAINER_NAME mv /tmp/gitea.db /data/gitea/gitea.db
elif [[ "$BACKUP_FILE" =~ .*gitea_backup_.*.sql$ ]]; then
  # 对 MySQL 恢复
  docker cp $BACKUP_FILE $GITEA_CONTAINER_NAME:/tmp/gitea_backup.sql
  docker exec $GITEA_CONTAINER_NAME mysql -u root -p<your_password> gitea < /tmp/gitea_backup.sql
  rm -f /tmp/gitea_backup.sql
else
  echo "不支持的备份文件类型"
  exit 1
fi
# 恢复配置和数据目录
echo "恢复配置和存储数据..."
tar -zxvf $BACKUP_DIR/gitea_data_$BACKUP_FILE -C /srv/gitea
# 重启 Gitea 容器
echo "重启 Gitea 容器..."
docker restart $GITEA_CONTAINER_NAME
echo "恢复完成"
        说明:
- 输入参数:通过命令行参数传入备份文件路径。
 - 恢复数据库:恢复 SQLite 或 MySQL 数据库。
 - 恢复配置和存储:恢复配置文件和存储数据。
 - 重启 Gitea 容器:确保恢复完成后重启容器