คู่มือติดตั้งบน Ubuntu ทีละขั้น

คู่มือนี้ติดตั้งวิทยุออนไลน์บนเซิร์ฟเวอร์ Ubuntu หนึ่งเครื่อง ตั้งแต่เครื่องเปล่าจนสถานีแรกออกอากาศ เขียนสำหรับผู้เริ่มต้น ทุกขั้นมีคำสั่งที่ต้องพิมพ์ สิ่งที่ควรเห็น และสิ่งที่ต้องทำถ้าไม่สำเร็จ

ใช้กับโปรแกรมอ่านหน้าจอผ่าน SSH ได้ ไม่มีขั้นไหนต้องใช้เมาส์ สี หรือรูปภาพ ข้อความทุกอย่างจากเซิร์ฟเวอร์เป็นตัวอักษรธรรมดา บรรทัดละหนึ่งเรื่อง

หลังขั้นที่ 6 คู่มือเดียวกันนี้อยู่บนเซิร์ฟเวอร์เป็นไฟล์ข้อความธรรมดา: less /opt/radio/INSTALL-UBUNTU.th.txt ในเว็บแอปคือหน้าช่วยเหลือ "คู่มือติดตั้งบน Ubuntu ทีละขั้น" (/help/install-ubuntu) รายละเอียดทางเทคนิคอยู่ในคู่มือการติดตั้ง และงานประจำวันอยู่ในคู่มือดูแลระบบ

วิธีอ่านคู่มือนี้

  • คำสั่งอยู่บรรทัดของตัวเองเสมอ คัดลอกทั้งบรรทัด วางในหน้าต่าง SSH แล้วกด Enter
  • บรรทัดที่ขึ้นต้นด้วย # เป็นคำอธิบาย ไม่ต้องพิมพ์
  • คำที่เป็นตัวพิมพ์ใหญ่ เช่น YOUR-SERVER-IP คือค่าที่ต้องเปลี่ยนเป็นของคุณเอง
  • "ควรเห็น" บอกว่าเซิร์ฟเวอร์ควรตอบอะไร
  • "ถ้าไม่สำเร็จ" บอกว่าต้องทำอะไรต่อ
  • คำสั่งขึ้นต้นด้วย sudo คือสั่งในฐานะผู้ดูแลระบบ (root) ครั้งแรกจะถามรหัสผ่านของคุณ ตอนพิมพ์รหัสผ่านจะไม่มีอะไรแสดงบนจอ เป็นเรื่องปกติ
  • ถ้าเข้าระบบเป็นผู้ใช้ root ไม่ต้องพิมพ์ sudo
  • ผลลัพธ์ที่ยาว อ่านทีละหน้าได้ง่ายกว่า: เติม | less ท้ายคำสั่ง ใน less กด Space เพื่อไปหน้าถัดไป กด / เพื่อค้นหา และกด q เพื่อออก

สารบัญ

  1. สิ่งที่ต้องเตรียม
  2. เลือกวิธีที่ผู้ใช้เข้าถึงแพลตฟอร์ม
  3. เตรียม DNS (เฉพาะแบบโดเมน)
  4. เชื่อมต่อเซิร์ฟเวอร์ด้วย SSH
  5. อัปเดต Ubuntu
  6. ติดตั้งแพ็กเกจ
  7. ตั้งค่าด้วย sudo radio-setup
  8. ตั้งค่าครั้งแรกในเว็บ
  9. เข้าสู่ระบบ
  10. ตรวจครั้งแรก
  11. ตั้งค่าอีเมล (SMTP) หลังติดตั้ง
  12. ไฟร์วอลล์และ security group ของผู้ให้บริการคลาวด์
  13. การสำรองข้อมูล
  14. อัปเดตเป็นเวอร์ชันใหม่
  15. เปลี่ยนจาก IP เป็นโดเมนภายหลัง
  16. ย้ายการติดตั้งรุ่นเก่า
  17. ถอนการติดตั้ง
  18. แก้ปัญหา
  19. บันทึกการทำงาน (log) อยู่ที่ไหน
  20. ขอความช่วยเหลือ
  21. ภาคผนวก: ติดตั้งโดยไม่มีอินเทอร์เน็ต
  22. ภาคผนวก: ตัวเลือกทั้งหมดของ radio-setup

1. สิ่งที่ต้องเตรียม

1.1 เซิร์ฟเวอร์

เซิร์ฟเวอร์เสมือน (VPS) จากผู้ให้บริการคลาวด์ หรือเครื่องของคุณเอง ต้องเป็น Ubuntu Server 22.04 LTS หรือ 24.04 LTS แบบ 64 บิต (amd64 หรือ arm64) ใช้เครื่องใหม่ที่ว่าง: ต้องไม่มีโปรแกรมอื่นใช้พอร์ต 80 และ 443

เลือกขนาดตามจำนวนสถานี ตัวติดตั้งจะแนะนำโปรไฟล์ขนาดที่เหมาะกับเครื่องของคุณ

โปรไฟล์ CPU หน่วยความจำ ดิสก์ สถานี
small 2 vCPU 4 GB 40 GB ขึ้นไป ไม่เกิน 5
medium 4 vCPU 8 GB 80 GB ขึ้นไป ไม่เกิน 15
large 8 vCPU 16 GB 160 GB ขึ้นไป ไม่เกิน 40

ดิสก์ใช้เก็บระบบ อิมเมจของ Docker (ประมาณ 3 GB) คลังเสียง ไฟล์บันทึกรายการ และข้อมูลสำรองในเครื่อง ตัวติดตั้งจะหยุดถ้าพื้นที่ว่างน้อยกว่า 10 GB และเตือนถ้าน้อยกว่า 30 GB

ผู้ฟังต้องใช้แบนด์วิดท์ขาออก: จำนวนผู้ฟังคูณบิตเรต เช่น ผู้ฟัง 500 คนที่ 128 kbps ต้องใช้ประมาณ 64 Mbit/s

1.2 พอร์ต

พอร์ตเหล่านี้ต้องเข้าถึงได้จากอินเทอร์เน็ต (หรือจากเครือข่ายภายในในโหมด HTTP ธรรมดา)

พอร์ต โปรโตคอล ใช้ทำอะไร
22 TCP SSH สำหรับคุณ ถ้าทำได้ ให้เปิดเฉพาะจาก IP ของคุณเอง
80 TCP เว็บไซต์ และการขอใบรับรองจาก Let's Encrypt
443 TCP เว็บไซต์แบบ HTTPS และสตรีมเสียง
443 UDP HTTP/3 (เร็วขึ้นบนมือถือ ไม่บังคับ)
8100 ถึง 8119 TCP ดีเจออกอากาศสดด้วย BUTT หรือ OBS สถานีละหนึ่งพอร์ต (โปรไฟล์ small) โปรไฟล์ medium: 8100 ถึง 8139 โปรไฟล์ large: 8100 ถึง 8199
10100 ถึง 10119 UDP รับสัญญาณถ่ายทอดต่อที่ส่งเข้ามาทาง SRT (ไม่บังคับ เปิดเมื่อสถานีใช้)

ห้ามเปิดพอร์ต 3000, 5432, 6432 และ 8000 เด็ดขาด เป็นพอร์ตภายใน

1.3 ที่อยู่: โดเมนหรือ IP คงที่

ผู้ใช้เปิดแพลตฟอร์มด้วยชื่อโดเมน เช่น radio.example.th หรือด้วยหมายเลข IP ของเซิร์ฟเวอร์ โดเมนดีที่สุด: ใช้ได้ทุกความสามารถ หมายเลข IP ต้องเป็นแบบคงที่ (static) เซิร์ฟเวอร์คลาวด์ส่วนใหญ่มี IP สาธารณะคงที่ ถ้าเป็นเครื่องที่บ้านหรือในสำนักงาน ให้ถามผู้ดูแลเครือข่าย ส่วนที่ 2 อธิบายวิธีเลือก

1.4 อีเมล

ต้องมีอีเมลของคุณเอง ใช้เป็นบัญชีผู้ดูแลระบบ และ Let's Encrypt จะส่งแจ้งเตือนเรื่องใบรับรองมาที่อีเมลนี้

1.5 ไม่บังคับ: เซิร์ฟเวอร์อีเมล (SMTP)

แพลตฟอร์มให้ผู้ใช้เข้าสู่ระบบด้วยรหัส 6 หลักที่ส่งทางอีเมล ไม่มีรหัสผ่าน การส่งอีเมลเหล่านี้ต้องมีบัญชี SMTP จากผู้ให้บริการอีเมลของคุณ เช่น Google Workspace, Microsoft 365, Amazon SES หรือบริการแบบเดียวกัน

ติดตั้งโดยไม่มี SMTP ได้ อีเมลทุกฉบับ รวมทั้งรหัสเข้าสู่ระบบ จะถูกเขียนเป็นไฟล์บนเซิร์ฟเวอร์แทนการส่ง อ่านได้ด้วยคำสั่งนี้:

sudo radioctl outbox

ใช้แบบนี้ได้ในช่วงแรก แต่ควรตั้ง SMTP (ส่วนที่ 11) ก่อนให้คนอื่นเข้าสู่ระบบ

1.6 บนคอมพิวเตอร์ของคุณ

  • โปรแกรม SSH Windows 10 และ 11 มีมาให้แล้ว (Windows Terminal หรือ PowerShell) macOS มี Terminal
  • โปรแกรมอ่านหน้าจอถ้าคุณใช้: NVDA, JAWS หรือ Narrator บน Windows, VoiceOver บน macOS
  • สำหรับทดสอบดีเจ: BUTT (Broadcast Using This Tool) ดาวน์โหลดฟรีที่ https://danielnoethen.de/butt/

2. เลือกวิธีที่ผู้ใช้เข้าถึงแพลตฟอร์ม

ตัวตั้งค่าจะถามข้อนี้ มีให้เลือกสามแบบ

  • โดเมน (domain แนะนำ): https://radio.example.th ต้องมีโดเมนที่ชี้มาที่เซิร์ฟเวอร์
  • IP แบบ HTTPS (ip-https): https://203.0.113.10 ไม่ต้องมีโดเมน Let's Encrypt ออกใบรับรองให้หมายเลข IP ถ้าเป็น IP ส่วนตัว (เช่น 192.168.x.x) เซิร์ฟเวอร์จะออกใบรับรองเอง และเบราว์เซอร์จะเตือน
  • IP แบบ HTTP ธรรมดา (ip-http): http://192.168.1.20 สำหรับเครือข่ายภายในเท่านั้น ไม่มีการเข้ารหัส

ความสามารถที่ใช้ได้ในแต่ละแบบ:

ความสามารถ โดเมน IP แบบ HTTPS IP แบบ HTTP ธรรมดา
เว็บไซต์ ฟังสถานี หน้าผู้ดูแล ได้ ได้ ได้
ดีเจด้วย BUTT หรือ OBS ได้ ได้ ได้
การเชื่อมต่อแบบเข้ารหัส ได้ ได้ ไม่ได้
ไมโครโฟนในเว็บดีเจ (ห้องจัดรายการ) ได้ ได้ ไม่ได้
แขกรับเชิญทางไกล (โทรผ่านเบราว์เซอร์) ได้ ได้ ไม่ได้
การแจ้งเตือนแบบพุช ได้ ได้ เฉพาะ IP สาธารณะ ไม่ได้
พาสคีย์ (เข้าสู่ระบบด้วยลายนิ้วมือหรือ PIN) ได้ ไม่ได้ ไม่ได้
โดเมนย่อยของสถานี (station.radio.example.th) ได้ ไม่ได้ ไม่ได้
ข้อความจาก LINE และ Telegram ได้ อาจถูกปฏิเสธ ไม่ได้
เครื่องเล่นที่ฝังในเว็บไซต์อื่น ได้ ได้ เฉพาะ IP สาธารณะ ไม่ได้

เปลี่ยนแบบภายหลังได้โดยข้อมูลไม่หาย (ส่วนที่ 15)

3. เตรียม DNS (เฉพาะแบบโดเมน)

ถ้าใช้แบบ IP ข้ามส่วนนี้ได้

DNS บอกทั้งโลกว่าโดเมนของคุณเป็นของหมายเลข IP ไหน แก้ไขได้ที่ที่คุณซื้อโดเมน หรือที่บริการ DNS ของคุณ (เช่น Cloudflare)

