-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
152 lines (133 loc) · 5.49 KB
/
Copy pathDockerfile
File metadata and controls
152 lines (133 loc) · 5.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
FROM node:22.22.2-alpine AS base
ENV NODE_OPTIONS="--max_old_space_size=7168"
WORKDIR /app
# Install system dependencies (only for building)
RUN apk add --no-cache --update python3 make g++ tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apk del tzdata
# Configure pnpm with parallel builds
RUN corepack enable \
&& corepack prepare [email protected] --activate \
&& pnpm config set network-timeout 600000 -g \
&& pnpm config set registry https://registry.npmmirror.com -g \
&& pnpm config set fetch-retries 20 -g \
&& pnpm config set fetch-timeout 600000 -g \
&& pnpm config set jobs 6 -g
# Copy package files for dependency installation
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.base.json ./
COPY packages/server/package.json ./packages/server/
COPY packages/website/package.json ./packages/website/
COPY packages/admin/package.json ./packages/admin/
COPY packages/cli/package.json ./packages/cli/
COPY packages/waline/package.json ./packages/waline/
# Install all dependencies (including devDependencies for building)
RUN pnpm install
# Build server
FROM base AS server_builder
WORKDIR /app
COPY ./packages/server/ ./packages/server/
WORKDIR /app/packages/server
RUN pnpm build
# Build website
FROM base AS website_builder
WORKDIR /app
COPY ./packages/website ./packages/website
WORKDIR /app/packages/website
ENV isBuild=true
ENV VAN_BLOG_ALLOW_DOMAINS="pic.mereith.com"
ARG VAN_BLOG_BUILD_SERVER
ENV VAN_BLOG_SERVER_URL=${VAN_BLOG_BUILD_SERVER}
ARG VAN_BLOG_VERSIONS
ENV VAN_BLOG_VERSION=${VAN_BLOG_VERSIONS}
RUN pnpm build
# Build admin
FROM base AS admin_builder
WORKDIR /app
COPY ./packages/admin/ ./packages/admin/
WORKDIR /app/packages/admin
ENV NODE_OPTIONS='--max_old_space_size=6144 --openssl-legacy-provider'
ENV EEE=production
RUN pnpm build
# Final runtime image
FROM node:22.22.2-alpine AS runner
WORKDIR /app
# Install ONLY runtime dependencies (no build tools)
RUN apk add --no-cache --update tzdata caddy nss-tools libwebp-tools wget unzip curl \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apk del tzdata \
&& corepack enable \
&& corepack prepare [email protected] --activate \
&& pnpm config set network-timeout 600000 -g \
&& pnpm config set registry https://registry.npmmirror.com -g \
&& pnpm config set fetch-retries 20 -g \
&& pnpm config set fetch-timeout 600000 -g \
&& pnpm config set jobs 6 -g
# Install aliyunpan (阿里云盘命令行工具)
RUN ARCH=$(uname -m) \
&& if [ "$ARCH" = "x86_64" ]; then ALIYUNPAN_ARCH="amd64"; elif [ "$ARCH" = "aarch64" ]; then ALIYUNPAN_ARCH="arm64"; else ALIYUNPAN_ARCH="amd64"; fi \
&& ALIYUNPAN_VERSION="v0.3.7" \
&& wget -O /tmp/aliyunpan.zip "https://github.com/tickstep/aliyunpan/releases/download/${ALIYUNPAN_VERSION}/aliyunpan-${ALIYUNPAN_VERSION}-linux-${ALIYUNPAN_ARCH}.zip" \
&& unzip /tmp/aliyunpan.zip -d /tmp/ \
&& mv /tmp/aliyunpan-${ALIYUNPAN_VERSION}-linux-${ALIYUNPAN_ARCH}/aliyunpan /usr/local/bin/ \
&& chmod +x /usr/local/bin/aliyunpan \
&& rm -rf /tmp/aliyunpan* \
&& aliyunpan --version
# Copy CLI tool with PRODUCTION dependencies only
WORKDIR /app/cli
COPY ./packages/cli/ ./
COPY packages/cli/package.json ./package.json
RUN pnpm install --prod
# Copy Waline with PRODUCTION dependencies only
WORKDIR /app/waline
COPY ./packages/waline/ ./
COPY packages/waline/package.json ./package.json
RUN pnpm install --prod
# Copy server with PRODUCTION dependencies only
WORKDIR /app/server
COPY --from=server_builder /app/packages/server/dist/src/ ./
COPY packages/server/package.json ./package.json
RUN pnpm install --prod
# Copy website (static files, no additional dependencies needed)
WORKDIR /app/website
COPY --from=website_builder /app/packages/website/.next/standalone/ ./
COPY --from=website_builder /app/packages/website/next.config.js ./packages/website/next.config.js
COPY --from=website_builder /app/packages/website/public ./packages/website/public
COPY --from=website_builder /app/packages/website/package.json ./packages/website/package.json
COPY --from=website_builder /app/packages/website/.next/static ./packages/website/.next/static
# Copy admin static files (no dependencies needed)
WORKDIR /app/admin
COPY --from=admin_builder /app/packages/admin/dist/ ./
# Copy mindmap static files (after build to avoid webpack processing)
COPY mind-map/dist ./mindmap/dist
COPY mind-map/index.html ./mindmap/index.html
COPY mind-map/editor ./mindmap/editor
COPY mind-map/nav ./mindmap/nav
# Copy configuration files
WORKDIR /app
COPY caddyTemplate.json /app/caddyTemplate.json
COPY CaddyfileTemplateLocal /app/CaddyfileTemplateLocal
COPY ./scripts/start.js ./
COPY ./scripts/fix-waline-dashboard.js ./scripts/
COPY ./entrypoint.sh ./
# Set production environment variables.
# This legacy single-image Dockerfile now defaults to the PostgreSQL-based runtime.
ENV NODE_ENV=production
ENV VAN_BLOG_SERVER_URL="http://127.0.0.1:3000"
ENV VAN_BLOG_ALLOW_DOMAINS="pic.mereith.com"
ENV VAN_BLOG_DATABASE_URL="postgresql://postgres:postgres@postgres:5432/vanblog"
ENV EMAIL="[email protected]"
ENV VAN_BLOG_WALINE_DB="waline"
ENV VAN_BLOG_WALINE_DATABASE_URL="postgresql://postgres:postgres@postgres:5432/waline"
ENV PORT=3001
ARG VAN_BLOG_VERSIONS
ENV VAN_BLOG_VERSION=${VAN_BLOG_VERSIONS}
# Define volumes
VOLUME /app/static
VOLUME /var/log
VOLUME /root/.config/caddy
VOLUME /root/.local/share/caddy
VOLUME /root/.config/aliyunpan
EXPOSE 80
ENTRYPOINT [ "sh","entrypoint.sh" ]