cloudpasteview / Dockerfile
dragg2's picture
Update Dockerfile
5bfbaae verified
FROM ymlisoft/kkfileview
USER root
# 1. 安装必要依赖
RUN apt-get update && apt-get install -y \
nginx \
apache2-utils \
xvfb \
curl \
libfreetype6 \
fontconfig \
fonts-wqy-zenhei \
&& rm -rf /var/lib/apt/lists/* \
&& fc-cache -fv
# 2. 环境变量配置
ENV SERVER_PORT=8012
ENV KKFILEVIEW_SECURITY_TRUST_HOST=default
ENV AUTH_USERNAME=admin
ENV AUTH_PASSWORD=yourpassword
# 3. JVM 配置
# - 堆内存: 4GB
# - G1GC: 低延迟垃圾回收
# - 元空间: 256MB
ENV JAVA_OPTS="-server \
-Xms4g \
-Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-Djava.awt.headless=true \
-Dsun.java2d.fontpath=/usr/share/fonts \
-Dfile.encoding=UTF-8 \
-Dserver.tomcat.threads.max=16 \
-Dserver.tomcat.threads.min-spare=4 \
-Dserver.tomcat.accept-count=50 \
-Dserver.tomcat.max-connections=200"
# 4. LibreOffice 配置
ENV office.plugin.server.ports=2001,2002,2003,2004,2005
ENV office.plugin.task.timeout=5m
ENV office.preview.type=pdf
ENV office.timeout=300000
ENV file.dir=/opt/kkFileView/file/
# 5. Nginx 配置
RUN rm -rf /etc/nginx/sites-enabled/* /etc/nginx/conf.d/* && \
printf 'server {\n\
listen 7860 default_server;\n\
server_name _;\n\
\n\
client_max_body_size 500M;\n\
\n\
# 静态文件目录\n\
location ~ ^/(demo|file|static)/ {\n\
auth_basic off;\n\
proxy_pass http://127.0.0.1:8012;\n\
proxy_set_header Host $http_host;\n\
proxy_set_header X-Real-IP $remote_addr;\n\
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;\n\
proxy_buffering off;\n\
proxy_read_timeout 300s;\n\
}\n\
\n\
# 健康检查端点\n\
location /health {\n\
auth_basic off;\n\
return 200 "OK";\n\
add_header Content-Type text/plain;\n\
}\n\
\n\
# 主要预览路径 - 基于 Referer 白名单\n\
location / {\n\
set $auth_required "Restricted Access";\n\
\n\
# 替换为域名\n\
if ($http_referer ~* "^https?://.*\\.cloudpaste\\.qzz\\.io") {\n\
set $auth_required off;\n\
}\n\
\n\
# 部署在 HuggingFace Spaces\n\
if ($http_referer ~* "^https?://.*\\.hf\\.space") {\n\
set $auth_required off;\n\
}\n\
\n\
# 开发环境支持\n\
if ($http_referer ~* "^https?://localhost") {\n\
set $auth_required off;\n\
}\n\
if ($http_referer ~* "^https?://127\\.0\\.0\\.1") {\n\
set $auth_required off;\n\
}\n\
\n\
auth_basic $auth_required;\n\
auth_basic_user_file /etc/nginx/.htpasswd;\n\
\n\
proxy_pass http://127.0.0.1:8012;\n\
proxy_set_header Host $http_host;\n\
proxy_set_header X-Real-IP $remote_addr;\n\
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;\n\
proxy_buffering off;\n\
proxy_read_timeout 300s;\n\
}\n\
}\n' > /etc/nginx/conf.d/kkfileview.conf
# 6. 启动脚本
RUN printf '#!/bin/bash\n\
set -e\n\
\n\
echo "=== Starting KKFileView (EPS + CAD Fix) for HuggingFace Spaces ==="\n\
\n\
# 查找 KKFileView 启动脚本\n\
STARTUP_SCRIPT=$(find /opt -name "startup.sh" -o -name "kkFileView" | grep "bin/" | head -n 1)\n\
KK_ROOT_DIR=$(dirname $(dirname "$STARTUP_SCRIPT"))\n\
\n\
# 生成 htpasswd 文件\n\
htpasswd -cb /etc/nginx/.htpasswd "$AUTH_USERNAME" "$AUTH_PASSWORD"\n\
\n\
# 创建文件存储目录\n\
mkdir -p /opt/kkFileView/file\n\
chmod 755 /opt/kkFileView/file\n\
\n\
# 启动 Xvfb\n\
echo "Starting Xvfb..."\n\
Xvfb :99 -screen 0 1024x768x24 >/dev/null 2>&1 &\n\
export DISPLAY=:99\n\
sleep 2\n\
echo "✓ Xvfb started on DISPLAY=:99"\n\
\n\
# 启动 KKFileView)\n\
echo "Starting KKFileView on port 8012..."\n\
echo "LibreOffice will be managed by KKFileView automatically"\n\
export JAVA_OPTS="$JAVA_OPTS"\n\
\n\
if [[ "$STARTUP_SCRIPT" == *".sh" ]]; then\n\
bash "$STARTUP_SCRIPT" 2>&1 | tee /var/log/kkfileview.log &\n\
else\n\
"$STARTUP_SCRIPT" --server.port=8012 2>&1 | tee /var/log/kkfileview.log &\n\
fi\n\
\n\
# 等待日志文件生成\n\
echo "Waiting for log file..."\n\
LOG_FILE="$KK_ROOT_DIR/log/kkFileView.log"\n\
for i in {1..30}; do\n\
if [ -f "$LOG_FILE" ]; then\n\
echo "✓ Found log file: $LOG_FILE"\n\
tail -f "$LOG_FILE" &\n\
break\n\
fi\n\
sleep 1\n\
done\n\
\n\
# 等待 KKFileView 启动\n\
echo "Waiting for KKFileView to start..."\n\
for i in {1..60}; do\n\
if curl -s http://127.0.0.1:8012 >/dev/null 2>&1; then\n\
echo "✓ KKFileView is ready on port 8012!"\n\
break\n\
fi\n\
if [ $i -eq 60 ]; then\n\
echo "ERROR: KKFileView failed to start within 120 seconds"\n\
exit 1\n\
fi\n\
echo "Waiting... ($i/60)"\n\
sleep 2\n\
done\n\
\n\
# 验证 LibreOffice\n\
echo "Checking LibreOffice status..."\n\
LIBREOFFICE_COUNT=$(ps aux | grep soffice | grep -v grep | wc -l)\n\
if [ $LIBREOFFICE_COUNT -gt 0 ]; then\n\
echo "✓ LibreOffice processes running: $LIBREOFFICE_COUNT"\n\
else\n\
echo "⚠ LibreOffice not detected (will be started on first use)"\n\
fi\n\
\n\
# 启动 Nginx\n\
echo "Starting Nginx on port 7860..."\n\
nginx -g "daemon off;"\n' > /start.sh && \
chmod +x /start.sh
# 7. 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:7860/health || exit 1
# 8. 暴露端口
EXPOSE 7860
# 9. 启动命令
ENTRYPOINT []
CMD ["/start.sh"]