ขั้นที่ 3.1: หาหมายเลข IP สาธารณะของเซิร์ฟเวอร์

ดูได้จากแผงควบคุมของผู้ให้บริการคลาวด์ หรือถามเซิร์ฟเวอร์เองหลังเชื่อมต่อในส่วนที่ 4:

curl -4 -s https://api.ipify.org; echo

ควรเห็น: หนึ่งบรรทัดที่เป็นหมายเลข IP เช่น 203.0.113.10

ขั้นที่ 3.2: สร้างระเบียน A

ในบริการ DNS ของคุณ เพิ่มระเบียน:

ช่อง ค่า
Type (ประเภท) A
Name (ชื่อ) radio (สำหรับ radio.example.th) หรือ @ สำหรับตัวโดเมนเอง
Value หรือ Target (ค่า) หมายเลข IP ของเซิร์ฟเวอร์
TTL ค่าเริ่มต้น หรือ 300 วินาที

ถ้าเซิร์ฟเวอร์มี IPv6 ด้วย ให้เพิ่มระเบียน AAAA ชื่อเดียวกัน ถ้าใช้ Cloudflare ช่วงแรกให้ตั้งระเบียนเป็น "DNS only" (ไม่ผ่านพร็อกซี)

ถ้าต้องการให้เปิดได้ทั้งแบบมีและไม่มี www (เช่น example.th และ www.example.th) ให้เพิ่มระเบียน A ชื่อ www ชี้ไปที่ IP เดียวกันด้วย ระบบออกใบรับรอง HTTPS ให้ทั้งสองชื่อและต่ออายุเอง และส่งต่อชื่อที่มี www ไปที่อยู่หลัก (หรือกลับกัน ถ้าที่อยู่หลักมี www) ไม่ต้องตั้งค่าอื่นเพิ่ม

ขั้นที่ 3.3: ไม่บังคับ ระเบียน wildcard สำหรับโดเมนย่อยของสถานี

ทุกสถานีมีที่อยู่แบบ radio.example.th/s/ชื่อสถานี เสมอ ถ้าต้องการ ชื่อสถานี.radio.example.th ด้วย ให้เพิ่มระเบียน A อีกหนึ่งรายการ:

ช่อง ค่า
Type (ประเภท) A
Name (ชื่อ) *.radio (สำหรับ *.radio.example.th)
Value (ค่า) หมายเลข IP ของเซิร์ฟเวอร์

ขั้นที่ 3.4: ตรวจว่า DNS ใช้ได้

รอสักครู่ แล้วรันคำสั่งใดคำสั่งหนึ่งต่อไปนี้บนเซิร์ฟเวอร์ (หรือบนคอมพิวเตอร์ของคุณ)

getent hosts radio.example.th

ควรเห็น: หนึ่งบรรทัดที่ขึ้นต้นด้วยหมายเลข IP ของเซิร์ฟเวอร์

host radio.example.th

ควรเห็น: radio.example.th has address 203.0.113.10

dig +short radio.example.th

ควรเห็น: หมายเลข IP อย่างเดียว

ตรวจระเบียน wildcard ด้วยชื่อใดก็ได้ใต้โดเมนนั้น:

getent hosts test.radio.example.th

ถ้าไม่สำเร็จ: ไม่มีผลลัพธ์แปลว่ายังไม่มีระเบียน การเปลี่ยนแปลงอาจใช้เวลาถึงหนึ่งชั่วโมง บางครั้งนานกว่านั้น ตรวจการสะกดชื่อในบริการ DNS คำสั่ง host และ dig อยู่ในแพ็กเกจ bind9-dnsutils: sudo apt install -y bind9-dnsutils

ติดตั้งต่อก่อน DNS พร้อมก็ได้ ตัวตั้งค่าจะเตือน และใบรับรองจะออกเมื่อ DNS ชี้มาที่เซิร์ฟเวอร์แล้ว

4. เชื่อมต่อเซิร์ฟเวอร์ด้วย SSH

ผู้ให้บริการจะให้ชื่อผู้ใช้ (มักเป็น ubuntu หรือ root) หมายเลข IP และรหัสผ่านหรือไฟล์กุญแจ (key)

4.1 Windows: Windows Terminal หรือ PowerShell

  1. กดปุ่ม Windows พิมพ์ terminal แล้วกด Enter (Windows รุ่นเก่า พิมพ์ powershell)
  2. พิมพ์คำสั่งนี้ โดยใส่ชื่อผู้ใช้และหมายเลข IP ของคุณ แล้วกด Enter:
ssh ubuntu@YOUR-SERVER-IP

ถ้าผู้ให้บริการให้ไฟล์กุญแจ:

ssh -i C:\Users\YOU\Downloads\server-key.pem ubuntu@YOUR-SERVER-IP
  1. ครั้งแรกจะถามว่า "Are you sure you want to continue connecting (yes/no/[fingerprint])?" พิมพ์ yes แล้วกด Enter
  2. พิมพ์รหัสผ่านถ้าถาม ระหว่างพิมพ์จะไม่มีอะไรแสดง

