javaeeduke commited on
Commit
9e8330a
ยท
verified ยท
1 Parent(s): b7f676f

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +134 -21
Dockerfile CHANGED
@@ -11,36 +11,149 @@ ENV NODE_ENV=production
11
 
12
  # ๐Ÿ”‘ ่ฎพ็ฝฎๆ–ฐๅฏ†็ 
13
  ENV INITIAL_PASSWORD=Amd3dnow!
 
 
 
 
14
  EXPOSE 7860
15
 
16
- # ๅฏๅŠจๅ‘ฝไปคๆ”น้€ ๏ผšไฟฎๆญฃๆ ธๅฟƒๅฏๅŠจๆ–‡ไปถ้—ฎ้ข˜
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  CMD \
18
- # 1. ใ€ๆ ธๅฟƒๆŽ’ๆŸฅใ€‘ๅผบ่กŒๅœจๆ—ฅๅฟ—้‡Œๆ‰“ๅฐๅ‡บ /data ็›ฎๅฝ•ๅ’Œ /root/.omniroute ็›ฎๅฝ•ไธ‹็š„ๆ‰€ๆœ‰ๆ–‡ไปถ
19
- echo "=== ๆฃ€ๆŸฅๅผ€ๅง‹ ==="; \
20
- echo "--- 1. ๅฝ“ๅ‰ /data ็›ฎๅฝ•ไธ‹็š„ๆ–‡ไปถๆœ‰๏ผš ---"; \
21
- ls -la /data 2>&1 || echo "/data ็›ฎๅฝ•ไธๅญ˜ๅœจ"; \
22
- echo "--- 2. ๅฝ“ๅ‰ OmniRoute ้ป˜่ฎค็›ฎๅฝ•ไธ‹็š„ๆ–‡ไปถๆœ‰๏ผš ---"; \
23
- ls -la /root/.omniroute 2>&1 || echo "OmniRoute ็›ฎๅฝ•ไธๅญ˜ๅœจ"; \
24
- echo "=== ๆฃ€ๆŸฅ็ป“ๆŸ ==="; \
 
 
25
  \
26
- # 2. ๅผ€ๆœบๆขๅคๆ•ฐๆฎ
27
  if [ -f /data/omni_storage.sqlite ]; then \
28
- mkdir -p /root/.omniroute && cp /data/omni_storage.sqlite /root/.omniroute/storage.sqlite; \
29
- fi; \
 
 
 
 
30
  if [ -f /data/omni_settings.json ]; then \
31
- mkdir -p /root/.omniroute && cp /data/omni_settings.json /root/.omniroute/settings.json; \
32
- fi; \
 
 
 
 
33
  \
34
- # 3. ๅŽๅฐๅฎšๆ—ถๅค‡ไปฝ๏ผˆๆฏ 60 ็ง’๏ผ‰
35
  (while true; do \
36
  sleep 60; \
37
- if [ -f /root/.omniroute/storage.sqlite ]; then \
38
- mkdir -p /data && cp /root/.omniroute/storage.sqlite /data/omni_storage.sqlite; \
39
- fi; \
40
- if [ -f /root/.omniroute/settings.json ]; then \
41
- mkdir -p /data && cp /root/.omniroute/settings.json /data/omni_settings.json; \
42
- fi; \
 
43
  done) & \
44
  \
45
- # 4. ๆญฃๅธธๅฏๅŠจไธป็จ‹ๅบ
 
 
 
46
  PORT=7860 omniroute
 
11
 
12
  # ๐Ÿ”‘ ่ฎพ็ฝฎๆ–ฐๅฏ†็ 
13
  ENV INITIAL_PASSWORD=Amd3dnow!
14
+
15
+ # ๐Ÿ”‘ ไธ‹่ฝฝๆŽฅๅฃ็š„่ฎฟ้—ฎไปค็‰Œ๏ผˆๅœจ HF Space Settings โ†’ Variables ้‡Œ่ฆ†็›–่ฟ™ไธชๅ€ผ๏ผ๏ผ‰
16
+ ENV DOWNLOAD_TOKEN=change_me_please
17
+
18
  EXPOSE 7860
19
 
