迁移档案

This commit is contained in:
chermack
2026-07-26 17:20:23 +08:00
parent c4fd036890
commit 39255cc3dc
3 changed files with 941 additions and 0 deletions
+151
View File
@@ -10,6 +10,13 @@
- 容器 `trojan`:镜像 `jrohy/trojan`,已运行约两年,当前已连续运行七周;`docker ps` 没有显示端口映射。这与项目 README 的 `--net=host` 启动方式一致,意味着它很可能直接使用宿主机网络,并占用 Trojan 的 `443` 与管理 Web 的 `80`
- 容器 `trojan-mariadb`:镜像 `mariadb:10.2`,当前映射 `0.0.0.0:3306->3306``[::]:3306->3306`;即 MySQL/MariaDB 已对全网开放。
### 2026-07-26 服务器只读核查结果
- `trojan` 容器实际使用 Docker `host` 网络,没有持久化挂载卷。配置和证书只在这个已运行两年的容器内;迁移前必须导出备份,不能直接删除或重建。
- `443` 由 Trojan 监听,`80` 由容器内的 `/usr/local/bin/trojan web` 监听。
- Trojan 配置已确认:`local_port=443``remote_addr=127.0.0.1``remote_port=80`SNI 为 `www.hk.chermack.top`。这表示非 Trojan 的 HTTPS 请求会由 Trojan 回落到管理后台。
- `trojan-mariadb` 的 3306 当前对 IPv4/IPv6 公网开放,后续应收紧到内部网络或回环地址。
本文后续均直接使用该真实 Trojan 域名:**`www.hk.chermack.top`**。
## 1. 结论
@@ -48,6 +55,21 @@ flowchart TB
所有域名的 A/AAAA 记录都指向这台服务器。Trojan 客户端应继续使用 `www.hk.chermack.top` 作为 SNI 和服务器地址。
### 是否必须新增 `panel.hk.chermack.top`
**不一定。**项目源码中附带的 systemd 服务执行的是 `trojan web`,而该命令默认监听 `0.0.0.0:80`、不启用 TLS;Trojan 服务则通常监听 `443`。这只是源码默认行为,典型原始部署会按端口区分:
```text
http://www.hk.chermack.top:80 -> Trojan 管理后台(HTTP
www.hk.chermack.top:443 -> Trojan TLS 服务
```
服务器已核实 `http://www.hk.chermack.top``https://www.hk.chermack.top` 都能访问后台的原因:Trojan 已配置将非 Trojan 的 HTTPS 请求回落到 `127.0.0.1:80`。因此当前同域名 HTTPS 后台是已验证的 Trojan 回落链路,不需要新增 `panel.hk.chermack.top`
迁移后应保持这一关系:Nginx 仅按 SNI 将 `www.hk.chermack.top` 的所有 443 TLS 流量转给 TrojanTrojan 负责识别协议,并将普通 HTTPS 后台请求回落到迁移后的后台端口 `127.0.0.1:8081`。Nginx 不应尝试把相同的 `www.hk.chermack.top` SNI 拆分到 Caddy 与 Trojan。
`panel.hk.chermack.top` 仍可作为将来独立管理后台的可选项,但不是本服务器部署 Gitea 的必要条件。
## 3. 前置条件与注意事项
1. 所有服务应只向 Docker 内网或 `127.0.0.1` 发布端口;不要把 Trojan 的新端口、Caddy 的 `8080/9443` 直接暴露到公网。
@@ -188,3 +210,132 @@ app.hk.chermack.top {
## 9. 后续执行前需要确认的信息
实施时需要根据真实状态补全:当前 Trojan 容器的 `docker inspect` 输出、实际 `config.json`、MariaDB 容器/卷、当前占用 80/443 的进程、服务器系统发行版、可用域名及 DNS 提供商。
## 10. 与 Gitea 共存:`git.hk.chermack.top`
### 能否完全不改变当前 Trojan Docker 服务?
**不能同时满足“完全不变”与“通过 `https://git.hk.chermack.top` 对外访问”这两个条件。**
目前 `trojan` 容器没有端口映射,结合原项目的启动方式可推断其使用宿主机网络,并直接占用宿主机 `80/443`。Gitea 可以新增容器并运行在 `127.0.0.1:3000`SSH Git 可以运行在 `2222`,但在 Trojan 持续独占公网 `80/443` 时:
- 不能启动 Nginx/Caddy 绑定公网 `80/443`
- 不能让 Caddy 为 `git.hk.chermack.top` 完成 HTTP-01 校验并提供 HTTPS
- Trojan 的 `plain_http_response` 不是 HTTP 反向代理,不能把 Gitea 的 Web 请求转发出去。
因此分为两个阶段:
1. **不改变现状的准备阶段**:仅部署 Gitea 与 PostgreSQL,不发布 Web 域名;本机可通过 `curl http://127.0.0.1:3000` 验证,公网可暂时使用 SSH Git 端口 `2222`
2. **正式上线阶段(必要变更)**:按本文第 4~7 节让 Trojan 改至本机 `8443`、管理后台改至本机 `8081`,让 Nginx 接管公网 `80/443`,再由 Caddy 为 `git.hk.chermack.top` 托管 HTTPS。
现有容器中的 Trojan 和 MariaDB 数据不会被删除;但 Trojan 容器需要在完成备份后重建或调整启动配置,才能释放宿主机 `80/443`。这是端口绑定的硬性限制,不是 Gitea 配置能够规避的问题。
### 目标流量关系
```mermaid
flowchart LR
U["用户 / Git 客户端"] -->|"HTTPS :443\ngit.hk.chermack.top"| N["Nginx stream"]
U -->|"Trojan 或后台 HTTPS :443\nwww.hk.chermack.top"| N
N -->|"SNI = git.hk.chermack.top"| C["共享 Caddy"]
N -->|"SNI = www.hk.chermack.top"| T["Trojan :8443"]
T -->|"非 Trojan TLS 回落"| Pnl["管理后台 :8081"]
C -->|"HTTP"| G["Gitea :3000"]
U -->|"SSH Git :2222"| G
G --> P["PostgreSQL\n仅 Docker 网络"]
```
### DNS 与端口
新增 DNS 记录:
```text
类型:A(若已启用 IPv6,则另加 AAAA)
主机记录:git
记录值:本服务器公网 IP
结果:git.hk.chermack.top
```
开放公网 TCP `2222` 供 SSH Git 克隆/推送;公网 `80/443` 仍只由统一 Nginx 入口占用。不要开放 PostgreSQL 的 `5432`,也不需要公开 Gitea 的 `3000`
### Gitea Compose(不再单独启动 Caddy
原 Gitea 部署方案中的独立 `gitea-caddy` 不应再映射宿主机 `80:80` / `443:443`,因为这些端口已由统一入口占用。Gitea 目录建议为 `/opt/gitea`,其 `docker-compose.yml` 可只保留数据库与 Gitea
```yaml
services:
db:
image: postgres:16
container_name: gitea-db
restart: unless-stopped
environment:
POSTGRES_USER: gitea
POSTGRES_PASSWORD: CHANGE_TO_A_LONG_RANDOM_PASSWORD
POSTGRES_DB: gitea
volumes:
- ./postgres:/var/lib/postgresql/data
networks: [gitea]
gitea:
image: docker.gitea.com/gitea:CHANGE_TO_A_VALIDATED_VERSION
container_name: gitea
restart: unless-stopped
depends_on: [db]
environment:
USER_UID: "1000"
USER_GID: "1000"
GITEA__database__DB_TYPE: postgres
GITEA__database__HOST: db:5432
GITEA__database__NAME: gitea
GITEA__database__USER: gitea
GITEA__database__PASSWD: CHANGE_TO_A_LONG_RANDOM_PASSWORD
GITEA__server__DOMAIN: git.hk.chermack.top
GITEA__server__ROOT_URL: https://git.hk.chermack.top/
GITEA__server__PROTOCOL: http
GITEA__server__SSH_DOMAIN: git.hk.chermack.top
GITEA__server__SSH_PORT: "2222"
ports:
- "127.0.0.1:3000:3000"
- "2222:22"
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
networks: [gitea]
networks:
gitea:
```
示例固定 Gitea 镜像版本,避免 `latest` 在重建时产生不可预期的大版本升级。实际部署前应选定并验证当时支持的稳定版本;升级前先备份 `./gitea` 与 PostgreSQL。
### 共享 Caddy 新增站点
在第 6 节的**共享** Caddyfile 中新增:
```caddyfile
git.hk.chermack.top {
reverse_proxy 127.0.0.1:3000
}
```
当 Nginx 的 `443` stream 根据 SNI 将 `git.hk.chermack.top` 转到 Caddy 后,Caddy 会自动申请和续期该域名证书,再将 HTTP 请求反向代理给 Gitea。Gitea 生成的网页链接与 clone 地址则由 `ROOT_URL``SSH_*` 配置保持为正确的公网地址。
对本服务器,最终的 443 分流应是:`www.hk.chermack.top` 全部转给 Trojan`git.hk.chermack.top` 转给 Caddy。迁移后的 Trojan 监听 `127.0.0.1:8443`,其 `remote_port` 改为 `8081`Caddy 对外通过 Nginx 使用 `127.0.0.1:8080`HTTP)和 `127.0.0.1:9443`HTTPS)。
Nginx 的 80 端口按域名转发:`www.hk.chermack.top``127.0.0.1:8081``git.hk.chermack.top` 到 Caddy 的 `127.0.0.1:8080`。Trojan 证书续期不能再依赖独占 80 的 acme standalone 方式;正式迁移时应改用 Nginx 可服务的 ACME webroot 验证,或 DNS-01 验证。
### 验证清单
```bash
# Gitea 准备阶段:仅确认服务已运行(在服务器执行)
cd /opt/gitea
docker compose up -d
curl -I http://127.0.0.1:3000
# 正式切换统一入口之后
curl -I https://git.hk.chermack.top
ssh -T -p 2222 git@git.hk.chermack.top
git clone ssh://git@git.hk.chermack.top:2222/<组织>/<仓库>.git
```
`ssh -T` 的首次连接会要求确认主机指纹;应通过服务器控制台或管理员提供的指纹核验,不应盲目接受来源不明的密钥变更。