support HTTP-only and Caddy (HTTP+HTTPS) modes via compose profiles

This commit is contained in:
2026-04-23 22:20:02 +08:00
parent 866c059ee4
commit ff0929dc02
4 changed files with 66 additions and 18 deletions

View File

@@ -18,5 +18,10 @@ GITEA__lfs__PATH=/data/git/lfs
# 禁用公开注册(仅管理员可创建账号) # 禁用公开注册(仅管理员可创建账号)
GITEA__service__DISABLE_REGISTRATION=true GITEA__service__DISABLE_REGISTRATION=true
# 域名配置Caddy 反向代理 + 自动 HTTPS # 域名配置
DOMAIN=git.example.com DOMAIN=git.example.com
# ROOT_URL决定 Gitea UI 中的链接生成
# 不使用 Caddy仅 HTTPROOT_URL=http://${DOMAIN}:${HTTP_PORT}/
# 使用 CaddyHTTP + HTTPSROOT_URL=https://${DOMAIN}/
ROOT_URL=http://${DOMAIN}:${HTTP_PORT}/

View File

@@ -1,3 +1,7 @@
{$DOMAIN} { http://{$DOMAIN} {
reverse_proxy gitea:3000
}
https://{$DOMAIN} {
reverse_proxy gitea:3000 reverse_proxy gitea:3000
} }

View File

