曼

曼波的神秘网址

A text-focused Halo theme

  • 首页
  • Gitee
  • 服务器
  • 关于
主页 从零开始部署 Docker 化 Gitea + MySQL 完整指南
文章

从零开始部署 Docker 化 Gitea + MySQL 完整指南

发表于 2025-08-25 更新于 2025-09- 15
作者 Administrator 已删除用户
26~34 分钟 阅读

介绍

购买服务器后想自己搭建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

  1. 访问安装页面:http://<服务器公网IP>:3000

  2. 数据库配置:

    • 数据库类型:MySQL

    • 数据库主机:db:3306

    • 数据库名称:gitea

    • 数据库用户名:gitea

    • 数据库密码:GiteaSecurePass456!

  3. 服务器设置:

    • SSH 服务端口:22

    • HTTP 服务端口:3000

    • Gitea 基本 URL:http://<服务器公网IP>:3000

  4. 设置管理员账户

  5. 点击 "安装 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
  1. 解压备份文件

解压备份文件

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

服务器
linux 网络 VPN 服务器
许可协议:  CC BY 4.0
分享

相关文章

9月 9, 2025

Nginx 反向代理

本文详细记录如何通过 Nginx 反向代理将 Halo 博客服务部署到自定义域名,并成功配置 HTTPS 访问的完整过程。文中包含实际操作中遇到的问题及其解决方案,希望对有类似需求的用户有所帮助。 系统架构概述 本项目采用的部署架构为: 1. Halo 服务:运行在 Docker 容器中,监听 80

9月 9, 2025

Halo 博客系统部署教程:从安装到 HTTPS 配置(网络剪切)

📌 原文链接:https://zhuanlan.zhihu.com/... 🕘 收藏时间:2025年08月22日 📂 文档目录:我的云文档/1.学习笔记/服务器搭建 📑 本文档由【金山收藏助手】一键生成 我们在百度上搜索工作或学习上遇到的问题时,或多或少得会在别人的博客上找到答案或帮

8月 28, 2025

Linux 上安装和配置 Transmission

本文详细记录了在 Ubuntu Linux 系统上安装、配置 Transmission BitTorrent 客户端,更换中文 Web 控制面板,以及通过 FRP 实现内网穿透的全过程。内容包括基础安装、目录配置、权限设置、网络穿透和界面美化,并针对过程中遇到的各种问题提供了解决方案。 完整安装与配

下一篇

在Linux服务器下安装clash

上一篇

利用frp工具实现内网穿透

最近更新

  • Nginx 反向代理
  • Halo 博客系统部署教程:从安装到 HTTPS 配置(网络剪切)
  • Linux 上安装和配置 Transmission
  • 在 Linux 系统中挂载新硬盘
  • 利用frp工具实现内网穿透

热门标签

Halo linux VPN 网络 服务器

目录

©2025 曼波的神秘网址. 保留部分权利。

使用 Halo 主题 Chirpy