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

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +12 -24
Dockerfile CHANGED
@@ -21,27 +21,15 @@ 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
 
21
  ENV NODE_ENV=production
22
  ENV DATABASE_URL="file:/data/database.sqlite"
23
 
24
+ # 3. 【核心修复】:用最直观的方式把看门大爷的代码写进独立的 security.js 文件里
25
+ RUN echo "const fs = require('fs');" > security.js && \
26
+ echo "const file = 'server/dist/index.js';" >> security.js && \
27
+ echo "if (fs.existsSync(file)) {" >> security.js && \
28
+ echo " let content = fs.readFileSync(file, 'utf8');" >> security.js && \
29
+ echo " const injectCode = \`global.authMiddleware = (req, res, next) => { const user = process.env.SPACE_BASIC_AUTH_USERNAME || 'admin'; const pass = process.env.SPACE_BASIC_AUTH_PASSWORD || 'admin123'; const b64auth = (req.headers.authorization || '').split(' ')[1] || ''; const [login, password] = Buffer.from(b64auth, 'base64').toString().split(':'); if (req.url.startsWith('/v1')) return next(); if (login && password && login === user && password === pass) return next(); res.statusCode = 401; res.setHeader('WWW-Authenticate', 'Basic realm=\"Secure\"'); res.end('Unauthorized'); };\`;" >> security.js && \
30
+ echo " content = content.replace('const app =', 'const app = ; app.use(global.authMiddleware); //');" >> security.js && \
31
+ echo " fs.writeFileSync(file, injectCode + content, 'utf8');" >> security.js && \
32
+ echo "}" >> security.js
33
+
34
+ # 4. 彻底没有引号冲突的干净启动命令
35
+ CMD ["sh", "-c", "rm -rf /app/server/data && ln -s /data/freellm /app/server/data && node security.js && export ENCRYPTION_KEY=$(node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\") && node server/dist/index.js"]