NN Server · คู่มือผู้ใช้

ขึ้นเว็บของคุณบน NN Server ตั้งแต่ต้นจนใช้งานได้

คู่มือนี้พาคุณจากบัญชีใหม่ไปถึงเว็บที่เปิดได้จริงผ่าน HTTPS บนโดเมนของคุณ ทุกขั้นตอนทดสอบแล้วบนเซิร์ฟเวอร์จริง ใช้ได้ทั้ง macOS และ Windows (เลือกแท็บตามเครื่องของคุณ)

Panel ของคุณpanel.heybring.com
IP สำหรับตั้ง DNS141.11.33.47
ระบบในแต่ละ VMUbuntu 24.04 + Docker
HTTPSออกให้อัตโนมัติ
ภาพรวม

ระบบทำงานอย่างไร

บัญชีเดียวมีได้หลายโปรเจกต์ แต่ละโปรเจกต์ได้ 2 VM (เซิร์ฟเวอร์ + ฐานข้อมูล) หรือ 1 VM (รวมกัน) ตามที่ขอ คุณมีสิทธิ์ sudo เต็มที่ในทุกเครื่องของคุณ VM ในโปรเจกต์เดียวกันคุยกันได้ทุกพอร์ต ส่วนของโปรเจกต์อื่นหรือผู้ใช้อื่นเข้าไม่ได้

ผู้เข้าชมhttps://shop.example.com
NN Serverรับ HTTPS แล้วส่งต่อตามชื่อโดเมน
VM เซิร์ฟเวอร์แอปของคุณ เช่น พอร์ต 3000
VM ฐานข้อมูลPostgreSQL / Supabase (คุยกันผ่าน IP ภายใน)
ค่าประจำโปรเจกต์ตัวอย่างดูค่าของคุณที่
IP ภายใน VM เซิร์ฟเวอร์10.10.0.103Panel → แถวโปรเจกต์ → จัดการ ▾ (การ์ดของแต่ละ VM)
IP ภายใน VM ฐานข้อมูล10.10.0.104
SSH VM เซิร์ฟเวอร์ssh -p 2203 ubuntu@141.11.33.47
SSH VM ฐานข้อมูลssh -p 2204 ubuntu@141.11.33.47

ตัวอย่างในคู่มือใช้ IP และพอร์ตข้างบน ให้เปลี่ยนเป็นค่าของโปรเจกต์คุณ

1

เข้า Panel ครั้งแรก คุณ

  1. เปิดลิงก์เชิญจากผู้ดูแลเซิร์ฟเวอร์ (ใช้ได้ครั้งเดียว หมดอายุใน 24 ชั่วโมง)
  2. ตั้งรหัสผ่านอย่างน้อย 12 ตัวอักษร แล้วกด ถัดไป ระบบพาเข้า Panel ทันที
  3. ครั้งต่อไปเข้าที่ panel.heybring.com ติ๊ก จดจำเครื่องนี้ 30 วัน บนเครื่องส่วนตัวเพื่อไม่ต้องล็อกอินบ่อย
ลืมรหัสผ่าน แจ้งผู้ดูแลให้ส่งลิงก์ตั้งรหัสใหม่ · เปลี่ยนรหัสผ่าน ทำได้จากปุ่มมุมขวาบน (ทุกเครื่องที่จำไว้จะหลุด ยกเว้นหน้าที่ใช้อยู่)
2

ขอสร้างโปรเจกต์ คุณ → ผู้ดูแลอนุมัติ

  1. กด + ขอสร้างโปรเจกต์
  2. กรอก ชื่อโปรเจกต์ (ภาษาอังกฤษตัวเล็ก ตัวเลข และ - เช่น wordrun) และ ชื่อที่แสดง (ภาษาไทยได้)
  3. เลือก แยกฐานข้อมูล (2 VM แนะนำสำหรับระบบจริง) หรือ ไม่แยก (1 VM ประหยัด เหมาะกับเว็บเล็ก)
  4. ใส่สเปก CPU / RAM / ดิสก์ และหมายเหตุ แล้วกด ส่งคำขอ
