From 343f66976c4e9d029af7a0d512fdf81e8f30d4dc Mon Sep 17 00:00:00 2001 From: m1saka Date: Fri, 23 Oct 2026 22:44:16 +0800 Subject: [PATCH] chore: use 1Panel images and add dependency mirror fallback --- Dockerfile | 30 +++++++++++++++++++++++++----- README.md | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 24df99a..cc84d68 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,20 @@ -FROM node:24-alpine AS frontend +ARG NODE_IMAGE=docker.1panel.live/library/node:24-alpine +ARG GO_IMAGE=docker.1panel.live/library/golang:1.26-alpine +ARG ALPINE_IMAGE=docker.1panel.live/library/alpine:3.23 + +FROM ${NODE_IMAGE} AS frontend +ARG NPM_REGISTRY=auto WORKDIR /src/web COPY web/package*.json ./ -RUN npm ci +RUN if [ "${NPM_REGISTRY}" = auto ]; then \ + npm ci --registry=https://registry.npmjs.org --fetch-retries=0 --fetch-timeout=15000 \ + || { echo 'Retrying npm install with npmmirror'; npm ci --registry=https://registry.npmmirror.com --fetch-retries=1 --fetch-timeout=30000; }; \ + else npm ci --registry="${NPM_REGISTRY}"; fi COPY web/ ./ RUN npm run build -FROM golang:1.26-alpine AS backend +FROM ${GO_IMAGE} AS backend +ARG GOPROXY=https://proxy.golang.org|https://goproxy.cn|direct WORKDIR /src COPY go.mod go.sum ./ RUN go mod download @@ -13,8 +22,19 @@ COPY . . COPY --from=frontend /src/web/dist ./web/dist RUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w' -o /ai-router . -FROM alpine:3.23 -RUN apk add --no-cache ca-certificates && addgroup -g 10001 router && adduser -D -u 10001 -G router router +FROM ${ALPINE_IMAGE} +ARG ALPINE_MIRROR=auto +RUN set -eu; \ + if [ "${ALPINE_MIRROR}" = auto ]; then \ + apk --timeout 15 add --no-cache ca-certificates \ + || { echo 'Retrying apk install with Aliyun mirror'; \ + sed -i 's|https\?://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g' /etc/apk/repositories; \ + apk --timeout 30 add --no-cache ca-certificates; }; \ + else \ + sed -i "s|https\?://dl-cdn.alpinelinux.org/alpine|${ALPINE_MIRROR%/}|g" /etc/apk/repositories; \ + apk add --no-cache ca-certificates; \ + fi; \ + addgroup -g 10001 router; adduser -D -u 10001 -G router router WORKDIR /app RUN mkdir /app/data && chown router:router /app/data COPY --from=backend /ai-router /usr/local/bin/ai-router diff --git a/README.md b/README.md index 4be7488..f4ae53b 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ HTTPS 反向代理部署时,在配置中设置 `server.public_origin: "https:/ ## Docker Compose 部署 需要 Docker Engine 和 Docker Compose v2。Compose 使用现有多阶段 Dockerfile -构建前后端,容器以 UID/GID 10001 运行,SQLite 保存在命名卷 router-data 中。 +构建前后端,容器以 UID/GID 10001 运行,SQLite 保存在宿主机 ./data 目录中。 首次部署时创建配置(如果已有 config.yaml,请备份并编辑,不要覆盖): @@ -33,6 +33,8 @@ openssl rand -hex 32 # 将生成的随机值填入 config.yaml 的 admin.password sudo chown 10001:10001 config.yaml sudo chmod 600 config.yaml +sudo mkdir -p data +sudo chown 10001:10001 data docker compose config --quiet docker compose up -d --build docker compose ps @@ -60,13 +62,41 @@ HTTPS 反向代理,同时设置 server.public_origin 并禁用 SSE 代理缓 docker compose logs -f --tail=100 docker compose up -d --build # 更新源码后重新构建和部署 docker compose restart # 修改配置文件后重启 -docker compose down # 停止并删除容器,保留数据库卷 +docker compose down # 停止并删除容器,保留宿主机 data 目录 ``` -不要执行 docker compose down -v,除非明确要删除数据库卷。 -首次启动使用独立的新数据库,不会自动导入本地运行的数据。 +目录挂载的数据不会被 docker compose down -v 删除,仍需自行备份。 +不会自动导入旧命名卷 router-data 中的数据。 迁移时先停止旧服务,备份原数据库目录(含可能存在的 WAL/SHM 文件), -再将数据复制到命名卷并确保 UID/GID 10001 可读写;不要让两套服务同时写同一数据库。 +再将数据复制到 ./data 并确保 UID/GID 10001 可读写;不要让两套服务同时写同一数据库。 + +### 国内镜像源构建 + +默认无需指定参数,直接运行 `docker compose up -d --build` 即可自动回退: + +- npm:优先官方源,安装失败后使用 npmmirror 重试一次。 +- Go:依次尝试官方代理、goproxy.cn、直接获取;使用 `|` 分隔,任意代理错误均可回退。 +- Alpine:优先官方源,安装失败后使用阿里云源重试一次。 + +这不是按地区或测速选择;npm / apk 的单次网络等待有限时,Go 使用自身网络超时。 +若所有来源均失败,构建仍会报错,不跳过依赖。可通过构建参数固定依赖源(不再自动切换): + +```sh +docker compose build \ + --build-arg NPM_REGISTRY=https://registry.npmmirror.com \ + --build-arg GOPROXY=https://goproxy.cn,direct \ + --build-arg ALPINE_MIRROR=https://mirrors.aliyun.com/alpine +docker compose up -d +``` + +这些参数也适用于 docker build。Go 仍保留模块校验,不关闭 GOSUMDB。 +镜像源可用性取决于网络环境,请只使用可信源。 + +FROM 基础镜像默认使用 1Panel 镜像源 docker.1panel.live/library/, +分别拉取 node:24-alpine、golang:1.26-alpine、alpine:3.23。 +可通过 NODE_IMAGE、GO_IMAGE、ALPINE_IMAGE 构建参数覆盖完整镜像地址, +例如 `--build-arg NODE_IMAGE=node:24-alpine` 改回 Docker Hub 的 Node 镜像。 +基础镜像拉取失败不会自动回退,需手动替换地址;依赖软件包仍使用上述自动回退策略。 ## 渠道与模型映射