New season — Spring/Summer drop now live

Maintenance — บำรุงรักษาระบบ

สิ่งที่ต้องทำหลัง deploy ไปแล้ว — backup, update, monitor

Backup ฐานข้อมูล

Manual

# บน server
docker compose exec postgres \
  pg_dump -U ecommerce ecommerce > backup-$(date +%F-%H%M).sql

# ดาวน์โหลดมา local
scp root@<server>:/opt/ecommerce/backup-*.sql ./backups/

Auto — Daily cron

/etc/cron.d/ecommerce-backup:

0 3 * * * root cd /opt/ecommerce && \
  docker compose exec -T postgres \
  pg_dump -U ecommerce ecommerce | gzip > \
  /backups/db-$(date +\%F).sql.gz && \
  find /backups -name "db-*.sql.gz" -mtime +30 -delete

(backup ทุก 03:00, เก็บ 30 วัน, gzip)

Auto — Upload to S3

# install awscli
apt install awscli

# cron job
0 3 * * * root cd /opt/ecommerce && \
  docker compose exec -T postgres pg_dump -U ecommerce ecommerce | \
  gzip | aws s3 cp - s3://yourbucket/db-$(date +\%F).sql.gz

Restore

# จาก local file
cat backup-2026-01-15.sql | \
  docker compose exec -T postgres psql -U ecommerce ecommerce

# จาก S3
aws s3 cp s3://yourbucket/db-2026-01-15.sql.gz - | gunzip | \
  docker compose exec -T postgres psql -U ecommerce ecommerce

Backup รูป (uploads)

# Manual
tar -czf uploads-$(date +%F).tar.gz ecommerce-api/uploads/

# Auto cron
0 3 * * * root tar -czf /backups/uploads-$(date +\%F).tar.gz \
  /opt/ecommerce/ecommerce-api/uploads/

ถ้าใช้ S3 อยู่แล้ว → enable S3 versioning ดูแลให้

Monitoring

Uptime

UptimeRobot (ฟรี — 50 monitors):

  • ตั้ง check ทุก 5 นาที:
    • https://yourshop.com
    • https://api.yourshop.com/api/v1/health
  • Alert ทาง Email / LINE / SMS

Error tracking

Sentry (ฟรี tier — 5k errors/เดือน):

ecommerce-api/src/main.ts:

import * as Sentry from '@sentry/node'
Sentry.init({
  dsn: process.env.SENTRY_DSN,
  environment: process.env.NODE_ENV,
})

ecommerce-web/nuxt.config.ts:

import { sentryVitePlugin } from '@sentry/vite-plugin'
// (config ใน docs ของ Sentry)

Performance monitoring

  • Vercel Analytics (ถ้าใช้ Vercel)
  • New Relic / Datadog (paid, advanced)
  • Self-hosted: Grafana + Prometheus

Database

ดูสุขภาพ DB:

docker compose exec postgres psql -U ecommerce -c "
  SELECT count(*) AS connections,
         (SELECT count(*) FROM pg_stat_activity WHERE state='active') AS active
  FROM pg_stat_activity;
"

ตั้ง alert ถ้า:

  • connections > 80% ของ max
  • disk usage > 80%
  • slow queries เพิ่มขึ้น

Update Source Code

ดึง update จากผู้ขายระบบ

ถ้าผู้ขายส่ง patch มา:

# Backup ก่อนเสมอ!
docker compose exec postgres pg_dump ... > backup-before-update.sql

# Pull update
cd /opt/ecommerce
git fetch origin
git checkout v1.2.0   # เวอร์ชันใหม่

# Rebuild
docker compose build --no-cache
docker compose up -d

# Migration (ถ้ามี)
docker compose exec api npx prisma migrate deploy

# Health check
curl https://api.yourshop.com/api/v1/health

ถ้าพังหลัง update — rollback:

git checkout v1.1.0
docker compose build --no-cache
docker compose up -d

Update dependency

ทุก 1-3 เดือน ตรวจ vulnerability:

cd ecommerce-api
npm audit
npm audit fix       # auto fix non-breaking

cd ../ecommerce-web
npm audit
npm audit fix

ถ้ามี major version update (เช่น Nuxt 4 → 5) — รอ patch จากผู้ขาย หรือทดสอบใน staging ก่อน

Maintenance Mode

ปิดเว็บชั่วคราว (ตอน maintenance):

infra/nginx/maintenance.conf:

location / {
  return 503;
}
error_page 503 /maintenance.html;
location = /maintenance.html {
  root /usr/share/nginx/html;
}

เปิด maintenance:

sudo ln -sf /etc/nginx/sites-available/maintenance.conf \
  /etc/nginx/sites-enabled/yourshop.conf
sudo nginx -s reload

ปิด maintenance:

sudo ln -sf /etc/nginx/sites-available/yourshop.conf \
  /etc/nginx/sites-enabled/yourshop.conf
sudo nginx -s reload

งานประจำ (Routine Tasks)

รายวัน

  • [ ] เช็คออเดอร์รอตรวจสลิป (5 นาที)
  • [ ] ตอบ inbox ลูกค้า
  • [ ] ตรวจ error log ของ api

รายสัปดาห์

  • [ ] ดู dashboard ยอดขาย
  • [ ] ตรวจสต๊อกใกล้หมด
  • [ ] ดู review ที่ลูกค้าส่ง
  • [ ] เช็ค uptime + alert

รายเดือน

  • [ ] Export ออเดอร์ทั้งเดือน → ส่งบัญชี
  • [ ] รีวิว top sellers + slow sellers
  • [ ] อัปเดต coupon
  • [ ] ตรวจ backup ใช้ได้จริง (ลอง restore ใน staging)
  • [ ] npm audit ทั้ง 3 projects

รายไตรมาส

  • [ ] เปลี่ยน password admin
  • [ ] เปลี่ยน JWT secret (rotate)
  • [ ] รีวิว performance + scale plan
  • [ ] อัปเดต OS + dependencies

รายปี

  • [ ] ต่อ HTTPS certificate (auto แต่เช็คให้ชัวร์)
  • [ ] ต่อโดเมน
  • [ ] ต่อ Apple Developer ($99/ปี)
  • [ ] รีวิว pricing / cost ของ hosting

Disaster Recovery

ถ้าระบบล่มทั้งหมด:

Server พัง — ของยังอยู่ใน S3

  1. เช่า VPS ใหม่
  2. ติดตั้ง docker
  3. clone source
  4. restore database จาก S3 backup
  5. restore uploads จาก S3
  6. start docker-compose
  7. ปลี่ยน DNS ชี้ IP ใหม่
  8. รอ propagate ~5-30 นาที

RTO (Recovery Time Objective): ~2 ชั่วโมง
RPO (Recovery Point Objective): ~24 ชั่วโมง (ถ้า backup daily)

ถ้าต้องการ RPO ต่ำกว่า → ตั้ง streaming replication (advanced)

ขั้นต่อไป

  • FAQ ครบทุกหัวข้อ → 10 — FAQ
Join the club

ของเด็ดส่งตรง
ถึงอินบ็อกซ์

สมัครรับข่าวสาร — รับส่วนลด 10% สำหรับสมาชิกใหม่ + อัปเดตคอลเลกชันก่อนใคร