ขนาดที่แนะนำเซิร์ฟเวอร์ฐานข้อมูล
เว็บเล็กในองค์กร2 vCPU · 2–4 GB · 30–40 GB2 vCPU · 4 GB · 40–60 GB
ใช้ Supabase2–4 vCPU · 4 GB4 vCPU · 8 GB ขึ้นไป
1 VM (ไม่แยก)2 vCPU · 4 GB · 40–60 GB

เมื่ออนุมัติแล้ว ระบบสร้าง VM ให้ภายใน 2–5 นาที และโปรเจกต์จะขึ้นในตาราง ขอปรับสเปกภายหลังได้โดยติดต่อผู้ดูแล

3

เข้าเครื่อง VM คุณ

ทาง A · Terminal ในเว็บ

Panel → จัดการ ▾ → เปิด Terminal บนการ์ดของ VM ได้หน้าจอสั่งงานทันทีในฐานะผู้ใช้ ubuntu ไม่ต้องลงโปรแกรม ใช้จากมือถือได้

ทาง B · SSH จากคอมพิวเตอร์

ระบบรับเฉพาะกุญแจ SSH ไม่รับรหัสผ่าน ตั้งครั้งเดียวต่อ VM ตามขั้นตอนด้านล่าง ใช้ได้กับ VS Code (Remote-SSH) และโปรแกรมส่งไฟล์ด้วย

เปิดแอป Terminal · สร้างกุญแจ (ถ้ายังไม่มี) แล้วคัดลอกกุญแจสาธารณะ
ssh-keygen -t ed25519
pbcopy < ~/.ssh/id_ed25519.pub      # คัดลอกลงคลิปบอร์ดแล้ว
ใน Terminal ในเว็บของ VM · วางกุญแจที่คัดลอกมา (ทำทีละ VM)
echo "ssh-ed25519 AAAA...กุญแจของคุณ... you@laptop" >> ~/.ssh/authorized_keys
บนคอมของคุณ (macOS Terminal หรือ Windows PowerShell) · เข้าเครื่อง
ssh -p 2203 ubuntu@141.11.33.47   # VM เซิร์ฟเวอร์
ssh -p 2204 ubuntu@141.11.33.47   # VM ฐานข้อมูล
ส่งหรือวางเฉพาะไฟล์ที่ลงท้าย .pub ไฟล์ id_ed25519 ที่ไม่มี .pub คือกุญแจส่วนตัว ห้ามส่งให้ใคร
4

ตั้งฐานข้อมูลบน VM ฐานข้อมูล คุณ

ทำใน VM ฐานข้อมูล พอร์ตใน VM นี้เข้าถึงได้จาก VM เซิร์ฟเวอร์ในโปรเจกต์เดียวกันเท่านั้น อินเทอร์เน็ตเข้าตรงไม่ได้ (โปรเจกต์ 1 VM ให้ทำในเครื่องเดียวกับแอป)

ทาง A · PostgreSQL

ใน VM ฐานข้อมูล · สร้างไฟล์ทั้งหมดในคำสั่งเดียว
mkdir -p ~/db && cd ~/db
cat > docker-compose.yml <<'EOF'
services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: app
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:
EOF
echo "DB_PASSWORD=$(openssl rand -hex 24)" > .env && chmod 600 .env
docker compose up -d
docker compose exec db pg_isready -U app     # ต้องขึ้น accepting connections
cat .env                                      # จดรหัสไว้ใช้ในขั้นที่ 6

ทาง B · Supabase (self-hosted)

