如何使用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 容器:确保恢复完成后重启容器