Gitea Docker 部署项目

本项目用于在已有DNMP环境中部署Gitea服务。

项目背景

  • 服务器环境Debian 12
  • 已部署服务DNMP (Docker + Nginx + MySQL + PHP)
  • 目标部署Gitea服务
  • 域名gitea.mzh.one (已完成DNS解析)
  • 证书使用已安装的certbot申请和自动更新SSL证书

DNMP环境配置

  • DNMP目录/opt/dnmp
  • DNMP的www目录/opt/dnmp/www
  • DNMP的Nginx配置目录/opt/dnmp/services/nginx/conf.d
  • SSL证书目录/opt/dnmp/services/nginx/ssl/gitea.mzh.one
  • Nginx配置文件名gitea.mzh.one.conf

容器路径映射

本项目会自动检测DNMP环境中的容器路径映射适应不同的DNMP配置

  • Nginx容器中的路径映射
    • 主机上的 /opt/dnmp/www 通常映射到容器内的 /www
    • 主机上的 /opt/dnmp/services/nginx/ssl 通常映射到容器内的 /ssl
    • 主机上的 /opt/dnmp/services/nginx/conf.d 通常映射到容器内的 /etc/nginx/conf.d

安装脚本会自动检测这些映射,并相应地调整配置文件。

容器自动检测

本项目的脚本会自动检测环境中的容器:

  • 自动检测MySQL容器脚本会自动查找运行中的MySQL或MariaDB容器
  • 自动检测Nginx容器脚本会自动查找运行中的Nginx容器
  • 自动检测Docker网络如果没有找到dnmp_default网络会使用默认的bridge网络

这使得本项目可以适应不同的Docker环境配置无需手动修改脚本中的容器名称。

项目结构

.
├── README.md                 # 项目说明文档
├── docker-compose.yml        # Docker Compose配置文件
├── deploy.sh                 # 部署脚本
├── install.sh                # 一键安装脚本
├── uninstall.sh              # 卸载脚本
├── backup.sh                 # 备份脚本
├── conf                      # 配置文件目录
│   ├── nginx                 # Nginx配置文件目录
│   │   └── conf.d            # Nginx站点配置目录
│   │       └── gitea.mzh.one.conf  # Gitea站点配置
│   └── gitea                 # Gitea配置文件目录
│       └── app.ini           # Gitea主配置文件
└── data                      # 数据存储目录
    ├── gitea                 # Gitea数据目录
    └── mysql                 # MySQL数据目录(如需单独使用)

快速开始

一键安装

使用一键安装脚本可以快速部署Gitea

# 下载安装脚本
wget https://raw.githubusercontent.com/yourusername/gitea-docker/main/install.sh
# 添加执行权限
chmod +x install.sh
# 执行安装脚本
sudo ./install.sh

安装脚本会自动完成以下操作:

  1. 检查必要的依赖
  2. 自动检测MySQL和Nginx容器
  3. 自动检测容器的路径映射
  4. 创建项目目录结构
  5. 创建MySQL数据库和用户
  6. 申请SSL证书
  7. 配置Nginx反向代理
  8. 启动Gitea服务

一键卸载

如需卸载Gitea可以使用卸载脚本

# 下载卸载脚本
wget https://raw.githubusercontent.com/yourusername/gitea-docker/main/uninstall.sh
# 添加执行权限
chmod +x uninstall.sh
# 执行卸载脚本
sudo ./uninstall.sh

卸载脚本会执行以下操作:

  1. 停止并删除Gitea容器
  2. 删除Nginx配置
  3. 可选删除Gitea数据库
  4. 可选删除SSL证书
  5. 可选:删除安装目录

自动备份

使用备份脚本可以定期备份Gitea数据

# 下载备份脚本
wget https://raw.githubusercontent.com/yourusername/gitea-docker/main/backup.sh
# 添加执行权限
chmod +x backup.sh
# 执行备份脚本
sudo ./backup.sh

