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
安装脚本会自动完成以下操作:
- 检查必要的依赖
- 自动检测MySQL和Nginx容器
- 自动检测容器的路径映射
- 创建项目目录结构
- 创建MySQL数据库和用户
- 申请SSL证书
- 配置Nginx反向代理
- 启动Gitea服务
一键卸载
如需卸载Gitea,可以使用卸载脚本:
# 下载卸载脚本
wget https://raw.githubusercontent.com/yourusername/gitea-docker/main/uninstall.sh
# 添加执行权限
chmod +x uninstall.sh
# 执行卸载脚本
sudo ./uninstall.sh
卸载脚本会执行以下操作:
- 停止并删除Gitea容器
- 删除Nginx配置
- 可选:删除Gitea数据库
- 可选:删除SSL证书
- 可选:删除安装目录
自动备份
使用备份脚本可以定期备份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. 准备工作
- 确保服务器上已安装Docker和Docker Compose
- 确保MySQL和Nginx容器已正常运行
- 确保域名gitea.mzh.one已正确解析到服务器IP
- 确保服务器上已安装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/
安全建议
- 修改默认的数据库密码
- 启用Gitea的二次验证功能
- 定期备份数据
- 定期更新Gitea版本
- 限制SSH访问权限
维护指南
更新Gitea
更新Gitea到最新版本:
# 拉取最新镜像
docker pull gitea/gitea:latest
# 重启服务
docker-compose down
docker-compose up -d
数据迁移
如需迁移Gitea到新服务器:
-
在旧服务器上执行备份
./backup.sh -
将备份文件复制到新服务器
scp -r /opt/gitea-backups user@new-server:/tmp/ -
在新服务器上安装Gitea
./install.sh -
恢复备份
# 停止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
Languages
Shell
100%