Files
llm_wiki/wiki/Gitea-部署指南.md
T

1618 lines
39 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.
---
categories:
- '[[LLM Wiki]]'
tags:
- wiki
- concept
- gitea
- deployment
- frp
- nas
created: 2026-04-07
source: '[[Gitea个人Git服务部署指南]]'
type: concept
aliases:
- 自建Git服务
- NAS代码仓库
- FRP内网穿透
relations:
- type: extends
target: '[[Gitea-故障排查]]'
confidence: 2
- type: extends
target: '[[FRP]]'
confidence: 2
---
[raw:Gitea个人Git服务部署指南:2]# Gitea 部署指南
> **一句话描述**:在群晖 NAS 上部署 Gitea + FRP 实现个人 Git 服务的公网访问
## 背景
在群晖 NAS 上部署 Gitea 代码仓库服务,通过 FRP 内网穿透暴露到公网,实现个人代码仓库的远程访问。相比 QuickConnect,FRP 提供更稳定的连接和更快的访问速度。
### 两种部署方案
| 方案 | 架构 | 优势 | 适用场景 |
|
------|
------|------|----------|
| **NAS 方案** | NAS + Gitea + FRP | 配置简单,无需额外 VPS | 已有 NAS,设备较少 |
| **VPS 方案** | VPS + Nginx + FRP + NAS + Gitea | HTTPS 自动化,可扩展多服务 | 需要独立域名,希望更稳定 |
**本指南重点**NAS 方案(群晖 + Gitea + FRP
**VPS 方案参考**:本指南后文的"VPS 方案"章节
---
## 环境概览
### 硬件环境
| 配置项 | 值 |
|--------|-----|
| 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 |
---
## 部署架构
### NAS 方案(本指南重点)
```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
### VPS 方案(参考)
```mermaid
graph LR
A[用户浏览器] -->|HTTPS| B[腾讯云VPS<br/>82.156.57.104]
A -->|git clone/push| B
B -->|Nginx反代| C[frps:13000]
C -->|FRP隧道<br/>TLS加密| D[frpc]
D -->|TCP| E[NAS Gitea:8418]
```
**VPS 端口映射**
| 位置 | 端口 | 服务 |
|------|------|------|
| VPS | 7000 | frps 通信 |
| VPS | 13000 | frps 代理(Gitea Web |
| VPS | 10022 | frps 代理(Gitea SSH |
| VPS | 443 | Nginx HTTPS |
| VPS | 80 | Nginx HTTP → HTTPS |
---
## 方案选型
> [!tip] 选型结论
> 经过对比 Gitea vs Gogs、SQLite vs MySQL/PostgreSQL、FRP vs Tailscale,最终选择:**Gitea + SQLite + FRP**。
### Gitea vs Gogs vs GitLab
| 维度 | Gitea ✅ | Gogs | GitLab ❌ |
|------|---------|------|---------|
| 最低内存 | ~200MB | ~100MB | ≥4GB |
| 功能完整度 | PR/Actions/包管理/Wiki | 基础 | 全功能 |
| CI/CD | 内置 Actions | 需外接 | 内置 |
| 社区活跃度 | 非常活跃 | 维护模式 | 活跃 |
### 数据库选型
| 维度 | SQLite ✅ | MySQL | PostgreSQL | CouchDB(已有) |
|------|---------|-------|-----------|---------------|
| 额外内存 | 0 | ~200MB | ~200MB | ~43MB |
| 额外部署 | 无 | 需安装 | 需安装 | 已有 |
| Gitea 支持 | ✅ | ✅ | ✅ | ❌ |
### 内网穿透选型
| 维度 | FRP ✅ | Tailscale | Cloudflare Tunnel |
|------|--------|-----------|-------------------|
| 每台设备装客户端 | 不需要 | 需要 | 不需要 |
| 传输方式 | 中继 | P2P 优先 | 中继 |
| 部署复杂度 | 低 | 中 | 中 |
| 适用场景 | 少设备通用访问 | 多设备频繁访问 | HTTP-only |
> [!warning] Tailscale 不选的原因
> - 家宽 NAT 穿透不稳定,手机 4G 大概率走 DERP 中继(速度与 FRP 相当)
> - 每台设备都要装客户端,临时借用电脑不方便
> - VPS 带宽才是瓶颈(~2.8Mbps),P2P 优势有限
---
## VPS 方案部署(参考)
### VPS 环境信息
| 项目 | 值 |
|------|-----|
| 系统 | Ubuntu 24.04.4 LTS |
| CPU | 2 核 AMD EPYC 7K62 |
| 内存 | 2GB(可用约 640MB |
| 磁盘 | 40GB(可用 14GB |
| 公网 IP | 82.156.57.104 |
| 已有服务 | Nginx、OpenClaw Gateway、CouchDB |
### 第一步:FRP 服务端部署(VPS)
**1. 下载安装**
```bash
# 下载 FRP v0.68.0
wget https://github.com/fatedier/frp/releases/download/v0.68.0/frp_0.68.0_linux_amd64.tar.gz
tar -xzf frp_0.68.0_linux_amd64.tar.gz -C /opt/
mv /opt/frp_0.68.0_linux_amd64 /opt/frp
ln -s /opt/frp/frps /usr/local/bin/frps
```
**2. 配置 frps.toml**
```toml
# FRP 服务端配置
bindPort = 7000 # 客户端连接端口
[auth]
token = "你的强密码" # 认证令牌(两端必须一致)
[transport]
tls.force = true # 强制 TLS 加密
[webServer]
addr = "127.0.0.1" # Dashboard 仅本地访问
port = 7500
user = "admin"
password = "你的密码"
```
**3. systemd 服务**
```ini
# /etc/systemd/system/frps.service
[Unit]
Description=FRP Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frps -c /opt/frp/frps.toml
[Install]
WantedBy=multi-user.target
```
**4. 启动**
```bash
systemctl daemon-reload
systemctl enable --now frps
```
**5. 腾讯云安全组放行**
| 端口 | 协议 | 来源 | 用途 |
|------|------|------|------|
| 7000 | TCP | 0.0.0.0/0 | FRP 通信 |
| 13000 | TCP | 0.0.0.0/0 | Gitea Web |
| 10022 | TCP | 0.0.0.0/0 | Gitea SSH(可选) |
### 第二步:Nginx 反向代理 + HTTPS
**1. HTTP 反代配置**
```nginx
# /etc/nginx/sites-available/gitea
server {
listen 80;
listen [::]:80;
server_name git.haiguang.xyz;
access_log /var/log/nginx/gitea-access.log;
error_log /var/log/nginx/gitea-error.log;
location / {
proxy_pass http://127.0.0.1:13000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 100m;
}
}
```
**2. Let's Encrypt 证书**
```bash
# 安装 certbot
apt install certbot python3-certbot-nginx
# 签发证书并自动配置 HTTPS
certbot --nginx -d git.haiguang.xyz
```
certbot 会自动修改 Nginx 配置,添加 HTTPS 监听和证书路径。
### 第三步:FRP 客户端配置(NAS)
VPS 方案下的 FRP 客户端配置与 NAS 方案相同,见"部署步骤"章节。
### VPS 方案文件路径
| 文件 | 路径 |
|------|------|
| frps 二进制 | /usr/local/bin/frps |
| frps 配置 | /opt/frp/frps.toml |
| frps 服务 | /etc/systemd/system/frps.service |
| Nginx Gitea 配置 | /etc/nginx/sites-available/gitea |
| HTTPS 证书 | /etc/letsencrypt/live/git.haiguang.xyz/ |
| HTTPS 密钥 | /etc/letsencrypt/live/git.haiguang.xyz/privkey.pem |
---
## NAS 方案部署步骤
## 环境概览
### 硬件环境
| 配置项 | 值 |
|--------|-----|
| 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
密码: [你的密码]
```
### 第二阶段: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` 显式调用脚本,而非直接执行
### 第三阶段:配置更新
#### 1. 更新 ROOT_URL 和安全配置
编辑 `/var/packages/gitea/var/conf.ini`
```ini
[server]
ROOT_URL = https://git.haiguang.xyz/
DOMAIN = git.haiguang.xyz
SSH_DOMAIN = git.haiguang.xyz
[service]
DISABLE_REGISTRATION = true # 禁用公开注册
ENABLE_OPENID_SIGNUP = false
```
重启服务:
```bash
synopkg restart gitea
```
#### 2. 配置 DNS 解析
在域名服务商添加 A 记录:
| 类型 | 主机记录 | 记录值 | TTL |
|------|----------|--------|-----|
| A | git | 82.156.57.104 | 600 |
## 关键参数清单
### 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 显式调用
### 问题 2HTTP 代理不支持
**现象**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
```
### Token 管理
#### 创建访问令牌
1. 登录 Gitea → 右上角头像 → **设置**
2. 左侧菜单 → **应用****管理 Access Token**
3. 点击 **生成新的 Token**
4. 填写信息:
- **令牌名称**:如 `sync-token`
- **权限选择**:只勾选 `repo`(最小权限原则)
- **过期时间**:建议 30-90 天
5. 点击 **生成令牌**
6. **⚠️ 立即复制 Token**(只显示一次)
#### Token 权限说明
| 权限范围 | 说明 | 个人使用 |
|---------|------|---------|
| `repo` | 仓库读写 | ✅ 必需 |
| `admin` | 管理员权限 | ❌ 不需要 |
| `user` | 用户信息 | ❌ 不需要 |
| `org` | 组织管理 | ❌ 不需要 |
#### Token 安全最佳实践
-**最小权限**:只授予必需的权限
-**定期更换**:每 3-6 个月更换一次
-**环境变量**:不要在脚本中硬编码 Token
-**监控使用**:定期检查 Token 使用记录
-**不要分享**Token 相当于密码
-**不要提交**:不要提交到 Git 仓库
## 使用指南
### 日常操作
#### 启动 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
# 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 # 验证配置
```
## 与 Gitea 故障排查的关系
本部署指南与 [[Gitea-故障排查]] 是互补关系:
| 维度 | 部署指南 | 故障排查 |
|------|---------|----------|
| **重点** | 部署流程、配置参数、架构设计 | 使用中遇到的具体问题 |
| **受众** | 从零搭建的人 | 已部署但遇到问题的人 |
| **内容** | 环境配置、脚本部署、安全设置 | 错误信息、解决方案、诊断命令 |
| **依赖** | 群晖 NAS、FRP 服务 | 部署完成的服务 |
**建议使用流程**
1. 按照 [[Gitea 部署指南]] 完成部署
2. 遇到问题时,查阅 [[Gitea-故障排查]] 的对应章节
3. 使用本指南中的"常用命令速查"进行诊断
## 相关概念
- [[FRP]] - 内网穿透工具
- [[内网穿透]] - 将本地服务暴露到公网的技术
- [[Gitea]] - Git 托管服务本身
- [[群晖NAS]] - Synology 网络存储服务器
- [[Git]] - 版本控制系统
## 来源
- [[Gitea个人Git服务部署指南]] - 完整部署指南(2026-03-29
- Gitea 官方文档:<https://docs.gitea.io/>
- FRP 官方文档:<https://gofrp.org/docs/>
- SynoCommunity 套件源:<https://github.com/SynoCommunity/spksrc>
[raw:Gitea个人Git服务部署指南:2]# Gitea 部署指南
> **一句话描述**:在群晖 NAS 上部署 Gitea + FRP 实现个人 Git 服务的公网访问
## 背景
在群晖 NAS 上部署 Gitea 代码仓库服务,通过 FRP 内网穿透暴露到公网,实现个人代码仓库的远程访问。相比 QuickConnect,FRP 提供更稳定的连接和更快的访问速度。
### 两种部署方案
| 方案 | 架构 | 优势 | 适用场景 |
|------|------|------|----------|
| **NAS 方案** | NAS + Gitea + FRP | 配置简单,无需额外 VPS | 已有 NAS,设备较少 |
| **VPS 方案** | VPS + Nginx + FRP + NAS + Gitea | HTTPS 自动化,可扩展多服务 | 需要独立域名,希望更稳定 |
**本指南重点**NAS 方案(群晖 + Gitea + FRP
**VPS 方案参考**:本指南后文的"VPS 方案"章节
---
## 环境概览
### 硬件环境
| 配置项 | 值 |
|--------|-----|
| 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 |
---
## 部署架构
### NAS 方案(本指南重点)
```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
### VPS 方案(参考)
```mermaid
graph LR
A[用户浏览器] -->|HTTPS| B[腾讯云VPS<br/>82.156.57.104]
A -->|git clone/push| B
B -->|Nginx反代| C[frps:13000]
C -->|FRP隧道<br/>TLS加密| D[frpc]
D -->|TCP| E[NAS Gitea:8418]
```
**VPS 端口映射**
| 位置 | 端口 | 服务 |
|------|------|------|
| VPS | 7000 | frps 通信 |
| VPS | 13000 | frps 代理(Gitea Web |
| VPS | 10022 | frps 代理(Gitea SSH |
| VPS | 443 | Nginx HTTPS |
| VPS | 80 | Nginx HTTP → HTTPS |
---
## 方案选型
> [!tip] 选型结论
> 经过对比 Gitea vs Gogs、SQLite vs MySQL/PostgreSQL、FRP vs Tailscale,最终选择:**Gitea + SQLite + FRP**。
### Gitea vs Gogs vs GitLab
| 维度 | Gitea ✅ | Gogs | GitLab ❌ |
|------|---------|------|---------|
| 最低内存 | ~200MB | ~100MB | ≥4GB |
| 功能完整度 | PR/Actions/包管理/Wiki | 基础 | 全功能 |
| CI/CD | 内置 Actions | 需外接 | 内置 |
| 社区活跃度 | 非常活跃 | 维护模式 | 活跃 |
### 数据库选型
| 维度 | SQLite ✅ | MySQL | PostgreSQL | CouchDB(已有) |
|------|---------|-------|-----------|---------------|
| 额外内存 | 0 | ~200MB | ~200MB | ~43MB |
| 额外部署 | 无 | 需安装 | 需安装 | 已有 |
| Gitea 支持 | ✅ | ✅ | ✅ | ❌ |
### 内网穿透选型
| 维度 | FRP ✅ | Tailscale | Cloudflare Tunnel |
|------|--------|-----------|-------------------|
| 每台设备装客户端 | 不需要 | 需要 | 不需要 |
| 传输方式 | 中继 | P2P 优先 | 中继 |
| 部署复杂度 | 低 | 中 | 中 |
| 适用场景 | 少设备通用访问 | 多设备频繁访问 | HTTP-only |
> [!warning] Tailscale 不选的原因
> - 家宽 NAT 穿透不稳定,手机 4G 大概率走 DERP 中继(速度与 FRP 相当)
> - 每台设备都要装客户端,临时借用电脑不方便
> - VPS 带宽才是瓶颈(~2.8Mbps),P2P 优势有限
---
## VPS 方案部署(参考)
### VPS 环境信息
| 项目 | 值 |
|------|-----|
| 系统 | Ubuntu 24.04.4 LTS |
| CPU | 2 核 AMD EPYC 7K62 |
| 内存 | 2GB(可用约 640MB |
| 磁盘 | 40GB(可用 14GB |
| 公网 IP | 82.156.57.104 |
| 已有服务 | Nginx、OpenClaw Gateway、CouchDB |
### 第一步:FRP 服务端部署(VPS)
**1. 下载安装**
```bash
# 下载 FRP v0.68.0
wget https://github.com/fatedier/frp/releases/download/v0.68.0/frp_0.68.0_linux_amd64.tar.gz
tar -xzf frp_0.68.0_linux_amd64.tar.gz -C /opt/
mv /opt/frp_0.68.0_linux_amd64 /opt/frp
ln -s /opt/frp/frps /usr/local/bin/frps
```
**2. 配置 frps.toml**
```toml
# FRP 服务端配置
bindPort = 7000 # 客户端连接端口
[auth]
token = "你的强密码" # 认证令牌(两端必须一致)
[transport]
tls.force = true # 强制 TLS 加密
[webServer]
addr = "127.0.0.1" # Dashboard 仅本地访问
port = 7500
user = "admin"
password = "你的密码"
```
**3. systemd 服务**
```ini
# /etc/systemd/system/frps.service
[Unit]
Description=FRP Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frps -c /opt/frp/frps.toml
[Install]
WantedBy=multi-user.target
```
**4. 启动**
```bash
systemctl daemon-reload
systemctl enable --now frps
```
**5. 腾讯云安全组放行**
| 端口 | 协议 | 来源 | 用途 |
|------|------|------|------|
| 7000 | TCP | 0.0.0.0/0 | FRP 通信 |
| 13000 | TCP | 0.0.0.0/0 | Gitea Web |
| 10022 | TCP | 0.0.0.0/0 | Gitea SSH(可选) |
### 第二步:Nginx 反向代理 + HTTPS
**1. HTTP 反代配置**
```nginx
# /etc/nginx/sites-available/gitea
server {
listen 80;
listen [::]:80;
server_name git.haiguang.xyz;
access_log /var/log/nginx/gitea-access.log;
error_log /var/log/nginx/gitea-error.log;
location / {
proxy_pass http://127.0.0.1:13000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 100m;
}
}
```
**2. Let's Encrypt 证书**
```bash
# 安装 certbot
apt install certbot python3-certbot-nginx
# 签发证书并自动配置 HTTPS
certbot --nginx -d git.haiguang.xyz
```
certbot 会自动修改 Nginx 配置,添加 HTTPS 监听和证书路径。
### 第三步:FRP 客户端配置(NAS)
VPS 方案下的 FRP 客户端配置与 NAS 方案相同,见"部署步骤"章节。
### VPS 方案文件路径
| 文件 | 路径 |
|------|------|
| frps 二进制 | /usr/local/bin/frps |
| frps 配置 | /opt/frp/frps.toml |
| frps 服务 | /etc/systemd/system/frps.service |
| Nginx Gitea 配置 | /etc/nginx/sites-available/gitea |
| HTTPS 证书 | /etc/letsencrypt/live/git.haiguang.xyz/ |
| HTTPS 密钥 | /etc/letsencrypt/live/git.haiguang.xyz/privkey.pem |
---
## NAS 方案部署步骤
## 环境概览
### 硬件环境
| 配置项 | 值 |
|--------|-----|
| 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
密码: [你的密码]
```
### 第二阶段: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` 显式调用脚本,而非直接执行
### 第三阶段:配置更新
#### 1. 更新 ROOT_URL 和安全配置
编辑 `/var/packages/gitea/var/conf.ini`
```ini
[server]
ROOT_URL = https://git.haiguang.xyz/
DOMAIN = git.haiguang.xyz
SSH_DOMAIN = git.haiguang.xyz
[service]
DISABLE_REGISTRATION = true # 禁用公开注册
ENABLE_OPENID_SIGNUP = false
```
重启服务:
```bash
synopkg restart gitea
```
#### 2. 配置 DNS 解析
在域名服务商添加 A 记录:
| 类型 | 主机记录 | 记录值 | TTL |
|------|----------|--------|-----|
| A | git | 82.156.57.104 | 600 |
## 关键参数清单
### 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 显式调用
### 问题 2HTTP 代理不支持
**现象**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
```
### Token 管理
#### 创建访问令牌
1. 登录 Gitea → 右上角头像 → **设置**
2. 左侧菜单 → **应用****管理 Access Token**
3. 点击 **生成新的 Token**
4. 填写信息:
- **令牌名称**:如 `sync-token`
- **权限选择**:只勾选 `repo`(最小权限原则)
- **过期时间**:建议 30-90 天
5. 点击 **生成令牌**
6. **⚠️ 立即复制 Token**(只显示一次)
#### Token 权限说明
| 权限范围 | 说明 | 个人使用 |
|---------|------|---------|
| `repo` | 仓库读写 | ✅ 必需 |
| `admin` | 管理员权限 | ❌ 不需要 |
| `user` | 用户信息 | ❌ 不需要 |
| `org` | 组织管理 | ❌ 不需要 |
#### Token 安全最佳实践
-**最小权限**:只授予必需的权限
-**定期更换**:每 3-6 个月更换一次
-**环境变量**:不要在脚本中硬编码 Token
-**监控使用**:定期检查 Token 使用记录
-**不要分享**Token 相当于密码
-**不要提交**:不要提交到 Git 仓库
## 使用指南
### 日常操作
#### 启动 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
# 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 # 验证配置
```
## 与 Gitea 故障排查的关系
本部署指南与 [[Gitea-故障排查]] 是互补关系:
| 维度 | 部署指南 | 故障排查 |
|------|---------|----------|
| **重点** | 部署流程、配置参数、架构设计 | 使用中遇到的具体问题 |
| **受众** | 从零搭建的人 | 已部署但遇到问题的人 |
| **内容** | 环境配置、脚本部署、安全设置 | 错误信息、解决方案、诊断命令 |
| **依赖** | 群晖 NAS、FRP 服务 | 部署完成的服务 |
**建议使用流程**
1. 按照 [[Gitea 部署指南]] 完成部署
2. 遇到问题时,查阅 [[Gitea-故障排查]] 的对应章节
3. 使用本指南中的"常用命令速查"进行诊断
## 相关概念
- [[FRP]] - 内网穿透工具
- [[内网穿透]] - 将本地服务暴露到公网的技术
- [[Gitea]] - Git 托管服务本身
- [[群晖NAS]] - Synology 网络存储服务器
- [[Git]] - 版本控制系统
## 来源
- [[Gitea个人Git服务部署指南]] - 完整部署指南(2026-03-29
- Gitea 官方文档:<https://docs.gitea.io/>
- FRP 官方文档:<https://gofrp.org/docs/>
- SynoCommunity 套件源:<https://github.com/SynoCommunity/spksrc>