GiteaDocker/README.md

360 lines
9.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```bash
# 下载安装脚本
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可以使用卸载脚本
```bash
# 下载卸载脚本
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数据
```bash
# 下载备份脚本
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
设置定时备份:
```bash
# 编辑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. 克隆项目
```bash
git clone https://github.com/yourusername/gitea-docker.git
cd gitea-docker
```
或者手动创建项目结构和文件。
### 3. 准备MySQL数据库
创建Gitea所需的数据库和用户
```bash
# 创建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证书
```bash
# 确保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配置目录
```bash
# 复制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服务
```bash
# 启动服务
docker-compose up -d
```
### 7. 完成初始化设置
访问 https://gitea.mzh.one 完成Gitea的初始化设置。
初始化时,请使用以下数据库设置:
- 数据库类型MySQL
- 主机:[MySQL容器名]:3306脚本会自动检测并显示
- 用户名gitea
- 密码gitea_password
- 数据库名gitea
## 使用方法
### 1. 启动服务
```bash
docker-compose up -d
```
### 2. 停止服务
```bash
docker-compose down
```
### 3. 查看日志
```bash
docker-compose logs -f gitea
```
### 4. 备份数据
备份Gitea数据有两种方式
#### 手动备份
```bash
# 备份数据目录
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
```
#### 自动备份
使用提供的备份脚本:
```bash
# 执行备份
./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配置和容器运行状态
```bash
docker ps | grep gitea
docker logs gitea
```
- 如果数据库连接失败请检查MySQL服务状态和连接配置
```bash
# 自动检测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证书问题请检查证书路径和权限
```bash
ls -la /opt/dnmp/services/nginx/ssl/gitea.mzh.one/
```
- 如果Nginx配置冲突请检查是否有多个配置文件使用相同的域名
```bash
grep -r "server_name gitea.mzh.one" /opt/dnmp/services/nginx/conf.d/
```
## 安全建议
1. 修改默认的数据库密码
2. 启用Gitea的二次验证功能
3. 定期备份数据
4. 定期更新Gitea版本
5. 限制SSH访问权限
## 维护指南
### 更新Gitea
更新Gitea到最新版本
```bash
# 拉取最新镜像
docker pull gitea/gitea:latest
# 重启服务
docker-compose down
docker-compose up -d
```
### 数据迁移
如需迁移Gitea到新服务器
1. 在旧服务器上执行备份
```bash
./backup.sh
```
2. 将备份文件复制到新服务器
```bash
scp -r /opt/gitea-backups user@new-server:/tmp/
```
3. 在新服务器上安装Gitea
```bash
./install.sh
```
4. 恢复备份
```bash
# 停止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
```