360 lines
9.4 KiB
Markdown
360 lines
9.4 KiB
Markdown
# 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
|
||
``` |