DigitalOcean Spaces: Object Storage แบบ S3 พร้อม CDN ราคา $5 วิธีใช้ และตัวอย่างโค้ด
คู่มือ DigitalOcean Spaces ภาษาไทย ที่เก็บไฟล์แบบ S3-compatible พร้อม CDN ราคาเริ่ม $5 ต่อเดือน (250 GiB + 1 TiB transfer) วิธีสร้าง bucket ใช้ s3cmd rclone AWS CLI และตั้ง CDN
Spaces คืออะไร
Spaces คือบริการ Object Storage ของ DigitalOcean ใช้เก็บไฟล์จำนวนมากเป็น "object" ใน "bucket" เข้าถึงผ่าน HTTP/API ที่ เข้ากันได้กับ S3 API ของ Amazon ทำให้เครื่องมือและไลบรารีที่รองรับ S3 ใช้กับ Spaces ได้โดยเปลี่ยนแค่ endpoint
เหมาะกับ: รูปภาพและวิดีโอของเว็บ, ไฟล์ที่ผู้ใช้อัปโหลด, ไฟล์ backup, ไฟล์ static ของเว็บ, log, ไฟล์ดาวน์โหลดขนาดใหญ่ และข้อมูลที่ไม่ควรอยู่บนดิสก์ของ Droplet
ราคา
ตามหน้าราคาทางการ ณ 3 พ.ย. 2569
| รายการ | ราคา/ปริมาณ |
|---|---|
| ค่าบริการพื้นฐาน | $5/เดือน |
| พื้นที่เก็บข้อมูลรวม | 250 GiB |
| Transfer ขาออกรวม | 1 TiB |
| พื้นที่เกิน | $0.02/GiB |
| Transfer เกิน | $0.01/GiB |
| Cold storage | $0.007/GiB |
| CDN | รวมในตัว |
| จำนวน bucket | สูงสุด 100 ต่อบัญชี |
เมื่อเทียบกับการเก็บไฟล์บน Droplet: ดิสก์ของ Droplet ราคาตายตัวตามขนาดเครื่อง แต่ Spaces แยกการขยาย storage ออกจากการขยาย CPU/RAM ช่วยให้เครื่องเล็กลงได้เมื่อย้ายไฟล์มีเดียออกไป ดู 15 วิธีลดค่าใช้จ่าย DigitalOcean
ข้อดี
- เข้ากันได้กับ S3 ใช้ AWS SDK, s3cmd, rclone, Cyberduck, Restic ได้
- มี CDN ในตัว กระจายไฟล์ไปยัง edge ใกล้ผู้ใช้ ลดภาระ Droplet
- ราคาแพ็กเดียวคาดเดาได้ พร้อมโควตา storage และ transfer
- ไม่จำกัดจำนวนไฟล์ (ตามเงื่อนไขการใช้งาน) ขยายได้ตามต้องการ
- ควบคุมสิทธิ์ละเอียด ตั้ง public/private ต่อไฟล์ ใช้ presigned URL ได้
ข้อควรรู้
- ภูมิภาค Spaces มีให้บริการเฉพาะบางภูมิภาค (ตรวจสอบว่ามีสิงคโปร์ (SGP1) หรือภูมิภาคใกล้เคียงในขณะที่คุณใช้) เลือกภูมิภาคเดียวกับ Droplet เพื่อลดความหน่วงและค่า transfer
- เป็น object ไม่ใช่ filesystem ไม่เหมาะกับไฟล์ที่ต้องแก้ไขบางส่วนบ่อย ๆ หรือรันฐานข้อมูลบนนั้น
- ตั้งสิทธิ์ให้ถูก bucket public ผิดพลาดคือสาเหตุข้อมูลรั่วที่พบบ่อยที่สุดของ object storage ทุกเจ้า
- ตรวจ billing ไฟล์ที่ลืมลบยังคิดเงิน
วิธีสร้าง Space และ Access Key
- Control Panel → Create → Spaces Object Storage
- เลือกภูมิภาค (แนะนำภูมิภาคเดียวกับ Droplet)
- เลือกว่าจะเปิด CDN หรือไม่ (แนะนำเปิดถ้าให้บริการไฟล์ public)
- ตั้งชื่อ Space (ต้องไม่ซ้ำกับชื่อ bucket ของผู้ใช้อื่นในภูมิภาคนั้น)
- เลือกโปรเจกต์ แล้ว Create
- สร้าง Access Key ที่ API → Spaces Keys: รับ
Access Key IDและSecret(เห็น Secret ครั้งเดียว เก็บให้ดี) แนะนำให้สร้าง key สิทธิ์จำกัดต่อ bucket ถ้ามีตัวเลือก
Endpoint มีรูปแบบ https://<REGION>.digitaloceanspaces.com เช่น https://sgp1.digitaloceanspaces.com (ตรวจรหัสภูมิภาคจริงในหน้า Settings ของ Space)
ใช้งานด้วย rclone
ติดตั้ง rclone แล้วตั้งค่า remote
rclone config
เลือก s3 → provider DigitalOcean Spaces ใส่ Access Key / Secret และ endpoint ของภูมิภาค จากนั้นใช้งาน
rclone copy /var/backups spaces:ชื่อ-space/backups --progress
rclone ls spaces:ชื่อ-space
rclone sync ./public spaces:ชื่อ-space/static
ใช้งานด้วย AWS CLI
aws configure # ใส่ Access Key และ Secret, region อาจใส่ us-east-1
aws s3 ls --endpoint-url https://sgp1.digitaloceanspaces.com s3://ชื่อ-space
aws s3 cp backup.tar.gz s3://ชื่อ-space/backups/ --endpoint-url https://sgp1.digitaloceanspaces.com
ตัวอย่างโค้ด Node.js (AWS SDK v3)
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import fs from "fs";
const s3 = new S3Client({
region: "us-east-1",
endpoint: "https://sgp1.digitaloceanspaces.com",
credentials: { accessKeyId: process.env.SPACES_KEY, secretAccessKey: process.env.SPACES_SECRET },
});
await s3.send(new PutObjectCommand({
Bucket: "ชื่อ-space",
Key: "uploads/photo.jpg",
Body: fs.readFileSync("photo.jpg"),
ACL: "public-read",
ContentType: "image/jpeg",
}));
ตัวอย่าง Python (boto3)
import boto3, os
s3 = boto3.client("s3", endpoint_url="https://sgp1.digitaloceanspaces.com",
aws_access_key_id=os.environ["SPACES_KEY"], aws_secret_access_key=os.environ["SPACES_SECRET"])
s3.upload_file("backup.sql.gz", "ชื่อ-space", "backups/backup.sql.gz")
url = s3.generate_presigned_url("get_object", Params={"Bucket": "ชื่อ-space", "Key": "backups/backup.sql.gz"}, ExpiresIn=3600)
print(url)
ใช้ Spaces เก็บ backup ของ Droplet
เป็นกรณีใช้งานยอดนิยม ทำให้ข้อมูลสำรองอยู่นอกเครื่องหลัก ตามกฎ 3-2-1 ใน คู่มือความปลอดภัยเซิร์ฟเวอร์
#!/bin/bash
D=$(date +%F)
mysqldump --single-transaction wordpress | gzip > /tmp/db-$D.sql.gz
rclone copy /tmp/db-$D.sql.gz spaces:ชื่อ-space/db/
rm /tmp/db-$D.sql.gz
ตั้ง Lifecycle rule (ถ้ามีในคอนโซลหรือ API) ให้ลบ backup เก่าเกิน 30 วันอัตโนมัติ เพื่อคุมค่าใช้จ่าย
ใช้ Spaces กับ WordPress
ติดตั้งปลั๊กอินที่ออฟโหลดมีเดียไป S3-compatible storage (เช่น WP Offload Media หรือปลั๊กอินอื่นที่รองรับ custom endpoint) แล้วตั้งค่า endpoint เป็นของ Spaces ผลคือรูปภาพถูกเสิร์ฟจาก CDN เครื่อง Droplet เบาลง ดูพื้นฐานที่ ติดตั้ง WordPress บน DigitalOcean
ตั้งค่า CDN และโดเมนของตัวเอง
- เปิด CDN ที่ Settings ของ Space ระบบจะให้ endpoint ลักษณะ
ชื่อ-space.sgp1.cdn.digitaloceanspaces.com - ถ้าต้องการโดเมนของตัวเอง (เช่น
cdn.example.com) ให้เพิ่ม Custom Subdomain และใบรับรอง SSL (Let's Encrypt หรือใบรับรองของคุณ) แล้วสร้าง CNAME ตามที่ระบบบอก - ตั้ง Cache-Control บน object ให้เหมาะสม เช่น
max-age=31536000สำหรับไฟล์ที่มีชื่อเปลี่ยนตามเนื้อหา - เมื่ออัปเดตไฟล์ชื่อเดิม ใช้ปุ่ม Purge Cache เพื่อล้างแคช CDN
ตั้งค่า CORS
ถ้าเว็บของคุณโหลดฟอนต์หรือไฟล์จากโดเมน CDN ข้ามโดเมน ต้องตั้ง CORS ที่ Settings → CORS Configurations ให้อนุญาตโดเมนของคุณ (หลีกเลี่ยงการตั้ง * ถ้าไม่จำเป็น)
แนวปฏิบัติด้านความปลอดภัย
- ค่าเริ่มต้นเป็น private ตั้ง public เฉพาะไฟล์ที่ตั้งใจเผยแพร่
- ใช้ presigned URL สำหรับไฟล์ private ที่ต้องแชร์ชั่วคราว
- อย่าฝัง Secret ในโค้ดฝั่งไคลเอนต์ เก็บในตัวแปรสภาพแวดล้อมฝั่งเซิร์ฟเวอร์
- หมุนเวียน Access Key เป็นระยะ และลบ key ที่ไม่ใช้
- เปิด versioning/ทำสำเนาข้อมูลสำคัญ ถ้ามีฟีเจอร์ที่ต้องการ
- ตรวจ bucket ที่เป็น public เป็นประจำ
ตัวอย่างต้นทุน
| กรณี | ใช้ | ประมาณการ |
|---|---|---|
| เว็บบล็อก รูป 20 GiB, transfer 200 GiB/เดือน | อยู่ในโควตา | $5 |
| ร้านค้า รูป+วิดีโอ 400 GiB, transfer 2 TiB/เดือน | storage เกิน 150 GiB, transfer เกิน 1 TiB | $5 + (150×$0.02) + (1,024×$0.01) ≈ $18.24 |
| เก็บ backup 1 TiB | storage เกิน ~774 GiB | $5 + (774×$0.02) ≈ $20.48 |
คำนวณจากอัตราส่วนเกินที่ระบุในหน้าราคา ใช้เป็นตัวอย่างเท่านั้น (1 TiB = 1,024 GiB) ราคาจริงตรวจสอบกับใบแจ้งหนี้
คำถามที่พบบ่อย
Spaces ต่างจาก Volumes อย่างไร
Volume คือดิสก์บล็อกที่ต่อเข้ากับ Droplet ใช้เป็นไดรฟ์เหมือนดิสก์ทั่วไป ส่วน Spaces เป็นที่เก็บไฟล์ผ่าน API/HTTP เข้าถึงจากหลายเครื่องและผ่าน CDN ได้
ใช้ Spaces เป็นโฮสต์เว็บ static ได้ไหม
ทำได้ในเชิงเทคนิค แต่ถ้าต้องการ build/deploy อัตโนมัติและ SSL ที่สะดวก App Platform สำหรับ Static Site (ฟรี 3 เว็บ) น่าจะเหมาะกว่า ดู คู่มือ App Platform
ถ้าเกินโควตา transfer จะถูกตัดบริการไหม
ไม่ตัดบริการ แต่คิดค่า transfer ส่วนเกินตามอัตราที่ประกาศ ตั้ง Billing Alert ไว้ล่วงหน้า