内网 Gitea 通过 FRP 公网访问配置教程(SSH + HTTP)

1️⃣ 环境概览

架构:

公网服务器(公网ip)
      │ 7000, 7400 (FRP服务端)
      │
      ▼
内网主机(192.168.1.180)
      │ 22(SSH宿主机)、3000(Gitea HTTP)、2222(Gitea SSH 内部端口)
      │
      ▼
Docker 容器 Gitea
      │ 3000(HTTP)、22(SSH,映射到宿主机2222)
  • 目标:公网客户端可通过 SSH(端口59022)和 HTTP(端口59023)访问内网 Gitea。
  • 工具:FRP 内网穿透 + Gitea Docker + SSH Key。

2️⃣ Docker 部署 Gitea

在内网主机执行:

docker run -d \
  --name gitea \
  -p 3000:3000 \   # HTTP
  -p 222:22 \     # SSH
  -v /data/gitea:/data \
  gitea/gitea:latest
  • Gitea 内部 SSH 端口:22 → 宿主机映射 222
  • Gitea HTTP 端口:3000 → 宿主机映射 3000

配置 Gitea

app.ini 中(位于 /data/gitea/custom/conf/app.ini):

[server]
DOMAIN = git.frp.beihong.wang
SSH_DOMAIN = git.frp.beihong.wang
HTTP_PORT = 3000
ROOT_URL = https://git.frp.beihong.wang/
DISABLE_SSH = false
SSH_PORT = 22   # 容器内端口
SSH_LISTEN_PORT = 22

3️⃣ 配置 FRP

FRP 客户端配置(运行在内网主机):

serverAddr = "8.155.166.96"
serverPort = 7000
auth.method = "token"
auth.token = "60d8a83c544e6168db"

webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "frpc_user"
webServer.password = "e63bnK6FZRpDAjXm"

# Gitea HTTP 映射(可选)
[[proxies]]
name = "tai_git"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3000       # 宿主机 HTTP 端口
remotePort = 59023     # 公网访问端口

# Gitea SSH 映射
[[proxies]]
name = "gitea_ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 222       # 宿主机 Gitea SSH 映射端口
remotePort = 59022     # 公网访问端口

FRP 服务端配置(运行在公网服务器):

[common]
bind_port = 7000
dashboard_port = 7400
dashboard_user = frpc_user
dashboard_pwd = e63bnK6FZRpDAjXm
vhost_http_timeout = 300

启动 FRP:

# 服务端(公网)
./frps -c ./frps.ini

# 客户端(内网)
./frpc -c ./frpc.ini

4️⃣ 客户端 SSH Key 配置

在本地开发机(客户端):

# 启动 SSH agent
eval "$(ssh-agent -s)"

# 添加私钥
ssh-add ~/.ssh/id_ed25519

# 验证
ssh-add -l

公钥~/.ssh/id_ed25519.pub)添加到 Gitea 的 SSH Keys 页面。


5️⃣ 配置 Git 远程仓库

修改 Git 远程 URL:

git remote set-url origin ssh://git@git.frp.beihong.wang:59022/用户名/仓库名.git
  • 这里 59022 是 FRP 映射的 SSH 公网端口
  • git@git.frp.beihong.wang → 公网 FRP 地址

第一次连接时:

ssh -p 59022 git@git.frp.beihong.wang
# 会提示 host key,输入 yes

6️⃣ Git 推送

git push -u origin main

成功输出示例:

Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 20 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 659.06 KiB | 18.31 MiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
remote: . Processing 1 references
remote: Processed 1 references in total
To ssh://git.frp.beihong.wang:59022/用户名/仓库名.git
   929f627..bfd2d9a  main -> main
branch 'main' set up to track 'origin/main'.

✅ 注意事项

  1. 端口映射冲突

    • FRP TCP 端口不能重复。SSH(59022)和 HTTP(59023)分开映射。
  2. Gitea SSH 端口

    • Docker 容器内默认 22
    • 宿主机映射 222 → FRP 映射 59022
  3. SSH host key

    • 本地 known_hosts 文件可能要删除旧条目:

      ssh-keygen -R "[git.frp.beihong.wang]:59022"
  4. HTTP 访问

    • 如果只需要浏览器访问,可以用 59023 端口
    • Git clone / push 优先用 SSH(稳定)