20
+ # ๅ†™ๅ…ฅไธ‹่ฝฝๆœๅŠก่„šๆœฌ๏ผˆ็บฏ Node.js๏ผŒๆ— ้œ€้ขๅค–ไพ่ต–๏ผ‰
21
+ RUN cat > /app/download_server.js << 'EOF'
22
+ const http = require('http');
23
+ const fs = require('fs');
24
+ const path = require('path');
25
+ const { execSync } = require('child_process');
26
+
27
+ const PORT = 7861;
28
+ const TOKEN = process.env.DOWNLOAD_TOKEN || 'change_me_please';
29
+
30
+ // ๅ…่ฎธไธ‹่ฝฝ็š„ๅฎ‰ๅ…จ็›ฎๅฝ•็™ฝๅๅ•
31
+ const ALLOWED_DIRS = ['/data', '/root/.omniroute'];
32
+
33
+ function safeResolvePath(filename) {
34
+ // ๅชๅ…่ฎธ็บฏๆ–‡ไปถๅ๏ผŒๆ‹’็ปไปปไฝ•่ทฏๅพ„ๅˆ†้š”็ฌฆ๏ผˆ้˜ฒ่ทฏๅพ„็ฉฟ่ถŠ๏ผ‰
35
+ if (!filename || filename.includes('/') || filename.includes('\\') || filename.includes('..')) {
36
+ return null;
37
+ }
38
+ // ไพๆฌกๅœจ็™ฝๅๅ•็›ฎๅฝ•ไธญๆŸฅๆ‰พๆ–‡ไปถ
39
+ for (const dir of ALLOWED_DIRS) {
40
+ const fullPath = path.join(dir, filename);
41
+ if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {
42
+ return fullPath;
43
+ }
44
+ }
45
+ return null;
46
+ }
47
+
48
+ const server = http.createServer((req, res) => {
49
+ const url = new URL(req.url, `http://localhost:${PORT}`);
50
+ const token = url.searchParams.get('token') || '';
51
+ const route = url.pathname;
52
+
53
+ // โ”€โ”€ ็ปŸไธ€้‰ดๆƒ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
54
+ // ไฝฟ็”จ้€ๅญ—็ฌฆๆฏ”่พƒ้˜ฒๆญขๆ—ถๅบๆ”ปๅ‡ป
55
+ const tokenValid =
56
+ token.length === TOKEN.length &&
57
+ token.split('').every((c, i) => c === TOKEN[i]);
58
+
59
+ if (!tokenValid) {
60
+ res.writeHead(403, { 'Content-Type': 'application/json' });
61
+ res.end(JSON.stringify({ error: 'Forbidden: invalid token' }));
62
+ return;
63
+ }
64
+
65
+ // โ”€โ”€ GET /list โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
66
+ if (route === '/list') {
67
+ const result = {};
68
+ for (const dir of ALLOWED_DIRS) {
69
+ try {
70
+ result[dir] = fs.readdirSync(dir).map(name => {
71
+ const stat = fs.statSync(path.join(dir, name));
72
+ return { name, size: stat.size, mtime: stat.mtime };
73
+ });
74
+ } catch (_) {
75
+ result[dir] = `directory not found`;
76
+ }
77
+ }
78
+ res.writeHead(200, { 'Content-Type': 'application/json' });
79
+ res.end(JSON.stringify(result, null, 2));
80
+ return;
81
+ }
82
+
83
+ // โ”€โ”€ GET /download?token=...&file=omni_storage.sqlite โ”€โ”€โ”€โ”€โ”€โ”€
84
+ if (route === '/download') {
85
+ const filename = url.searchParams.get('file') || '';
86
+ const fullPath = safeResolvePath(filename);
87
+
88
+ if (!fullPath) {
89
+ res.writeHead(404, { 'Content-Type': 'application/json' });
90
+ res.end(JSON.stringify({ error: `File not found: ${filename}` }));
91
+ return;
92
+ }
93
+
94
+ const stat = fs.statSync(fullPath);
95
+ res.writeHead(200, {
96
+ 'Content-Type': 'application/octet-stream',
97
+ 'Content-Disposition': `attachment; filename="${filename}"`,
98
+ 'Content-Length': stat.size,
99
+ });
100
+ fs.createReadStream(fullPath).pipe(res);
101
+ console.log(`[download] ${fullPath} (${stat.size} bytes)`);
102
+ return;
103
+ }
104
+
105
+ // โ”€โ”€ 404 โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
106
+ res.writeHead(404, { 'Content-Type': 'application/json' });
107
+ res.end(JSON.stringify({ error: 'Unknown route', routes: ['/list', '/download'] }));
108
+ });
109
+
110
+ server.listen(PORT, '0.0.0.0', () => {
111
+ console.log(`[download-server] listening on port ${PORT}`);
112
+ console.log(`[download-server] routes: /list /download?file=<filename>`);
113
+ });
114
+ EOF
115
+
116
  CMD \