ควรเห็น: ข้อความต้อนรับจาก Ubuntu แล้วตามด้วยบรรทัดพร้อมรับคำสั่งที่ลงท้ายด้วย $ (หรือ # ถ้าเป็น root)

ถ้าไม่สำเร็จ:

  • "Connection timed out": หมายเลข IP ผิด หรือพอร์ต 22 ถูกปิดในไฟร์วอลล์ของผู้ให้บริการ (ส่วนที่ 12)
  • "Permission denied": ชื่อผู้ใช้ รหัสผ่าน หรือกุญแจไม่ถูกต้อง

เคล็ดลับสำหรับ NVDA ใน Windows Terminal:

  • NVDA อ่านข้อความใหม่ให้อัตโนมัติ ถ้าไม่อ่าน ให้ตรวจว่าเปิด "รายงานการเปลี่ยนแปลงของเนื้อหาแบบไดนามิก" (Report dynamic content changes) ไว้ (เมนู NVDA, การตั้งค่า, การตั้งค่า, การนำเสนอวัตถุ)
  • อ่านจอทีละบรรทัดด้วยเคอร์เซอร์ทบทวน: แบบเดสก์ท็อป Numpad 7 (บรรทัดก่อนหน้า) Numpad 8 (บรรทัดปัจจุบัน) Numpad 9 (บรรทัดถัดไป) แบบแล็ปท็อป: NVDA+ลูกศรขึ้น, NVDA+Shift+จุด, NVDA+ลูกศรลง
  • วางคำสั่งที่คัดลอกไว้ด้วย Ctrl+V (หรือ Ctrl+Shift+V)
  • ถ้าต้องการเก็บผลลัพธ์ที่ยาว ให้บันทึกลงไฟล์แล้วอ่านด้วย less: sudo radioctl doctor > ~/doctor.txt 2>&1 แล้ว less ~/doctor.txt
  • JAWS: ใช้เทอร์มินัลเดียวกันได้ ใช้เคอร์เซอร์ JAWS หรือ Insert+ลูกศรขึ้น เพื่ออ่านบรรทัดปัจจุบัน

4.2 Windows: PuTTY

  1. เปิด PuTTY โฟกัสอยู่ที่ช่อง "Host Name (or IP address)" พิมพ์หมายเลข IP
  2. พอร์ตคงไว้ที่ 22 ประเภทการเชื่อมต่อ SSH กด Enter (ปุ่ม Open)
  3. ครั้งแรกจะมีคำเตือนด้านความปลอดภัยเรื่องกุญแจของเครื่อง เลือก "Accept"
  4. ที่ "login as:" พิมพ์ชื่อผู้ใช้แล้วกด Enter จากนั้นพิมพ์รหัสผ่าน

วางข้อความใน PuTTY ด้วย Shift+Insert (หรือคลิกขวา) NVDA อ่าน PuTTY ด้วยเคอร์เซอร์ทบทวนแบบเดียวกับข้อ 4.1 ผู้ใช้โปรแกรมอ่านหน้าจอหลายคนพบว่า Windows Terminal ใช้ง่ายกว่า

4.3 macOS: Terminal

  1. กด Command+Space พิมพ์ terminal แล้วกด Return
  2. พิมพ์ ssh ubuntu@YOUR-SERVER-IP แล้วกด Return ครั้งแรกตอบ yes

ถ้าใช้ VoiceOver ให้เข้าไปโต้ตอบกับข้อความในเทอร์มินัล (VO+Shift+ลูกศรลง) แล้วอ่านทีละบรรทัดด้วย VO+ลูกศรขึ้น และ VO+ลูกศรลง วางข้อความด้วย Command+V

4.4 ไม่บังคับ: เข้าระบบด้วยกุญแจแทนรหัสผ่าน

บนคอมพิวเตอร์ของคุณ (Windows Terminal, PowerShell หรือ Terminal ของ macOS):

ssh-keygen -t ed25519

กด Enter สามครั้งเพื่อใช้ค่าเริ่มต้น แล้วคัดลอกกุญแจไปที่เซิร์ฟเวอร์ บน macOS:

ssh-copy-id ubuntu@YOUR-SERVER-IP

บน Windows PowerShell:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh ubuntu@YOUR-SERVER-IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

ควรเห็น: ครั้งต่อไปที่สั่ง ssh ubuntu@YOUR-SERVER-IP จะไม่ถามรหัสผ่าน

5. อัปเดต Ubuntu

ขั้นที่ 5.1: ตรวจรุ่นของ Ubuntu

grep PRETTY_NAME /etc/os-release

ควรเห็น: PRETTY_NAME="Ubuntu 24.04.1 LTS" หรือ Ubuntu 22.04...

ถ้าไม่สำเร็จ: รุ่นอื่นหรือระบบอื่นยังไม่ได้ทดสอบ ให้ใช้ Ubuntu 22.04 หรือ 24.04

ขั้นที่ 5.2: ติดตั้งอัปเดต

sudo apt update

ควรเห็น: หลายบรรทัดที่ขึ้นต้นด้วย "Hit" หรือ "Get" ท้ายสุดคือ "Reading package lists... Done" และจำนวนแพ็กเกจที่อัปเกรดได้

sudo apt upgrade -y

ควรเห็น: รายการแพ็กเกจที่กำลังติดตั้ง อาจใช้เวลาหลายนาที ถ้ามีคำถามเต็มจอเรื่องการเริ่มบริการใหม่ ให้กด Enter เพื่อใช้ค่าเริ่มต้น

ขั้นที่ 5.3: รีสตาร์ตถ้า Ubuntu ต้องการ

ls /var/run/reboot-required

ถ้าคำตอบเป็นชื่อไฟล์ (ไม่ใช่ "No such file or directory") ให้รีสตาร์ต:

sudo reboot

การเชื่อมต่อ SSH จะหลุด รอหนึ่งนาทีแล้วเชื่อมต่อใหม่ (ส่วนที่ 4)

ขั้นที่ 5.4: ตรวจนาฬิกาและขนาดของเครื่อง

timedatectl

ควรเห็น: บรรทัด "System clock synchronized: yes" ถ้าเป็น no: sudo timedatectl set-ntp true

ไม่บังคับ ตั้งเขตเวลาประเทศไทย:

sudo timedatectl set-timezone Asia/Bangkok

ตรวจ CPU หน่วยความจำ และดิสก์:

nproc
free -h
df -h /

ควรเห็น: nproc บอกจำนวนคอร์ ใน free -h บรรทัด "Mem:" ตัวเลขแรกคือหน่วยความจำทั้งหมด ใน df -h / คอลัมน์ "Avail" คือพื้นที่ว่าง

ถ้าเครื่องมีหน่วยความจำน้อยกว่า 4 GB ให้เพิ่ม swap ก่อนทำต่อ (ดูสร้างอิมเมจไม่สำเร็จเพราะหน่วยความจำไม่พอ)

6. ติดตั้งแพ็กเกจ

แพ็กเกจคือไฟล์ radio_1.2.4_all.deb จากหน้า Release ของวิทยุออนไลน์ ที่อยู่ของหน้า Release ได้จากผู้ให้บริการวิทยุออนไลน์ของคุณ เช่น https://github.com/OWNER/REPO/releases ในคำสั่งด้านล่าง ให้เปลี่ยน OWNER/REPO เป็นที่เก็บนั้น และเปลี่ยน 1.2.4 เป็นเวอร์ชันที่จะติดตั้ง

ขั้นที่ 6.1: ดาวน์โหลดแพ็กเกจและไฟล์ตรวจสอบ

cd ~
curl -fLO https://github.com/OWNER/REPO/releases/download/v1.2.4/radio_1.2.4_all.deb
curl -fLO https://github.com/OWNER/REPO/releases/download/v1.2.4/SHA256SUMS

ควรเห็น: บรรทัดแสดงความคืบหน้าของแต่ละไฟล์ และไม่มีข้อผิดพลาด ตรวจด้วย ls -l: ต้องเห็น radio_1.2.4_all.deb (ไม่ถึง 1 MB) และ SHA256SUMS

ถ้าไม่สำเร็จ: "404" แปลว่าที่อยู่หรือเวอร์ชันผิด ให้คัดลอกลิงก์จากหน้า Release

ขั้นที่ 6.2: ตรวจไฟล์ที่ดาวน์โหลด

sha256sum -c SHA256SUMS --ignore-missing

ควรเห็น: radio_1.2.4_all.deb: OK

ถ้าไม่สำเร็จ: "FAILED" แปลว่าไฟล์เสียหายหรือไม่ใช่ไฟล์จริง ลบทิ้ง (rm radio_1.2.4_all.deb) แล้วดาวน์โหลดใหม่ ห้ามติดตั้งไฟล์ที่ไม่ผ่านการตรวจนี้

ขั้นที่ 6.3: ติดตั้ง

sudo apt install -y ./radio_1.2.4_all.deb

./ ด้านหน้าสำคัญ: บอก apt ให้ใช้ไฟล์ในโฟลเดอร์นี้ apt จะติดตั้งสิ่งที่แพ็กเกจต้องใช้จาก Ubuntu ด้วย: curl, openssl, iproute2 และเครื่องมือไฟร์วอลล์ ufw

ควรเห็น ท้ายสุด:

วิทยุออนไลน์ 1.2.4: ติดตั้งไฟล์ใน /opt/radio แล้ว ยังไม่มีบริการใดเริ่มทำงาน
ขั้นต่อไป: ตั้งค่าและเริ่มระบบด้วยคำสั่ง
  sudo radio-setup

ข้อความเดียวกันแสดงเป็นภาษาอังกฤษด้วย การติดตั้งแพ็กเกจใช้เวลาประมาณ 10 วินาที และยังไม่เริ่มอะไรเลย

บรรทัด "Download is performed unsandboxed as root" เป็นเพียงข้อสังเกต ไม่ต้องสนใจ

ถ้าไม่สำเร็จ:

  • "Unable to locate package": ลืมพิมพ์ ./
  • "is a git checkout" หรือ "เป็นสำเนา git": /opt/radio มีสำเนา git ของซอร์สโค้ด ย้ายออกก่อน: sudo mv /opt/radio /opt/radio.old

ขั้นที่ 6.4: ตรวจการติดตั้ง

cat /opt/radio/VERSION
radioctl help | head -n 3

ควรเห็น: 1.2.4 แล้วตามด้วยบรรทัดแรก ๆ ของคำอธิบาย radioctl

แพ็กเกจติดตั้ง:

  • โฟลเดอร์ /opt/radio (แม่แบบไฟล์ตั้งค่า ไฟล์ Docker Compose สคริปต์ คู่มือ และซอร์สโค้ด)
  • คำสั่ง radio-setup (ตั้งค่า) radioctl (ดูแลระบบ) และ radio (คำสั่งผู้ดูแลระบบ)
  • คู่มือนี้เป็นไฟล์ข้อความธรรมดา: /opt/radio/INSTALL-UBUNTU.th.txt และ /opt/radio/INSTALL-UBUNTU.en.txt

อ่านบนเซิร์ฟเวอร์ได้ทุกเมื่อ:

less /opt/radio/INSTALL-UBUNTU.th.txt

6.5 วิธีอื่นในการได้ไฟล์

ทั้งสามวิธีได้ไฟล์ใน /opt/radio เหมือนกันทุกประการ เลือกใช้วิธีเดียว

ตัวติดตั้งบรรทัดเดียว ดาวน์โหลดไฟล์รุ่นแล้วเริ่มตั้งค่าทันที:

curl -fsSL https://github.com/OWNER/REPO/releases/latest/download/install.sh | sudo bash

ไฟล์รุ่น radio-1.2.4.tar.gz แตกไฟล์เอง:

sudo mkdir -p /opt/radio
sudo tar xzf radio-1.2.4.tar.gz -C /opt/radio --strip-components=1
sudo bash /opt/radio/scripts/install.sh

ถ้าไม่ใช้แพ็กเกจ ให้ใช้ sudo bash /opt/radio/scripts/install.sh ทุกที่ที่คู่มือนี้เขียนว่า sudo radio-setup หลังรันครั้งแรกจะมีคำสั่ง radio-setup, radioctl และ radio ให้ใช้เช่นกัน ถ้าใช้แพ็กเกจ apt จะอัปเดตไฟล์ให้ (ส่วนที่ 14) จึงแนะนำให้ใช้แพ็กเกจ

7. ตั้งค่าด้วย sudo radio-setup

sudo radio-setup

ตัวตั้งค่าจะถามทีละคำถาม แต่ละคำถามแสดงค่าเริ่มต้นในวงเล็บ เช่น "(ค่าเริ่มต้น: small)" กด Enter อย่างเดียวเพื่อใช้ค่าเริ่มต้น คำถามแบบใช่หรือไม่ ตอบ y หรือ n

ถ้าต้องการเก็บสำเนาทุกอย่างที่แสดง ให้รันแบบนี้แทน:

sudo radio-setup 2>&1 | tee ~/radio-setup.log

คำถาม: ภาษา

"เลือกภาษา / Choose a language: พิมพ์ 1 สำหรับภาษาไทย, type 2 for English, then press Enter." พิมพ์ 1 สำหรับภาษาไทย หรือ 2 สำหรับภาษาอังกฤษ

ส่วนที่ 1/8: ตรวจเครื่องเซิร์ฟเวอร์

ไม่มีคำถาม รายงานระบบปฏิบัติการ CPU หน่วยความจำ พื้นที่ว่าง และนาฬิกา

ถ้าไม่สำเร็จ:

  • "พื้นที่ว่างน้อยกว่า 10 GB": ขยายดิสก์ก่อน
  • "ต้องรันด้วยสิทธิ์ root": ลืมพิมพ์ sudo

ส่วนที่ 2/8: ขนาดของระบบ

"เครื่องนี้เหมาะกับโปรไฟล์ small พิมพ์ small, medium หรือ large (ค่าเริ่มต้น: small)" กด Enter เพื่อยอมรับ เลือกโปรไฟล์ใหญ่ขึ้นเฉพาะบนเครื่องที่ใหญ่ขึ้น ถ้าเลือกใหญ่เกินเครื่อง จะถามให้ยืนยัน

ส่วนที่ 3/8: Docker

ไม่มีคำถาม ถ้ายังไม่มี Docker จะติดตั้ง Docker Engine และ Docker Compose จากคลังของ Docker เอง ถ้าติดต่อคลังนั้นไม่ได้ จะใช้แพ็กเกจของ Ubuntu (docker.io และ docker-compose-v2) แทน ถ้ามี Docker อยู่แล้ว (ของ Docker หรือของ Ubuntu) จะใช้ตัวที่มี ขั้นนี้ใช้เวลาหนึ่งถึงสามนาที

ส่วนที่ 4/8: ที่อยู่ของแพลตฟอร์ม

"เลือกวิธีเข้าถึงแพลตฟอร์ม:" ตามด้วยสามตัวเลือก พิมพ์ 1 (โดเมน) 2 (IP แบบ HTTPS) หรือ 3 (IP แบบ HTTP ธรรมดา) ค่าเริ่มต้นคือ 1 ดูส่วนที่ 2

ถ้าเลือก 1 โดเมน:

  • "โดเมนของแพลตฟอร์ม เช่น radio.example.th": พิมพ์โดเมนของคุณ
  • "ใช้โดเมนย่อยของสถานีหรือไม่": ตอบ y เฉพาะเมื่อสร้างระเบียน wildcard ในขั้นที่ 3.3 แล้ว ค่าเริ่มต้น: ไม่ใช้
  • "โดเมนแยกสำหรับสตรีมเสียง (ไม่บังคับ...)": กด Enter สตรีมจะอยู่ที่ https://โดเมนของคุณ/stream/ชื่อสถานี
  • จากนั้นตรวจ DNS "DNS ของ radio.example.th ชี้มาที่เครื่องนี้" แปลว่าเรียบร้อย ถ้า DNS ยังไม่พร้อม จะถามว่า "ติดตั้งต่อหรือไม่" พิมพ์ y แล้วแก้ DNS ภายหลัง

ถ้าเลือก 2 หรือ 3 หมายเลข IP:

  • "หมายเลข IP ที่ผู้ใช้จะพิมพ์ในเบราว์เซอร์ (ค่าเริ่มต้น: ...)": เสนอหมายเลขที่ตรวจพบ กด Enter หรือพิมพ์หมายเลขที่ถูกต้อง
  • ถ้าเลือก 2 และเป็น IP สาธารณะ จะอธิบายเรื่องใบรับรอง Let's Encrypt สำหรับ IP (อายุประมาณ 6 วัน ต่ออายุเอง พอร์ต 80 และ 443 ต้องเปิดไว้ตลอด)
  • ถ้าเลือก 3 จะเตือนว่า HTTP ธรรมดาไม่เข้ารหัส แล้วถามว่า "ใช้ HTTP ธรรมดาต่อไปหรือไม่" พิมพ์ y

คำถามสุดท้ายของส่วนนี้ มีในทุกแบบ: "ชื่อเครื่องหรือ IP ที่ดีเจใช้เชื่อมต่อ BUTT หรือ OBS (ค่าเริ่มต้น: ...)": กด Enter

ส่วนที่ 5/8: อีเมล

  • "อีเมลผู้ดูแลระบบ": พิมพ์อีเมลของคุณ ใช้ในหน้าตั้งค่าบนเว็บและกับ Let's Encrypt
  • "เซิร์ฟเวอร์อีเมลสำหรับส่งรหัสเข้าสู่ระบบ รูปแบบ smtp://ผู้ใช้:รหัสผ่าน@โฮสต์:587 (เว้นว่างได้...)": กด Enter เพื่อข้าม หรือพิมพ์ที่อยู่ SMTP ของคุณ ตัวอย่าง: smtp://radio%40example.th:MyPassword@smtp.example.th:587 ถ้าชื่อผู้ใช้มี @ ให้เขียนเป็น %40 ส่วนที่ 11 อธิบายเรื่องนี้

ส่วนที่ 6/8: การสำรองข้อมูล

  • "โฟลเดอร์เก็บข้อมูลสำรองบนเครื่องนี้ (ค่าเริ่มต้น: /var/backups/radio)": กด Enter
  • "สำรองข้อมูลไปที่ S3 ด้วยหรือไม่": ตอบ n ไปก่อน หรือ y ถ้ามีบักเก็ต S3 (Amazon S3, Cloudflare R2, Wasabi, MinIO) แล้วจะถาม:
    • ที่อยู่คลัง เช่น s3:https://s3.ap-southeast-1.amazonaws.com/my-bucket/radio
    • Access key ID
    • Secret access key (ระหว่างพิมพ์จะไม่แสดง)
    • Region เช่น ap-southeast-1

เพิ่ม S3 ภายหลังได้ (ส่วนที่ 13)

ส่วนที่ 7/8: เขียนไฟล์ตั้งค่า

ไม่มีคำถาม สร้างรหัสผ่านและรหัสลับทั้งหมด แล้วเขียนลง /opt/radio/.env ไฟล์นี้อ่านได้เฉพาะ root จากนั้นแสดงบรรทัดสรุป: ที่อยู่ ที่อยู่สตรีม และพอร์ตดีเจ

ส่วนที่ 8/8: เตรียมอิมเมจและเริ่มระบบ

ไม่มีคำถาม เตรียมอิมเมจของโปรแกรมแล้วเริ่มทุกบริการ:

  • ถ้ารุ่นนี้มีอิมเมจที่เผยแพร่ไว้ จะดาวน์โหลด (ประมาณ 1 GB)
  • ถ้าไม่มี เซิร์ฟเวอร์จะสร้างอิมเมจเองจากซอร์สโค้ดใน /opt/radio ข้อความจะแสดงขั้นตอนการสร้าง

จากนั้น "กำลังรอให้ทุกบริการพร้อม (ไม่เกิน 5 นาที)" และ "เรียบร้อย: ทุกบริการทำงานแล้ว"

ท้ายสุด "ขั้นต่อไป:" บอกที่อยู่ของหน้าตั้งค่าบนเว็บ เช่น:

2. เปิด http://192.168.1.20/install ทันที แล้วสร้างผู้ดูแลระบบด้วยอีเมล admin@example.th

ถ้าไม่สำเร็จ:

รัน sudo radio-setup ซ้ำได้เสมอโดยปลอดภัย รหัสผ่านและข้อมูลทั้งหมดยังอยู่ และคำตอบเดิมจะเป็นค่าเริ่มต้น

ระหว่างติดตั้งเกิดอะไรขึ้น และใช้เวลาเท่าไร

ขั้นตอน เวลา
ติดตั้งแพ็กเกจ (ขั้นที่ 6.3) ประมาณ 10 วินาที
ติดตั้ง Docker ถ้ายังไม่มี 1 ถึง 3 นาที
ดาวน์โหลดอิมเมจที่เผยแพร่ไว้ 2 ถึง 10 นาที ขึ้นกับความเร็วอินเทอร์เน็ต
สร้างอิมเมจบนเซิร์ฟเวอร์ครั้งแรก เครื่องเล็ก (2 vCPU) ประมาณ 5 ถึง 15 นาที
สร้างใหม่หลังแก้ไขเล็กน้อย (มีแคช) ประมาณ 1 ถึง 3 นาที
เริ่มบริการและตรวจสุขภาพ ประมาณ 1 นาที

วัดบนเครื่องทดสอบ 2 vCPU 8 GB, Ubuntu 24.04, โหมด HTTP ธรรมดา, สร้างอิมเมจบนเครื่อง:

  • sudo radio-setup ทั้งหมดใช้เวลา 2 นาที 25 วินาที (ชั้นพื้นฐานมีในแคชแล้ว)
  • การสร้างอิมเมจทั้งหมดโดยไม่มีแคชใช้เวลา 3 นาที บนอินเทอร์เน็ตความเร็วสูง

ถ้าอินเทอร์เน็ตช้ากว่า หรือเครื่องมีหน่วยความจำ 4 GB จะใช้เวลานานกว่า: เผื่อไว้ถึง 15 นาที

การสร้างอิมเมจต้องมีหน่วยความจำอย่างน้อย 4 GB หรือหน่วยความจำ 2 GB กับ swap 2 GB

แบบไม่ถามคำถาม

ใส่คำตอบทั้งหมดเป็นตัวเลือกได้ ตัวอย่าง:

sudo radio-setup --yes --lang th --mode domain --domain radio.example.th --email admin@example.th
sudo radio-setup --yes --lang th --mode ip-https --ip 203.0.113.10 --email admin@example.th
sudo radio-setup --yes --lang th --mode ip-http --ip 192.168.1.20 --email admin@example.th

sudo radio-setup --help แสดงตัวเลือกทั้งหมด ภาคผนวก อธิบายแต่ละตัว

8. ตั้งค่าครั้งแรกในเว็บ

ทำทันที: ก่อนจะมีผู้ดูแลระบบ ใครก็ตามที่เปิดหน้านี้ได้ก่อนจะสร้างผู้ดูแลได้

ขั้นที่ 8.1: เปิดหน้าตั้งค่า

ในเบราว์เซอร์ เปิดที่อยู่ที่ตัวตั้งค่าแสดง ซึ่งลงท้ายด้วย /install:

  • โดเมน: https://radio.example.th/install
  • IP แบบ HTTPS: https://203.0.113.10/install
  • IP แบบ HTTP ธรรมดา: http://192.168.1.20/install (เติม :พอร์ต ถ้าเลือกพอร์ต HTTP อื่น)

ควรเห็น: หน้าชื่อ "ติดตั้งแพลตฟอร์มวิทยุ"

ถ้าไม่สำเร็จ:

  • เปิดหน้าไม่ได้: ไฟร์วอลล์หรือ security group ของคลาวด์ปิดพอร์ต 80 หรือ 443 (ส่วนที่ 12) บนเซิร์ฟเวอร์ คำสั่ง curl -sI http://localhost/install | head -n 1 ควรตอบบรรทัดที่ขึ้นต้นด้วย HTTP/1.1: 200 ก่อนตั้งค่าในเว็บ 303 หลังตั้งค่าแล้ว หรือ 308 (เปลี่ยนไปใช้ HTTPS) ในโหมด HTTPS ถ้าไม่มีคำตอบเลย แปลว่าแพลตฟอร์มไม่ได้ทำงาน: sudo radioctl status
  • เตือนเรื่องใบรับรองในแบบโดเมน: DNS ยังไม่ชี้มาที่เซิร์ฟเวอร์ หรือพอร์ต 80 และ 443 ปิดอยู่ รอสักครู่ แล้วตรวจด้วย sudo radioctl doctor
  • เตือนเรื่องใบรับรองเมื่อใช้ IP ส่วนตัว: เป็นเรื่องปกติ Caddy ออกใบรับรองเอง ให้ดำเนินการต่อ หรือติดตั้งใบรับรองหลักของ Caddy (คู่มือการติดตั้ง)
  • หน้าเปลี่ยนไปหน้าแรก: แพลตฟอร์มตั้งค่าไปแล้ว ให้เข้าสู่ระบบแทน (ส่วนที่ 9)

ขั้นที่ 8.2: อ่านผลการตรวจระบบ

ส่วนแรก หัวข้อ "ตรวจความพร้อมของระบบ" เป็นตาราง: ส่วนประกอบ สถานะ รายละเอียด PostgreSQL, โครงสร้างฐานข้อมูล (migration), Storage และ FFmpeg ต้อง "ผ่าน" คำเตือนเหล่านี้เป็นเรื่องปกติหลังเพิ่งเริ่มระบบ:

  • "ระบบออกอากาศ (worker และ Liquidsoap)": "ยังไม่มี worker รายงานสถานะ" จะเริ่มภายในหนึ่งนาที
  • "อีเมล (SMTP)": "ยังไม่ได้ตั้ง" เมื่อข้าม SMTP
  • "ที่อยู่สาธารณะ": หมายเหตุเรื่อง http ที่ไม่เข้ารหัส ในโหมด HTTP ธรรมดา

ขั้นที่ 8.3: กรอกแบบฟอร์ม

ส่วนที่สอง หัวข้อ "สร้างผู้ดูแลระบบ" ถ้าใช้โปรแกรมอ่านหน้าจอ กระโดดไปด้วยปุ่มหัวข้อ (H ในโหมดเรียกดูของ NVDA และ JAWS)

ช่อง กรอกอะไร
ชื่อแพลตฟอร์ม ชื่อที่ผู้ใช้เห็นทุกหน้า ค่าเริ่มต้น: วิทยุออนไลน์ เปลี่ยนภายหลังได้ที่หน้าภาพรวมของผู้ดูแลระบบ
ชื่อที่แสดงของผู้ดูแล ชื่อของคุณ
อีเมลผู้ดูแล อีเมลของคุณ ใช้เข้าสู่ระบบ

กลุ่ม "สถานีแรก (ไม่บังคับ)" กรอกครบทั้งสามช่อง หรือไม่กรอกเลย:

ช่อง กรอกอะไร
ชื่อองค์กร องค์กรของคุณ เช่น "เซนต์ เทคโนโลยี"
ชื่อสถานี ชื่อสถานี เช่น "SAINT FM"
ชื่อย่อสถานีในลิงก์ ตัวอักษรภาษาอังกฤษพิมพ์เล็ก ตัวเลข และขีดกลาง 2 ถึง 41 ตัว เช่น saint-fm เป็นส่วนหนึ่งของที่อยู่สถานีและสตรีม ลงท้ายด้วย -low หรือ -phone ไม่ได้

กดปุ่ม "ติดตั้ง"

ควรเห็น: คุณเข้าสู่ระบบแล้ว และหน้า "ศูนย์ควบคุมแพลตฟอร์ม" เปิดขึ้นพร้อมข้อความ "ติดตั้งเสร็จแล้ว ยินดีต้อนรับสู่ศูนย์ควบคุมแพลตฟอร์ม"

ถ้าไม่สำเร็จ: สรุปข้อผิดพลาดด้านบนแบบฟอร์มบอกแต่ละปัญหา พร้อมลิงก์ไปที่ช่องนั้น แก้แล้วกด "ติดตั้ง" อีกครั้ง

อีกวิธีในการสร้างผู้ดูแลระบบ บนเซิร์ฟเวอร์:

sudo radio create-admin you@example.th

9. เข้าสู่ระบบ

  1. เปิดที่อยู่ของแพลตฟอร์ม แล้วเลือก "เข้าสู่ระบบ" (ที่อยู่ /login)
  2. พิมพ์อีเมล แล้วกดปุ่มเพื่อขอรหัส
  3. หน้าเว็บบอกว่า "เราส่งรหัส 6 หลักไปที่ ... แล้ว รหัสใช้ได้ 15 นาที"
  4. พิมพ์รหัสจากอีเมลแล้วยืนยัน

ถ้าไม่มี SMTP ให้อ่านรหัสบนเซิร์ฟเวอร์:

sudo radioctl outbox

ควรเห็น: อีเมล 5 ฉบับล่าสุด ฉบับละ 1–3 บรรทัดสั้น ๆ คือ เวลา ผู้รับ และหัวเรื่อง ถ้ามีรหัสจะมีบรรทัด "รหัส: 482913 (ทีละตัว: 4 8 2 9 1 3)" และบรรทัด "ลิงก์เข้าสู่ระบบ" บรรทัดสุดท้ายบอกว่าคัดลอกรหัสล่าสุดไว้ในคลิปบอร์ดแล้ว กลับไปที่ช่อง "รหัส 6 หลัก" ในเบราว์เซอร์แล้วกด Ctrl+V ได้เลย ไม่ต้องอ่านรหัสจากหน้าจอเทอร์มินัล

  • sudo radioctl outbox 1 แสดงเฉพาะฉบับล่าสุด
  • sudo radioctl outbox admin@example.th แสดงเฉพาะอีเมลถึงที่อยู่นี้
  • sudo radioctl outbox --full แสดงข้อความเต็มของแต่ละฉบับ
  • sudo radioctl outbox --no-copy ไม่คัดลอก

การคัดลอกเข้าคลิปบอร์ด (outbox และ login-link):

  • ต่อเซิร์ฟเวอร์ด้วย SSH จาก Windows: ใช้ Windows Terminal (มีใน Windows 11 และติดตั้งจาก Microsoft Store ได้ใน Windows 10) แล้วพิมพ์ ssh ชื่อผู้ใช้@ที่อยู่เซิร์ฟเวอร์ ข้อความจะเข้าคลิปบอร์ดของ Windows
  • PuTTY ไม่รองรับ การคัดลอกแบบนี้ ถ้าใช้ PuTTY ให้ใช้รหัสแบบทีละตัวในบรรทัด "ทีละตัว" แทน หรือเปลี่ยนไปใช้ Windows Terminal
  • ใช้หน้าจอบนเครื่องเซิร์ฟเวอร์เอง (Ubuntu Desktop): ติดตั้งเครื่องมือคลิปบอร์ดก่อน sudo apt install wl-clipboard xclip
  • โปรแกรมไม่สามารถตรวจได้ว่าการคัดลอกผ่านเทอร์มินัลสำเร็จหรือไม่ ถ้ากด Ctrl+V แล้วไม่มีอะไร แปลว่าโปรแกรมเทอร์มินัลไม่รองรับ

ถ้าไม่สำเร็จ: "No such service" หรือไม่มีอะไรเลย แปลว่าแพลตฟอร์มไม่ได้ทำงาน ตรวจด้วย sudo radioctl status

10. ตรวจครั้งแรก

ขั้นที่ 10.1: สถานะ

sudo radioctl status

ควรเห็น เป็นส่วน ๆ:

  • "== บริการ": แต่ละบริการ เช่น app: running, Up 5 minutes (healthy) บริการมี app, backup, caddy, db, engine-net, icecast และ worker
  • "== การใช้ทรัพยากร (ตอนนี้)": CPU และหน่วยความจำของแต่ละคอนเทนเนอร์
  • "== สถานี": เช่น "สถานีที่เปิดอยู่ 1 จาก 5 ที่โปรไฟล์ small รองรับ"
  • "== การสำรองข้อมูลล่าสุด", "== เวอร์ชัน", ที่อยู่ และพื้นที่ว่างบนดิสก์

ขั้นที่ 10.2: ตรวจปัญหา (doctor)

sudo radioctl doctor

ตรวจไฟล์ตั้งค่า บริการ ดิสก์ นาฬิกา DNS ใบรับรอง พอร์ตดีเจฐานข้อมูล และการสำรองข้อมูล แต่ละปัญหาแสดงเป็น "ปัญหา:" และบรรทัด "วิธีแก้:" พร้อมคำสั่งที่ต้องรัน ควรเห็น ท้ายสุด: "เรียบร้อย: ไม่พบปัญหา"

หลังติดตั้งใหม่ มักรายงานว่า "ยังไม่เคยสำรองข้อมูล" ให้สำรองครั้งแรก:

sudo radioctl backup

ควรเห็น: "เรียบร้อย: สำรองข้อมูลเสร็จ" แล้วรัน doctor อีกครั้ง

บรรทัด "หมายเหตุ: ยังไม่ได้ตั้งเซิร์ฟเวอร์อีเมล" เป็นแค่หมายเหตุ ไม่ใช่ปัญหา

ขั้นที่ 10.3: ฟังสตรีม

ที่อยู่สตรีมคือที่อยู่ของแพลตฟอร์ม ตามด้วย /stream/ แล้วตามด้วยชื่อย่อสถานี เช่น https://radio.example.th/stream/saint-fm หรือ http://192.168.1.20/stream/saint-fm

บนเซิร์ฟเวอร์:

curl -s -o /dev/null --max-time 5 -w '%{http_code} %{size_download}\n' http://localhost/stream/saint-fm

ในโหมด HTTPS ใช้ที่อยู่แบบ HTTPS และเติมพอร์ตถ้าไม่ใช่ 80 ควรเห็น: 200 ตามด้วยจำนวนไบต์ที่มากกว่า 0 curl หยุดหลัง 5 วินาที ซึ่งเป็นเรื่องปกติของสตรีม

บนคอมพิวเตอร์ของคุณ: เปิดที่อยู่สตรีมในเบราว์เซอร์ หรือใน VLC (Ctrl+N "Open network stream" วางที่อยู่ แล้ว Enter) สถานีใหม่ยังไม่มีเพลง: จะได้ยินเสียงสัญญาณรอหรือความเงียบ จนกว่าจะอัปโหลดเพลงในหน้าผู้ดูแลสถานี (คู่มือผู้ดูแลสถานี)

ขั้นที่ 10.4: ทดสอบดีเจด้วย BUTT

  1. ในเว็บแอป เปิดหน้าผู้ดูแลสถานี: "จัดการสถานี" แล้ว "การออกอากาศสด"
  2. กด "สร้างข้อมูลเข้าออกอากาศ" จดที่อยู่เซิร์ฟเวอร์ พอร์ต ชื่อผู้ใช้ และรหัสผ่าน (รหัสผ่านแสดงครั้งเดียว)
  3. ใน BUTT: Settings แท็บ Main ใต้ Server กด ADD เลือก Type: Icecast ใส่ Address และ Port จากข้อ 2 Password จากข้อ 2 Icecast mountpoint: live Icecast user: ชื่อผู้ใช้ แล้วกด ADD
  4. แท็บ Audio: codec MP3, bitrate 128k, sample rate 44100, stereo
  5. ปิดหน้าตั้งค่า แล้วกด Play (ปุ่มแรก)

ควรเห็น: BUTT บอกว่าเชื่อมต่อแล้ว และสตรีมจากขั้นที่ 10.3 เล่นเสียงของคุณภายในไม่กี่วินาที กด Stop เพื่อจบ

พอร์ตดีเจของสถานีแรกคือพอร์ตแรกของช่วง (ค่าเริ่มต้น 8100) ตรวจจากคอมพิวเตอร์ของคุณว่าพอร์ตเปิด ใน PowerShell:

Test-NetConnection YOUR-SERVER-IP -Port 8100

ควรเห็น: "TcpTestSucceeded : True" บน macOS หรือ Linux: nc -vz YOUR-SERVER-IP 8100

ถ้าไม่สำเร็จ: ดูดีเจเชื่อมต่อไม่ได้ รายละเอียดทั้งหมดอยู่ในคู่มือดีเจ

11. ตั้งค่าอีเมล (SMTP) หลังติดตั้ง

ต้องมีข้อมูลจากผู้ให้บริการอีเมล: ชื่อเซิร์ฟเวอร์ พอร์ต (ปกติ 587) ชื่อผู้ใช้ และรหัสผ่าน ผู้ให้บริการหลายรายให้ใช้ "รหัสผ่านสำหรับแอป" (app password) แทนรหัสผ่านปกติ (บัญชี Google และ Microsoft ที่เปิดการยืนยันสองขั้น)

ผู้ให้บริการ เซิร์ฟเวอร์ พอร์ต
Google Workspace หรือ Gmail smtp.gmail.com 587
Microsoft 365 smtp.office365.com 587
Amazon SES (สิงคโปร์) email-smtp.ap-southeast-1.amazonaws.com 587

เขียนเป็นที่อยู่เดียว: smtp://USER:PASSWORD@SERVER:587 อักขระในชื่อผู้ใช้หรือรหัสผ่านต้องเข้ารหัส: @ เป็น %40, : เป็น %3A, / เป็น %2F, # เป็น %23, ช่องว่างเป็น %20 ตัวอย่าง: ผู้ใช้ radio@example.th รหัสผ่าน Pa:ss จะได้ smtp://radio%40example.th:Pa%3Ass@smtp.example.th:587

ขั้นที่ 11.1: ตั้งด้วย radio-setup

วิธีที่ง่ายที่สุดคือรันตัวตั้งค่าอีกครั้งพร้อมค่าใหม่ ค่าอื่นทั้งหมดคงเดิม:

sudo radio-setup --yes --smtp-url 'smtp://radio%40example.th:APP-PASSWORD@smtp.example.th:587'

ต้องมีเครื่องหมายคำพูดเดี่ยวครอบที่อยู่ ควรเห็น: ส่วนต่าง ๆ เหมือนครั้งก่อน และจบด้วย "เรียบร้อย: ทุกบริการทำงานแล้ว"

อีกวิธี: แก้ /opt/radio/.env ด้วยโปรแกรมแก้ไขข้อความ (sudo nano /opt/radio/.env) แก้บรรทัด SMTP_URL= และ MAIL_FROM= บันทึก แล้วรัน sudo radioctl up

MAIL_FROM คือผู้ส่ง เช่น MAIL_FROM='Online Radio <no-reply@example.th>' ผู้ให้บริการหลายรายรับเฉพาะที่อยู่ผู้ส่งที่เป็นโดเมนของคุณเอง

ขั้นที่ 11.2: ทดสอบ

ออกจากระบบ แล้วเข้าสู่ระบบใหม่ (ส่วนที่ 9) รหัสควรมาถึงทางอีเมลภายในหนึ่งนาที ตรวจโฟลเดอร์สแปมด้วย

ถ้าไม่สำเร็จ: ดูอีเมลไม่มาถึง

ขั้นที่ 11.3: Gmail, Microsoft 365 และบัญชีที่เปิดการยืนยันหลายขั้น

บัญชีที่เปิดการยืนยันหลายขั้น (2-Step Verification) ไม่รับรหัสผ่านปกติ จากโปรแกรมอื่นเลย ไม่ว่าจะตั้งค่าอย่างไร นี่เป็นนโยบายของ Google และ Microsoft ตั้งในหน้าเว็บ ผู้ดูแลระบบ › อีเมล เลือกวิธีใดวิธีหนึ่ง:

วิธีที่แนะนำ: เชื่อมบัญชีอีเมลแบบง่าย (มีเมื่อแพลตฟอร์มมีแอปกลางของวิทยุออนไลน์ ดู docs/mail-oauth-apps.th.md)

  • Microsoft (Outlook, Hotmail, Microsoft 365):
    1. กด เชื่อมบัญชี Microsoft
    2. หน้าจอแสดงรหัสสั้น ๆ เช่น ABCD-EFGH (มีปุ่มคัดลอก และอ่านทีละตัวให้)
    3. เปิด microsoft.com/devicelogin ใส่รหัส เข้าสู่ระบบด้วยบัญชีที่จะใช้ส่ง ยืนยันสองขั้นตามปกติ แล้วกด Accept
    4. กลับมาที่หน้าเดิม ภายในไม่กี่วินาทีจะได้ยินว่า "เชื่อมบัญชี ... แล้ว และส่งอีเมลทดสอบไปที่ ... สำเร็จ"
  • Google (Gmail, Google Workspace):
    1. กด เชื่อมบัญชี Google แล้วกดลิงก์ เข้าสู่ระบบด้วย Google
    2. เข้าสู่ระบบและกดอนุญาต
    3. เบราว์เซอร์ขึ้นว่าเปิดหน้าไม่ได้ ซึ่งเป็นเรื่องปกติ กด Alt+D แล้ว Ctrl+C กลับมาวางในช่อง แล้วกด เชื่อมต่อ ทดสอบ และบันทึก

ไม่ต้องรู้ชื่อเซิร์ฟเวอร์ พอร์ต หรือรหัสผ่านใด ๆ และแพลตฟอร์มไม่เห็นรหัสผ่านของบัญชี

วิธีที่ 1: รหัสผ่านสำหรับแอป (Gmail ส่วนตัว)

  1. เปิด https://myaccount.google.com/apppasswords ด้วยบัญชี Gmail ที่จะใช้ส่ง (ถ้าไม่มีหน้านี้ ให้เปิดการยืนยันแบบ 2 ขั้นตอนก่อน)
  2. ตั้งชื่อ เช่น วิทยุออนไลน์ แล้วกดสร้าง Google แสดงรหัส 16 ตัวอักษร เป็นกลุ่มละ 4 ตัว
  3. ในหน้า ผู้ดูแลระบบ › อีเมล เลือก Gmail ชื่อผู้ใช้ใส่อีเมล Gmail เต็ม รหัสผ่านวางรหัส 16 ตัวนั้น (มีช่องว่างก็ได้ ระบบตัดให้) แล้วกด ทดสอบและบันทึก
  4. ถ้าระบบขอยืนยันตัวตนก่อนบันทึก ยืนยันแล้วกด ทำรายการต่อ ได้เลย ไม่ต้องพิมพ์รหัสผ่านซ้ำ
  5. ถ้าใส่รหัสผ่านปกติของ Gmail หน้านั้นจะเตือนทันทีว่ารหัสผ่านสำหรับแอปต้องมี 16 ตัวอักษร
  6. เปลี่ยนรหัสผ่าน Google เมื่อไร รหัสผ่านสำหรับแอปเดิมจะใช้ไม่ได้ ต้องสร้างใหม่

วิธีที่ 2: เข้าสู่ระบบด้วยบัญชี Google หรือ Microsoft (OAuth ไม่ใช้รหัสผ่าน)

ใช้เมื่อไม่มีเมนูรหัสผ่านสำหรับแอป (ผู้ดูแล Google Workspace ปิดไว้) หรือใช้ Microsoft 365 (Microsoft กำลังเลิกรับรหัสผ่านสำหรับ SMTP: ปิดเป็นค่าเริ่มต้นตั้งแต่ปลายเดือนธันวาคม 2026 และจะประกาศวันเลิกถาวรในครึ่งหลังของปี 2027)

  1. ในหน้า ผู้ดูแลระบบ › อีเมล ส่วน "เข้าสู่ระบบด้วยบัญชี Google หรือ Microsoft" คัดลอก ที่อยู่สำหรับส่งกลับ (Redirect URI) ไว้ (มีปุ่มคัดลอก)
  2. Google: เปิด https://console.cloud.google.com สร้างโปรเจกต์ แล้วไปที่ APIs & Services
    • OAuth consent screen: เลือก External กรอกชื่อแอปและอีเมล แล้วกด Publish app (ถ้าค้างไว้ที่ Testing การอนุญาตหมดอายุทุก 7 วัน)
    • Credentials › Create credentials › OAuth client ID › ชนิด Web application › Authorized redirect URIs วางที่อยู่จากข้อ 1 › Create
    • คัดลอก Client ID และ Client secret
  3. Microsoft: เปิด https://entra.microsoft.com › App registrations › New registration
    • Redirect URI เลือก Web แล้ววางที่อยู่จากข้อ 1
    • Certificates & secrets › New client secret › คัดลอกค่า (Value)
    • API permissions › Add a permission › APIs my organization uses › Office 365 Exchange Online › Delegated › SMTP.Send แล้วกด Grant admin consent
    • ผู้ดูแล Microsoft 365 ต้องเปิด Authenticated SMTP ให้กล่องจดหมายที่ใช้ส่ง
  4. กลับมาที่หน้า ผู้ดูแลระบบ › อีเมล เลือกผู้ให้บริการ ใส่อีเมลของบัญชีที่ใช้ส่ง Client ID และ Client secret แล้วกด ไปหน้าเข้าสู่ระบบของผู้ให้บริการ
  5. กดลิงก์ เข้าสู่ระบบด้วย Google (หรือ Microsoft) เข้าสู่ระบบด้วยบัญชีนั้น แล้วกดอนุญาต
    • Google อาจขึ้นว่า "Google hasn't verified this app" เพราะเป็นแอปของคุณเอง กด Advanced แล้ว Go to ... (unsafe)
  6. ถ้าแพลตฟอร์มมีชื่อโดเมนแบบ HTTPS เบราว์เซอร์จะกลับมาที่แพลตฟอร์มเอง ระบบส่งอีเมลทดสอบและบันทึกให้
  7. ถ้าแพลตฟอร์มใช้ที่อยู่ IP (ยังไม่มีโดเมน) เบราว์เซอร์จะขึ้นว่าเปิดหน้า localhost ไม่ได้ ซึ่งเป็นเรื่องปกติ กด Alt+D แล้ว Ctrl+C เพื่อคัดลอกที่อยู่ กลับไปแท็บของแพลตฟอร์ม วางในช่อง "วางที่อยู่ของหน้าที่เปิดไม่ได้" แล้วกด เชื่อมต่อ ทดสอบ และบันทึก ภายใน 20 นาที

ควรเห็น: "เชื่อมบัญชี ... แล้ว และส่งอีเมลทดสอบไปที่ ... สำเร็จ" และหัวข้อสถานะบอกว่าใช้บัญชีที่เชื่อมไว้ (OAuth ไม่ใช้รหัสผ่าน) ถ้าภายหลังมีคนยกเลิกการอนุญาต อีเมลจะส่งไม่ออก (เก็บไว้ให้อ่านด้วย sudo radioctl outbox) และหน้านั้นบอกให้กด เชื่อมต่อใหม่

วิธีที่ 3: บริการส่งอีเมล (ใช้ API key แทนรหัสผ่าน)

เช่น Brevo (มีแบบฟรีวันละ 300 ฉบับ), SendGrid, Mailgun, Resend เลือกชื่อบริการในรายการผู้ให้บริการ แล้วทำตามคำแนะนำใต้ "สิ่งที่ต้องเตรียมของแต่ละผู้ให้บริการ" ต้องยืนยันอีเมลผู้ส่งหรือโดเมนกับบริการนั้นก่อน

12. ไฟร์วอลล์และ security group ของผู้ให้บริการคลาวด์

มีไฟร์วอลล์ได้สองชั้น: ของผู้ให้บริการคลาวด์ (security group) และ ufw บนเซิร์ฟเวอร์ ทั้งสองต้องอนุญาตพอร์ตในข้อ 1.2

12.1 ufw บนเซิร์ฟเวอร์

แพ็กเกจติดตั้ง ufw ให้แล้ว แต่ยังปิดอยู่จนกว่าคุณจะเปิด อนุญาต SSH ก่อน มิฉะนั้นจะเข้าเครื่องไม่ได้:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw allow 8100:8119/tcp
sudo ufw allow 10100:10119/udp
sudo ufw enable

โปรไฟล์ medium ใช้ 8100:8139/tcp โปรไฟล์ large ใช้ 8100:8199/tcp sudo ufw enable จะถามว่า "Command may disrupt existing ssh connections. Proceed with operation (y|n)?" พิมพ์ y

ตรวจ:

sudo ufw status verbose

ควรเห็น: "Status: active" และหนึ่งบรรทัดต่อหนึ่งกฎ

ถ้า ufw เปิดอยู่แล้วตอนรัน sudo radio-setup ตัวตั้งค่าจะเพิ่มกฎเหล่านี้ให้เอง

ควรรู้: Docker เปิดพอร์ตของคอนเทนเนอร์ (80, 443 และพอร์ตดีเจ) เองโดยไม่ผ่าน ufw ufw ยังป้องกันพอร์ตอื่นทั้งหมด เช่น SSH ส่วนฐานข้อมูลและพอร์ตภายในอื่น ๆ Docker ไม่เปิดออกนอกเครื่องเลย

12.2 ไฟร์วอลล์ของผู้ให้บริการคลาวด์

ในแผงควบคุมของผู้ให้บริการ หาไฟร์วอลล์ของเซิร์ฟเวอร์ ชื่อเรียกต่างกัน: "Security group" (Amazon Web Services, Alibaba Cloud, Huawei Cloud) "Firewall rules" (Google Cloud) "Network security group" (Microsoft Azure) หรือ "Cloud Firewall" (DigitalOcean) เพิ่มกฎขาเข้า:

โปรโตคอล พอร์ต ต้นทาง
TCP 22 IP ของคุณเอง (หรือทุกที่)
TCP 80 ทุกที่ (0.0.0.0/0 และ ::/0)
TCP 443 ทุกที่
UDP 443 ทุกที่
TCP 8100 ถึง 8119 ทุกที่ หรือเฉพาะ IP ของดีเจ
UDP 10100 ถึง 10119 ทุกที่ หรือเฉพาะ IP ของฝั่งส่ง (เมื่อใช้ SRT)

ขาออก: อนุญาตทั้งหมด (ค่าเริ่มต้น)

13. การสำรองข้อมูล

แพลตฟอร์มสำรองข้อมูลเองทุกวันเวลา 03:30 (เวลากรุงเทพฯ) ข้อมูลสำรองมีฐานข้อมูล ไฟล์เสียงและไฟล์บันทึกรายการทั้งหมด และไฟล์ตั้งค่า ข้อมูลสำรองเข้ารหัสด้วยรหัส RESTIC_PASSWORD จาก /opt/radio/.env เก็บไว้: รายวัน 7 ชุด รายสัปดาห์ 4 ชุด และรายเดือน 6 ชุด

ขั้นที่ 13.1: เก็บสำเนาไฟล์ตั้งค่าไว้นอกเซิร์ฟเวอร์

ถ้าไม่มี RESTIC_PASSWORD จะไม่มีใครอ่านข้อมูลสำรองได้ แม้แต่ตัวคุณเอง คัดลอก .env มาที่คอมพิวเตอร์ของคุณหนึ่งครั้ง และทุกครั้งที่มีการเปลี่ยนแปลง บนเซิร์ฟเวอร์:

sudo cp /opt/radio/.env ~/radio-env.txt
sudo chown "$USER" ~/radio-env.txt

บนคอมพิวเตอร์ของคุณ (เปิดหน้าต่างเทอร์มินัลใหม่ ไม่ใช่หน้าต่าง SSH):

scp ubuntu@YOUR-SERVER-IP:radio-env.txt .

แล้วลบสำเนาบนเซิร์ฟเวอร์: rm ~/radio-env.txt เก็บไฟล์ไว้ในที่ปลอดภัย เช่น โปรแกรมจัดการรหัสผ่าน ไฟล์นี้มีรหัสผ่านทั้งหมดของแพลตฟอร์ม

ขั้นที่ 13.2: สำรองตอนนี้และตรวจ

sudo radioctl backup
sudo radioctl backup list
sudo radioctl backup status
sudo radioctl backup check

ควรเห็น: "เรียบร้อย: สำรองข้อมูลเสร็จ" รายการข้อมูลสำรองพร้อมเวลา ผลการสำรองครั้งล่าสุด และ "no errors were found" จากการตรวจ

ขั้นที่ 13.3: เพิ่ม S3

สำเนานอกเซิร์ฟเวอร์ยังอยู่แม้เซิร์ฟเวอร์เสียหาย สร้างบักเก็ตและ access key ที่ผู้ให้บริการ S3 แล้ว:

sudo radio-setup --yes --s3-repository 's3:https://s3.ap-southeast-1.amazonaws.com/my-bucket/radio' --s3-access-key 'AKIA...' --s3-secret-key 'SECRET' --s3-region ap-southeast-1
sudo radioctl backup
sudo radioctl backup list s3

ควรเห็น: รายการใน S3 มีข้อมูลสำรองชุดใหม่

ขั้นที่ 13.4: ทดสอบกู้คืน

การกู้คืนจะแทนที่ข้อมูลทั้งหมดด้วยข้อมูลสำรอง ให้ทดสอบบนเครื่องสำรอง ห้ามทดสอบบนเครื่องที่ใช้งานจริง:

  1. ติดตั้งเครื่องสำรองแบบเดียวกัน (ส่วนที่ 5 ถึง 7) ด้วยโหมดเดียวกัน
  2. คัดลอกค่า RESTIC_PASSWORD และบรรทัด BACKUP_S3_... จาก .env ที่เก็บไว้ ใส่ใน /opt/radio/.env ของเครื่องสำรอง แล้วรัน sudo radioctl up
  3. รัน sudo radioctl restore --from s3 จะแสดงรายการข้อมูลสำรองและให้พิมพ์คำว่า restore
  4. เมื่อถามว่า "ข้อมูลสำรองมาจากการติดตั้งอื่น ใช้รหัสลับ ... จากข้อมูลสำรองหรือไม่" ตอบ y
  5. ควรเห็น: "เรียบร้อย: กู้คืนเสร็จ ระบบทำงานแล้ว" เข้าสู่ระบบ เปิดสถานี และเล่นสตรีม

คู่มือดูแลระบบ อธิบายค่าตั้งของการสำรองข้อมูลทุกตัว

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

ขั้นที่ 14.1: ดาวน์โหลดแพ็กเกจใหม่

cd ~
curl -fLO https://github.com/OWNER/REPO/releases/download/v1.2.4/radio_1.2.4_all.deb
curl -fLO https://github.com/OWNER/REPO/releases/download/v1.2.4/SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing

ควรเห็น: radio_1.2.4_all.deb: OK

ขั้นที่ 14.2: ติดตั้ง

sudo apt install -y ./radio_1.2.4_all.deb

ควรเห็น:

วิทยุออนไลน์ 1.2.4: ติดตั้งไฟล์โปรแกรมใน /opt/radio แล้ว
ไฟล์ตั้งค่า /opt/radio/.env และข้อมูลทั้งหมดยังอยู่ครบ ไม่มีอะไรถูกเปลี่ยน
ระบบยังทำงานด้วยเวอร์ชัน 1.2.3 เปลี่ยนเป็น 1.2.4 ด้วยคำสั่ง:
  sudo radioctl update

แพลตฟอร์มยังทำงานด้วยเวอร์ชันเดิมจนกว่าจะทำขั้นถัดไป

ขั้นที่ 14.3: อัปเดตระบบที่กำลังทำงาน

เลือกช่วงเวลาที่มีผู้ฟังน้อย: แต่ละสถานีจะเริ่มใหม่สองสามวินาที

sudo radioctl update

คำสั่งนี้:

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

ควรเห็น ท้ายสุด: "เรียบร้อย: อัปเดตเป็น 1.2.4 แล้ว (ย้อนกลับได้ด้วย radioctl rollback)" ตรวจด้วย sudo radioctl status และ sudo radioctl doctor

ขั้นที่ 14.4: ย้อนกลับ (rollback)

sudo radioctl rollback

กลับไปใช้เวอร์ชันที่ทำงานก่อนหน้า การย้อนกลับไม่ย้อนการเปลี่ยนแปลงฐานข้อมูล ถ้าเวอร์ชันเก่าใช้กับฐานข้อมูลที่ปรับแล้วไม่ได้ ให้กู้คืนข้อมูลสำรองที่การอัปเดตทำไว้ก่อน (sudo radioctl backup list แสดงรายการ แล้ว sudo radioctl restore SNAPSHOT-ID) ถ้าต้องการไฟล์โปรแกรมเวอร์ชันเก่าด้วย: sudo apt install --allow-downgrades ./radio_1.2.3_all.deb

15. เปลี่ยนจาก IP เป็นโดเมนภายหลัง

โหมด (โดเมน, IP แบบ HTTPS, HTTP ธรรมดา) เป็นค่าตั้งของเซิร์ฟเวอร์

  1. สร้างระเบียน DNS (ส่วนที่ 3) แล้วรอจน getent hosts radio.example.th แสดง IP ของเซิร์ฟเวอร์
  2. เปิดพอร์ต 80 และ 443 (ส่วนที่ 12)
  3. รันตัวตั้งค่าด้วยโหมดใหม่ ข้อมูล บัญชี และสถานีทั้งหมดยังอยู่:
sudo radio-setup --mode domain --domain radio.example.th
  1. เปิด https://radio.example.th แล้วเข้าสู่ระบบ

ควรเห็น: ตัวตั้งค่าจบด้วย "เรียบร้อย: ทุกบริการทำงานแล้ว" และที่อยู่ใหม่ใช้ HTTPS ได้ภายในหนึ่งนาที

ชื่อโดเมนในแพลตฟอร์มเปลี่ยนได้ในเว็บแอป: การจัดการแพลตฟอร์ม แล้ว "โดเมนและที่อยู่" ที่นั่นเปลี่ยนที่อยู่หลัก ที่อยู่สตรีม และโดเมนย่อยของสถานี และเพิ่มโดเมนของสถานีเองได้ Caddy ขอใบรับรองให้เอง คู่มือผู้ดูแลระบบ อธิบายหน้านั้น

16. ย้ายการติดตั้งรุ่นเก่า

การติดตั้งก่อนเวอร์ชัน 1.0.0 อาจอยู่ในโฟลเดอร์อื่น เช่น /opt/saint-radio และวอลุ่มของ Docker ตั้งชื่อตามโฟลเดอร์นั้น (saint-radio_db-data) radioctl ตรวจพบเรื่องนี้และหยุดพร้อมข้อความ แทนที่จะเริ่มแพลตฟอร์มเปล่า ย้ายการติดตั้งแบบนี้หนึ่งครั้ง ก่อนติดตั้งแพ็กเกจ:

  1. แตกไฟล์รุ่นใหม่ทับโฟลเดอร์เดิม: sudo tar xzf radio-1.2.4.tar.gz -C /opt/saint-radio --strip-components=1
  2. ดูแผนก่อน ยังไม่เปลี่ยนอะไร: sudo bash /opt/saint-radio/scripts/radioctl migrate-name --dry-run
  3. ย้าย: sudo bash /opt/saint-radio/scripts/radioctl migrate-name
  4. ติดตั้งแพ็กเกจตามส่วนที่ 6 แพ็กเกจจะดูแลไฟล์ใน /opt/radio ต่อ และเก็บ .env ไว้
  5. ตรวจ: sudo radioctl status และ sudo radioctl doctor

ข้อ 3 จะสำรองข้อมูล คัดลอกวอลุ่มทุกตัวเป็น radio_* ย้ายโฟลเดอร์ไปที่ /opt/radio และเปรียบเทียบจำนวนสถานี ผู้ใช้ และไฟล์เสียงก่อนและหลัง สถานีจะหยุดออกอากาศสองสามนาที วอลุ่มเดิมไม่ถูกแก้ไข เมื่อทุกอย่างทำงานดีแล้ว ลบด้วยคำสั่ง docker volume rm ที่แสดงให้ ถ้าโฟลเดอร์เดิมเป็นสำเนา git ให้ย้ายโฟลเดอร์ .git ออกก่อนข้อ 4: sudo mv /opt/radio/.git /root/radio-git

17. ถอนการติดตั้ง

ขั้นที่ 17.1: ถอนโปรแกรม

sudo apt remove radio

คำสั่งนี้หยุดแพลตฟอร์ม (docker compose down) และลบไฟล์โปรแกรม แต่เก็บไฟล์ตั้งค่า /opt/radio/.env วอลุ่มของ Docker (ฐานข้อมูล ไฟล์เสียง ใบรับรอง) และข้อมูลสำรองไว้ ท้ายสุดจะแสดงรายการสิ่งที่เก็บไว้ และคำสั่งสำหรับลบจริง

ติดตั้งกลับภายหลัง: sudo apt install ./radio_1.2.4_all.deb แล้ว sudo radioctl up

ขั้นที่ 17.2: ลบทุกอย่างอย่างถาวร

ย้อนกลับไม่ได้ ถ้าอาจต้องใช้ข้อมูลอีก ให้แน่ใจว่ามีข้อมูลสำรองที่อ่านได้ (ส่วนที่ 13)

sudo docker volume ls --filter label=com.docker.compose.project=radio

คำสั่งนี้แสดงรายการวอลุ่ม เช่น radio_db-data ลบวอลุ่ม แล้วลบข้อมูลสำรอง โฟลเดอร์ และแพ็กเกจ:

sudo docker volume rm $(sudo docker volume ls -q --filter label=com.docker.compose.project=radio)
sudo rm -rf /var/backups/radio
sudo rm -rf /opt/radio
sudo apt purge radio

apt purge อย่างเดียวไม่ลบวอลุ่มหรือข้อมูลสำรองเด็ดขาด และจะเก็บ /opt/radio/.env ไว้ตราบที่ยังมีวอลุ่มหรือข้อมูลสำรองอยู่ เพราะถ้าไม่มีไฟล์นี้จะอ่านข้อมูลสำรองไม่ได้

ลบอิมเมจของโปรแกรมได้ด้วย: sudo docker image ls แสดงรายการ (local/radio-app และอื่น ๆ) และ sudo docker image prune -a ลบอิมเมจทุกตัวที่ไม่มีคอนเทนเนอร์ใช้

Docker เองยังติดตั้งอยู่ ถ้าต้องการลบด้วย: sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin (หรือถ้าเป็นแพ็กเกจของ Ubuntu: sudo apt purge docker.io docker-compose-v2)

18. แก้ปัญหา

เริ่มด้วยคำสั่งนี้เสมอ:

sudo radioctl doctor
ปัญหา ทำอย่างไร
a: unbound variable ตอนเลือกวิธีเข้าถึงแพลตฟอร์ม ข้อบกพร่องของเวอร์ชัน 1.0.0 แก้แล้วใน 1.0.1: ติดตั้งแพ็กเกจใหม่ sudo apt install ./radio_1.2.4_all.deb แล้วรัน sudo radio-setup อีกครั้ง (หรือใช้ 1.0.0 แบบไม่ถามคำถาม เช่น sudo radio-setup --mode ip-http --ip IP-ของเครื่อง --yes)
ตัวตั้งค่าบอกว่าพอร์ต 80 หรือ 443 มีโปรแกรมอื่นใช้ พอร์ต 80 หรือ 443 มีโปรแกรมอื่นใช้อยู่
เตือนเรื่องใบรับรองในแบบโดเมน DNS ไม่ได้ชี้มาที่เซิร์ฟเวอร์
ไม่ได้ใบรับรองใหม่ ขีดจำกัดของ Let's Encrypt
อีเมลเข้าสู่ระบบไม่มาถึง อีเมลไม่มาถึง
Docker ไม่เริ่มทำงาน Docker ไม่เริ่มทำงาน
สร้างอิมเมจแล้วหยุดกลางคัน หรือเครื่องค้าง สร้างอิมเมจไม่สำเร็จเพราะหน่วยความจำไม่พอ
สถานีเงียบ สถานีไม่มีเสียง
BUTT เชื่อมต่อไม่ได้ ดีเจเชื่อมต่อไม่ได้
เปิดหน้าตั้งค่าไม่ได้ ส่วนที่ 12 (ไฟร์วอลล์) แล้วขั้นที่ 8.1
ลืมที่อยู่ของแพลตฟอร์ม grep -E '^(BASE_URL|PUBLIC_MODE)=' /opt/radio/.env

พอร์ต 80 หรือ 443 มีโปรแกรมอื่นใช้อยู่

หาโปรแกรมที่ใช้พอร์ต:

sudo ss -ltnp 'sport = :80'
sudo ss -ltnp 'sport = :443'

ควรเห็น: บรรทัดที่มีชื่อโปรแกรมใน users:(("ชื่อ",...)) มักเป็น apache2 หรือ nginx ถ้าเครื่องนี้ไม่มีเว็บไซต์อื่น ให้หยุดและปิดไว้:

sudo systemctl disable --now apache2
sudo systemctl disable --now nginx

แล้วรัน sudo radio-setup อีกครั้ง ถ้าต้องเก็บเว็บไซต์อื่นไว้ ให้ใช้พอร์ตอื่น: sudo radio-setup --http-port 8080 --https-port 8443 ที่อยู่จะมีพอร์ตต่อท้าย และ Let's Encrypt จะออกใบรับรองไม่ได้ (ต้องใช้พอร์ต 80 และ 443)

DNS ไม่ได้ชี้มาที่เซิร์ฟเวอร์

getent hosts radio.example.th
curl -4 -s https://api.ipify.org; echo

หมายเลขทั้งสองต้องตรงกัน ถ้าไม่ตรง แก้ระเบียน A (ส่วนที่ 3) แล้วรอ Caddy จะลองใหม่เอง ดูได้ด้วย sudo radioctl logs caddy --follow (กด Ctrl+C เพื่อหยุด)

ขีดจำกัดของ Let's Encrypt

Let's Encrypt จำกัดจำนวนใบรับรองที่ขอได้:

  • ล้มเหลวได้ไม่เกิน 5 ครั้งต่อชื่อโดเมนต่อชั่วโมง
  • ไม่เกิน 50 ใบต่อโดเมนที่จดทะเบียนต่อสัปดาห์
  • ใบรับรองชุดชื่อเดิมซ้ำได้ไม่เกิน 5 ใบต่อสัปดาห์

บันทึกของ Caddy จะมีคำว่า "rateLimited" หรือ "too many" ดูได้ด้วย:

sudo radioctl logs caddy | grep -i -E 'rate|too many|error'

ทำอย่างไร: แก้สาเหตุก่อน (DNS พอร์ตปิด) แล้วรอหนึ่งชั่วโมง (หรือหนึ่งสัปดาห์สำหรับขีดจำกัดรายสัปดาห์) อย่าลบวอลุ่มของ Docker หรือติดตั้งใหม่ซ้ำ ๆ: ใบรับรองเก็บอยู่ในวอลุ่ม radio_caddy-data การเริ่มจากศูนย์จะขอใบใหม่ทุกครั้ง

อีเมลไม่มาถึง

เข้าสู่ระบบให้ได้ก่อน (เลือกวิธีใดวิธีหนึ่ง):

  • อ่านรหัสที่ส่งไม่ออกบนเซิร์ฟเวอร์: sudo radioctl outbox (เก็บทั้งกรณีที่ยังไม่ได้ตั้งเซิร์ฟเวอร์อีเมล และกรณีที่เซิร์ฟเวอร์อีเมลส่งไม่สำเร็จ)
  • สร้างลิงก์เข้าสู่ระบบใช้ครั้งเดียว: sudo radioctl login-link admin@example.th ลิงก์ถูกคัดลอกเข้าคลิปบอร์ดให้ (ดูเงื่อนไขในส่วนที่ 9) วางในช่องที่อยู่ของเบราว์เซอร์แล้วกด Enter ภายใน 15 นาที
  • ถ้าตั้งไว้ล่วงหน้า: ในหน้าเข้าสู่ระบบเลือก "เข้าสู่ระบบด้วยวิธีอื่น" แล้วใช้แอปยืนยันตัวตน รหัสกู้คืน หรือรับรหัสทาง LINE / Telegram

แก้การส่งอีเมล:

  1. เข้าสู่ระบบแล้วไปที่ ผู้ดูแลระบบ › อีเมล เลือกผู้ให้บริการ (Gmail, Microsoft 365, Zoho, Amazon SES หรืออื่น ๆ) กรอกชื่อผู้ใช้และรหัสผ่าน แล้วกด ส่งอีเมลทดสอบอย่างเดียว
  2. ถ้าไม่สำเร็จ หน้านั้นบอกสาเหตุเป็นภาษาไทย เช่น รหัสผ่านผิด ต้องใช้รหัสผ่านสำหรับแอป พอร์ตถูกปิด หรือการเข้ารหัสไม่ตรงกับพอร์ต
  3. Gmail และบัญชีที่เปิดการยืนยันหลายขั้นไม่รับรหัสผ่านปกติ: ใช้รหัสผ่านสำหรับแอป เข้าสู่ระบบด้วยบัญชี Google หรือ Microsoft (OAuth) หรือบริการส่งอีเมล ดูขั้นที่ 11.3
  4. "Connection timeout": ผู้ให้บริการคลาวด์บางรายปิดพอร์ตส่งอีเมลขาออก ใช้พอร์ต 587 แบบ STARTTLS หรือ 465 แบบ TLS หรือขอให้ผู้ให้บริการเปิด
  5. ส่งสำเร็จแล้วกด ทดสอบและบันทึก การตั้งค่าในหน้านี้ใช้แทน SMTP_URL ในไฟล์ .env
  6. ตรวจภาพรวมด้วย sudo radioctl doctor (มีหัวข้อ "อีเมล")
  7. อีเมลไปอยู่ในสแปม: ตั้งผู้ส่งเป็นที่อยู่ในโดเมนของคุณเอง และเพิ่มระเบียน SPF และ DKIM ที่ผู้ให้บริการอีเมลกำหนด

ทีมงานของสถานีที่ไม่ได้รับอีเมล: ผู้ดูแลสถานีกด ลิงก์เข้าสู่ระบบ ในหน้าทีมงาน แล้วส่งลิงก์ให้ทางช่องทางที่ไว้ใจได้

ตั้งรหัสผ่านจาก command line

ใช้กับบัญชีใดก็ได้ รวมบัญชีผู้ดูแลระบบ:

sudo radioctl password admin@example.th

ควรเห็น: PASSWORD: abcd-efgh-jkmn-pqrs พร้อมวันหมดอายุ รหัสนี้แสดงครั้งเดียว ใช้ได้ 7 วัน เข้าสู่ระบบที่ "เข้าสู่ระบบด้วยรหัสผ่าน" แล้วระบบให้ตั้งรหัสผ่านของตัวเองทันทีก่อนทำอย่างอื่น เจ้าของบัญชีได้รับอีเมลแจ้ง (ไม่มีรหัสในอีเมล) และบันทึกไว้ในบันทึกการใช้งาน

  • sudo radioctl password อีเมล --link: ลิงก์ใช้ครั้งเดียว (60 นาที ปรับด้วย --minutes) ที่เข้าสู่ระบบแล้วพาไปหน้าตั้งรหัสผ่านทันที
  • sudo radioctl password อีเมล --remove: ลบรหัสผ่าน
  • ถ้าเห็นว่าบัญชีเป็นทีมงานที่ยังไม่มีแอปยืนยันตัวตนหรือพาสคีย์: นโยบายแพลตฟอร์ม (เปิดเป็นค่าเริ่มต้น) ไม่ให้ทีมงานใช้รหัสผ่านโดยไม่มีขั้นที่ 2 ให้ใช้ sudo radioctl login-link อีเมล เข้าสู่ระบบ ตั้งแอปยืนยันตัวตนที่ /account/security แล้วสั่งคำสั่งนี้อีกครั้ง

Docker ไม่เริ่มทำงาน

sudo systemctl status docker --no-pager
sudo journalctl -u docker --no-pager -n 50

หาบรรทัดแรกที่มีคำว่า "error" หรือ "failed"

  • ไฟล์ /etc/docker/daemon.json เขียนผิด: ตรวจด้วย sudo python3 -m json.tool /etc/docker/daemon.json ถ้าไม่ต้องใช้ ย้ายออก: sudo mv /etc/docker/daemon.json /root/daemon.json.bak
  • แล้ว: sudo systemctl restart docker
  • ถ้าเป็น LXC container ของ Proxmox ต้องเปิดตัวเลือก nesting=1 และ keyctl=1 ของ container
  • การรีสตาร์ตเครื่องมักช่วยได้: sudo reboot

สร้างอิมเมจไม่สำเร็จเพราะหน่วยความจำไม่พอ

การสร้างอิมเมจต้องใช้หน่วยความจำประมาณ 4 GB ถ้าน้อยกว่านั้น การสร้างจะหยุดพร้อมคำว่า "Killed" หรือ "exit code: 137" หรือเครื่องหยุดตอบสนอง เพิ่ม swap 4 GB (ไฟล์หน่วยความจำบนดิสก์):

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

ตรวจด้วย free -h: บรรทัด "Swap:" แสดง 4.0Gi แล้วรัน sudo radio-setup อีกครั้ง ถ้า fallocate ไม่สำเร็จ ให้ใช้ sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 แทนบรรทัดแรก

สถานีไม่มีเสียง

  1. สถานีใหม่ยังไม่มีเพลง อัปโหลดไฟล์เสียงและสร้างเพลย์ลิสต์ในหน้าผู้ดูแลสถานี (คู่มือผู้ดูแลสถานี)
  2. ตรวจเอนจิน: sudo radioctl logs worker | tail -n 50
  3. ตรวจบริการ: sudo radioctl status worker ต้องเป็น "healthy"
  4. เริ่มเอนจินใหม่: sudo radioctl restart worker ระหว่างนั้นผู้ฟังได้ยินเสียงสัญญาณรอ

ดีเจเชื่อมต่อไม่ได้

  1. พอร์ตต้องเปิด: ใน ufw (ข้อ 12.1) และในไฟร์วอลล์ของคลาวด์ (ข้อ 12.2) ทดสอบตามขั้นที่ 10.4
  2. ใช้พอร์ตของสถานีนั้น mount live ชื่อผู้ใช้ และรหัสผ่านจากหน้า "การออกอากาศสด" ตัวพิมพ์เล็กพิมพ์ใหญ่ต้องตรงกัน
  3. สถานีอาจรับดีเจเฉพาะในช่วงรายการสดตามผัง หน้า "การออกอากาศสด" จะบอกไว้
  4. sudo radioctl doctor รายงานพอร์ตดีเจที่ไม่ได้เปิด
  5. ผู้ดูแลสถานีดูการเชื่อมต่อที่ถูกปฏิเสธแต่ละครั้งได้ที่ รายงาน เหตุการณ์การออกอากาศ พร้อมเหตุผล

19. บันทึกการทำงาน (log) อยู่ที่ไหน

อะไร คำสั่ง
ทุกบริการ 200 บรรทัดล่าสุด sudo radioctl logs
บริการเดียว sudo radioctl logs app (หรือ worker, icecast, db, caddy, backup)
ดูต่อเนื่อง sudo radioctl logs worker --follow หยุดด้วย Ctrl+C
บันทึกลงไฟล์ sudo radioctl logs app > ~/app-log.txt 2>&1
การติดตั้งแพ็กเกจ /var/log/apt/term.log
ตัว Docker เอง sudo journalctl -u docker --no-pager -n 100
ข้อความของตัวตั้งค่า แสดงบนจออย่างเดียว เก็บไว้ได้ด้วย sudo radio-setup 2>&1 | tee ~/radio-setup.log

Docker เก็บไม่เกิน 3 ไฟล์ ไฟล์ละ 10 MB ต่อบริการ บรรทัดเก่าจะหายไปเอง

20. ขอความช่วยเหลือ

รวบรวมข้อมูลนี้ก่อน:

sudo radioctl version > ~/radio-help.txt 2>&1
sudo radioctl status >> ~/radio-help.txt 2>&1
sudo radioctl doctor >> ~/radio-help.txt 2>&1

อ่านด้วย less ~/radio-help.txt ห้ามส่ง /opt/radio/.env ให้ใครเด็ดขาด ไฟล์นี้มีรหัสผ่านทั้งหมด

จากนั้น:

  • อ่านคู่มือดูแลระบบ และคู่มือการติดตั้ง ในเว็บแอปอยู่ที่เมนูช่วยเหลือ (/help)
  • ติดต่อผู้ให้บริการวิทยุออนไลน์ของคุณ (บริษัท เซนต์ เทคโนโลยี จำกัด) พร้อมไฟล์ radio-help.txt และข้อความที่เห็นแบบตรงตัว

21. ภาคผนวก: ติดตั้งโดยไม่มีอินเทอร์เน็ต

แต่ละรุ่นมีไฟล์ radio-images-1.2.4-amd64.tar.gz (และ -arm64 สำหรับเซิร์ฟเวอร์ ARM) ด้วย ไฟล์นี้มีอิมเมจของโปรแกรมทุกตัวในรุ่นนั้น รวมทั้ง PostgreSQL และ Caddy เซิร์ฟเวอร์ต้องติดตั้ง Docker ไว้แล้ว

  1. คัดลอกแพ็กเกจและไฟล์อิมเมจไปที่เซิร์ฟเวอร์ (เช่น ด้วย scp หรือ USB)
  2. sudo apt install ./radio_1.2.4_all.deb (apt ต้องติดตั้งแพ็กเกจที่ต้องใช้ ถ้าเครื่องไม่มีอินเทอร์เน็ตเลย ให้ติดตั้ง curl, openssl และ iproute2 จากสื่อติดตั้ง Ubuntu ก่อน)
  3. sudo radio-setup --offline ~/radio-images-1.2.4-amd64.tar.gz

ควรเห็น: "กำลังโหลดอิมเมจจาก ..." และต่อมา "เรียบร้อย: ใช้อิมเมจที่มีในเครื่อง (ไม่ดาวน์โหลด)" การอัปเดตทำแบบเดียวกัน: sudo radioctl update --offline ~/radio-images-1.2.4-amd64.tar.gz

22. ภาคผนวก: ตัวเลือกทั้งหมดของ radio-setup

sudo radio-setup --help แสดงรายการนี้บนเซิร์ฟเวอร์ (ภาษาอังกฤษ)

ตัวเลือก ความหมาย ค่าเริ่มต้น
--lang th หรือ en ภาษาของคำถาม ถาม
--yes ไม่ถาม: ใช้ค่าเริ่มต้นและค่าที่ให้มา ปิด
--mode domain, ip-https หรือ ip-http วิธีที่ผู้ใช้เข้าถึงแพลตฟอร์ม (ส่วนที่ 2) ถาม ถ้าไม่ถามคือ domain
--domain NAME โดเมนของแพลตฟอร์ม ไม่มี
--wildcard, --no-wildcard โดเมนย่อยของสถานี ไม่ใช้
--stream-domain NAME โดเมนแยกสำหรับสตรีม ไม่มี
--ip ADDRESS หมายเลข IP ในแบบ IP ตรวจหาให้
--ip-tls letsencrypt หรือ internal ใบรับรองในโหมด ip-https letsencrypt เมื่อเป็น IP สาธารณะ
--domain-tls public หรือ internal ใบรับรองจาก Let's Encrypt หรือของ Caddy เอง public
--dj-host NAME ชื่อเครื่องที่ดีเจเชื่อมต่อ โดเมนหรือ IP
--email ADDRESS อีเมลผู้ดูแล ใช้กับ Let's Encrypt ด้วย ถาม
--smtp-url URL เซิร์ฟเวอร์อีเมลสำหรับรหัสเข้าสู่ระบบ ไม่มี
--skip-dns-check ไม่ตรวจ DNS ปิด
--profile small, medium หรือ large โปรไฟล์ขนาด ตามขนาดเครื่อง
--backup-dir DIR โฟลเดอร์ข้อมูลสำรองในเครื่อง /var/backups/radio
--s3-repository, --s3-access-key, --s3-secret-key, --s3-region สำรองข้อมูลไป S3 ไม่มี
--version TAG เวอร์ชันอิมเมจที่ใช้ เวอร์ชันของแพ็กเกจ
--image-prefix PREFIX ที่มาของอิมเมจ เช่น ghcr.io/OWNER ของรุ่นนั้น
--build สร้างอิมเมจบนเซิร์ฟเวอร์ เมื่อไม่มีที่มาของอิมเมจ
--offline [FILE] ไม่ดาวน์โหลด โหลดอิมเมจจาก FILE ปิด
--http-port N, --https-port N พอร์ตเว็บอื่น 80, 443
--dj-port-start N พอร์ตดีเจแรก 8100
--docker-source docker หรือ ubuntu ที่มาของ Docker ถ้ายังไม่มี docker
--no-docker-install ไม่ติดตั้งหรือตั้งค่า Docker ปิด
--no-start เตรียมอย่างเดียว ไม่เริ่มอะไร ปิด
--dry-run ตรวจเครื่องและเขียนไฟล์ตั้งค่าอย่างเดียว ปิด