File size: 1,264 Bytes
8a59281
 
 
 
20ebd03
8a59281
 
 
20ebd03
8a59281
20ebd03
 
8a59281
 
2a67ddb
8a59281
 
 
20ebd03
8a59281
 
20ebd03
eadc41e
8a59281
20ebd03
 
 
 
 
eadc41e
8a59281
 
20ebd03
2a67ddb
20ebd03
eadc41e
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
FROM node:20-slim AS builder

WORKDIR /app

# 1. 安装 git 并克隆最新官方源码
RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/tashfeenahmed/freellmapi.git .

# 2. 安装全部依赖
RUN npm install

# 3. 编译所有子工作区(前端 + 后端)
RUN npm run build

# --- 生产运行环境 ---
FROM node:20-slim AS runner
WORKDIR /app

# 4. 复制编译产物
COPY --from=builder /app ./

# 5. 开辟持久化目录
RUN mkdir -p /data/freellm

# 6. 【绝杀技巧】:把前端打包出来的静态网页文件,直接物理复制进后端的静态资源公开目录下!
# 这样当通过 7860 端口直接访问根目录时,后端会自动吐出前端管理面板
RUN cp -r client/dist/* server/dist/public/ 2>/dev/null || cp -r client/dist/* server/public/ 2>/dev/null || true

# 7. 核心环境变量注入
EXPOSE 7860
ENV PORT=7860
ENV NODE_ENV=production
ENV DATABASE_URL="file:/data/database.sqlite"

# 8. 启动命令(保留内存软链接持久化机制)
CMD ["sh", "-c", "rm -rf /app/server/data && ln -s /data/freellm /app/server/data && export ENCRYPTION_KEY=$(node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\") && node server/dist/index.js"]