ขึ้นเว็บของคุณบน NN Server ตั้งแต่ต้นจนใช้งานได้
คู่มือนี้พาคุณจากบัญชีใหม่ไปถึงเว็บที่เปิดได้จริงผ่าน HTTPS บนโดเมนของคุณ ทุกขั้นตอนทดสอบแล้วบนเซิร์ฟเวอร์จริง ใช้ได้ทั้ง macOS และ Windows (เลือกแท็บตามเครื่องของคุณ)
ระบบทำงานอย่างไร
บัญชีเดียวมีได้หลายโปรเจกต์ แต่ละโปรเจกต์ได้ 2 VM (เซิร์ฟเวอร์ + ฐานข้อมูล) หรือ 1 VM (รวมกัน) ตามที่ขอ คุณมีสิทธิ์ sudo เต็มที่ในทุกเครื่องของคุณ VM ในโปรเจกต์เดียวกันคุยกันได้ทุกพอร์ต ส่วนของโปรเจกต์อื่นหรือผู้ใช้อื่นเข้าไม่ได้
| ค่าประจำโปรเจกต์ | ตัวอย่าง | ดูค่าของคุณที่ |
|---|---|---|
| IP ภายใน VM เซิร์ฟเวอร์ | 10.10.0.103 | Panel → แถวโปรเจกต์ → จัดการ ▾ (การ์ดของแต่ละ 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 และพอร์ตข้างบน ให้เปลี่ยนเป็นค่าของโปรเจกต์คุณ
เข้า Panel ครั้งแรก คุณ
- เปิดลิงก์เชิญจากผู้ดูแลเซิร์ฟเวอร์ (ใช้ได้ครั้งเดียว หมดอายุใน 24 ชั่วโมง)
- ตั้งรหัสผ่านอย่างน้อย 12 ตัวอักษร แล้วกด ถัดไป ระบบพาเข้า Panel ทันที
- ครั้งต่อไปเข้าที่ panel.heybring.com ติ๊ก จดจำเครื่องนี้ 30 วัน บนเครื่องส่วนตัวเพื่อไม่ต้องล็อกอินบ่อย
ขอสร้างโปรเจกต์ คุณ → ผู้ดูแลอนุมัติ
- กด + ขอสร้างโปรเจกต์
- กรอก ชื่อโปรเจกต์ (ภาษาอังกฤษตัวเล็ก ตัวเลข และ
-เช่นwordrun) และ ชื่อที่แสดง (ภาษาไทยได้) - เลือก แยกฐานข้อมูล (2 VM แนะนำสำหรับระบบจริง) หรือ ไม่แยก (1 VM ประหยัด เหมาะกับเว็บเล็ก)
- ใส่สเปก CPU / RAM / ดิสก์ และหมายเหตุ แล้วกด ส่งคำขอ
| ขนาดที่แนะนำ | เซิร์ฟเวอร์ | ฐานข้อมูล |
|---|---|---|
| เว็บเล็กในองค์กร | 2 vCPU · 2–4 GB · 30–40 GB | 2 vCPU · 4 GB · 40–60 GB |
| ใช้ Supabase | 2–4 vCPU · 4 GB | 4 vCPU · 8 GB ขึ้นไป |
| 1 VM (ไม่แยก) | 2 vCPU · 4 GB · 40–60 GB | |
เมื่ออนุมัติแล้ว ระบบสร้าง VM ให้ภายใน 2–5 นาที และโปรเจกต์จะขึ้นในตาราง ขอปรับสเปกภายหลังได้โดยติดต่อผู้ดูแล
เข้าเครื่อง VM คุณ
ทาง A · Terminal ในเว็บ
Panel → จัดการ ▾ → เปิด Terminal บนการ์ดของ VM ได้หน้าจอสั่งงานทันทีในฐานะผู้ใช้ ubuntu ไม่ต้องลงโปรแกรม ใช้จากมือถือได้
ทาง B · SSH จากคอมพิวเตอร์
ระบบรับเฉพาะกุญแจ SSH ไม่รับรหัสผ่าน ตั้งครั้งเดียวต่อ VM ตามขั้นตอนด้านล่าง ใช้ได้กับ VS Code (Remote-SSH) และโปรแกรมส่งไฟล์ด้วย
ssh-keygen -t ed25519
pbcopy < ~/.ssh/id_ed25519.pub # คัดลอกลงคลิปบอร์ดแล้วssh-keygen -t ed25519 Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard
echo "ssh-ed25519 AAAA...กุญแจของคุณ... you@laptop" >> ~/.ssh/authorized_keys
ssh -p 2203 ubuntu@141.11.33.47 # VM เซิร์ฟเวอร์ ssh -p 2204 ubuntu@141.11.33.47 # VM ฐานข้อมูล
id_ed25519 ที่ไม่มี .pub คือกุญแจส่วนตัว ห้ามส่งให้ใครตั้งฐานข้อมูลบน VM ฐานข้อมูล คุณ
ทำใน VM ฐานข้อมูล พอร์ตใน VM นี้เข้าถึงได้จาก VM เซิร์ฟเวอร์ในโปรเจกต์เดียวกันเท่านั้น อินเทอร์เน็ตเข้าตรงไม่ได้ (โปรเจกต์ 1 VM ให้ทำในเครื่องเดียวกับแอป)
ทาง A · PostgreSQL
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)
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
ส่งโค้ดขึ้น VM เซิร์ฟเวอร์ คุณ
git clone https://github.com/you/myapp.git ~/myapp
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
scp -P 2203 -r .\myapp ubuntu@141.11.33.47:~/
ก่อนส่ง ลบโฟลเดอร์ node_modules และ .next ออก (หรือส่งเฉพาะไฟล์โค้ด) · แบบลากวาง: WinSCP → SFTP, โฮสต์ 141.11.33.47, พอร์ต 2203, ผู้ใช้ ubuntu, ใช้ไฟล์กุญแจ
รันแอปบน VM เซิร์ฟเวอร์ คุณ
ใช้ Docker Compose พร้อม restart: unless-stopped แอปจะเปิดเองทุกครั้งที่ VM รีสตาร์ท ตัวอย่างนี้เป็น Next.js ที่พอร์ต 3000 (ทดสอบแล้ว)
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"]
services:
web:
build: .
restart: unless-stopped
env_file: .env
ports:
- "3000:3000"node_modules .next .git .env .env.*
# ทาง 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
cd ~/myapp && chmod 600 .env docker compose up -d --build docker compose logs --tail 50
docker compose up -d --build ใหม่ · ใช้ TypeScript กับไลบรารีที่ไม่มีชนิดในตัว เช่น pg ให้ติดตั้ง @types/pg เพิ่ม ไม่อย่างนั้น build จะล้มตรวจว่าแอปพร้อมรับคนเข้า คุณ
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 |
ตั้ง DNS ที่ผู้ให้บริการโดเมน เจ้าของโดเมน
| Type | Name | Value | ได้ลิงก์ |
|---|---|---|---|
A | @ | 141.11.33.47 | https://example.com |
A | www | 141.11.33.47 | https://www.example.com |
A | api | 141.11.33.47 | https://api.example.com (Supabase) |
- Cloudflare: ตั้ง Proxy เป็น DNS only (เมฆสีเทา)
- ลบ record แบบ
AAAAของชื่อนั้น (เซิร์ฟเวอร์ใช้ IPv4) - ห้ามแก้หรือลบ record แบบ
MX/TXTของอีเมล - รอ 1–5 นาที
ผูกโดเมนใน Panel คุณ
- Panel → แถวโปรเจกต์ → จัดการ ▾
- บนการ์ดของ VM ที่แอปรันอยู่ กด โดเมนของเครื่องนี้
- พิมพ์โดเมน ใส่พอร์ตของแอปใน VM แล้วกด เพิ่มโดเมน
| โดเมน | การ์ด VM | พอร์ต |
|---|---|---|
example.com | เซิร์ฟเวอร์ | 3000 |
www.example.com | เซิร์ฟเวอร์ | 3000 (เพิ่มแยกอีกรายการ) |
api.example.com | ฐานข้อมูล (Supabase) | 8000 |
ระบบตรวจ DNS และความซ้ำ แล้วออกใบรับรอง HTTPS ให้ภายในประมาณ 15 วินาทีถึง 1 นาที ผู้เข้าชมไม่ต้องพิมพ์พอร์ต
ตรวจหน้าเว็บและสถานะ คุณ
เปิด https://example.com ต้องเห็นรูปกุญแจ แล้วดูตารางโปรเจกต์ใน Panel
| ในตาราง | ความหมาย |
|---|---|
| ✅ ปกติ | VM ทำงานครบ และแอปตอบที่พอร์ตของทุกโดเมน |
| กรอบสีแดง | VM ปิดหรือค้าง หรือแอปไม่ตอบที่พอร์ตของโดเมน สาเหตุแสดงในช่อง "สถานะรวม" |
ทดสอบการรีสตาร์ท: กด "รีสตาร์ท" ที่ VM เซิร์ฟเวอร์ เว็บควรกลับมาเองภายใน 15–60 วินาที
อัปเดต สำรองข้อมูล และดูแลต่อ
อัปเดตเวอร์ชันใหม่
cd ~/myapp
git pull # หรือส่งไฟล์ใหม่ตามขั้นที่ 5
docker compose up -d --buildสำรองฐานข้อมูลเอง (แนะนำ)
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 -
~/backups เก็บไว้ที่อื่นด้วยสิ่งที่ทำได้และข้อจำกัด
| เรื่อง | รายละเอียด |
|---|---|
| สิทธิ์ใน VM | ผู้ดูแลเต็มที่ (sudo) ติดตั้งอะไรก็ได้ รวมถึงเครื่องมือ AI |
| จากอินเทอร์เน็ต | เว็บผ่านโดเมนที่ผูกใน Panel และ SSH พอร์ตเฉพาะของแต่ละ VM · ต้องการพอร์ตอื่นติดต่อผู้ดูแล |
| ระหว่าง VM | VM ในโปรเจกต์เดียวกันคุยกันได้ทุกพอร์ต · 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) |