117
+ # โ”€โ”€ 1. ๅฏๅŠจ่ฏŠๆ–ญๆ—ฅๅฟ— โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ \
118
+ echo "=== ๅญ˜ๅ‚จ่ฏŠๆ–ญๅผ€ๅง‹ ===" && \
119
+ echo "--- /data ็›ฎๅฝ• ---" && \
120
+ ls -lah /data 2>&1 || echo "/data ็›ฎๅฝ•ไธๅญ˜ๅœจ" && \
121
+ echo "--- /root/.omniroute ็›ฎๅฝ• ---" && \
122
+ ls -lah /root/.omniroute 2>&1 || echo "OmniRoute ็›ฎๅฝ•ไธๅญ˜ๅœจ" && \
123
+ echo "--- ็ฃ็›˜ๆŒ‚่ฝฝๆƒ…ๅ†ต ---" && \
124
+ df -h && \
125
+ echo "=== ๅญ˜ๅ‚จ่ฏŠๆ–ญ็ป“ๆŸ ===" && \
126
  \
127
+ # โ”€โ”€ 2. ๅผ€ๆœบไปŽๆŒไน…ๅŒ–ๅญ˜ๅ‚จๆขๅคๆ•ฐๆฎ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ \
128
  if [ -f /data/omni_storage.sqlite ]; then \
129
+ mkdir -p /root/.omniroute && \
130
+ cp /data/omni_storage.sqlite /root/.omniroute/storage.sqlite && \
131
+ echo "โœ… ๆขๅค storage.sqlite ๆˆๅŠŸ"; \
132
+ else \
133
+ echo "โš ๏ธ /data/omni_storage.sqlite ไธๅญ˜ๅœจ๏ผŒ่ทณ่ฟ‡ๆขๅค"; \
134
+ fi && \
135
  if [ -f /data/omni_settings.json ]; then \
136
+ mkdir -p /root/.omniroute && \
137
+ cp /data/omni_settings.json /root/.omniroute/settings.json && \
138
+ echo "โœ… ๆขๅค settings.json ๆˆๅŠŸ"; \
139
+ else \
140
+ echo "โš ๏ธ /data/omni_settings.json ไธๅญ˜ๅœจ๏ผŒ่ทณ่ฟ‡ๆขๅค"; \
141
+ fi && \
142
  \
143
+ # โ”€โ”€ 3. ๅŽๅฐ๏ผšๆฏ 60 ็ง’ๆŠŠๆ•ฐๆฎๅค‡ไปฝๅˆฐ /data โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ \
144
  (while true; do \
145
  sleep 60; \
146
+ mkdir -p /data; \
147
+ [ -f /root/.omniroute/storage.sqlite ] && \
148
+ cp /root/.omniroute/storage.sqlite /data/omni_storage.sqlite && \
149
+ echo "๐Ÿ’พ [backup] storage.sqlite โ†’ /data"; \
150
+ [ -f /root/.omniroute/settings.json ] && \
151
+ cp /root/.omniroute/settings.json /data/omni_settings.json && \
152
+ echo "๐Ÿ’พ [backup] settings.json โ†’ /data"; \
153
  done) & \
154
  \
155
+ # โ”€โ”€ 4. ๅŽๅฐ๏ผšๅฏๅŠจไธ‹่ฝฝๆœๅŠก๏ผˆ7861 ็ซฏๅฃ๏ผ‰โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ \
156
+ node /app/download_server.js & \
157
+ \
158
+ # โ”€โ”€ 5. ๅ‰ๅฐ๏ผšๅฏๅŠจไธป็จ‹ๅบ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ \
159
  PORT=7860 omniroute