File size: 6,314 Bytes
efe92b5
e4956d2
919170c
bbf8af3
4d8577b
459e040
 
 
 
eb21930
4d8577b
 
 
919170c
4d8577b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0c799ac
07ef463
 
 
e4956d2
4d8577b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ec4776c
4d8577b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
459e040
4d8577b
e7e4e66
4d8577b
0c799ac
ae0ce11
459e040
4d8577b
459e040
4d8577b
 
50ec61c
459e040
 
4d8577b
b39ad01
0c799ac
459e040
ae0ce11
4d8577b
 
 
 
 
444c787
4d8577b
 
50ec61c
4d8577b
50ec61c
4d8577b
50ec61c
ae0ce11
4d8577b
b9de94c
4d8577b
 
b9de94c
 
4d8577b
 
 
 
fc0cce5
 
 
0f0189d
4d8577b
459e040
19c209b
e4cf850
4d8577b
 
 
 
 
e4cf850
 
4d8577b
fc0cce5
4d8577b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
FROM ymlisoft/kkfileview

USER root

# 1. 安装必要依赖
RUN apt-get update && apt-get install -y \
    nginx \
    apache2-utils \
    xvfb \
    fonts-wqy-zenhei \
    curl \
    && rm -rf /var/lib/apt/lists/* \
    && fc-cache -fv

# 2. JVM 优化配置(针对 16GB RAM 环境)
ENV SERVER_PORT=8012 \
    KKFILEVIEW_SECURITY_TRUST_HOST=default \
    JAVA_OPTS="-server \
-Xms8g \
-Xmx8g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:G1HeapRegionSize=16m \
-XX:G1NewSizePercent=30 \
-XX:G1MaxNewSizePercent=40 \
-XX:InitiatingHeapOccupancyPercent=45 \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-Xss1m \
-XX:+UseCompressedOops \
-XX:+UseStringDeduplication \
-XX:+OptimizeStringConcat \
-Djava.awt.headless=true \
-Dsun.java2d.fontpath=/usr/share/fonts \
-Dfile.encoding=UTF-8 \
-Djava.security.egd=file:/dev/./urandom \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/kkfileview/ \
-XX:+PrintGCDetails \
-XX:+PrintGCTimeStamps \
-Xloggc:/var/log/kkfileview/gc.log \
-XX:+UseGCLogFileRotation \
-XX:NumberOfGCLogFiles=5 \
-XX:GCLogFileSize=100M \
-Dserver.tomcat.threads.max=16 \
-Dserver.tomcat.threads.min-spare=4 \
-Dserver.tomcat.accept-count=50 \
-Dserver.tomcat.max-connections=200"

# 3. 创建目录并设置权限(兼容现有用户)
RUN mkdir -p /var/log/kkfileview /opt/kkFileView/file && \
chmod -R 755 /var/log/kkfileview /opt/kkFileView

# 4. Nginx 配置
RUN rm -rf /etc/nginx/sites-enabled/* /etc/nginx/conf.d/* && \
    printf 'user nginx;\n\
worker_processes 2;\n\
worker_cpu_affinity 01 10;\n\
worker_priority -5;\n\
worker_rlimit_nofile 65535;\n\
\n\
error_log /var/log/nginx/error.log warn;\n\
pid /var/run/nginx.pid;\n\
\n\
events {\n\
    worker_connections 4096;\n\
    multi_accept on;\n\
    use epoll;\n\
    accept_mutex off;\n\
}\n\
\n\
http {\n\
    include /etc/nginx/mime.types;\n\
    default_type application/octet-stream;\n\
    \n\
    log_format main '"'"'$remote_addr - $remote_user [$time_local] "$request" '"'"'\n\
                    '"'"'$status $body_bytes_sent "$http_referer" '"'"'\n\
                    '"'"'"$http_user_agent" rt=$request_time uct="$upstream_connect_time"'"'"';\n\
    \n\
    access_log /var/log/nginx/access.log main;\n\
    \n\
    sendfile on;\n\
    tcp_nopush on;\n\
    tcp_nodelay on;\n\
    keepalive_timeout 65;\n\
    keepalive_requests 1000;\n\
    \n\
    client_max_body_size 500M;\n\
    client_body_buffer_size 1M;\n\
    client_body_timeout 300s;\n\
    client_header_timeout 60s;\n\
    \n\
    proxy_buffering on;\n\
    proxy_buffer_size 16k;\n\
    proxy_buffers 8 16k;\n\
    proxy_busy_buffers_size 32k;\n\
    proxy_max_temp_file_size 2048m;\n\
    proxy_temp_file_write_size 32k;\n\
    \n\
    proxy_connect_timeout 60s;\n\
    proxy_send_timeout 300s;\n\
    proxy_read_timeout 300s;\n\
    \n\
    gzip on;\n\
    gzip_vary on;\n\
    gzip_min_length 1024;\n\
    gzip_comp_level 6;\n\
    gzip_types text/plain text/css text/xml text/javascript application/json application/javascript;\n\
    \n\
    upstream kkfileview {\n\
        server 127.0.0.1:8012;\n\
        keepalive 32;\n\
        keepalive_requests 1000;\n\
        keepalive_timeout 60s;\n\
    }\n\
    \n\
    server {\n\
        listen 7860 default_server;\n\
        server_name _;\n\
        \n\
        auth_basic "Restricted Access";\n\
        auth_basic_user_file /etc/nginx/.htpasswd;\n\
        \n\
        add_header X-Content-Type-Options "nosniff" always;\n\
        add_header X-Frame-Options "SAMEORIGIN" always;\n\
        add_header X-XSS-Protection "1; mode=block" always;\n\
        \n\
        location / {\n\
            proxy_pass http://kkfileview;\n\
            proxy_http_version 1.1;\n\
            proxy_set_header Connection "";\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 $scheme;\n\
            \n\
            proxy_buffering on;\n\
            proxy_buffer_size 16k;\n\
            proxy_buffers 8 16k;\n\
            proxy_read_timeout 300s;\n\
        }\n\
        \n\
        location /health {\n\
            auth_basic off;\n\
            access_log off;\n\
            return 200 "OK";\n\
            add_header Content-Type text/plain;\n\
        }\n\
        \n\
        location /nginx_status {\n\
            auth_basic off;\n\
            stub_status on;\n\
            access_log off;\n\
            allow 127.0.0.1;\n\
            deny all;\n\
        }\n\
    }\n\
}\n' > /etc/nginx/nginx.conf

# 5. 启动脚本
RUN printf '#!/bin/bash\n\
set -e\n\
\n\
echo "=== Starting KKFileView Optimized for HuggingFace Spaces ==="\n\
\n\
: "${AUTH_USERNAME:?AUTH_USERNAME is required}"\n\
: "${AUTH_PASSWORD:?AUTH_PASSWORD is required}"\n\
\n\
htpasswd -cb /etc/nginx/.htpasswd "$AUTH_USERNAME" "$AUTH_PASSWORD"\n\
\n\
echo "Starting Xvfb..."\n\
Xvfb :99 -screen 0 1024x768x24 >/dev/null 2>&1 &\n\
export DISPLAY=:99\n\
sleep 2\n\
\n\
STARTUP_SCRIPT=$(find /opt -name "startup.sh" -o -name "kkFileView" | grep "bin/" | head -n 1)\n\
if [ -z "$STARTUP_SCRIPT" ]; then\n\
    echo "ERROR: KKFileView startup script not found!"\n\
    exit 1\n\
fi\n\
\n\
echo "Starting KKFileView on port 8012..."\n\
echo "JVM Configuration: $JAVA_OPTS"\n\
if [[ "$STARTUP_SCRIPT" == *".sh" ]]; then\n\
    bash "$STARTUP_SCRIPT" 2>&1 | tee /var/log/kkfileview/app.log &\n\
else\n\
    "$STARTUP_SCRIPT" --server.port=8012 2>&1 | tee /var/log/kkfileview/app.log &\n\
fi\n\
\n\
echo "Waiting for KKFileView to start..."\n\
for i in {1..30}; do\n\
    if curl -s http://127.0.0.1:8012 >/dev/null 2>&1; then\n\
        echo "✓ KKFileView is ready!"\n\
        break\n\
    fi\n\
    if [ $i -eq 30 ]; then\n\
        echo "ERROR: KKFileView failed to start within 60 seconds"\n\
        cat /var/log/kkfileview/app.log\n\
        exit 1\n\
    fi\n\
    sleep 2\n\
done\n\
\n\
echo "Starting Nginx on port 7860..."\n\
nginx -g "daemon off;"\n' > /start.sh && \
    chmod +x /start.sh

# 6. 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
    CMD curl -f http://localhost:7860/health || exit 1

# 7. 暴露端口
EXPOSE 7860

# 8. 启动命令
ENTRYPOINT []
CMD ["/start.sh"]