Compare commits
2 Commits
5464539a91
...
72d7111581
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72d7111581 | ||
|
|
03895cc0d4 |
@@ -1,17 +1,30 @@
|
|||||||
FROM node:22-slim AS build
|
FROM node:22-slim AS build
|
||||||
RUN corepack enable
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
# npm/corepack registry(可经 build arg 覆盖):部分区域 registry.npmjs.org 不可达,部署时指向镜像
|
||||||
|
# (如 registry.npmmirror.com,整源镜像 npmjs 且保留 integrity,与 --frozen-lockfile 兼容)。
|
||||||
|
ARG NPM_REGISTRY=https://registry.npmjs.org
|
||||||
|
ENV npm_config_registry=$NPM_REGISTRY
|
||||||
|
# corepack 默认硬编码从 npmjs 下载 pnpm 本体;此处改指同一镜像。镜像不提供 npm 签名密钥,
|
||||||
|
# 关掉签名校验(下载的 pnpm tarball 仍按内容哈希校验,安装的依赖仍按 lockfile integrity 校验)。
|
||||||
|
ENV COREPACK_NPM_REGISTRY=$NPM_REGISTRY
|
||||||
|
ENV COREPACK_INTEGRITY_KEYS=0
|
||||||
|
RUN corepack enable
|
||||||
# pnpm-workspace.yaml 必须在 install 前就位:它携带 minimumReleaseAgeExclude(豁免新发布包的
|
# pnpm-workspace.yaml 必须在 install 前就位:它携带 minimumReleaseAgeExclude(豁免新发布包的
|
||||||
# 供应链策略)、onlyBuiltDependencies/allowBuilds(构建脚本白名单)。缺它则容器内 install 看不到
|
# 供应链策略)、onlyBuiltDependencies/allowBuilds(构建脚本白名单)。缺它则容器内 install 看不到
|
||||||
# 这些策略,会误拒近期发布的依赖(如 @xyflow/*)而失败——与宿主行为不一致。
|
# 这些策略,会误拒近期发布的依赖(如 @xyflow/*)而失败——与宿主行为不一致。
|
||||||
COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml ./
|
COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml ./
|
||||||
RUN pnpm install --frozen-lockfile || pnpm install
|
# pnpm 11 不读 npm_config_registry env,须用 --registry 显式指定镜像(lockfile v9 仅存 integrity,
|
||||||
|
# 不含绝对 URL,故换源不破坏 --frozen-lockfile)。
|
||||||
|
RUN pnpm install --frozen-lockfile --registry="$NPM_REGISTRY" || pnpm install --registry="$NPM_REGISTRY"
|
||||||
COPY . .
|
COPY . .
|
||||||
# NEXT_PUBLIC_* 在 Next 构建期内联进浏览器 bundle——必须在 `pnpm build` 前用 build ARG 注入。
|
# NEXT_PUBLIC_* 在 Next 构建期内联进浏览器 bundle——必须在 `pnpm build` 前用 build ARG 注入。
|
||||||
# 默认 http://localhost:8000 供 dev;生产经 compose build args 传公网 API 基址。
|
# 默认 http://localhost:8000 供 dev;生产经 compose build args 传公网 API 基址。
|
||||||
ARG NEXT_PUBLIC_API_BASE=http://localhost:8000
|
ARG NEXT_PUBLIC_API_BASE=http://localhost:8000
|
||||||
ENV NEXT_PUBLIC_API_BASE=$NEXT_PUBLIC_API_BASE
|
ENV NEXT_PUBLIC_API_BASE=$NEXT_PUBLIC_API_BASE
|
||||||
RUN pnpm build
|
RUN pnpm build
|
||||||
|
# 本项目 public/ 为空目录(不入 git,git archive 构建上下文里不存在);确保它存在,
|
||||||
|
# 否则下方 run 阶段 `COPY --from=build /app/public` 会因源缺失而失败。
|
||||||
|
RUN mkdir -p /app/public
|
||||||
|
|
||||||
FROM node:22-slim AS run
|
FROM node:22-slim AS run
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|||||||
@@ -13,9 +13,10 @@ services:
|
|||||||
POSTGRES_USER: writer
|
POSTGRES_USER: writer
|
||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 必填(生产强口令,勿用 base 弱口令)}
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 必填(生产强口令,勿用 base 弱口令)}
|
||||||
POSTGRES_DB: writer
|
POSTGRES_DB: writer
|
||||||
# 不对公网暴露:仅绑本机回环(供宿主机跑迁移)。彻底隔离可整段删掉只走 compose 内网。
|
# 生产不发布任何宿主端口:迁移经 compose 内网(`run --rm api alembic`)直连 pg 服务名,
|
||||||
ports:
|
# 且宿主已有别的 pg 占用 127.0.0.1:5432。!reset 清掉 base 的 "5432:5432"——否则 compose
|
||||||
- "127.0.0.1:5432:5432"
|
# 会「拼接」两份端口(base 的 0.0.0.0:5432 + 本层),既暴露公网又与宿主 pg 冲突。
|
||||||
|
ports: !reset []
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
api:
|
api:
|
||||||
@@ -26,6 +27,10 @@ services:
|
|||||||
LOG_JSON: "true"
|
LOG_JSON: "true"
|
||||||
CREDENTIAL_ENC_KEY: ${CREDENTIAL_ENC_KEY:?CREDENTIAL_ENC_KEY 必填(生产 Fernet key,勿用占位值)}
|
CREDENTIAL_ENC_KEY: ${CREDENTIAL_ENC_KEY:?CREDENTIAL_ENC_KEY 必填(生产 Fernet key,勿用占位值)}
|
||||||
CORS_ORIGINS: ${CORS_ORIGINS:?CORS_ORIGINS 必填(前端真实来源,逗号分隔,禁通配)}
|
CORS_ORIGINS: ${CORS_ORIGINS:?CORS_ORIGINS 必填(前端真实来源,逗号分隔,禁通配)}
|
||||||
|
# base 发布 0.0.0.0:8000(dev 便利);生产只绑回环——nginx 是唯一公网入口,basic auth 不可绕过。
|
||||||
|
# !override 整体替换 base 的端口列表(否则拼接会残留 0.0.0.0:8000)。
|
||||||
|
ports: !override
|
||||||
|
- "127.0.0.1:8000:8000"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
web:
|
web:
|
||||||
@@ -34,7 +39,12 @@ services:
|
|||||||
args:
|
args:
|
||||||
# 构建期内联:生产须指向浏览器可达的公网 API(通常反代后的 https 域名)。
|
# 构建期内联:生产须指向浏览器可达的公网 API(通常反代后的 https 域名)。
|
||||||
NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填(浏览器可达的公网 API 基址)}
|
NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填(浏览器可达的公网 API 基址)}
|
||||||
|
# 本机所在区域 registry.npmjs.org 不可达,构建走 npmmirror 镜像(可用 env NPM_REGISTRY 覆盖)。
|
||||||
|
NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmmirror.com}
|
||||||
environment:
|
environment:
|
||||||
NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填}
|
NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填}
|
||||||
API_BASE_INTERNAL: http://api:8000
|
API_BASE_INTERNAL: http://api:8000
|
||||||
|
# 只绑回环(同 api):nginx 反代 127.0.0.1:3000 是唯一公网入口。!override 替换 base 的 3000:3000。
|
||||||
|
ports: !override
|
||||||
|
- "127.0.0.1:3000:3000"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
Reference in New Issue
Block a user