# 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 < 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 ```