Files
gitea/docs/superpowers/specs/2026-03-20-gitea-lan-deployment-design.md

179 lines
5.4 KiB
Markdown
Raw 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 Compose 在局域网中部署 Gitea Git 服务,支持 HTTP 和 SSH 访问,启用 Git LFS 支持。使用 PostgreSQL 替代 SQLite 以获得更好的并发性能(尤其是 LFS 大文件上传)。
## 需求
- 仅局域网使用
- Docker Compose 容器化部署
- 数据库PostgreSQL解决 SQLite 文件锁导致的 LFS 上传瓶颈)
- 访问方式HTTP + SSH
- 端口配置:通过 `.env` 文件灵活配置
- 数据存储:宿主机目录挂载
- 支持 Git LFS
- 镜像版本:固定版本(避免 latest
## 技术选型
| 组件 | 选择 | 说明 |
|-----|------|------|
| Gitea 版本 | 1.25.4 | 当前最新稳定版 |
| 数据库 | PostgreSQL 16 | 并发写入性能好,解决 SQLite 文件锁瓶颈 |
| 容器镜像 | gitea/gitea:1.25.4 | 官方镜像,固定版本 |
| 数据库镜像 | postgres:16-alpine | 轻量 PostgreSQL~80MB |
### 为什么从 SQLite 迁移到 PostgreSQL
SQLite 使用文件级写锁,在 LFS 大文件上传时,元数据写入被串行化,导致上传速度被限制在约 1.7 MB/s。PostgreSQL 支持并发写入,消除了这个瓶颈。
## 目录结构
```
gitea/
├── docker-compose.yml # 容器编排配置
├── .env # 环境变量(端口等配置)
├── .env.example # 环境变量示例
├── .gitignore # 忽略数据目录和敏感文件
├── Caddyfile # Caddy 反向代理配置(可选)
├── README.md # 使用说明
└── data/ # Gitea 数据(挂载目录)
├── git/ # Git 仓库数据
│ ├── repositories/ # 仓库存储
│ └── lfs/ # LFS 文件存储
├── gitea/ # Gitea 配置
│ ├── gitea.db # SQLite 数据库(迁移后保留作备份)
│ └── conf/app.ini # 配置文件
├── postgres/ # PostgreSQL 数据
└── ssh/ # SSH 密钥
```
## 配置文件
### .env - 环境变量
```env
# 镜像版本
GITEA_VERSION=1.25.4
# 端口配置
HTTP_PORT=3000
SSH_PORT=2222
# 时区
TZ=Asia/Shanghai
# PostgreSQL 配置
POSTGRES_VERSION=16-alpine
POSTGRES_DB=gitea
POSTGRES_USER=gitea
POSTGRES_PASSWORD=changeme
# Git LFS 配置
GITEA__lfs__START_SERVER=true
GITEA__lfs__PATH=/data/git/lfs
# 禁用公开注册
GITEA__service__DISABLE_REGISTRATION=true
# 域名配置
DOMAIN=git.example.com
ROOT_URL=http://${DOMAIN}:${HTTP_PORT}/
```
### docker-compose.yml
#### Gitea 服务
- 镜像:`gitea/gitea:${GITEA_VERSION}`
- 端口映射:
- `${HTTP_PORT}:3000` - Web 界面和 HTTP Git 操作
- `${SSH_PORT}:22` - SSH Git 操作
- 数据卷挂载:`./data:/data`
- 环境变量:从 `.env` 文件读取(数据库连接通过 `GITEA__database__*` 环境变量覆盖 app.ini
- 依赖:`postgres`(健康检查通过后启动)
- 重启策略:`always`
#### PostgreSQL 服务
- 镜像:`postgres:${POSTGRES_VERSION}`(默认 16-alpine
- 环境变量:`POSTGRES_DB``POSTGRES_USER``POSTGRES_PASSWORD`
- 数据卷挂载:`./data/postgres:/var/lib/postgresql/data`
- 健康检查:`pg_isready`5 秒间隔3 秒超时5 次重试
- 重启策略:`always`
#### Caddy 服务(可选,--profile caddy
- 镜像:`caddy:2`
- 端口80、443
- 配置:`./Caddyfile` 只读挂载
- 依赖:`gitea`
### .gitignore
忽略 `data/` 目录、`.env` 文件、Caddy 数据目录(避免敏感信息提交)
## 数据库配置说明
数据库配置通过 docker-compose.yml 中的 `GITEA__database__*` 环境变量设置,优先级高于 `app.ini`
| 环境变量 | 值 | 说明 |
|---------|---|------|
| `GITEA__database__DB_TYPE` | `postgres` | 数据库类型 |
| `GITEA__database__HOST` | `postgres:5432` | Docker 内部网络连接 |
| `GITEA__database__NAME` | `${POSTGRES_DB}` | 数据库名 |
| `GITEA__database__USER` | `${POSTGRES_USER}` | 用户名 |
| `GITEA__database__PASSWD` | `${POSTGRES_PASSWORD}` | 密码 |
## 数据存储说明
| 数据类型 | 容器内路径 | 宿主机路径 |
|---------|-----------|-----------|
| PostgreSQL 数据 | /var/lib/postgresql/data | ./data/postgres/ |
| Git 仓库 | /data/git/repositories/ | ./data/git/repositories/ |
| SSH 密钥 | /data/git/.ssh/ | ./data/git/.ssh/ |
| LFS 文件 | /data/git/lfs/ | ./data/git/lfs/ |
| 配置文件 | /data/gitea/conf/app.ini | ./data/gitea/conf/app.ini |
## 使用方式
### 启动服务
```bash
docker compose up -d
```
### 访问方式
- Web 界面:`http://<服务器IP>:3000`
- HTTP 克隆:`git clone http://<服务器IP>:3000/用户/仓库.git`
- SSH 克隆:`git clone ssh://git@<服务器IP>:2222/用户/仓库.git`
### 初始配置
首次访问 Web 界面会进入安装向导,需要:
1. 设置管理员账户
2. 数据库已通过环境变量配置为 PostgreSQL无需手动设置
### 备份
```bash
# 导出数据库
docker exec postgres pg_dump -U gitea gitea > gitea-db-$(date +%Y%m%d).sql
# 备份数据目录
tar -czvf gitea-data-$(date +%Y%m%d).tar.gz data/
```
## 文件清单
| 文件 | 职责 |
|-----|------|
| `docker-compose.yml` | 容器编排Gitea + PostgreSQL + Caddy |
| `.env` | 环境变量:版本、端口、数据库、域名 |
| `.env.example` | 环境变量示例 |
| `.gitignore` | 忽略数据目录和敏感文件 |
| `Caddyfile` | Caddy 反向代理配置 |
| `README.md` | 使用说明文档 |