Upload 2 files
Browse files- Dockerfile +49 -9
- server.js +8 -3
Dockerfile
CHANGED
@@ -1,27 +1,67 @@
|
|
1 |
-
#
|
2 |
-
FROM
|
3 |
|
4 |
-
#
|
5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
# 复制 package 文件
|
8 |
COPY package*.json ./
|
9 |
|
10 |
-
#
|
11 |
-
USER root
|
12 |
-
|
13 |
-
# 现在有了 package-lock.json,可以使用 npm ci
|
14 |
RUN npm ci --only=production && npm cache clean --force
|
15 |
|
16 |
# 复制应用代码
|
17 |
COPY . .
|
18 |
|
19 |
-
#
|
|
|
|
|
|
|
20 |
USER pptruser
|
21 |
|
22 |
# 设置环境变量
|
23 |
ENV NODE_ENV=production
|
24 |
ENV PORT=7860
|
|
|
|
|
25 |
|
26 |
# 暴露端口
|
27 |
EXPOSE 7860
|
|
|
1 |
+
# HF Spaces Dockerfile - 修复 Chrome 路径问题
|
2 |
+
FROM node:18-slim
|
3 |
|
4 |
+
# 安装必要的系统依赖
|
5 |
+
RUN apt-get update && apt-get install -y \
|
6 |
+
wget \
|
7 |
+
gnupg \
|
8 |
+
ca-certificates \
|
9 |
+
apt-transport-https \
|
10 |
+
--no-install-recommends
|
11 |
+
|
12 |
+
# 添加 Google Chrome 官方仓库
|
13 |
+
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \
|
14 |
+
&& echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
|
15 |
+
|
16 |
+
# 安装 Chrome 和相关依赖
|
17 |
+
RUN apt-get update && apt-get install -y \
|
18 |
+
google-chrome-stable \
|
19 |
+
fonts-liberation \
|
20 |
+
libappindicator3-1 \
|
21 |
+
libasound2 \
|
22 |
+
libatk-bridge2.0-0 \
|
23 |
+
libdrm2 \
|
24 |
+
libgtk-3-0 \
|
25 |
+
libnspr4 \
|
26 |
+
libnss3 \
|
27 |
+
libx11-xcb1 \
|
28 |
+
libxcomposite1 \
|
29 |
+
libxdamage1 \
|
30 |
+
libxrandr2 \
|
31 |
+
libgbm1 \
|
32 |
+
libxss1 \
|
33 |
+
libgconf-2-4 \
|
34 |
+
--no-install-recommends \
|
35 |
+
&& rm -rf /var/lib/apt/lists/*
|
36 |
+
|
37 |
+
# 创建非 root 用户
|
38 |
+
RUN groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \
|
39 |
+
&& mkdir -p /home/pptruser/Downloads \
|
40 |
+
&& chown -R pptruser:pptruser /home/pptruser
|
41 |
+
|
42 |
+
# 设置工作目录
|
43 |
+
WORKDIR /app
|
44 |
|
45 |
# 复制 package 文件
|
46 |
COPY package*.json ./
|
47 |
|
48 |
+
# 安装 Node.js 依赖
|
|
|
|
|
|
|
49 |
RUN npm ci --only=production && npm cache clean --force
|
50 |
|
51 |
# 复制应用代码
|
52 |
COPY . .
|
53 |
|
54 |
+
# 更改所有权
|
55 |
+
RUN chown -R pptruser:pptruser /app
|
56 |
+
|
57 |
+
# 切换到非 root 用户
|
58 |
USER pptruser
|
59 |
|
60 |
# 设置环境变量
|
61 |
ENV NODE_ENV=production
|
62 |
ENV PORT=7860
|
63 |
+
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
|
64 |
+
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome-stable
|
65 |
|
66 |
# 暴露端口
|
67 |
EXPOSE 7860
|
server.js
CHANGED
@@ -73,9 +73,10 @@ app.post('/screenshot', async (req, res) => {
|
|
73 |
try {
|
74 |
console.log('Launching browser...');
|
75 |
|
76 |
-
// HF Spaces 优化配置 -
|
77 |
-
|
78 |
headless: 'new',
|
|
|
79 |
args: [
|
80 |
'--no-sandbox',
|
81 |
'--disable-setuid-sandbox',
|
@@ -89,7 +90,9 @@ app.post('/screenshot', async (req, res) => {
|
|
89 |
'--disable-backgrounding-occluded-windows',
|
90 |
'--disable-renderer-backgrounding'
|
91 |
]
|
92 |
-
}
|
|
|
|
|
93 |
|
94 |
const page = await browser.newPage();
|
95 |
|
@@ -151,6 +154,8 @@ app.post('/screenshot', async (req, res) => {
|
|
151 |
errorResponse.suggestion = 'Try a simpler webpage or reduce timeout';
|
152 |
} else if (error.message.includes('net::')) {
|
153 |
errorResponse.suggestion = 'Check if the URL is accessible';
|
|
|
|
|
154 |
}
|
155 |
|
156 |
res.status(500).json(errorResponse);
|
|
|
73 |
try {
|
74 |
console.log('Launching browser...');
|
75 |
|
76 |
+
// HF Spaces 优化配置 - 明确指定 Chrome 路径
|
77 |
+
const browserOptions = {
|
78 |
headless: 'new',
|
79 |
+
executablePath: '/usr/bin/google-chrome-stable',
|
80 |
args: [
|
81 |
'--no-sandbox',
|
82 |
'--disable-setuid-sandbox',
|
|
|
90 |
'--disable-backgrounding-occluded-windows',
|
91 |
'--disable-renderer-backgrounding'
|
92 |
]
|
93 |
+
};
|
94 |
+
|
95 |
+
browser = await puppeteer.launch(browserOptions);
|
96 |
|
97 |
const page = await browser.newPage();
|
98 |
|
|
|
154 |
errorResponse.suggestion = 'Try a simpler webpage or reduce timeout';
|
155 |
} else if (error.message.includes('net::')) {
|
156 |
errorResponse.suggestion = 'Check if the URL is accessible';
|
157 |
+
} else if (error.message.includes('Chrome')) {
|
158 |
+
errorResponse.suggestion = 'Chrome installation issue, contact admin';
|
159 |
}
|
160 |
|
161 |
res.status(500).json(errorResponse);
|