ใน VM ฐานข้อมูล
git clone --depth 1 https://github.com/supabase/supabase
mkdir -p ~/supabase-project
cp -rf supabase/docker/* ~/supabase-project
cp supabase/docker/.env.example ~/supabase-project/.env
cd ~/supabase-project && chmod 600 .env
nano .env        # เปลี่ยนค่าลับทุกตัว (ดูรายการด้านล่าง)
docker compose pull && docker compose up -d

ค่าที่ต้องเปลี่ยนใน .env: POSTGRES_PASSWORD JWT_SECRET ANON_KEY SERVICE_ROLE_KEY DASHBOARD_USERNAME DASHBOARD_PASSWORD และตั้ง SUPABASE_PUBLIC_URL / API_EXTERNAL_URL เป็นโดเมนที่จะผูก เช่น https://api.example.com · API เปิดรอที่พอร์ต 8000

ถ้า git clone จาก GitHub ช้า เส้นทางไป GitHub จากเซิร์ฟเวอร์อาจช้า ให้ clone บนคอมของคุณแล้วส่งขึ้นตามขั้นที่ 5 · Docker Hub, npm และ apt ใช้ได้เร็วปกติ
5

ส่งโค้ดขึ้น VM เซิร์ฟเวอร์ คุณ

ทาง A · จาก Git (ใน VM เซิร์ฟเวอร์)
git clone https://github.com/you/myapp.git ~/myapp
ทาง B · จากเครื่องของคุณ (Terminal) — มี rsync ในเครื่องอยู่แล้ว
rsync -avz --exclude node_modules --exclude .next --exclude .git \
  -e "ssh -p 2203" ./myapp/ ubuntu@141.11.33.47:~/myapp/

แบบลากวาง: Cyberduck (ฟรี) หรือ Transmit → เลือก SFTP, โฮสต์ 141.11.33.47, พอร์ต 2203, ผู้ใช้ ubuntu, ใช้ไฟล์กุญแจ ~/.ssh/id_ed25519

ห้ามส่ง node_modules จาก Mac ชิป M (Apple Silicon) โมดูลที่ติดตั้งบน Mac ใช้บนเซิร์ฟเวอร์ Linux ไม่ได้ ให้ติดตั้งใหม่บนเซิร์ฟเวอร์ผ่าน Docker (ขั้นที่ 6)
6

รันแอปบน VM เซิร์ฟเวอร์ คุณ

ใช้ Docker Compose พร้อม restart: unless-stopped แอปจะเปิดเองทุกครั้งที่ VM รีสตาร์ท ตัวอย่างนี้เป็น Next.js ที่พอร์ต 3000 (ทดสอบแล้ว)

~/myapp/Dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npx","next","start","-H","0.0.0.0","-p","3000"]
~/myapp/docker-compose.yml
services:
  web:
    build: .
    restart: unless-stopped
    env_file: .env
    ports:
      - "3000:3000"
~/myapp/.dockerignore · กันไฟล์ในเครื่องและรหัสลับหลุดเข้าอิมเมจ
node_modules
.next
.git
.env
.env.*
~/myapp/.env · ต่อฐานข้อมูลข้าม VM ด้วย IP ภายใน (ไม่ใช่ localhost)
# ทาง A (PostgreSQL)
DATABASE_URL=postgresql://app:รหัสจากขั้นที่4@10.10.0.104:5432/app
# ทาง B (Supabase)
NEXT_PUBLIC_SUPABASE_URL=https://api.example.com
NEXT_PUBLIC_SUPABASE_ANON_KEY=ค่า ANON_KEY
SUPABASE_SERVICE_ROLE_KEY=ค่า SERVICE_ROLE_KEY
ใน VM เซิร์ฟเวอร์
cd ~/myapp && chmod 600 .env
docker compose up -d --build
docker compose logs --tail 50
ตัวแปร NEXT_PUBLIC_* ถูกฝังตอน build ถ้าแก้ค่าเหล่านี้ ต้อง docker compose up -d --build ใหม่ · ใช้ TypeScript กับไลบรารีที่ไม่มีชนิดในตัว เช่น pg ให้ติดตั้ง @types/pg เพิ่ม ไม่อย่างนั้น build จะล้ม
7

ตรวจว่าแอปพร้อมรับคนเข้า คุณ

ใน VM เซิร์ฟเวอร์
sudo ss -tlnp | grep 3000       # ต้องเห็น 0.0.0.0:3000
curl -I http://localhost:3000   # ต้องได้ HTTP/1.1 200
nc -zv 10.10.0.104 5432         # เห็นฐานข้อมูล (Supabase ใช้ 8000)
ผลของ ssความหมาย
0.0.0.0:3000 หรือ *:3000พร้อม ไปขั้นที่ 8
127.0.0.1:3000ต้องแก้ แอปรับเฉพาะในเครื่อง เว็บจะขึ้น 502
ไม่มีบรรทัดใดต้องแก้ แอปไม่ได้รัน ดู docker compose logs
8

ตั้ง DNS ที่ผู้ให้บริการโดเมน เจ้าของโดเมน

TypeNameValueได้ลิงก์
A@141.11.33.47https://example.com
Awww141.11.33.47https://www.example.com
Aapi141.11.33.47https://api.example.com (Supabase)
  • Cloudflare: ตั้ง Proxy เป็น DNS only (เมฆสีเทา)
  • ลบ record แบบ AAAA ของชื่อนั้น (เซิร์ฟเวอร์ใช้ IPv4)
  • ห้ามแก้หรือลบ record แบบ MX / TXT ของอีเมล
  • รอ 1–5 นาที
9

ผูกโดเมนใน Panel คุณ

  1. Panel → แถวโปรเจกต์ → จัดการ ▾
  2. บนการ์ดของ VM ที่แอปรันอยู่ กด โดเมนของเครื่องนี้
  3. พิมพ์โดเมน ใส่พอร์ตของแอปใน VM แล้วกด เพิ่มโดเมน
โดเมนการ์ด VMพอร์ต
example.comเซิร์ฟเวอร์3000
www.example.comเซิร์ฟเวอร์3000 (เพิ่มแยกอีกรายการ)
api.example.comฐานข้อมูล (Supabase)8000

ระบบตรวจ DNS และความซ้ำ แล้วออกใบรับรอง HTTPS ให้ภายในประมาณ 15 วินาทีถึง 1 นาที ผู้เข้าชมไม่ต้องพิมพ์พอร์ต

ข้อความที่อาจเห็น: "ยังไม่พบ DNS" รอ DNS อีกสักครู่ · "DNS ชี้ไป … ไม่ใช่ 141.11.33.47" แก้ A record หรือปิด Proxy ของ Cloudflare · "มี AAAA record" ลบ AAAA · "มีผู้ใช้อื่นใช้อยู่แล้ว" ติดต่อผู้ดูแล
10

ตรวจหน้าเว็บและสถานะ คุณ

เปิด https://example.com ต้องเห็นรูปกุญแจ แล้วดูตารางโปรเจกต์ใน Panel

ในตารางความหมาย
✅ ปกติVM ทำงานครบ และแอปตอบที่พอร์ตของทุกโดเมน
กรอบสีแดงVM ปิดหรือค้าง หรือแอปไม่ตอบที่พอร์ตของโดเมน สาเหตุแสดงในช่อง "สถานะรวม"

ทดสอบการรีสตาร์ท: กด "รีสตาร์ท" ที่ VM เซิร์ฟเวอร์ เว็บควรกลับมาเองภายใน 15–60 วินาที

หลังขึ้นเว็บแล้ว

อัปเดต สำรองข้อมูล และดูแลต่อ

อัปเดตเวอร์ชันใหม่

ใน VM เซิร์ฟเวอร์
cd ~/myapp
git pull                  # หรือส่งไฟล์ใหม่ตามขั้นที่ 5
docker compose up -d --build

สำรองฐานข้อมูลเอง (แนะนำ)

ใน VM ฐานข้อมูล · ทาง A · ทุกวันตี 3 เก็บ 14 วัน
mkdir -p ~/backups
cat > ~/backup-db.sh <<'EOF'
#!/bin/sh
cd ~/db && docker compose exec -T db pg_dump -U app app | gzip > ~/backups/app_$(date +%F).sql.gz
find ~/backups -name '*.sql.gz' -mtime +14 -delete
EOF
chmod +x ~/backup-db.sh
(crontab -l 2>/dev/null; echo "0 3 * * * $HOME/backup-db.sh") | crontab -
ระบบสำรองของเซิร์ฟเวอร์ สำรอง VM ทั้งเครื่องทุกคืน 02:00 น. เก็บ 7 วัน ข้อมูลชุดนี้อยู่บนเครื่องเดียวกับ VM จึงควรดาวน์โหลด ~/backups เก็บไว้ที่อื่นด้วย
ข้อกำหนด

สิ่งที่ทำได้และข้อจำกัด

เรื่องรายละเอียด
สิทธิ์ใน VMผู้ดูแลเต็มที่ (sudo) ติดตั้งอะไรก็ได้ รวมถึงเครื่องมือ AI
จากอินเทอร์เน็ตเว็บผ่านโดเมนที่ผูกใน Panel และ SSH พอร์ตเฉพาะของแต่ละ VM · ต้องการพอร์ตอื่นติดต่อผู้ดูแล
ระหว่าง VMVM ในโปรเจกต์เดียวกันคุยกันได้ทุกพอร์ต · VM ของโปรเจกต์อื่นเข้าไม่ได้
อีเมลพอร์ต 25 ถูกปิด ส่งผ่านผู้ให้บริการอีเมล (SMTP 587/465 หรือ API) ได้ปกติ
ไฟร์วอลล์ใน VMถ้าเปิด ufw ต้องอนุญาตพอร์ต 22 และพอร์ตของแอปก่อน ไม่อย่างนั้น Terminal ในเว็บและหน้าเว็บจะใช้ไม่ได้
ทรัพยากรตามที่อนุมัติ ขอปรับได้จากผู้ดูแล (ปรับ CPU/RAM ต้องปิด VM 1–2 นาที, ดิสก์เพิ่มได้อย่างเดียว)
ปุ่มบังคับปิดเหมือนถอดปลั๊ก ใช้เมื่อเครื่องค้างเท่านั้น
แก้ปัญหา

อาการที่พบบ่อย

อาการสาเหตุที่พบบ่อยวิธีแก้
502 Bad Gatewayแอปไม่ได้รัน / ฟังที่ 127.0.0.1 / ใส่พอร์ตผิดขั้นที่ 7 แล้วตรวจพอร์ตใน Panel
เบราว์เซอร์เตือนไม่ปลอดภัยใบรับรองยังไม่เสร็จ / DNS ผิด / เปิด Proxyรอ 1–2 นาที ตรวจ A record ตั้ง DNS only
"ไม่สามารถเข้าถึงเว็บไซต์นี้"เครื่องคุณจำผล DNS เก่าหน้าต่างไม่ระบุตัวตน หรือรอ 30 นาที
build ล้ม "Could not find a declaration file"TypeScript ไม่มีชนิดของไลบรารีnpm i -D @types/ชื่อไลบรารี
แอปต่อฐานข้อมูลไม่ได้ใช้ localhost แทน IP ภายในใช้ IP VM ฐานข้อมูล ทดสอบด้วย nc -zv
Terminal ในเว็บเชื่อมต่อไม่ได้VM ปิดอยู่ หรือ ufw ปิดพอร์ต 22เปิดเครื่องใน Panel / แก้ ufw ผ่าน SSH
git clone ช้ามากเส้นทางไป GitHub ช้าclone บนคอมแล้วส่งขึ้น (ขั้นที่ 5)
ติดต่อผู้ดูแลเมื่อ ต้องการปรับสเปก · เปิดพอร์ตพิเศษ · รีเซ็ตรหัสผ่าน · กู้ VM จากข้อมูลสำรองหรือถังขยะ · โดเมนมีผู้อื่นใช้อยู่