ติดตั้ง Host Storage
ติดตั้งเซิร์ฟเวอร์เก็บไฟล์ของคุณเอง (ดาวน์โหลดได้เลย) ตั้งค่า รัน ทำ HTTPS และเชื่อมกับ Instance
ภาพรวม
Host Storage คือเซิร์ฟเวอร์เก็บไฟล์ที่คุณติดตั้งและดูแลเอง ไฟล์ที่อัปโหลดในหน้า ไฟล์ จะถูกเก็บบนดิสก์ของเครื่องคุณ และผู้เล่นดาวน์โหลดผ่าน URL ของเซิร์ฟเวอร์นี้ เหมาะถ้าอยากควบคุมที่เก็บไฟล์เองและไม่อยากใช้บริการคลาวด์ (ถ้าไม่อยากดูแลเซิร์ฟเวอร์ ใช้ S3 / R2 แทนได้ ดู Storage)
แพ็กเกจที่ให้ดาวน์โหลดมีทุกอย่างที่ต้องใช้ - ตั้งค่า 3 อย่างก็รันได้:
- เซิร์ฟเวอร์เล็กๆ ไฟล์เดียว ใช้ Node.js หรือ Docker ก็ได้
- ตรวจความถูกต้องของไฟล์ (SHA-1) ทุกครั้งที่อัปโหลด ถ้าไฟล์เสียหายจะไม่เก็บ
- ไม่ต้องมีฐานข้อมูล ไฟล์ทั้งหมดอยู่ในโฟลเดอร์เดียว สำรองข้อมูลง่าย
สิ่งที่ต้องเตรียม
| สิ่งที่ต้องมี | รายละเอียด |
|---|---|
| เครื่อง / VPS | เปิดตลอดเวลา และเข้าถึงได้จากอินเทอร์เน็ต พื้นที่ดิสก์ให้พอกับไฟล์ที่จะเก็บ |
| Node.js 18 ขึ้นไป | หรือใช้ Docker แทนก็ได้ (ไม่ต้องลง Node.js) ตรวจเวอร์ชันด้วย node -v |
| โดเมน + HTTPS | แนะนำมาก เพราะหน้าเว็บนี้เป็น https เบราว์เซอร์จะไม่ยอมให้อัปโหลดไปยังที่อยู่ http |
| พอร์ตที่เปิดรับ | ค่าเริ่มต้น 8080 (ถ้าทำ HTTPS ผ่าน reverse proxy ผู้ใช้จะเข้าที่พอร์ต 443 แทน) |
ดาวน์โหลด
Dimension Host Storage
dimension-host-storage.zip
แตกไฟล์แล้วจะได้โฟลเดอร์ dimension-host-storage ประกอบด้วย:
| ไฟล์ | ใช้ทำอะไร |
|---|---|
server.js | ตัวเซิร์ฟเวอร์ |
package.json | รายการแพ็กเกจที่ต้องติดตั้ง |
.env.example | ตัวอย่างไฟล์ตั้งค่า - คัดลอกเป็น .env แล้วแก้ |
Dockerfile / docker-compose.yml | สำหรับรันด้วย Docker |
Caddyfile.example | ตัวอย่างทำ HTTPS ด้วย Caddy |
README.md | คู่มือย่อ |
ตั้งค่า (ไฟล์ .env)
ในโฟลเดอร์ที่แตกไฟล์ ให้คัดลอก .env.example เป็น .env แล้วแก้ค่า:
# Linux / macOS
cp .env.example .env
# Windows (Command Prompt)
copy .env.example .env| ตัวแปร | จำเป็น? | รายละเอียด |
|---|---|---|
API_KEY | จำเป็น | รหัสลับที่ใช้ยืนยันตัวตนกับระบบ ต้องเป็นค่าเดียวกับช่อง API Key ตอนเพิ่ม Storage ในหน้าเว็บ ตั้งเป็นค่าสุ่มยาวๆ (วิธีสร้างด้านล่าง) |
PUBLIC_URL | จำเป็น | ที่อยู่ที่ผู้ใช้เข้าถึงเซิร์ฟเวอร์นี้ได้จริง เช่น https://storage.example.com (ไม่ต้องมี / ท้าย) ใช้เป็น Base URL ในหน้าเว็บ |
PORT | ไม่จำเป็น | พอร์ตที่เซิร์ฟเวอร์ฟัง ค่าเริ่มต้น 8080 |
STORAGE_DIR | ไม่จำเป็น | โฟลเดอร์เก็บไฟล์ ค่าเริ่มต้นคือโฟลเดอร์ storage ในที่เดียวกัน |
MAX_SIZE_MB | ไม่จำเป็น | ขนาดไฟล์สูงสุดต่อไฟล์ ค่าเริ่มต้น 512 (MB) |
ALLOWED_ORIGINS | แนะนำ | โดเมนของหน้าเว็บที่อนุญาตให้อัปโหลดมาที่เซิร์ฟเวอร์นี้ ของเว็บนี้คือ https://โดเมนของเว็บนี้ (เว้นว่าง = อนุญาตทุกโดเมน) |
PRIVATE_FILES | ไม่จำเป็น | ค่าเริ่มต้นเปิด: ดาวน์โหลดได้เฉพาะลิงก์ที่หมดอายุซึ่งเว็บนี้สร้างให้ ตั้ง 0 = ใครมีลิงก์ไฟล์ก็โหลดได้ ดู ลิงก์ดาวน์โหลดที่หมดอายุ |
สร้าง API_KEY
รันคำสั่งนี้ แล้วคัดลอกผลลัพธ์ไปใส่ใน API_KEY:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"ตัวอย่างไฟล์ .env ที่ตั้งค่าเสร็จแล้ว:
API_KEY=9f2c1a7e5b8d4c0a93e1f6b7d2a4c8e05b1d9f3a7c6e2b4d8f0a1c3e5b7d9f21
PUBLIC_URL=https://storage.example.com
PORT=8080
ALLOWED_ORIGINS=https://manager.example.comใครมี API_KEY สามารถขอลิงก์อัปโหลดและลบไฟล์ในเซิร์ฟเวอร์ของคุณได้ อย่าแชร์ อย่าโพสต์ในที่สาธารณะ และอย่าใส่ไว้ในโฟลเดอร์ที่เปิดให้คนอื่นดาวน์โหลด
ติดตั้งและรัน (แบบ Node.js)
- 1
ติดตั้งแพ็กเกจ
เปิดเทอร์มินัลในโฟลเดอร์ที่แตกไฟล์:
bashnpm install - 2
ตั้งค่า .env (ตามหัวข้อด้านบน)
- 3
รันเซิร์ฟเวอร์
bashnpm startถ้าตั้งค่าถูกต้อง จะเห็นข้อความ "Dimension Host Storage is running" พร้อมสรุปค่าที่ใช้อยู่ ถ้าลืมตั้ง
API_KEYโปรแกรมจะบอกและหยุดทำงาน - 4
ตรวจว่าทำงาน
เปิด
http://localhost:8080/health(หรือPUBLIC_URL/health) ควรเห็น:json{"status":"ok","service":"dimension-host-storage","signedDownloads":true,"privateFiles":true}
ให้ทำงานต่อเนื่อง (ไม่หยุดเมื่อปิดเทอร์มินัล)
ใช้ pm2 (ตัวจัดการโปรเซสของ Node.js):
npm install -g pm2
pm2 start server.js --name host-storage
pm2 save
pm2 startup # ทำตามคำสั่งที่แสดง เพื่อให้เปิดเองหลังรีบูตเครื่องคำสั่งที่ใช้บ่อย: pm2 logs host-storage (ดู log), pm2 restart host-storage (รีสตาร์ท), pm2 stop host-storage (หยุด)
ติดตั้งและรัน (แบบ Docker)
- 1
ตั้งค่า .env (คัดลอกจาก .env.example และแก้ API_KEY, PUBLIC_URL)
- 2
สั่งรัน
bashdocker compose up -dไฟล์ที่อัปโหลดจะอยู่ในโฟลเดอร์
./storageข้างๆ ไฟล์docker-compose.yml - 3
ตรวจสถานะและ log
bashdocker compose ps docker compose logs -f
อัปเดตเวอร์ชัน: แทนที่ไฟล์ในโฟลเดอร์ด้วยเวอร์ชันใหม่ แล้วรัน docker compose up -d --build
ทำ HTTPS
เว็บนี้ใช้ https ดังนั้นเซิร์ฟเวอร์เก็บไฟล์ก็ต้องเป็น https ด้วย (ไม่งั้นเบราว์เซอร์จะบล็อกการอัปโหลด) วิธีที่ง่ายที่สุดคือใช้ reverse proxy หน้าเซิร์ฟเวอร์:
แบบ Caddy (ง่ายที่สุด - ขอใบรับรองให้อัตโนมัติ)
- ชี้ DNS ของโดเมน (เช่น storage.example.com) มาที่ IP ของเครื่อง
- ติดตั้ง Caddy แล้วใช้ไฟล์
Caddyfile.exampleในแพ็กเกจเป็นต้นแบบ:
storage.example.com {
request_body {
max_size 1GB
}
reverse_proxy localhost:8080
}จากนั้นตั้ง PUBLIC_URL=https://storage.example.com ใน .env แล้วรีสตาร์ทเซิร์ฟเวอร์
แบบ nginx
server {
server_name storage.example.com;
client_max_body_size 1g; # ต้องไม่น้อยกว่า MAX_SIZE_MB
location / {
proxy_pass http://127.0.0.1:8080;
proxy_request_buffering off; # ส่งไฟล์ต่อให้เซิร์ฟเวอร์ทันที ไม่พักไว้ที่ nginx
}
# ใส่ใบรับรอง HTTPS เช่นด้วย certbot
}ถ้าอัปโหลดไฟล์ใหญ่แล้วล้มเหลวทั้งที่ตั้ง MAX_SIZE_MB พอแล้ว ให้ตรวจขนาด body สูงสุดของ reverse proxy (client_max_body_size / max_size)
เปิดพอร์ต
ถ้ามีไฟร์วอลล์ ให้เปิดพอร์ต 80 และ 443 (ถ้าใช้ reverse proxy) หรือพอร์ตของเซิร์ฟเวอร์เองถ้าไม่ใช้ เช่นบน Ubuntu:
sudo ufw allow 80
sudo ufw allow 443เชื่อมกับ Instance
- 1
เปิด การตั้งค่า → Storage → เพิ่ม Storage
- 2
เลือก Host Storage
- 3
กรอกข้อมูล
ช่องในหน้าเว็บ ค่าที่ใส่ ชื่อ Storage ตั้งชื่ออะไรก็ได้ เช่น Host หลัก Base URL ของ Storage Server ค่า PUBLIC_URLใน .env (เช่น https://storage.example.com)API Key ค่า API_KEYใน .envPath prefix ปล่อยตามค่าเริ่มต้น (ชื่อ Instance) ได้ - 4
บันทึก แล้วลองอัปโหลดไฟล์ในแท็บไฟล์
ถ้าอัปโหลดสำเร็จ ไฟล์จะปรากฏในรายการและในโฟลเดอร์
storageของเซิร์ฟเวอร์
ลิงก์ดาวน์โหลดที่หมดอายุ
เว็บนี้ส่งลิงก์ดาวน์โหลดที่มีลายเซ็นและวันหมดอายุ (?exp=...&sig=...) ให้ launcher ของผู้เล่นทุกครั้ง ลิงก์ใช้ได้ 30-45 นาที (แค่ต้องเริ่มโหลดก่อนหมดเวลา) แล้ว launcher จะได้ลิงก์ใหม่เองตอนเช็กไฟล์ครั้งถัดไป ลายเซ็นทำจาก API_KEY ของ Storage นั้น
| เวอร์ชันของเซิร์ฟเวอร์ | ผลที่ได้ |
|---|---|
| 1.0.0 (เดิม) | ใช้กับเว็บได้ตามปกติ ไม่สนลายเซ็น ไฟล์เปิดสาธารณะ จะอัปเดตเมื่อไรก็ได้ |
| 1.1.0 ขึ้นไป (ค่าเริ่มต้น) | โหลดได้เฉพาะลิงก์ที่ลายเซ็นถูกและยังไม่หมดอายุ ลิงก์ที่เคยคัดลอกไปแจกจะใช้ไม่ได้ |
1.1.0 ขึ้นไป ตั้ง PRIVATE_FILES=0 | เหมือนเวอร์ชันเดิม ไฟล์เปิดสาธารณะ ทั้งลิงก์ที่มีลายเซ็นและไม่มีใช้ได้ |
อัปเดตเซิร์ฟเวอร์เป็นเวอร์ชันใหม่แล้วเปิดใช้เอง ตรวจได้ที่ /health ว่า "privateFiles":true ถ้าอยากให้ไฟล์เปิดสาธารณะเหมือนเดิม เพิ่ม PRIVATE_FILES=0 ใน .env แล้วรีสตาร์ท
ผู้เล่นที่ได้ลิงก์ยังโหลดไฟล์ได้จนลิงก์หมดอายุ และไฟล์ที่โหลดไปแล้วก็อยู่ในเครื่องเขา สิ่งนี้แค่ทำให้ลิงก์ที่หลุดออกไปใช้ได้ไม่นาน
ไฟล์ถูกเก็บอย่างไร
ไฟล์ถูกวางในโฟลเดอร์ storage (หรือที่ตั้งใน STORAGE_DIR) ภายใต้โฟลเดอร์ Path prefix ด้วยชื่อสุ่ม เช่น:
storage/
└── my_server/ ← Path prefix (ชื่อ Instance)
├── 3f2c9a1e-5b7d-4c0a-9e88-1d2f6a7b8c90
└── a81d77f0-92c4-4b53-8d1e-0c5f9e2a6b13ชื่อไฟล์จริง (เช่น mods/sodium.jar) ถูกจำไว้ในระบบ ไม่ใช่ชื่อบนดิสก์ จึงอย่าเปลี่ยนชื่อหรือย้ายไฟล์ในโฟลเดอร์นี้เอง
ดูแลรักษา
สำรองข้อมูล
คัดลอกโฟลเดอร์ storage ไปเก็บไว้เป็นระยะ (และไฟล์ .env เผื่อต้องตั้งเซิร์ฟเวอร์ใหม่)
อัปเดตเวอร์ชัน
ดาวน์โหลดแพ็กเกจใหม่ แทนที่ server.js และ package.json แล้วรัน npm install และรีสตาร์ท อย่าลบไฟล์ .env และโฟลเดอร์ storage
ย้ายไปเครื่องใหม่
- ตั้งเซิร์ฟเวอร์ใหม่ตามขั้นตอนด้านบน ใช้
.envเดิม - คัดลอกโฟลเดอร์
storageไปไว้ที่เครื่องใหม่ - ชี้โดเมนเดิมมาที่เครื่องใหม่ (ถ้าเปลี่ยนโดเมน ลิงก์ของไฟล์เดิมในระบบจะชี้ไปโดเมนเก่า)
เปลี่ยน API_KEY
- แก้
API_KEYใน.envแล้วรีสตาร์ทเซิร์ฟเวอร์ - ในหน้าเว็บ ไปที่ Storage นั้นกดแก้ไข ใส่ API Key ใหม่ แล้วบันทึก
ถ้าเปิด PRIVATE_FILES อยู่ ระหว่างสองขั้นตอนนี้ลิงก์ดาวน์โหลดจะใช้ไม่ได้ ควรทำต่อกันทันที
แก้ปัญหาเบื้องต้น
| อาการ | สาเหตุและวิธีแก้ |
|---|---|
เซิร์ฟเวอร์ขึ้นว่ายังไม่ได้ตั้งค่า API_KEY | ยังไม่ได้สร้างไฟล์ .env หรือ API_KEY ว่าง |
| อัปโหลดแล้วขึ้นข้อผิดพลาดเครือข่าย | ตรวจว่าใช้ https, ALLOWED_ORIGINS ตรงกับโดเมนของเว็บ (หรือเว้นว่าง) และ PUBLIC_URL เป็นที่อยู่จริง ไม่ใช่ localhost |
| เพิ่ม Storage แล้วอัปโหลดไม่ได้ ขึ้นว่าไม่ตอบสนองหรือปฏิเสธ | Base URL ผิด/เข้าไม่ถึง หรือ API Key ไม่ตรงกับ API_KEY ใน .env |
| ได้ 413 File too large | ไฟล์ใหญ่กว่า MAX_SIZE_MB หรือเกินขนาดสูงสุดของ reverse proxy |
| ได้ 400 hash does not match | ไฟล์เสียหายหรือถูกแก้ระหว่างอัปโหลด ลองอัปโหลดใหม่ |
| ดาวน์โหลดไฟล์ไม่ได้ (404) | ไฟล์ในโฟลเดอร์ storage ถูกลบ/ย้ายออก หรือ PUBLIC_URL ไม่ตรงกับที่อยู่จริง |
| ดาวน์โหลดแล้วได้ 403 Invalid or expired download url | เปิด PRIVATE_FILES อยู่ และลิงก์หมดอายุ หรือ API_KEY ใน .env ไม่ตรงกับในหน้าเว็บ ให้เปิดลิงก์ใหม่จากเว็บ/launcher |
ปัญหาอื่นๆ ดู คำถามที่พบบ่อยและแก้ปัญหา และอ่านเพิ่มเรื่องการใช้ Storage ที่ Storage

