Spaces:
Running
Running
| 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"] | |