Forgejo Docker 部署教程
Forgejo Docker 部署教程:使用独立 SSH 22 端口,实现 GitHub 风格 SSH 克隆地址
本文记录一次完整部署过程:
Docker Compose 部署 Forgejo + PostgreSQL,Caddy 反代 Web,独占公网 22 端口提供 Git SSH 服务,并配置 GitHub 风格 SSH URL。
最终效果:
网页:
https://git.zenroly.com
Git SSH:
git clone git@git.zenroly.com:bill/notes.git
无需:
-p 2222
与 GitHub 使用体验一致。
一、设计架构
服务器原本:
sshd
监听 51989
因为安全原因,没有使用默认 SSH 22:
sudo ss -tnlp | grep ssh
结果:
LISTEN 0 128 0.0.0.0:51989 sshd
所以 22 端口空闲,可以交给 Forgejo。
最终架构:
Internet
|
|
git.zenroly.com:22
|
|
docker-proxy
|
|
Forgejo SSH
|
Git 用户认证
管理SSH:
server-ip:51989
|
sshd
|
管理服务器
这样:
- Git 用户走 22
- 管理员 SSH 走 51989
互不干扰。
二、安装目录
创建:
mkdir ~/forgejo
cd ~/forgejo
目录:
forgejo/
├── docker-compose.yml
└── data/
└── gitea/
└── conf/
└── app.ini
Forgejo 继承 Gitea 配置路径:
/data/gitea/conf/app.ini
三、docker-compose.yml
最终配置:
networks:
forgejo_net:
services:
forgejo:
image: codeberg.org/forgejo/forgejo:15
container_name: forgejo
restart: unless-stopped
networks:
- forgejo_net
depends_on:
- forgejo-db
environment:
# 容器运行用户
- USER_UID=1001
- USER_GID=1001
# PostgreSQL
- FORGEJO__database__DB_TYPE=postgres
- FORGEJO__database__HOST=forgejo-db:5432
- FORGEJO__database__NAME=forgejo
- FORGEJO__database__USER=forgejo
- FORGEJO__database__PASSWD=密码
# 网站
- FORGEJO__server__ROOT_URL=https://git.zenroly.com/
- FORGEJO__server__DOMAIN=git.zenroly.com
# SSH
- FORGEJO__server__SSH_DOMAIN=git.zenroly.com
- FORGEJO__server__SSH_PORT=22
# 注意:
# 使用宿主机22映射,不使用Forgejo内置SSH
- FORGEJO__server__SSH_LISTEN_PORT=0.0.0.0:22
- FORGEJO__server__DISABLE_SSH=false
# 关闭内置 SSH Server
- FORGEJO__server__START_SSH_SERVER=false
# GitHub 风格 SSH URL
# false = git@host:user/repo.git
# true = ssh://git@host/user/repo.git
- FORGEJO__repository__USE_COMPAT_SSH_URI=false
# Actions
- FORGEJO__actions__ENABLED=true
- FORGEJO__actions__DEFAULT_ACTIONS_URL=https://code.forgejo.org
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
# Web 给 Caddy 反代
- "127.0.0.1:3000:3000"
# SSH
- "22:22"
forgejo-db:
image: postgres:16-alpine
container_name: forgejo-db
restart: unless-stopped
networks:
- forgejo_net
environment:
- POSTGRES_DB=forgejo
- POSTGRES_USER=forgejo
- POSTGRES_PASSWORD=密码
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
四、关键配置说明
1. 不开启 Forgejo 内置 SSH
错误方案:
FORGEJO__server__START_SSH_SERVER=true
原因:
Forgejo 会自己监听:
:22
但是 Docker 已经映射:
宿主机22 -> 容器22
会冲突:
日志:
Failed to start SSH server:
listen tcp :22:
bind: address already in use
所以:
正确:
FORGEJO__server__START_SSH_SERVER=false
2. SSH URL 格式
Forgejo 配置:
FORGEJO__repository__USE_COMPAT_SSH_URI=false
注意:
不是:
FORGEJO__server__USE_COMPAT_SSH_URI
错误位置不会生效。
对应:
[repository]
USE_COMPAT_SSH_URI = false
效果:
false:
git@git.zenroly.com:bill/notes.git
GitHub 风格。
true:
ssh://git@git.zenroly.com/bill/notes.git
标准 SSH URI。
五、启动 Forgejo
首次:
docker compose up -d
修改配置后:
不要:
docker restart forgejo
因为环境变量需要重新创建。
使用:
docker compose down
docker compose up -d --force-recreate
检查:
docker compose ps
应该:
forgejo Up
forgejo-db Up
六、检查端口
服务器:
sudo ss -tnlp | grep 22
正确:
LISTEN 0 4096 0.0.0.0:22 docker-proxy
说明:
Docker 已接管 22。
管理 SSH:
sudo ss -tnlp | grep ssh
保持:
0.0.0.0:51989 sshd
七、配置 Caddy 反代 Web
Caddy:
git.zenroly.com {
reverse_proxy 127.0.0.1:3000
}
然后:
systemctl reload caddy
访问:
https://git.zenroly.com
八、SSH 测试
电脑:
ssh git@git.zenroly.com
第一次:
接受指纹。
成功:
Hi there, bill!
You've successfully authenticated with the key named xxx,
but Forgejo does not provide shell access.
说明:
SSH Key → Forgejo → 用户认证成功。
九、Git clone 测试
推荐:
git clone git@git.zenroly.com:bill/notes.git
成功:
正克隆到 'notes'...
提交:
echo hello > test.md
git add .
git commit -m "test"
git push
结果:
To git@git.zenroly.com:bill/notes.git
main -> main
十、最终配置总结
SSH
| 用途 | 端口 | 程序 |
|---|---|---|
| Git仓库 | 22 | Docker Forgejo |
| 服务器管理 | 51989 | sshd |
Forgejo
| 项目 | 配置 |
|---|---|
| Web | Caddy → 3000 |
| 数据库 | PostgreSQL 16 |
| SSH | 宿主机22映射 |
| 内置SSH | 关闭 |
| Clone格式 | GitHub scp 风格 |
最终体验
和 GitHub 一样:
git clone git@git.zenroly.com:bill/notes.git
无需:
ssh://
-p 2222
整个架构已经比较接近 GitHub/GitLab 的部署方式。这个方案的优势是:Forgejo 不碰系统 sshd,Git 服务与服务器管理完全隔离。