Skip to content

Commit 202df78

Browse files
author
yangtao
committed
再次修复镜像构建版本问题导致的修改密码无效
1 parent c7b935b commit 202df78

File tree

6 files changed

+183
-133
lines changed

6 files changed

+183
-133
lines changed

.dockerignore

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,48 @@
1-
# 排除不需要的文件和目录
1+
# 开发文件
2+
node_modules
3+
.next
4+
.git
5+
.github
6+
.env*
7+
.vscode
8+
.idea
9+
10+
# 文档和配置
11+
*.md
12+
.gitignore
13+
.eslintrc*
14+
.prettierrc*
15+
.editorconfig
16+
17+
# 测试文件
18+
__tests__
19+
*.test.*
20+
*.spec.*
221

3-
# Node.js
4-
node_modules/
22+
# 日志和缓存
23+
logs
24+
*.log
25+
.cache
26+
.npm
27+
.pnpm-store
28+
29+
# 调试文件
530
npm-debug.log*
631
yarn-debug.log*
732
yarn-error.log*
33+
.pnpm-debug.log*
834

9-
# Next.js
10-
.next/
11-
out/
35+
# 系统文件
36+
.DS_Store
37+
Thumbs.db
1238

1339
# 构建输出
1440
dist/
1541
build/
1642

1743
# 环境变量文件
18-
.env*
1944
!.env.example
2045

21-
# 日志文件
22-
logs/
23-
*.log
24-
2546
# 运行时文件
2647
*.pid
2748
*.lock
@@ -31,21 +52,6 @@ logs/
3152
*.sqlite
3253
data/
3354

34-
# Git
35-
.git/
36-
.gitignore
37-
38-
# IDE/编辑器
39-
.vscode/
40-
.idea/
41-
*.swp
42-
*.swo
43-
*~
44-
45-
# 操作系统
46-
.DS_Store
47-
Thumbs.db
48-
4955
# Docker
5056
Dockerfile*
5157
docker-compose*.yml
@@ -55,7 +61,6 @@ docker-compose*.yml
5561
README.md
5662
DOCKER_SETUP.md
5763
CONFIG.md
58-
*.md
5964

6065
# 测试
6166
coverage/

