修复docker构建的问题
This commit is contained in:
@@ -1,6 +1,14 @@
|
||||
# HTTP server
|
||||
FIRE_SAFETY_HTTP_ADDR=:8080
|
||||
|
||||
# Build-time Go module proxy (not a runtime secret). Compose defaults to the
|
||||
# official Go proxy with a direct, checksum-verified VCS fallback when this is
|
||||
# empty or omitted. On a test server that cannot reach proxy.golang.org, set
|
||||
# this to an approved reachable proxy, for example:
|
||||
# FIRE_SAFETY_BUILD_GOPROXY=https://<approved-go-proxy>,direct
|
||||
# Do not set GOPROXY=off or disable GOSUMDB/checksum verification.
|
||||
FIRE_SAFETY_BUILD_GOPROXY=https://proxy.golang.org,direct
|
||||
|
||||
# SuperAgent Open API (disabled until a project-specific test credential is supplied)
|
||||
FIRE_SAFETY_SUPERAGENT_ENABLED=false
|
||||
# Required when enabled, for example: https://superagent.example.com
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
- MCP:标准库 HTTP/JSON-RPC,协议基线 `2025-06-18`,同步 JSON 响应,独立 Bearer 和 7 个只读工具;地名工具只搜索现有业务记录并要求用户确认候选。
|
||||
- PostgreSQL:`github.com/jackc/pgx/v5 v5.10.0` 原生连接池;连接默认只读并设置 statement timeout。
|
||||
- PostGIS:`ST_Covers`、`ST_DWithin`、`ST_Distance` 和 `ST_ClosestPoint`;只在实库确认 EPSG:4326 后启用。
|
||||
- 部署:多阶段 Docker 镜像与单实例 Compose;Secret 通过未提交的 `.env` 在运行时注入,容器内 8080 只发布到宿主机 `127.0.0.1:16587`,由宿主机 Nginx 终止 TLS。
|
||||
- 部署:多阶段 Docker 镜像与单实例 Compose;Secret 通过未提交的 `.env` 在运行时注入,容器内 8080 只发布到宿主机 `127.0.0.1:16587`,由宿主机 Nginx 终止 TLS。Docker build 的 Go module proxy 可按环境覆盖,但默认使用官方代理、保留 checksum 校验,且所选构建代理在运行容器内强制清空。
|
||||
|
||||
### 计划但尚未接入或确认
|
||||
|
||||
|
||||
@@ -6,7 +6,12 @@ FROM golang:1.26.8-alpine3.24 AS build
|
||||
|
||||
WORKDIR /src
|
||||
|
||||
RUN apk add --no-cache ca-certificates
|
||||
# Keep git in the builder because the default GOPROXY policy permits a
|
||||
# checksum-verified direct VCS fallback. It is not copied into the runtime.
|
||||
RUN apk add --no-cache ca-certificates git
|
||||
|
||||
ARG GOPROXY=https://proxy.golang.org,direct
|
||||
ENV GOPROXY=${GOPROXY}
|
||||
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
@@ -4,19 +4,20 @@
|
||||
| --- | --- |
|
||||
| 最近更新 | 2026-09-05 |
|
||||
| 当前分支 | `main` |
|
||||
| 当前阶段 | 对话、SuperAgent、空间 MCP 与测试环境容器部署基线已完成 |
|
||||
| 当前重点 | 在目标服务器验证宿主机 16587 端口映射、Nginx、真实消防 Profile 与公网 MCP 链路 |
|
||||
| 当前阶段 | 对话、SuperAgent、空间 MCP 与测试环境容器部署基线已完成;目标机首次构建排障中 |
|
||||
| 当前重点 | 解决目标服务器访问 Go module proxy 超时,完成容器启动后再验证公网链路 |
|
||||
|
||||
## 1. 当前 Checkpoint
|
||||
|
||||
- 名称:`fire-safety-ymd-container-test-deployment-bootstrap`
|
||||
- 状态:Complete
|
||||
- 目标:为 `/home/firee-safety-ymd` 测试服务器提供可复现的多阶段 Docker 镜像、单实例 Compose、回环端口边界、Nginx 公网入口以及不泄露 Secret 的部署、验证和回滚手册。
|
||||
- 名称:`fire-safety-ymd-test-server-build-network-recovery`
|
||||
- 状态:In Progress
|
||||
- 目标:在不关闭 Go module 校验的前提下,让 Docker 构建可显式选择目标服务器可达且经认可的模块代理,完成 `/home/firee-safety-ymd` 首次镜像构建与容器启动。
|
||||
- 非目标:替用户提交或推送 Git、直接修改远程服务器、创建数据库容器、迁移生产数据、签发证书、改变 DNS/安全组、实现真实用户认证、动态授权、会话持久化或生产审计。
|
||||
|
||||
当前进展:
|
||||
|
||||
- `Dockerfile` 使用显式 Go/Alpine 版本的多阶段构建,在构建阶段执行全部 Go 测试,最终镜像只包含静态服务二进制、CA 和时区数据,并以非 root 用户运行。
|
||||
- Docker build 支持通过 `FIRE_SAFETY_BUILD_GOPROXY` 选择目标机可达的可信 Go module proxy;默认仍为官方代理并保留 checksum database,`git` 只存在于 builder,构建代理配置在运行容器中强制清空。
|
||||
- `compose.yaml` 只运行一个 API 实例,从未提交的 `.env` 注入配置,强制清空一次性迁移 DSN,把容器内 8080 发布到宿主机 `127.0.0.1:16587`,并设置健康检查、只读文件系统、权限收紧和日志轮转。
|
||||
- 现有 PostgreSQL/PostGIS 不进入 Compose;同宿主机数据库需要使用容器可达的宿主机地址,且仍需受 `listen_addresses`、`pg_hba.conf` 和防火墙约束。
|
||||
- Nginx 示例增加 HTTP 到 HTTPS 跳转和 HTTP 429 JSON 限流响应,仍不比较、保存或注入 Chat、MCP、SuperAgent 或数据库 Secret。
|
||||
@@ -28,16 +29,17 @@
|
||||
- Compose 配置不包含明文 Secret,且没有数据库容器、数据卷或迁移命令;现有业务数据库不会被部署动作重建。
|
||||
- Nginx 上游固定为宿主机回环地址,兼容 Chat SSE 禁用缓冲和自动重试,未列出路径固定 404。
|
||||
- 目标机执行步骤包含不渲染 `.env` 内容的 Compose 检查、`nginx -t` 前置门禁和可恢复的配置替换。
|
||||
- 目标服务器尚未被本 checkpoint 修改;Docker/Nginx 真实验证留给下一 checkpoint。
|
||||
- 目标服务器已开始部署:Nginx 配置语法检查通过,但 Docker 构建在 `go mod download` 阶段因访问 `proxy.golang.org:443` 超时而停止,应用尚未监听 16587。
|
||||
|
||||
## 2. 当前优先级
|
||||
|
||||
1. 由用户审查本 checkpoint 变更后提交并推送 `origin/main`;服务器只部署明确提交的 revision。
|
||||
2. 在 `/home/firee-safety-ymd` 构建并启动 Compose,确认宿主机 16587 只绑定回环地址、容器内 8080 健康可达且数据库连接正常。
|
||||
3. 在目标机迁移 Nginx 配置并执行 `nginx -t` 后 reload;只公开 HTTPS 兼容路径、`/mcp` 和可选 `/health`。
|
||||
4. 使用项目专属测试 Key 和已发布消防 Profile 做兼容 `completion` 首轮/多轮真实冒烟,核对最终回答、用量和会话复用。
|
||||
5. 为所有查询表补齐适用 GiST 索引并验证查询计划;当前小数据可做联调,但生产前必须完成索引与并发验证。
|
||||
6. 设计真实用户身份、动态角色/区域授权、共享会话、限流、Secret 轮换、指标和持久审计。
|
||||
1. 为 Docker build 配置目标服务器实际可达、经运维认可的 Go module proxy,保留 `go.sum`/checksum database 校验并重新构建。
|
||||
2. 由用户审查本 checkpoint 变更后提交并推送 `origin/main`;服务器只部署明确提交的 revision。
|
||||
3. 在 `/home/firee-safety-ymd` 构建并启动 Compose,确认宿主机 16587 只绑定回环地址、容器内 8080 健康可达且数据库连接正常。
|
||||
4. reload 已通过语法检查的 Nginx 配置,只公开 HTTPS 兼容路径、`/mcp` 和可选 `/health`。
|
||||
5. 使用项目专属测试 Key 和已发布消防 Profile 做兼容 `completion` 首轮/多轮真实冒烟,核对最终回答、用量和会话复用。
|
||||
6. 为所有查询表补齐适用 GiST 索引并验证查询计划;当前小数据可做联调,但生产前必须完成索引与并发验证。
|
||||
7. 设计真实用户身份、动态角色/区域授权、共享会话、限流、Secret 轮换、指标和持久审计。
|
||||
|
||||
## 3. 已确认事实
|
||||
|
||||
@@ -57,7 +59,7 @@
|
||||
- `/api/chat` 已实现单进程内存会话映射、同会话并发 Run 冲突和严格 SSE 最终回答;模拟 Provider 端到端测试通过,真实 SuperAgent 尚未通过该入口联调。
|
||||
- 可选兼容入口已实现截图所示路径、`xtoken`、`input.prompt/session_id` 和 `event: result` 外形;正文仍只在严格成功的 `stop` 事件中出现,不是 DashScope 全量 API。
|
||||
- `Dockerfile`、`.dockerignore` 和 `compose.yaml` 已建立测试部署基线;容器单实例运行,容器内 8080 仅发布到宿主机 `127.0.0.1:16587`,一次性迁移 DSN 在服务容器中强制为空。
|
||||
- `deploy/nginx/fire-safety-ymd.conf.example` 已将公网调用指向宿主机 `127.0.0.1:16587`,再由 Docker 映射到容器 8080;配置不保存或注入任何 Provider/Chat/MCP Secret,目标机 Nginx 尚未验证。
|
||||
- `deploy/nginx/fire-safety-ymd.conf.example` 已将公网调用指向宿主机 `127.0.0.1:16587`,再由 Docker 映射到容器 8080;配置不保存或注入任何 Provider/Chat/MCP Secret。目标机仅 `nginx -t` 语法检查已通过,reload 和 HTTPS 实际响应尚未验证。
|
||||
- 用户确认真实数据包含大量镇街,环境变量不适合枚举全量值;MCP 现支持显式数据库全范围 `all` 和默认镇街白名单 `town_allowlist` 两种服务端范围。
|
||||
- 用户选择先实现简单地名能力、后续再优化;当前只查询既有森林防火记录,不调用外部地图服务,也不把候选代表点自动认定为演练点。
|
||||
- 本地真实 MCP 冒烟已完成:7 个工具均成功访问实库,响应和错误边界符合契约;该结果不等于公网、SuperAgent 或生产并发已验证。
|
||||
@@ -71,7 +73,8 @@
|
||||
- 水源/设施 `syzt`、水源 `hc_datetime` 等字段的枚举、单位、时区和更新责任人尚未确认。
|
||||
- SuperAgent MCP 的公网/内网 URL、TLS、网络白名单、Header 行为、Token 注入和轮换尚未联调。
|
||||
- `/api/chat` 静态 Bearer 和兼容路径 `xtoken` 只适用于受控联调,浏览器用户可以看到它;真实用户身份、动态授权、生产速率限制和滥用防护尚未实现。
|
||||
- 目标公网机器的 Docker/Compose 和 Nginx 版本、配置 include 层级、证书、DNS、安全组及 PostgreSQL 网络拓扑尚未验证;仓库已有部署资产和操作手册,但没有远程部署变更。
|
||||
- 目标公网机器的 Docker/Compose 和 Nginx 版本、配置 include 层级、证书、DNS、安全组及 PostgreSQL 网络拓扑尚未完整验证;用户已开始远程部署,仓库资产与服务器现场配置仍需完成一致性核验。
|
||||
- 目标服务器可以拉取 Docker 基础镜像元数据,但连续两次访问 `proxy.golang.org:443` 均在约 91 秒后超时;当前不能据此判断替代代理、GitHub direct 或所有外部 HTTPS 都不可达。
|
||||
- Chat 会话只在单个 Go 进程内存中保存;重启或多实例切换会丢失上下文,且当前没有历史查询、持久审计或主动取消 Provider Run。
|
||||
- 当前 `all`/`town_allowlist` 都是服务账号静态范围,不是最终用户级授权;`all` 会授权当前数据库中 MCP 固定查询表内所有镇街和镇街字段为空的记录,身份提供方、角色、租户和精确位置权限尚未确定。
|
||||
- 地名搜索是无索引的有界包含匹配;真实数据量下的耗时、重名率和名称字段质量尚未验证,生产优化可能需要标准地名表、别名词典或 `pg_trgm` 索引。
|
||||
@@ -101,8 +104,12 @@
|
||||
- `GOCACHE=/private/tmp/fire-safety-go-cache go vet ./...`:通过。
|
||||
- `GOCACHE=/private/tmp/fire-safety-go-cache go test -race -count=1 ./...`:通过。
|
||||
- 模拟 SuperAgent Chat 端到端:原生与兼容入口均通过;应用创建 Provider Session、发送消息、解析严格完成事件,原生返回 `conversation/message/done`,兼容入口返回 `result` 且最终 `finish_reason=stop`。
|
||||
- Nginx:配置已完成静态检查且未包含真实 Secret;当前开发机未安装 Nginx,尚未执行目标环境 `nginx -t` 或 reload。
|
||||
- Docker/Compose:部署文件已通过 YAML/静态安全断言;当前开发机未安装 Docker,尚未执行真实镜像构建、`docker compose config --quiet`、健康检查或容器运行验证。
|
||||
- Nginx:配置已完成静态检查且未包含真实 Secret;开发机未安装 Nginx。据用户截图,目标机 `nginx -t` 已通过,reload 和 HTTPS 实际响应尚未验证。
|
||||
- Docker/Compose:部署文件已通过 YAML/静态安全断言;开发机未安装 Docker。目标机已发起真实构建但未生成镜像,`docker compose config --quiet`、健康状态和运行容器仍待现场确认。
|
||||
- 构建代理回归检查:修复前静态反馈命令返回 `RED: Docker build has no configurable GOPROXY`;修复后确认 Compose build arg、Dockerfile `GOPROXY` 和运行容器清空边界,返回 GREEN。
|
||||
- `CGO_ENABLED=0 GOOS=linux go build -buildvcs=false -trimpath ./cmd/server`:通过,生成 Linux 静态服务二进制;不替代目标机真实 Docker build。
|
||||
- 目标机首次 Docker 构建:失败;`go mod download` 获取 `github.com/jackc/pgpassfile@v1.0.0` 时连接 `proxy.golang.org:443` 超时,镜像/容器未生成,随后 `curl http://127.0.0.1:16587/health` 得到 connection refused,符合前置构建失败。
|
||||
- 目标机 Nginx:用户截图显示 `nginx -t` 配置语法检查成功;是否已 reload 以及 HTTPS 实际响应仍待确认。
|
||||
- SRID 迁移预检:通过;使用临时 `admin` 连接确认 4,048 条候选、8 表 UPDATE 权限和 7 表 ALTER 权限,未输出 DSN 或业务记录。
|
||||
- SRID 数据迁移:通过;事务更新 4,048 条非空几何,7 张二维表改为 `geometry(Geometry,4326)`,防火通道保持裸 `geometry`,迁移前后几何载荷指纹与维度一致。
|
||||
- 真实 PostGIS 严格 audit:通过;运行时只读账号报告 8 表 SRID 均为 4326、类型与范围门禁通过。预期保留 7 条空几何、35 条无效面几何和 7 张缺 GiST 索引表 warning。
|
||||
@@ -110,4 +117,4 @@
|
||||
- 数据导入:用户报告 8 份 SQL 已导入,防火通道在使用裸 `geometry` 保留混合二维/Z 后重导成功;这是现场反馈,不替代项目只读 probe 的最终验证。
|
||||
- 真实 SuperAgent 对话与 MCP 联调:对话 API 仅完成模拟 Provider 端到端测试,真实消防 Profile 尚未测试;MCP readiness 和本地真实工具冒烟已通过,公网 HTTPS 回调未配置。
|
||||
- 样例 SQL:未执行;含受限数据的 `*.sql` 已被 Git 忽略。
|
||||
- Git 提交:未创建,符合用户要求。
|
||||
- Git:基线提交已存在并推送;本 checkpoint 变更尚未提交,未执行自动 commit/push。
|
||||
|
||||
@@ -3,6 +3,10 @@ services:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
# Non-secret build setting. Override when this host cannot reach the
|
||||
# official proxy; keep Go's checksum verification enabled.
|
||||
GOPROXY: "${FIRE_SAFETY_BUILD_GOPROXY:-https://proxy.golang.org,direct}"
|
||||
image: fire-safety-ymd:test
|
||||
container_name: fire-safety-ymd
|
||||
restart: unless-stopped
|
||||
@@ -12,6 +16,9 @@ services:
|
||||
# The host binding below keeps this port private; the process must bind
|
||||
# all container interfaces for Docker's loopback publish to work.
|
||||
FIRE_SAFETY_HTTP_ADDR: ":8080"
|
||||
# This setting is consumed only while resolving the build arg above.
|
||||
# Do not retain the selected proxy URL in the runtime environment.
|
||||
FIRE_SAFETY_BUILD_GOPROXY: ""
|
||||
# A one-off owner/migration credential must never enter the long-lived
|
||||
# application container, even if an operator left it in the local file.
|
||||
FIRE_SAFETY_POSTGIS_MIGRATION_DSN: ""
|
||||
|
||||
@@ -102,6 +102,9 @@ chmod 600 .env
|
||||
|
||||
~~~text
|
||||
FIRE_SAFETY_HTTP_ADDR=:8080
|
||||
# Build-time only. Keep the official default unless the target server cannot
|
||||
# reach it; this value is not passed to the running application container.
|
||||
FIRE_SAFETY_BUILD_GOPROXY=https://proxy.golang.org,direct
|
||||
|
||||
FIRE_SAFETY_SUPERAGENT_ENABLED=true
|
||||
FIRE_SAFETY_SUPERAGENT_BASE_URL=https://<superagent-api-host>
|
||||
@@ -154,7 +157,31 @@ FIRE_SAFETY_POSTGIS_EXPECTED_SRID=4326
|
||||
|
||||
## 5. 构建、启动和本机检查
|
||||
|
||||
以下命令在服务器项目目录执行。Compose 构建上下文不把 .env 作为 Dockerfile 构建参数:
|
||||
以下命令在服务器项目目录执行。Compose 构建上下文不复制 `.env`;非 Secret 的 `FIRE_SAFETY_BUILD_GOPROXY` 只会被映射为构建参数,并在运行容器环境中强制清空。
|
||||
|
||||
先检查 Go 模块代理是否从服务器/Docker 所在网络可达:
|
||||
|
||||
~~~bash
|
||||
curl --head --connect-timeout 10 https://proxy.golang.org/
|
||||
~~~
|
||||
|
||||
如果连接官方代理超时,可以测试经运维认可的替代代理。例如 [Goproxy.cn](https://goproxy.cn/) 官方说明支持标准 Go module proxy 协议:
|
||||
|
||||
~~~bash
|
||||
curl --head --connect-timeout 10 https://goproxy.cn/
|
||||
~~~
|
||||
|
||||
只有确认替代代理可达且组织允许使用时,才在服务器 `.env` 中改为:
|
||||
|
||||
~~~text
|
||||
FIRE_SAFETY_BUILD_GOPROXY=https://goproxy.cn,direct
|
||||
~~~
|
||||
|
||||
该值必须是不含用户名、密码或 Token 的代理地址;Docker build argument 不是 Secret 注入机制。若组织代理要求认证,需要另做 BuildKit Secret 设计,不能把凭证嵌进 URL 或 `.env` 中的构建参数。
|
||||
|
||||
主机侧 curl 成功只能初步说明连通性;最终仍以 `docker compose build` 是否能下载并校验模块为准。如果两个地址都超时,应修复 Docker/宿主机的 DNS、HTTPS 出口、透明代理或防火墙,或者使用组织自建的可信 Go module proxy。不要设置 `GOSUMDB=off`、跳过 `go.sum` 校验或反复执行 `docker compose up` 掩盖依赖下载失败。
|
||||
|
||||
代理连通后再构建并启动:
|
||||
|
||||
~~~bash
|
||||
cd /home/firee-safety-ymd
|
||||
@@ -168,6 +195,8 @@ curl --fail http://127.0.0.1:16587/health
|
||||
|
||||
预期结果:容器为 Up(健康状态由 Compose 显示),health 返回 HTTP 200;有限日志不应出现 DSN、密码、Token 或 API Key。docker compose config --quiet 只验证配置,不输出展开后的 Secret。若 Compose 不支持 --quiet,升级 Compose 或使用不会回显结果的等价校验方式。
|
||||
|
||||
若构建在 `RUN go mod download` 处失败,则镜像和容器尚未生成,后续访问宿主机端口会得到 connection refused。先解决模块代理连通性并重新执行 `docker compose build --pull`,成功后才能执行 `up -d`。
|
||||
|
||||
失败时只读取有限日志:
|
||||
|
||||
~~~bash
|
||||
|
||||
Reference in New Issue
Block a user