从零开始部署 Docker 化 Gitea + MySQL 完整指南
介绍
购买服务器后想自己搭建gitea服务器,以下为使用docker 中的gitea+mysql进行的gitea服务器搭建。mysql也在docker中进行搭建。
1. 准备工作
创建项目目录
mkdir -p /home/admin/gitea/docker-projects/gitea
cd /home/admin/gitea/docker-projects/gitea
创建数据目录
mkdir -p gitea-data mysql-data
2. Docker Compose 配置
创建 docker-compose.yml
version: "3.8"
networks:
gitea-net:
driver: bridge
services:
db:
image: mysql:5.7
container_name: gitea-db
environment:
MYSQL_ROOT_PASSWORD: "StrongRootPass123!"
MYSQL_DATABASE: gitea
MYSQL_USER: gitea
MYSQL_PASSWORD: "GiteaSecurePass456!"
volumes:
- ./mysql-data:/var/lib/mysql
networks:
- gitea-net
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
restart: unless-stopped
server:
image: gitea/gitea:1.21.1
container_name: gitea-app
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=GiteaSecurePass456!
volumes:
- ./gitea-data:/data
- /etc/timezone:/etc/timezone:ro
ports:
- "3000:3000" # HTTP 端口
- "2222:22" # SSH 端口
networks:
- gitea-net
depends_on:
- db
restart: unless-stopped
3. 部署流程
启动服务
docker-compose up -d
验证容器状态
docker-compose ps
检查数据库初始化
docker-compose exec db mysql -u root -p
输入密码:StrongRootPass123!
sql
SHOW DATABASES;
# 验证用户权限
ELECT User, Host FROM mysql.user;
检查 Gitea 日志
docker-compose logs -f server
4. 初始化 Gitea
访问安装页面:
http://<服务器公网IP>:3000
数据库配置:
数据库类型:MySQL
数据库主机:
db:3306
数据库名称:
gitea
数据库用户名:
gitea
数据库密码:
GiteaSecurePass456!
服务器设置:
SSH 服务端口:
22
HTTP 服务端口:
3000
Gitea 基本 URL:
http://<服务器公网IP>:3000
设置管理员账户
点击 "安装 Gitea"
5. 备份策略
创建备份脚本 /home/admin/gitea/backup.sh
#!/bin/bash
# 文件名: /home/admin/gitea/backup_mysql.sh
# 功能:每日备份 Gitea 的 MySQL 数据库
# 作者:您的名字
# 最后更新:2025-08-25
# ===================== 配置区域 =====================
BACKUP_DIR="/home/admin/gitea/backups/mysql"
CONTAINER_NAME="gitea_db" # MySQL 容器名
DB_NAME="gitea" # 数据库名
DB_USER="gitea" # 数据库用户
DB_PASS="gitea_password" # 数据库密码
RETENTION_DAYS=7 # 备份保留天数
COMPRESS_LEVEL=6 # gzip 压缩级别 (1-9)
# ===================================================
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 生成时间戳和文件名
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_backup_$TIMESTAMP.sql.gz"
# 执行备份 (使用 docker exec)
echo "[$(date '+%F %T')] 开始备份数据库: $DB_NAME"
docker exec $CONTAINER_NAME mysqldump \
-u$DB_USER -p"$DB_PASS" \
--single-transaction \
--routines \
--triggers \
--events \
$DB_NAME | gzip -$COMPRESS_LEVEL > "$BACKUP_FILE"
# 检查备份结果
if [ $? -eq 0 ] && [ -s "$BACKUP_FILE" ]; then
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "[$(date '+%F %T')] ✔ 备份成功! 文件: $BACKUP_FILE ($BACKUP_SIZE)"
else
echo "[$(date '+%F %T')] ✘ 备份失败! 请检查错误日志"
rm -f "$BACKUP_FILE"
exit 1
fi
# 清理旧备份
echo "[$(date '+%F %T')] 清理超过 $RETENTION_DAYS 天的旧备份..."
find "$BACKUP_DIR" -name "${DB_NAME}_backup_*.sql.gz" -mtime +$RETENTION_DAYS -delete
# 生成备份报告
BACKUP_COUNT=$(find "$BACKUP_DIR" -name "${DB_NAME}_backup_*.sql.gz" | wc -l)
echo "=========================================="
echo "数据库备份报告"
echo "------------------------------------------"
echo "备份时间: $(date)"
echo "数据库名: $DB_NAME"
echo "容器名: $CONTAINER_NAME"
echo "最新备份: $(basename $BACKUP_FILE)"
echo "备份大小: $BACKUP_SIZE"
echo "保留策略: 最近 $RETENTION_DAYS 天"
echo "当前备份数: $BACKUP_COUNT"
echo "=========================================="
exit 0
🔧 安装与使用指南
创建脚本文件
mkdir -p /home/admin/gitea/backups
vi /home/admin/gitea/backup_mysql.sh
粘贴上述内容,按需修改配置区域的值
设置可执行权限
chmod +x /home/admin/gitea/backup_mysql.sh
测试运行
/home/admin/gitea/backup_mysql.sh
检查输出和生成的备份文件:
ls -lh /home/admin/gitea/backups/mysql
配置每日自动执行
sudo crontab -e
添加以下行(每天凌晨2点执行):
0 2 * * * /home/admin/gitea/backup_mysql.sh >> /home/admin/gitea/backups/backup.log 2>&1
⚙️ 高级功能说明
事务一致性
使用 --single-transaction确保备份时不锁表
压缩优化
gzip -6平衡压缩率和速度(可调至9获得更高压缩率)
智能清理
自动删除超过保留天数的旧备份
详细日志
每次执行生成带时间戳的操作记录
完整性检查
验证备份文件非空且生成成功
!/bin/bash
# MySQL 容器备份
docker exec gitea-db mysqldump -u gitea -p"GiteaSecurePass456!" --single-transaction gitea | gzip > /home/admin/gitea/backups/gitea-db-$(date +%Y%m%d).sql.gz
# Gitea 数据备份
tar -czf /home/admin/gitea/backups/gitea-data-$(date +%Y%m%d).tar.gz /home/admin/gitea/docker-projects/gitea/gitea-data
# 清理旧备份 (保留7天)
find /home/admin/gitea/backups -name "*.gz" -mtime +7 -delete
设置定时任务
crontab -e
0 2 * * * /home/admin/gitea/backup.sh
🔄 正确恢复备份的步骤
找到备份文件
首先确定要恢复的备份文件路径:
ls -lh /home/admin/gitea/backups/mysql/
输出示例:
-rw-r--r-- 1 root root 12K Aug 25 11:16 gitea_backup_20250825_111606.sql.gz
解压备份文件
解压备份文件
gunzip /home/admin/gitea/backups/mysql/gitea_backup_20250825_111606.sql.gz
解压后会得到 .sql文件
将SQL文件导入MySQL容器
docker-compose exec -T db mysql -u root -p < /home/admin/gitea/backups/mysql/gitea_backup_20250825_111606.sql
系统会提示输入 MySQL root 密码(在 docker-compose.yml 中设置的)
验证恢复
docker-compose exec db mysql -u gitea -p -e "USE gitea; SHOW TABLES;"
输入 gitea 用户密码后,应显示数据库表列表
完整恢复示例
1. 进入备份目录
cd /home/admin/gitea/backups/mysql
2. 解压备份文件
gunzip gitea_backup_20250825_111606.sql.gz
3. 恢复数据库
docker-compose exec -T db mysql -u root -p < gitea_backup_20250825_111606.sql
输入密码:StrongRootPass123!
4. 验证恢复
docker-compose exec db mysql -u gitea -p -e "SELECT COUNT(*) FROM gitea.user"
输入密码:GiteaSecurePass456!
重要注意事项
#恢复前停止服务:
docker-compose stop server
#避免数据写入冲突
#备份当前数据库:
#恢复前先备份当前状态:
/home/admin/gitea/backup_mysql.sh
#恢复后重启:
docker-compose start server
6. 故障排查
常见问题解决
端口冲突:
sudo ss -tulnp | grep <端口号>
sudo kill -9 <占用进程PID>
数据库连接失败:
docker-compose exec db mysql -u gitea -p
重置管理员密码:
docker-compose exec server gitea admin user change-password --username admin --password newpassword
查看实时日志:
docker-compose logs -f server
许可协议:
CC BY 4.0