@@ -1,24 +1,32 @@
# Gitea Docker 部署Caddy 反向代理 + 自动 HTTPS # Gitea Docker 部署
使用 Docker Compose 部署 Gitea通过 Caddy 反向代理实现自动 HTTPSLet's Encrypt 使用 Docker Compose 部署 Gitea支持两种模式:
- **HTTP 模式**Gitea 直接暴露端口,仅 HTTP
- **Caddy 模式**:通过 Caddy 反向代理,同时支持 HTTP 和 HTTPS自动证书
## 架构 ## 架构
### HTTP 模式(默认)
``` ```
Client → Caddy (80/443, 自动 HTTPS) → Gitea (3000, Docker 内部网络) Client → Gitea (HTTP_PORT, e.g. 3000)
Gitea SSH (22 → 宿主机 2222) Gitea SSH (22 → 宿主机 SSH_PORT)
``` ```
- **Caddy** 处理 HTTPS 证书的自动申请、续期和 HTTP→HTTPS 重定向 ### Caddy 模式(--profile caddy
- **Gitea** Web 流量通过 Docker 内部网络由 Caddy 代理,不直接暴露端口
- **SSH** 直接映射到宿主机 2222 端口,不经过 Caddy ```
Client → Caddy (80/443, HTTP + HTTPS) → Gitea (3000, Docker 内部网络)
Gitea SSH (22 → 宿主机 SSH_PORT)
```
## 快速开始 ## 快速开始
### 前提条件 ### 前提条件
- 域名已解析到服务器公网 IP - 服务器 `SSH_PORT`(默认 2222端口可从外网访问
- 服务器 80、443、2222 端口可从外网访问 - 如使用 Caddy 模式:域名已解析到服务器公网 IP 80、443 端口可从外网访问
### 1. 配置环境变量 ### 1. 配置环境变量
@@ -29,34 +37,59 @@ cp .env.example .env
编辑 `.env`,关键配置: 编辑 `.env`,关键配置:
```env ```env
DOMAIN=git.example.com # 你的域名Caddy 将为此域名申请 HTTPS 证书) DOMAIN=git.example.com # 你的域名
SSH_PORT=2222 # SSH 端口(宿主机端口,容器内仍为 22 SSH_PORT=2222 # SSH 端口(宿主机端口,容器内仍为 22
``` ```
> `GITEA__server__SSH_PORT` 通过 `.env` 传递给容器,使 Web 界面中的 SSH clone 地址正确显示端口号。 #### HTTP 模式
```env
ROOT_URL=http://git.example.com:3000/
```
#### Caddy 模式
```env
ROOT_URL=https://git.example.com/
```
### 2. 启动服务 ### 2. 启动服务
```bash ```bash
# HTTP 模式(仅 Gitea无 Caddy
docker compose up -d docker compose up -d
# Caddy 模式HTTP + HTTPSCaddy 反向代理)
docker compose --profile caddy up -d
``` ```
Caddy 会自动为 `DOMAIN` 申请 Let's Encrypt 证书,稍等片刻后即可通过 HTTPS 访问。 > Caddy 会自动为 `DOMAIN` 申请 Let's Encrypt 证书,稍等片刻后即可通过 HTTPS 访问。
### 3. 初始配置 ### 3. 初始配置
首次访问 `https://<DOMAIN>` 会进入安装向导: 首次访问会进入安装向导:
1. 设置管理员账户 1. 设置管理员账户
2. 数据库已默认使用 SQLite 2. 数据库已默认使用 SQLite
## 访问方式 ## 访问方式
### HTTP 模式
| 方式 | 地址 |
|-----|------|
| Web 界面 | `http://<DOMAIN>:<HTTP_PORT>` |
| HTTP 克隆 | `git clone http://<DOMAIN>:<HTTP_PORT>/<用户>/<仓库>.git` |
| SSH 克隆 | `git clone ssh://git@<DOMAIN>:<SSH_PORT>/<用户>/<仓库>.git` |
### Caddy 模式
| 方式 | 地址 | | 方式 | 地址 |
|-----|------| |-----|------|
| Web 界面 | `https://<DOMAIN>` | | Web 界面 | `https://<DOMAIN>` |
| HTTP 克隆 | `git clone http://<DOMAIN>/<用户>/<仓库>.git` |
| HTTPS 克隆 | `git clone https://<DOMAIN>/<用户>/<仓库>.git` | | HTTPS 克隆 | `git clone https://<DOMAIN>/<用户>/<仓库>.git` |
| SSH 克隆 | `git clone ssh://git@<DOMAIN>:2222/<用户>/<仓库>.git` | | SSH 克隆 | `git clone ssh://git@<DOMAIN>:<SSH_PORT>/<用户>/<仓库>.git` |
## Git LFS ## Git LFS
@@ -91,9 +124,12 @@ tar -xzvf gitea-backup-20260320.tar.gz
## 常用命令 ## 常用命令
```bash ```bash
# 启动 # 启动HTTP 模式)
docker compose up -d docker compose up -d
# 启动Caddy 模式)
docker compose --profile caddy up -d
# 停止 # 停止
docker compose down docker compose down

View File

@@ -8,18 +8,21 @@ services:
- GITEA__lfs__PATH=${GITEA__lfs__PATH} - GITEA__lfs__PATH=${GITEA__lfs__PATH}
- GITEA__service__DISABLE_REGISTRATION=${GITEA__service__DISABLE_REGISTRATION} - GITEA__service__DISABLE_REGISTRATION=${GITEA__service__DISABLE_REGISTRATION}
- GITEA__server__SSH_PORT=${GITEA__server__SSH_PORT} - GITEA__server__SSH_PORT=${GITEA__server__SSH_PORT}
- GITEA__server__ROOT_URL=https://${DOMAIN}/ - GITEA__server__ROOT_URL=${ROOT_URL}
- GITEA__server__DOMAIN=${DOMAIN} - GITEA__server__DOMAIN=${DOMAIN}
- GITEA__server__SSH_DOMAIN=${DOMAIN} - GITEA__server__SSH_DOMAIN=${DOMAIN}
restart: always restart: always
volumes: volumes:
- ./data:/data - ./data:/data
ports: ports:
- "${HTTP_PORT}:3000"
- "${SSH_PORT}:22" - "${SSH_PORT}:22"
caddy: caddy:
image: caddy:2 image: caddy:2
container_name: caddy container_name: caddy
profiles:
- caddy
environment: environment:
- DOMAIN=${DOMAIN} - DOMAIN=${DOMAIN}
restart: always restart: always