备份脚本支持以下选项:

  • -d <目录>: 指定备份目录(默认:/opt/gitea-backups
  • -g <目录>: 指定Gitea安装目录默认/opt/gitea
  • -m <容器名>: 指定MySQL容器名默认自动检测
  • -u <用户名>: 指定MySQL用户名默认gitea
  • -p <密码>: 指定MySQL密码默认gitea_password
  • -k <天数>: 指定保留备份的天数默认7

设置定时备份:

# 编辑crontab
sudo crontab -e

# 添加以下行每天凌晨2点执行备份
0 2 * * * /opt/gitea/backup.sh > /var/log/gitea-backup.log 2>&1

详细部署步骤

1. 准备工作

  1. 确保服务器上已安装Docker和Docker Compose
  2. 确保MySQL和Nginx容器已正常运行
  3. 确保域名gitea.mzh.one已正确解析到服务器IP
  4. 确保服务器上已安装certbot

2. 克隆项目

git clone https://github.com/yourusername/gitea-docker.git
cd gitea-docker

或者手动创建项目结构和文件。

3. 准备MySQL数据库

创建Gitea所需的数据库和用户

# 创建SQL脚本
cat <<EOF > create_db.sql
CREATE DATABASE IF NOT EXISTS gitea CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'gitea'@'%' IDENTIFIED BY 'gitea_password';
GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'%';
FLUSH PRIVILEGES;
EOF

# 执行SQL脚本脚本会自动检测MySQL容器
docker exec -i $(docker ps | grep -E 'mysql|mariadb' | head -1 | awk '{print $1}') mysql -uroot -p < create_db.sql

4. 申请SSL证书

使用certbot申请SSL证书

# 确保DNMP的www目录存在
sudo mkdir -p /opt/dnmp/www/.well-known/acme-challenge

# 申请证书
sudo certbot certonly --webroot -w /opt/dnmp/www -d gitea.mzh.one

# 创建SSL证书目录
sudo mkdir -p /opt/dnmp/services/nginx/ssl/gitea.mzh.one

# 复制证书到DNMP的SSL目录
sudo cp /etc/letsencrypt/live/gitea.mzh.one/fullchain.pem /opt/dnmp/services/nginx/ssl/gitea.mzh.one/gitea.mzh.one.pem
sudo cp /etc/letsencrypt/live/gitea.mzh.one/privkey.pem /opt/dnmp/services/nginx/ssl/gitea.mzh.one/gitea.mzh.one.key

5. 配置Nginx

将项目中的Nginx配置文件复制到DNMP的Nginx配置目录

# 复制Nginx配置文件
sudo cp conf/nginx/conf.d/gitea.mzh.one.conf /opt/dnmp/services/nginx/conf.d/

# 重新加载Nginx配置脚本会自动检测Nginx容器
docker exec -it $(docker ps | grep nginx | head -1 | awk '{print $1}') nginx -s reload

6. 启动Gitea服务

# 启动服务
docker-compose up -d

7. 完成初始化设置

访问 https://gitea.mzh.one 完成Gitea的初始化设置。

初始化时,请使用以下数据库设置:

  • 数据库类型MySQL
  • 主机:[MySQL容器名]:3306脚本会自动检测并显示
  • 用户名gitea
  • 密码gitea_password
  • 数据库名gitea

使用方法

1. 启动服务

docker-compose up -d

2. 停止服务

docker-compose down

3. 查看日志

docker-compose logs -f gitea

4. 备份数据

备份Gitea数据有两种方式

手动备份

# 备份数据目录
tar -czvf gitea-data-backup.tar.gz data/gitea

# 备份MySQL数据库脚本会自动检测MySQL容器
MYSQL_CONTAINER=$(docker ps | grep -E 'mysql|mariadb' | head -1 | awk '{print $NF}')
docker exec $MYSQL_CONTAINER mysqldump -u gitea -pgitea_password gitea > gitea-db-backup.sql

自动备份

使用提供的备份脚本:

# 执行备份
./backup.sh

# 查看备份帮助
./backup.sh -h

注意事项

  • 确保MySQL服务已正常运行
  • 确保80和443端口未被占用
  • 确保域名已正确解析到服务器IP
  • 修改app.ini中的密钥和令牌SECRET_KEY, INTERNAL_TOKEN, LFS_JWT_SECRET
  • 默认SSH端口为222如需修改请同时更新docker-compose.yml和app.ini
  • 默认数据库密码为gitea_password建议在生产环境中修改为更强的密码
  • 确保没有其他配置文件使用相同的域名以避免Nginx配置冲突

故障排除

  • 如果无法访问Gitea请检查Nginx配置和容器运行状态

    docker ps | grep gitea
    docker logs gitea
    
  • 如果数据库连接失败请检查MySQL服务状态和连接配置

    # 自动检测MySQL容器并查询
    MYSQL_CONTAINER=$(docker ps | grep -E 'mysql|mariadb' | head -1 | awk '{print $NF}')
    docker exec -it $MYSQL_CONTAINER mysql -u gitea -pgitea_password -e "SHOW DATABASES;"
    
  • 如果SSL证书问题请检查证书路径和权限

    ls -la /opt/dnmp/services/nginx/ssl/gitea.mzh.one/
    
  • 如果Nginx配置冲突请检查是否有多个配置文件使用相同的域名

    grep -r "server_name gitea.mzh.one" /opt/dnmp/services/nginx/conf.d/
    

安全建议

  1. 修改默认的数据库密码
  2. 启用Gitea的二次验证功能
  3. 定期备份数据
  4. 定期更新Gitea版本
  5. 限制SSH访问权限

维护指南

更新Gitea

更新Gitea到最新版本

# 拉取最新镜像
docker pull gitea/gitea:latest

# 重启服务
docker-compose down
docker-compose up -d

数据迁移

如需迁移Gitea到新服务器

  1. 在旧服务器上执行备份

    ./backup.sh
    
  2. 将备份文件复制到新服务器

    scp -r /opt/gitea-backups user@new-server:/tmp/
    
  3. 在新服务器上安装Gitea

    ./install.sh
    
  4. 恢复备份

    # 停止Gitea服务
    docker-compose down
    
    # 恢复数据
    tar -xzf /tmp/gitea-data-*.tar.gz -C /opt/gitea/
    
    # 自动检测MySQL容器并恢复数据库
    MYSQL_CONTAINER=$(docker ps | grep -E 'mysql|mariadb' | head -1 | awk '{print $NF}')
    gunzip -c /tmp/gitea-db-*.sql.gz | docker exec -i $MYSQL_CONTAINER mysql -u gitea -pgitea_password gitea
    
    # 启动服务
    docker-compose up -d
    
Description
在DNMP环境中一键部署Gitea的Docker项目
Readme 40 KiB
Languages
Shell 100%