javaeeduke commited on
Commit
b78b330
·
verified ·
1 Parent(s): 5772276

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +26 -26
Dockerfile CHANGED
@@ -9,39 +9,39 @@ RUN npm run build
9
  FROM node:20-slim AS runner
10
  WORKDIR /app
11
 
12
- # 1. 安装用于网络转发和基础认证的 caddy(极其轻量且极其安全)
13
- RUN apt-get update && apt-get install -y debian-keyring debian-archive-keyring apt-transport-https curl \
14
- && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add - \
15
- && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.yandex.net/caddy/stable.list \
16
- && apt-get update && apt-get install -y caddy && rm -rf /var/lib/apt/lists/*
17
-
18
  COPY --from=builder /app ./
19
  RUN mkdir -p /data/freellm
20
 
21
- # 2. 路由修复
22
  RUN cp -r client/dist/* server/dist/public/ 2>/dev/null || cp -r client/dist/* server/public/ 2>/dev/null || true
23
 
24
- # 3. 环境变量(让 FreeLLMAPI 后端改退到内部 8080 端口,把 7860 留给密码锁)
25
  EXPOSE 7860
26
- ENV PORT=8080
27
  ENV NODE_ENV=production
28
  ENV DATABASE_URL="file:/data/database.sqlite"
29
 
30
- # 4. 【核心绝杀】:动态生成密码锁配置文件并启全套服务
31
  CMD ["sh", "-c", "rm -rf /app/server/data && ln -s /data/freellm /app/server/data && \
32
- # 如果你在 HF Settings 里配了这两个 secret,就用你配;没配就默认 admin/admin123 \
33
- USER=${SPACE_BASIC_AUTH_USERNAME:-admin} && \
34
- PASS=${SPACE_BASIC_AUTH_PASSWORD:-admin123} && \
35
- HASHED_PASS=$(caddy hash-password --plaintext \"$PASS\") && \
36
- # 现场印制 Caddyfile 配置文件 \
37
- echo \":7860 {\" > Caddyfile && \
38
- echo \" basic_auth / { \" >> Caddyfile && \
39
- echo \" $USER $HASHED_PASS\" >> Caddyfile && \
40
- echo \" }\" >> Caddyfile && \
41
- echo \" reverse_proxy localhost:8080\" >> Caddyfile && \
42
- echo \"}\" >> Caddyfile && \
43
- # 动态计算密钥并后台启动 API 引擎 \
44
- export ENCRYPTION_KEY=$(node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\") && \
45
- node server/dist/index.js & \
46
- # 前台启动密码锁守护进程 \
47
- caddy run --config Caddyfile\"]
 
 
 
 
 
 
 
9
  FROM node:20-slim AS runner
10
  WORKDIR /app
11
 
 
 
 
 
 
 
12
  COPY --from=builder /app ./
13
  RUN mkdir -p /data/freellm
14
 
15
+ # 1. 前端路由修复
16
  RUN cp -r client/dist/* server/dist/public/ 2>/dev/null || cp -r client/dist/* server/public/ 2>/dev/null || true
17
 
18
+ # 2. 注入基础配置
19
  EXPOSE 7860
20
+ ENV PORT=7860
21
  ENV NODE_ENV=production
22
  ENV DATABASE_URL="file:/data/database.sqlite"
23
 
24
+ # 3. 【原生绝杀】:在容器启,动态往核心代码里塞入一段 Basic Auth 拦截逻辑
25
  CMD ["sh", "-c", "rm -rf /app/server/data && ln -s /data/freellm /app/server/data && \
26
+ # 动态把密码拦截代码注入到后端入口文件中 \
27
+ node -e \" \
28
+ const fs = require('fs'); \
29
+ const file = 'server/dist/index.js'; \
30
+ if (fs.existsSync(file)) { \
31
+ let content = fs.readFileSync(file, 'utf8'); \
32
+ const injectCode = ` \
33
+ // 密码锁中间件 \
34
+ global.authMiddleware = (req, res, next) => { \
35
+ const user = process.env.SPACE_BASIC_AUTH_USERNAME || 'admin'; \
36
+ const pass = process.env.SPACE_BASIC_AUTH_PASSWORD || 'admin123'; \
37
+ const auth = { login: user, password: pass }; \
38
+ const b64auth = (req.headers.authorization || '').split(' ')[1] || ''; \
39
+ const [login, password] = Buffer.from(b64auth, 'base64').toString().split(':'); \
40
+ if (req.url.startsWith('/v1')) return next(); \
41
+ if (login && password && login === auth.login && password === auth.password) return next(); \
42
+ res.statusCode = 401; \
43
+ res.setHeader('WWW-Authenticate', 'Basic realm=\\\"Secure Area\\\"'); \
44
+ res.end('Unauthorized'); \
45
+ }; \
46
+ `; \
47
+ content = injectCode + content.replace('const app =', 'const app = ; app