.github/workflows/docker-build.yml

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
name: Docker Build
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
tags: [ 'v*.*.*' ] # 匹配版本标签
7+
pull_request:
8+
branches: [ main ]
9+
10+
env:
11+
REGISTRY: ghcr.io
12+
IMAGE_NAME: ${{ github.repository }}
13+
14+
jobs:
15+
build:
16+
runs-on: ubuntu-latest
17+
permissions:
18+
contents: read
19+
packages: write
20+
21+
steps:
22+
- name: Checkout repository
23+
uses: actions/checkout@v4
24+
with:
25+
fetch-depth: 0 # 获取完整的git历史用于版本计算
26+
27+
# 获取版本信息
28+
- name: Get version
29+
id: get_version
30+
run: |
31+
if [[ $GITHUB_REF == refs/tags/* ]]; then
32+
# 从tag获取版本
33+
VERSION=${GITHUB_REF#refs/tags/v}
34+
else
35+
# 从package.json获取版本
36+
VERSION=$(node -p "require('./package.json').version")
37+
fi
38+
echo "VERSION=$VERSION" >> $GITHUB_ENV
39+
echo "version=$VERSION" >> $GITHUB_OUTPUT
40+
41+
# 设置 QEMU 和 Docker Buildx
42+
- name: Set up QEMU
43+
uses: docker/setup-qemu-action@v3
44+
45+
- name: Set up Docker Buildx
46+
uses: docker/setup-buildx-action@v3
47+
with:
48+
driver-opts: |
49+
image=moby/buildkit:latest
50+
51+
# 登录到 GitHub Container Registry
52+
- name: Log into registry ${{ env.REGISTRY }}
53+
uses: docker/login-action@v3
54+
with:
55+
registry: ${{ env.REGISTRY }}
56+
username: ${{ github.actor }}
57+
password: ${{ secrets.GITHUB_TOKEN }}
58+
59+
# 提取元数据
60+
- name: Extract Docker metadata
61+
id: meta
62+
uses: docker/metadata-action@v5
63+
with:
64+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
65+
tags: |
66+
type=raw,value=latest,enable={{is_default_branch}}
67+
type=raw,value=${{ steps.get_version.outputs.version }}
68+
type=sha,format=short
69+
70+
# 构建和推送
71+
- name: Build and push
72+
uses: docker/build-push-action@v5
73+
with:
74+
context: .
75+
push: ${{ github.event_name != 'pull_request' }}
76+
tags: ${{ steps.meta.outputs.tags }}
77+
labels: ${{ steps.meta.outputs.labels }}
78+
platforms: linux/amd64,linux/arm64
79+
cache-from: type=gha,scope=${{ github.workflow }}
80+
cache-to: type=gha,mode=max,scope=${{ github.workflow }}
81+
build-args: |
82+
BUILDKIT_INLINE_CACHE=1
83+
VERSION=${{ steps.get_version.outputs.version }}
84+
# 启用 BuildKit 内联缓存
85+
outputs: type=docker,dest=/tmp/image.tar
86+
87+
# 输出版本信息
88+
- name: Print version info
89+
run: |
90+
echo "构建版本: ${{ steps.get_version.outputs.version }}"
91+
echo "镜像标签:"
92+
echo "${{ steps.meta.outputs.tags }}" | tr '\n' '\n '
93+

DOCKER.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ mkdir -p logs && chmod 777 logs
8181

8282
# 3. 启动容器
8383
docker run -d \
84-
--name nodepass-webui \
84+
--name nodepass-app \
8585
-p 3000:3000 \
8686
-v ./logs:/app/logs \
8787
-e POSTGRES_USER=nodepass \

Dockerfile

Lines changed: 47 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,135 +1,92 @@
11
# NodePass WebUI - 整合SSE服务的Docker镜像
22
# Next.js应用内置SSE服务,单端口运行
33

4-
FROM node:18-alpine AS base
4+
# 添加版本参数
5+
ARG VERSION=1.1.2
56

6-
# 安装必要的系统依赖
7-
RUN apk add --no-cache \
8-
postgresql-client \
9-
python3 \
10-
make \
11-
g++ \
12-
&& npm install -g pnpm
7+
# 依赖阶段 - 用于缓存依赖
8+
FROM node:18-alpine AS deps
139

14-
WORKDIR /app
10+
# 设置pnpm
11+
RUN corepack enable && corepack prepare pnpm@latest --activate
1512

16-
# ================================
17-
# 依赖安装阶段
18-
# ================================
19-
FROM base AS deps
13+
WORKDIR /app
2014

21-
# 复制依赖配置文件
22-
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
15+
# 只复制package文件
16+
COPY package.json pnpm-lock.yaml ./
2317

2418
# 安装依赖
25-
RUN pnpm install --frozen-lockfile
26-
27-
# ================================
28-
# 开发环境 (用于 docker-compose 开发)
29-
# ================================
30-
FROM base AS development
31-
32-
# 复制依赖
33-
COPY --from=deps /app/node_modules ./node_modules
34-
COPY --from=deps /app/package.json ./package.json
35-
36-
# 复制所有源代码
37-
COPY . .
19+
RUN apk add --no-cache python3 make g++ && \
20+
pnpm install --frozen-lockfile
3821

39-
# 生成 Prisma 客户端
40-
RUN pnpm exec prisma generate
41-
42-
# 暴露端口 (仅需要3000端口,SSE服务已整合)
43-
EXPOSE 3000
44-
45-
# 健康检查
46-
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
47-
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1
22+
# 构建阶段
23+
FROM node:18-alpine AS builder
4824

49-
# 开发启动脚本
50-
CMD ["sh", "-c", "\
51-
echo '🚀 启动NodePass开发环境 (整合SSE服务)...' && \
52-
echo '⏳ 等待数据库连接...' && \
53-
while ! pg_isready -h postgres -p 5432 -U ${POSTGRES_USER:-nodepass} -q; do \
54-
echo '⏳ 等待PostgreSQL启动...' && sleep 2; \
55-
done && \
56-
echo '📊 运行数据库迁移...' && \
57-
pnpm exec prisma migrate deploy && \
58-
echo '🌱 生成Prisma客户端...' && \
59-
pnpm exec prisma generate && \
60-
echo '🎯 启动整合服务 (Next.js + SSE)...' && \
61-
pnpm dev:integrated \
62-
"]
25+
# 设置pnpm
26+
RUN corepack enable && corepack prepare pnpm@latest --activate
6327

64-
# ================================
65-
# 构建阶段
66-
# ================================
67-
FROM base AS builder
28+
WORKDIR /app
6829

6930
# 复制依赖
7031
COPY --from=deps /app/node_modules ./node_modules
7132
COPY --from=deps /app/package.json ./package.json
7233

73-
# 复制源代码
34+
# 复制源代码并构建
7435
COPY . .
36+
RUN pnpm exec prisma generate && pnpm build
7537

76-
# 生成 Prisma 客户端
77-
RUN pnpm exec prisma generate
38+
# 生产环境
39+
FROM node:18-alpine AS production
7840

79-
# 构建应用
80-
RUN pnpm build
41+
# 设置版本标签
42+
ARG VERSION
43+
LABEL version=${VERSION}
44+
LABEL org.opencontainers.image.version=${VERSION}
8145

82-
# ================================
83-
# 生产环境
84-
# ================================
85-
FROM base AS production
46+
# 设置pnpm(使用corepack而不是npm)
47+
RUN corepack enable && corepack prepare pnpm@latest --activate
8648

87-
# 安装生产依赖和必要的CLI工具
88-
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
89-
RUN pnpm install --frozen-lockfile --prod && \
90-
pnpm add prisma tsx --save-dev
49+
WORKDIR /app
9150

92-
# 复制构建产物和必要文件
51+
# 合并所有生产环境的设置
52+
RUN apk add --no-cache postgresql-client && \
53+
addgroup -g 1001 -S nodejs && \
54+
adduser -S nextjs -u 1001
55+
56+
# 只复制生产所需文件
57+
COPY --from=builder /app/package.json /app/pnpm-lock.yaml ./
9358
COPY --from=builder /app/.next ./.next
94-
COPY --from=builder /app/server.ts ./server.ts
9559
COPY --from=builder /app/prisma ./prisma
96-
COPY --from=builder /app/lib ./lib
97-
COPY --from=builder /app/scripts ./scripts
98-
COPY --from=builder /app/app ./app
99-
COPY --from=builder /app/components ./components
100-
COPY --from=builder /app/styles ./styles
101-
COPY --from=builder /app/config ./config
102-
COPY --from=builder /app/types ./types
103-
COPY --from=builder /app/tsconfig.json ./tsconfig.json
10460
COPY --from=builder /app/next.config.js ./next.config.js
61+
COPY --from=builder /app/public ./public
10562

106-
# 生成 Prisma 客户端(生产环境)
107-
RUN pnpm exec prisma generate
108-
109-
# 创建非root用户
110-
RUN addgroup -g 1001 -S nodejs && \
111-
adduser -S nextjs -u 1001
63+
# 只安装生产依赖并清理
64+
RUN pnpm install --frozen-lockfile --prod && \
65+
pnpm add prisma --save-dev && \
66+
pnpm exec prisma generate && \
67+
pnpm cache clean && \
68+
rm -rf /root/.cache /root/.npm && \
69+
chown -R nextjs:nodejs /app
11270

113-
# 设置正确的权限
114-
RUN chown -R nextjs:nodejs /app
11571
USER nextjs
11672

117-
# 暴露端口 (仅需要3000端口,SSE服务已整合)
11873
EXPOSE 3000
11974

120-
# 健康检查
12175
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
12276
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1
12377

124-
# 生产启动脚本
78+
# 添加版本信息到环境变量
79+
ENV APP_VERSION=${VERSION}
80+
12581
CMD ["sh", "-c", "\
12682
echo '🚀 启动NodePass生产环境 (整合SSE服务)...' && \
83+
echo '📦 当前版本: '${APP_VERSION} && \
12784
echo '⏳ 等待数据库连接...' && \
12885
while ! pg_isready -h postgres -p 5432 -U ${POSTGRES_USER:-nodepass} -q; do \
12986
echo '⏳ 等待PostgreSQL启动...' && sleep 2; \
13087
done && \
13188
echo '📊 运行数据库迁移...' && \
13289
pnpm exec prisma migrate deploy && \
13390
echo '🎯 启动整合生产服务...' && \
134-
pnpm start:integrated \
91+
NODE_ENV=production pnpm start \
13592
"]

0 commit comments

Comments
 (0)