a6f05ab2d5
- Phase 0: AGENTS.md cleanup (dedup quotes, renumber sections, merge qmd) - Phase 1: typed relations (manage-relations.py, graph-search.py, check-staleness.py, detect-conflicts.py) - Phase 2: frontmatter validator, weekly lint, knowledge promotion, git hooks - Fix .gitignore to track tools/ and .githooks/ - Fix git remote URL (remove plaintext token) - New wiki pages: 504 pages, 34 raw sources
989 lines
22 KiB
Markdown
989 lines
22 KiB
Markdown
---
|
||
title: Gitea个人Git服务部署指南
|
||
created: 2026-03-29
|
||
tags:
|
||
- 群晖
|
||
- Gitea
|
||
- FRP
|
||
- 内网穿透
|
||
- Git
|
||
aliases:
|
||
- 自建Git服务
|
||
- NAS代码仓库
|
||
---
|
||
|
||
# Gitea个人Git服务部署指南
|
||
|
||
## 项目背景
|
||
|
||
在群晖NAS上部署Gitea代码仓库服务,通过FRP内网穿透暴露到公网,实现个人代码仓库的远程访问。相比QuickConnect,FRP提供更稳定的连接和更快的访问速度。
|
||
|
||
---
|
||
|
||
## 环境信息
|
||
|
||
### 硬件环境
|
||
|
||
| 配置项 | 值 |
|
||
|--------|-----|
|
||
| NAS型号 | Synology DS418play |
|
||
| CPU架构 | Intel Celeron J3355 (x86_64) |
|
||
| 系统版本 | DSM 7.3.2-86009 Update 3 |
|
||
| 域名 | haiguang.xyz |
|
||
|
||
### 软件版本
|
||
|
||
| 软件 | 版本 | 说明 |
|
||
|------|------|------|
|
||
| Gitea | 1.25.5-28 | SynoCommunity套件 |
|
||
| FRP | v0.68.0 | 最新版(2026-03-20发布) |
|
||
| MariaDB | 10 | 群晖套件(监听3307端口) |
|
||
|
||
### 网络环境
|
||
|
||
| 服务 | 地址 |
|
||
|------|------|
|
||
| FRP服务器 | 82.156.57.104:7000 |
|
||
| QuickConnect | hehaiguang.cn4.quickconnect.cn |
|
||
| 公网访问 | git.haiguang.xyz |
|
||
|
||
---
|
||
|
||
## 部署架构
|
||
|
||
```mermaid
|
||
graph LR
|
||
A[开发者] --> B[git.haiguang.xyz]
|
||
B --> C[FRP服务器<br/>82.156.57.104]
|
||
C --> D[FRP客户端<br/>群晖NAS]
|
||
D --> E[Gitea服务<br/>端口8418]
|
||
|
||
F[SSH访问] --> G[82.156.57.104:10022]
|
||
G --> D
|
||
D --> H[SSH服务<br/>端口10022]
|
||
```
|
||
|
||
### 流量路径
|
||
|
||
1. **HTTP访问**: `git.haiguang.xyz` → DNS解析到 `82.156.57.104` → FRP服务器端口13000 → FRP客户端 → Gitea本地端口8418
|
||
2. **SSH访问**: `82.156.57.104:10022` → FRP服务器 → FRP客户端 → Gitea SSH端口10022
|
||
|
||
---
|
||
|
||
## 部署步骤
|
||
|
||
### 第一阶段:Gitea服务安装
|
||
|
||
#### 1. 安装Gitea套件
|
||
|
||
从SynoCommunity安装Gitea套件:
|
||
|
||
- 套件中心 → 设置 → 套件来源 → 新增
|
||
- 名称: SynoCommunity
|
||
- 位置: `https://packages.synocommunity.com/`
|
||
- 搜索并安装 Gitea
|
||
|
||
#### 2. 初始化配置
|
||
|
||
访问 `http://192.168.123.21:8418` 进行初始化:
|
||
|
||
**数据库配置**:
|
||
|
||
```
|
||
数据库类型: SQLite3
|
||
数据库文件: /var/packages/gitea/var/data/gitea.db
|
||
```
|
||
|
||
> [!tip] 数据库选择建议
|
||
> - **SQLite3**: 零配置,适合个人使用(≤50仓库)
|
||
> - **MariaDB**: 性能更好,适合团队协作
|
||
> - 注意:群晖MariaDB监听 **3307** 端口(非标准3306)
|
||
|
||
**应用配置**:
|
||
|
||
```
|
||
仓库存储路径: /volume3/gitea-share/gitea-repositories
|
||
管理员账号: giteahhg
|
||
密码: [你的密码]
|
||
```
|
||
|
||
#### 3. 确认服务状态
|
||
|
||
```bash
|
||
# 查看运行端口
|
||
netstat -tuln | grep gitea
|
||
|
||
# 查看服务状态
|
||
synopkg status gitea
|
||
```
|
||
|
||
### 第二阶段:FRP客户端部署
|
||
|
||
#### 1. 准备部署文件
|
||
|
||
在本地创建以下文件:
|
||
|
||
**frpc.toml** (配置文件):
|
||
|
||
```toml
|
||
serverAddr = "82.156.57.104"
|
||
serverPort = 7000
|
||
auth.method = "token"
|
||
auth.token = "deb19f52ac7fa6423efcd1a3fbf9c2b7"
|
||
transport.tls.enable = true
|
||
log.to = "/var/log/frpc.log"
|
||
log.level = "info"
|
||
log.maxDays = 7
|
||
|
||
[[proxies]]
|
||
name = "gitea-web"
|
||
type = "tcp"
|
||
localIP = "127.0.0.1"
|
||
localPort = 8418
|
||
remotePort = 13000
|
||
|
||
[[proxies]]
|
||
name = "gitea-ssh"
|
||
type = "tcp"
|
||
localIP = "127.0.0.1"
|
||
localPort = 10022
|
||
remotePort = 10022
|
||
```
|
||
|
||
> [!warning] 关键配置说明
|
||
> - **type**: 必须使用 `tcp`,HTTP类型需要服务器配置vhost
|
||
> - **localPort**: Gitea实际运行端口(非标准3000)
|
||
> - **remotePort**: 服务器开放端口,避免使用3000(易冲突)
|
||
|
||
#### 2. 上传部署包
|
||
|
||
将以下文件上传到群晖 `/volume1/docker/frpc/`:
|
||
|
||
- frpc.toml
|
||
- frp_0.68.0_linux_amd64.tar.gz (从GitHub下载)
|
||
- install-local.sh
|
||
- start-frpc.sh
|
||
- stop-all-frpc.sh
|
||
- status-frpc.sh
|
||
|
||
#### 3. 执行部署
|
||
|
||
通过群晖任务计划执行:
|
||
|
||
```bash
|
||
# 安装FRP
|
||
bash /volume1/docker/frpc/install-local.sh
|
||
|
||
# 启动客户端
|
||
bash /volume1/docker/frpc/start-frpc.sh
|
||
|
||
# 检查状态
|
||
bash /volume1/docker/frpc/status-frpc.sh
|
||
```
|
||
|
||
> [!danger] 常见错误:脚本执行失败
|
||
> **问题**: 任务计划执行后"标准输出/错误无内容"
|
||
> **原因**: Windows换行符(CRLF)导致bash无法解析
|
||
> **解决**: 使用 `bash` 显式调用脚本,而非直接执行
|
||
|
||
#### 4. 验证连接
|
||
|
||
```bash
|
||
# 查看FRP进程
|
||
ps aux | grep frpc
|
||
|
||
# 查看日志
|
||
tail -f /var/log/frpc.log
|
||
|
||
# 预期输出
|
||
# [gitea-web] start proxy success
|
||
# [gitea-ssh] start proxy success
|
||
```
|
||
|
||
### 第三阶段:配置更新
|
||
|
||
#### 1. 更新ROOT_URL和安全配置
|
||
|
||
创建更新脚本 `update-gitea-security.sh`:
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
CONFIG_FILE="/var/packages/gitea/var/conf.ini"
|
||
|
||
# 备份配置
|
||
cp "$CONFIG_FILE" "${CONFIG_FILE}.backup.$(date +%Y%m%d_%H%M%S)"
|
||
|
||
# 更新访问URL
|
||
sed -i 's|^ROOT_URL.*|ROOT_URL = https://git.haiguang.xyz/|' "$CONFIG_FILE"
|
||
sed -i 's|^DOMAIN.*|DOMAIN = git.haiguang.xyz|' "$CONFIG_FILE"
|
||
sed -i 's|^SSH_DOMAIN.*|SSH_DOMAIN = git.haiguang.xyz|' "$CONFIG_FILE"
|
||
|
||
# 安全加固:禁用公开注册
|
||
sed -i 's|^DISABLE_REGISTRATION.*|DISABLE_REGISTRATION = true|' "$CONFIG_FILE"
|
||
sed -i 's|^ENABLE_OPENID_SIGNUP.*|ENABLE_OPENID_SIGNUP = false|' "$CONFIG_FILE"
|
||
|
||
# 重启服务
|
||
synopkg restart gitea
|
||
|
||
echo "配置更新完成!访问: https://git.haiguang.xyz/"
|
||
```
|
||
|
||
执行:
|
||
|
||
```bash
|
||
bash /volume1/docker/frpc/update-gitea-security.sh
|
||
```
|
||
|
||
#### 2. 配置DNS解析
|
||
|
||
在域名服务商添加A记录:
|
||
|
||
| 类型 | 主机记录 | 记录值 | TTL |
|
||
|------|----------|--------|-----|
|
||
| A | git | 82.156.57.104 | 600 |
|
||
|
||
#### 3. 配置开机自启
|
||
|
||
创建群晖任务计划:
|
||
|
||
- 控制面板 → 任务计划 → 新增 → 触发的任务 → 用户定义的脚本
|
||
- 事件: 开机
|
||
- 用户: root
|
||
- 脚本: `bash /volume1/docker/frpc/start-frpc.sh`
|
||
|
||
---
|
||
|
||
## 关键参数清单
|
||
|
||
### Gitea配置
|
||
|
||
> [!important] 重要:配置文件路径
|
||
> 群晖Gitea套件的配置文件路径为:**`/var/packages/gitea/var/conf.ini`**
|
||
>
|
||
> 很多文档错误地认为是 `/var/packages/gitea/var/app.ini`,这是不正确的。
|
||
|
||
| 参数 | 值 | 文件位置 |
|
||
|------|-----|----------|
|
||
| 本地端口 | 8418 | `/var/packages/gitea/var/conf.ini` |
|
||
| SSH端口 | 10022 | 同上 |
|
||
| 数据库 | SQLite3 | `/var/packages/gitea/var/data/gitea.db` |
|
||
| 仓库目录 | `/volume3/gitea-share/gitea-repositories` | 初始化时设置 |
|
||
| ROOT_URL | `https://git.haiguang.xyz/` | 需手动更新 |
|
||
| 运行用户 | sc-gitea | 套件自动创建 |
|
||
|
||
### FRP配置
|
||
|
||
| 参数 | 值 | 说明 |
|
||
|------|-----|------|
|
||
| 服务器地址 | 82.156.57.104 | FRP服务器IP |
|
||
| 服务器端口 | 7000 | FRP服务端口 |
|
||
| 认证Token | deb19f52ac7fa6423efcd1a3fbf9c2b7 | 服务端配置 |
|
||
| TLS加密 | 启用 | 安全传输 |
|
||
| Web代理 | 本地8418 → 远程13000 | TCP模式 |
|
||
| SSH代理 | 本地10022 → 远程10022 | TCP模式 |
|
||
|
||
---
|
||
|
||
## 经验教训
|
||
|
||
### 问题1:脚本执行失败
|
||
|
||
**现象**:群晖任务计划执行脚本后无输出,服务未启动
|
||
|
||
**根本原因**:
|
||
|
||
- Windows环境创建的脚本使用CRLF换行符
|
||
- 群晖bash无法解析CRLF格式
|
||
- 直接执行 `./script.sh` 会静默失败
|
||
|
||
**解决方案**:
|
||
|
||
```bash
|
||
# 错误方式
|
||
./install-local.sh
|
||
|
||
# 正确方式
|
||
bash install-local.sh
|
||
```
|
||
|
||
**预防措施**:
|
||
|
||
- 使用VSCode统一换行符为LF
|
||
- 或在脚本开头添加 `#!/bin/bash` 并用bash显式调用
|
||
|
||
---
|
||
|
||
### 问题2:HTTP代理不支持
|
||
|
||
**现象**:FRP日志显示 `type [http] not supported`
|
||
|
||
**根本原因**:
|
||
|
||
- FRP服务器未配置 `vhostHTTPPort`
|
||
- HTTP类型代理需要服务端支持虚拟主机
|
||
|
||
**解决方案**:
|
||
|
||
改用TCP模式:
|
||
|
||
```toml
|
||
[[proxies]]
|
||
name = "gitea-web"
|
||
type = "tcp" # 原为 "http"
|
||
localPort = 8418
|
||
remotePort = 13000
|
||
```
|
||
|
||
**对比**:
|
||
|
||
| 模式 | 优势 | 劣势 | 适用场景 |
|
||
|------|------|------|----------|
|
||
| HTTP | 支持域名路由,可共享80端口 | 需服务端配置 | 多服务共享域名 |
|
||
| TCP | 无需额外配置,通用性强 | 每服务需独立端口 | 单服务部署 |
|
||
|
||
---
|
||
|
||
### 问题3:端口冲突
|
||
|
||
**现象**:Gitea服务无法启动或FRP代理失败
|
||
|
||
**排查过程**:
|
||
|
||
1. 检查Gitea实际端口:`netstat -tuln | grep gitea` → 发现8418
|
||
2. 检查FRP端口占用:`netstat -tuln | grep 3000` → VPS已占用
|
||
3. 检查多实例:`ps aux | grep frpc` → 发现两个进程
|
||
|
||
**解决方案**:
|
||
|
||
```bash
|
||
# 清理所有frpc进程
|
||
kill -9 $(pgrep frpc)
|
||
|
||
# 修改remotePort为非标准端口
|
||
# 3000 → 13000
|
||
```
|
||
|
||
**预防措施**:
|
||
|
||
- 使用 `netstat` 或 `ss` 提前检查端口占用
|
||
- remotePort避免使用常见端口(3000, 8080等)
|
||
- 启动前执行清理脚本
|
||
|
||
---
|
||
|
||
### 问题4:数据库连接失败
|
||
|
||
**现象**:`dial tcp 127.0.0.1:3306: connect: connection refused`
|
||
|
||
**根本原因**:
|
||
|
||
- 群晖MariaDB套件监听 **3307** 端口(非标准3306)
|
||
- Gitea默认尝试连接3306
|
||
|
||
**解决方案**:
|
||
|
||
```bash
|
||
# 查看MariaDB实际端口
|
||
netstat -tuln | grep maria
|
||
|
||
# 方案1:修改Gitea配置连接3307
|
||
DB_TYPE = mysql
|
||
HOST = 127.0.0.1:3307
|
||
|
||
# 方案2:改用SQLite3(推荐个人使用)
|
||
DB_TYPE = sqlite3
|
||
```
|
||
|
||
**教训**:
|
||
|
||
- 群晖套件可能使用非标准端口
|
||
- 安装前务必确认服务实际配置
|
||
- 个人使用优先选择零配置方案
|
||
|
||
---
|
||
|
||
### 问题5:多实例冲突
|
||
|
||
**现象**:`proxy [gitea-web] already exists`
|
||
|
||
**原因**:
|
||
|
||
- 多次启动脚本导致多个frpc进程
|
||
- 旧进程未清理干净
|
||
|
||
**解决方案**:
|
||
|
||
```bash
|
||
# 强制停止所有实例
|
||
kill -9 $(pgrep frpc)
|
||
|
||
# 或使用专用停止脚本
|
||
bash stop-all-frpc.sh
|
||
```
|
||
|
||
**预防措施**:
|
||
|
||
- 启动前先执行停止
|
||
- 使用进程管理工具(如supervisor)
|
||
- 添加PID文件检查
|
||
|
||
---
|
||
|
||
## 安全配置
|
||
|
||
### 禁用公开注册
|
||
|
||
> [!warning] 重要安全设置
|
||
> 默认情况下,Gitea允许任何人注册账号。对于个人Git服务,必须禁用此功能。
|
||
|
||
**方法1:通过Web界面**
|
||
|
||
1. 以管理员登录Gitea
|
||
2. 点击右上角头像 → **管理后台**
|
||
3. 左侧菜单 → **配置管理** → **服务管理**
|
||
4. 找到 **禁止用户自行注册** 并勾选
|
||
5. 点击 **保存配置**
|
||
|
||
**方法2:修改配置文件**
|
||
|
||
编辑 `/var/packages/gitea/var/conf.ini`:
|
||
|
||
```ini
|
||
[service]
|
||
DISABLE_REGISTRATION = true
|
||
ENABLE_OPENID_SIGNUP = false
|
||
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
|
||
```
|
||
|
||
重启服务:
|
||
|
||
```bash
|
||
synopkg restart gitea
|
||
```
|
||
|
||
---
|
||
|
||
### Token管理
|
||
|
||
#### 创建访问令牌
|
||
|
||
1. 登录Gitea → 右上角头像 → **设置**
|
||
2. 左侧菜单 → **应用** → **管理Access Token**
|
||
3. 点击 **生成新的Token**
|
||
4. 填写信息:
|
||
- **令牌名称**:如 `sync-token`
|
||
- **权限选择**:只勾选 `repo`(最小权限原则)
|
||
- **过期时间**:建议30-90天
|
||
5. 点击 **生成令牌**
|
||
6. **⚠️ 立即复制Token**(只显示一次)
|
||
|
||
#### 配置Git使用Token
|
||
|
||
```bash
|
||
cd /path/to/your/repo
|
||
git remote set-url origin https://<token>@git.haiguang.xyz/username/repo.git
|
||
```
|
||
|
||
#### Token权限说明
|
||
|
||
| 权限范围 | 说明 | 个人使用 |
|
||
|---------|------|---------|
|
||
| `repo` | 仓库读写 | ✅ 必需 |
|
||
| `admin` | 管理员权限 | ❌ 不需要 |
|
||
| `user` | 用户信息 | ❌ 不需要 |
|
||
| `org` | 组织管理 | ❌ 不需要 |
|
||
|
||
#### Token安全最佳实践
|
||
|
||
- ✅ **最小权限**:只授予必需的权限
|
||
- ✅ **定期更换**:每3-6个月更换一次
|
||
- ✅ **环境变量**:不要在脚本中硬编码Token
|
||
- ✅ **监控使用**:定期检查Token使用记录
|
||
- ❌ **不要分享**:Token相当于密码
|
||
- ❌ **不要提交**:不要提交到Git仓库
|
||
|
||
---
|
||
|
||
### 自动同步配置
|
||
|
||
#### 创建同步脚本
|
||
|
||
**PowerShell版本** (`sync-gitea.ps1`):
|
||
|
||
```powershell
|
||
# Gitea仓库自动同步脚本
|
||
param(
|
||
[string]$RepoPath = "D:\TC_UP\2023card\projects\openclaw\obsidian_claw",
|
||
[string]$LogFile = "D:\TC_UP\2023card\projects\openclaw\obsidian_claw\sync.log",
|
||
[switch]$Quiet
|
||
)
|
||
|
||
function Write-Log {
|
||
param([string]$Message)
|
||
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||
$logEntry = "[$timestamp] $Message"
|
||
Add-Content -Path $LogFile -Value $logEntry
|
||
if (-not $Quiet) { Write-Host $logEntry }
|
||
}
|
||
|
||
try {
|
||
Write-Log "开始同步"
|
||
Push-Location $RepoPath
|
||
|
||
# 检查本地更改
|
||
$changes = git status --porcelain
|
||
if ($changes.Count -gt 0) {
|
||
Write-Log "提交本地更改"
|
||
git add -A
|
||
git commit -m "自动同步: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
|
||
}
|
||
|
||
# 拉取和推送
|
||
Write-Log "拉取远程更改"
|
||
git pull
|
||
|
||
if ($changes.Count -gt 0) {
|
||
Write-Log "推送本地更改"
|
||
git push
|
||
}
|
||
|
||
Pop-Location
|
||
Write-Log "同步完成"
|
||
} catch {
|
||
Write-Log "错误: $_"
|
||
exit 1
|
||
}
|
||
```
|
||
|
||
#### 配置Windows任务计划
|
||
|
||
1. 打开任务计划程序(`taskschd.msc`)
|
||
2. 创建基本任务:
|
||
- 名称:`Gitea仓库同步`
|
||
- 触发器:每天
|
||
- 操作:启动程序
|
||
- 程序:`powershell.exe`
|
||
- 参数:`-ExecutionPolicy Bypass -File "D:\path\to\sync-gitea.ps1" -Quiet`
|
||
3. 在属性中设置每小时重复
|
||
|
||
#### 查看同步日志
|
||
|
||
```powershell
|
||
# 查看最近20条日志
|
||
Get-Content sync.log -Tail 20
|
||
|
||
# 监控日志
|
||
Get-Content sync.log -Wait
|
||
```
|
||
|
||
---
|
||
|
||
## 完整配置示例
|
||
|
||
### Gitea配置文件(完整版)
|
||
|
||
```ini
|
||
APP_NAME = Gitea: Git with a cup of tea
|
||
RUN_USER = sc-gitea
|
||
WORK_PATH = /var/packages/gitea/var
|
||
RUN_MODE = prod
|
||
|
||
[repository]
|
||
ROOT = /volume3/gitea-share/gitea-repositories
|
||
|
||
[server]
|
||
SSH_DOMAIN = git.haiguang.xyz
|
||
DOMAIN = git.haiguang.xyz
|
||
ROOT_URL = https://git.haiguang.xyz/
|
||
LOCAL_ROOT_URL = http://localhost:8418/
|
||
HTTP_PORT = 8418
|
||
APP_DATA_PATH = /var/packages/gitea/var/data
|
||
DISABLE_SSH = false
|
||
SSH_PORT = 10022
|
||
LFS_START_SERVER = true
|
||
OFFLINE_MODE = true
|
||
|
||
[lfs]
|
||
PATH = /volume3/gitea-share/lfs
|
||
|
||
[database]
|
||
DB_TYPE = sqlite3
|
||
PATH = /var/packages/gitea/var/data/gitea.db
|
||
|
||
[service]
|
||
REGISTER_EMAIL_CONFIRM = false
|
||
ENABLE_NOTIFY_MAIL = false
|
||
DISABLE_REGISTRATION = true # 禁用公开注册
|
||
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
|
||
ENABLE_CAPTCHA = false
|
||
REQUIRE_SIGNIN_VIEW = false
|
||
DEFAULT_KEEP_EMAIL_PRIVATE = false
|
||
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
|
||
DEFAULT_ENABLE_TIMETRACKING = true
|
||
|
||
[openid]
|
||
ENABLE_OPENID_SIGNIN = true
|
||
ENABLE_OPENID_SIGNUP = false # 禁用OpenID注册
|
||
|
||
[security]
|
||
INSTALL_LOCK = true
|
||
PASSWORD_HASH_ALGO = pbkdf2
|
||
|
||
[log]
|
||
MODE = console
|
||
LEVEL = info
|
||
ROOT_PATH = /var/packages/gitea/var/log
|
||
```
|
||
|
||
### FRP配置文件(完整版)
|
||
|
||
```toml
|
||
serverAddr = "82.156.57.104"
|
||
serverPort = 7000
|
||
auth.method = "token"
|
||
auth.token = "your-token-here"
|
||
transport.tls.enable = true
|
||
log.to = "/var/log/frpc.log"
|
||
log.level = "info"
|
||
log.maxDays = 7
|
||
|
||
[[proxies]]
|
||
name = "gitea-web"
|
||
type = "tcp"
|
||
localIP = "127.0.0.1"
|
||
localPort = 8418
|
||
remotePort = 13000
|
||
|
||
[[proxies]]
|
||
name = "gitea-ssh"
|
||
type = "tcp"
|
||
localIP = "127.0.0.1"
|
||
localPort = 10022
|
||
remotePort = 10022
|
||
```
|
||
|
||
---
|
||
|
||
## 使用指南
|
||
|
||
### 日常操作
|
||
|
||
#### 启动FRP服务
|
||
|
||
```bash
|
||
bash /volume1/docker/frpc/start-frpc.sh
|
||
```
|
||
|
||
#### 停止FRP服务
|
||
|
||
```bash
|
||
bash /volume1/docker/frpc/stop-all-frpc.sh
|
||
```
|
||
|
||
#### 检查服务状态
|
||
|
||
```bash
|
||
bash /volume1/docker/frpc/status-frpc.sh
|
||
```
|
||
|
||
#### 查看日志
|
||
|
||
```bash
|
||
tail -f /var/log/frpc.log
|
||
```
|
||
|
||
#### 重启Gitea
|
||
|
||
```bash
|
||
synopkg restart gitea
|
||
```
|
||
|
||
---
|
||
|
||
### Git使用
|
||
|
||
#### HTTP克隆
|
||
|
||
```bash
|
||
git clone https://git.haiguang.xyz/username/repo.git
|
||
```
|
||
|
||
#### SSH克隆
|
||
|
||
```bash
|
||
git clone ssh://git@82.156.57.104:10022/username/repo.git
|
||
```
|
||
|
||
#### 配置SSH密钥
|
||
|
||
1. 生成密钥对:
|
||
```bash
|
||
ssh-keygen -t ed25519 -C "your_email@example.com"
|
||
```
|
||
|
||
2. 复制公钥到Gitea:
|
||
```bash
|
||
cat ~/.ssh/id_ed25519.pub
|
||
# 在 Gitea → 设置 → SSH/GPG密钥 → 添加密钥
|
||
```
|
||
|
||
3. 配置SSH客户端(`~/.ssh/config`):
|
||
```
|
||
Host gitea-haiguang
|
||
HostName 82.156.57.104
|
||
Port 10022
|
||
User git
|
||
IdentityFile ~/.ssh/id_ed25519
|
||
```
|
||
|
||
4. 简化克隆:
|
||
```bash
|
||
git clone gitea-haiguang:username/repo.git
|
||
```
|
||
|
||
---
|
||
|
||
### 维护任务
|
||
|
||
#### 定期备份
|
||
|
||
创建群晖任务计划,每周执行:
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
BACKUP_DIR="/volume1/backup/gitea"
|
||
DATE=$(date +%Y%m%d)
|
||
|
||
# 备份数据库
|
||
sqlite3 /var/packages/gitea/var/data/gitea.db ".backup ${BACKUP_DIR}/gitea-${DATE}.db"
|
||
|
||
# 备份配置
|
||
cp /var/packages/gitea/var/app.ini ${BACKUP_DIR}/app.ini.${DATE}
|
||
|
||
# 备份仓库(增量)
|
||
rsync -av /volume3/gitea-share/gitea-repositories/ ${BACKUP_DIR}/repos/
|
||
|
||
# 清理30天前的备份
|
||
find ${BACKUP_DIR} -name "*.db" -mtime +30 -delete
|
||
```
|
||
|
||
#### 监控脚本
|
||
|
||
创建 `check-gitea-health.sh`:
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# 检查Gitea服务
|
||
if ! synopkg status gitea | grep -q "start"; then
|
||
synopkg restart gitea
|
||
echo "$(date) Gitea服务重启" >> /var/log/gitea-health.log
|
||
fi
|
||
|
||
# 检查FRP客户端
|
||
if ! pgrep -x "frpc" > /dev/null; then
|
||
bash /volume1/docker/frpc/start-frpc.sh
|
||
echo "$(date) FRP客户端重启" >> /var/log/gitea-health.log
|
||
fi
|
||
```
|
||
|
||
配置cron每5分钟执行:
|
||
|
||
```bash
|
||
*/5 * * * * bash /volume1/docker/frpc/check-gitea-health.sh
|
||
```
|
||
|
||
---
|
||
|
||
## 故障排查
|
||
|
||
### 无法访问git.haiguang.xyz
|
||
|
||
**排查步骤**:
|
||
|
||
1. 检查DNS解析:
|
||
```bash
|
||
nslookup git.haiguang.xyz
|
||
# 应返回 82.156.57.104
|
||
```
|
||
|
||
2. 检查FRP客户端状态:
|
||
```bash
|
||
ps aux | grep frpc
|
||
tail -f /var/log/frpc.log
|
||
```
|
||
|
||
3. 检查服务器端口:
|
||
```bash
|
||
telnet 82.156.57.104 13000
|
||
```
|
||
|
||
4. 检查Gitea服务:
|
||
```bash
|
||
synopkg status gitea
|
||
curl http://127.0.0.1:8418
|
||
```
|
||
|
||
---
|
||
|
||
### SSH连接失败
|
||
|
||
**排查步骤**:
|
||
|
||
1. 检查SSH服务:
|
||
```bash
|
||
netstat -tuln | grep 10022
|
||
```
|
||
|
||
2. 检查SSH密钥:
|
||
```bash
|
||
ssh -v git@82.156.57.104 -p 10022
|
||
```
|
||
|
||
3. 检查Gitea SSH配置:
|
||
```ini
|
||
[server]
|
||
START_SSH_SERVER = true
|
||
SSH_PORT = 10022
|
||
```
|
||
|
||
---
|
||
|
||
### 推送超时
|
||
|
||
**可能原因**:
|
||
|
||
- 网络带宽不足
|
||
- 仓库过大
|
||
- FRP超时配置过短
|
||
|
||
**解决方案**:
|
||
|
||
```toml
|
||
# frpc.toml 增加超时时间
|
||
transport.dialTimeout = 30
|
||
transport.poolCount = 5
|
||
```
|
||
|
||
---
|
||
|
||
## 参考资源
|
||
|
||
### 官方文档
|
||
|
||
- [[Gitea官方文档]](https://docs.gitea.io/)
|
||
- [[FRP官方文档]](https://gofrp.org/docs/)
|
||
- [[SynoCommunity套件源]](https://github.com/SynoCommunity/spksrc)
|
||
|
||
### 相关笔记
|
||
|
||
- [[群晖NAS配置指南]]
|
||
- [[FRP内网穿透原理]]
|
||
- [[Git最佳实践]]
|
||
|
||
---
|
||
|
||
## 变更记录
|
||
|
||
| 日期 | 版本 | 变更内容 |
|
||
|------|------|----------|
|
||
| 2026-03-29 | 1.0 | 初始版本,记录完整部署流程 |
|
||
| 2026-03-29 | 1.1 | 新增内容:<br>- 修正配置文件路径(conf.ini而非app.ini)<br>- 添加安全配置章节(禁用注册、Token管理)<br>- 添加自动同步脚本配置<br>- 完善配置示例和故障排查清单<br>- 新增关键配置路径对照表 |
|
||
|
||
---
|
||
|
||
## 附录
|
||
|
||
### A. 部署文件清单
|
||
|
||
```
|
||
/volume1/docker/frpc/
|
||
├── frp_0.68.0_linux_amd64/ # FRP程序目录
|
||
│ ├── frpc # 客户端程序
|
||
│ └── frpc.toml # 配置文件
|
||
├── frp_0.68.0_linux_amd64.tar.gz # 安装包
|
||
├── install-local.sh # 安装脚本
|
||
├── start-frpc.sh # 启动脚本
|
||
├── stop-all-frpc.sh # 停止脚本
|
||
├── status-frpc.sh # 状态检查
|
||
├── check-gitea-health.sh # 健康检查
|
||
└── update-gitea-security.sh # 配置更新
|
||
|
||
/var/packages/gitea/var/
|
||
├── conf.ini # Gitea配置文件(重要)
|
||
├── data/
|
||
│ └── gitea.db # SQLite数据库
|
||
└── log/ # 日志目录
|
||
|
||
本地Windows仓库(obsidian_claw)/
|
||
├── sync-gitea.bat # 同步脚本(BAT版)
|
||
├── sync-gitea.ps1 # 同步脚本(PowerShell版)
|
||
├── 同步脚本使用说明.md # 同步脚本文档
|
||
└── sync.log # 同步日志
|
||
```
|
||
|
||
### B. 服务端口映射表
|
||
|
||
| 服务 | 本地地址 | 远程地址 | 协议 |
|
||
|------|----------|----------|------|
|
||
| Gitea Web | 127.0.0.1:8418 | 82.156.57.104:13000 | TCP |
|
||
| Gitea SSH | 127.0.0.1:10022 | 82.156.57.104:10022 | TCP |
|
||
|
||
### C. 常用命令速查
|
||
|
||
```bash
|
||
# Gitea相关
|
||
synopkg status gitea # 查看状态
|
||
synopkg restart gitea # 重启服务
|
||
synopkg stop gitea # 停止服务
|
||
synopkg start gitea # 启动服务
|
||
|
||
# FRP相关
|
||
ps aux | grep frpc # 查看进程
|
||
kill -9 $(pgrep frpc) # 强制停止
|
||
tail -f /var/log/frpc.log # 查看日志
|
||
|
||
# 网络诊断
|
||
netstat -tuln | grep 8418 # 检查端口
|
||
telnet 82.156.57.104 13000 # 测试连通性
|
||
curl -I https://git.haiguang.xyz/ # 测试HTTP
|
||
|
||
# 数据库操作(SQLite3)
|
||
sqlite3 /var/packages/gitea/var/data/gitea.db ".tables"
|
||
sqlite3 /var/packages/gitea/var/data/gitea.db ".backup /tmp/gitea.db.bak"
|
||
|
||
# Git Token配置
|
||
git remote set-url origin https://<token>@git.haiguang.xyz/username/repo.git
|
||
git remote -v # 验证配置
|
||
|
||
# Windows同步脚本
|
||
powershell -ExecutionPolicy Bypass -File sync-gitea.ps1
|
||
Get-Content sync.log -Tail 20 # 查看日志
|
||
```
|
||
|
||
### D. 故障排查清单
|
||
|
||
| 问题 | 检查命令 | 解决方案 |
|
||
|------|---------|---------|
|
||
| 无法访问仓库 | `curl -I https://git.haiguang.xyz/` | 检查DNS、FRP、Gitea服务 |
|
||
| Git推送失败 | `git remote -v` | 检查Token是否有效 |
|
||
| FRP连接失败 | `tail -f /var/log/frpc.log` | 检查服务器状态、Token |
|
||
| 脚本执行失败 | 使用 `bash script.sh` | 检查换行符(LF vs CRLF) |
|
||
| 端口冲突 | `netstat -tuln | grep <port>` | 修改端口号 |
|
||
| 配置不生效 | `synopkg restart gitea` | 重启服务 |
|
||
|
||
### E. 关键配置路径对照表
|
||
|
||
| 配置项 | 路径 | 说明 |
|
||
|--------|------|------|
|
||
| Gitea配置 | `/var/packages/gitea/var/conf.ini` | ⚠️ 不是app.ini |
|
||
| 数据库文件 | `/var/packages/gitea/var/data/gitea.db` | SQLite3 |
|
||
| FRP配置 | `/volume1/docker/frpc/frpc.toml` | TOML格式 |
|
||
| FRP日志 | `/var/log/frpc.log` | 按maxDays轮转 |
|
||
| 仓库目录 | `/volume3/gitea-share/gitea-repositories/` | 初始化时设置 |
|
||
| LFS文件 | `/volume3/gitea-share/lfs/` | 大文件存储 |
|
||
|
||
---
|
||
|
||
> [!quote] 总结
|
||
> 本次部署从零开始搭建了完整的个人Git服务,涵盖了Gitea安装、FRP内网穿透、域名配置、SSH密钥管理等核心环节。通过群晖任务计划实现了无SSH的远程部署,解决了Windows换行符、端口冲突、数据库配置等实际问题。最终实现了稳定的公网访问,为个人代码管理提供了可靠的基础设施。
|