การติดตั้งอัตโนมัติ

วิธีอัตโนมัติ: สคริปต์เดียวจากบัญชีผู้ใช้จะเตรียมเซิร์ฟเวอร์ทั้งหมดให้พร้อม (เว็บสแตก Apache + PHP, ฐานข้อมูล, เครื่องมือความปลอดภัย, cron) จากนั้น — ติดตั้งแดชบอร์ด, ออก SSL และกรอกใบอนุญาต ใช้งานได้บน Ubuntu/Debian: บน VPS ใหม่จะตั้งค่าทุกอย่างตั้งแต่ต้น, บนเซิร์ฟเวอร์ที่ตั้งค่าไว้แล้ว — เพิ่มเติมเท่านั้น (โปรไฟล์ “เซิร์ฟเวอร์ที่ตั้งค่าแล้ว”, ขั้นตอน 01) คำสั่งทั้งหมดด้านล่างเรียงตามลำดับ เพียงเลื่อนจากบนลงล่าง บน VPS ใหม่ทุกขั้นตอนใช้ได้ตามลำดับ หากเซิร์ฟเวอร์ตั้งค่าไว้แล้วหรือมีแผงควบคุมโฮสติ้งอยู่ สคริปต์จะตั้งใจปล่อยงานบางส่วนไว้ให้คุณทำเอง — ส่วนใดบ้างนั้นสคริปต์จะแจ้งไว้ตอนจบการทำงาน (การอ่านผลลัพธ์อยู่ในขั้นตอน 01)

ค่าตัวอย่างในคำสั่ง ให้แทนที่ด้วยค่าของคุณ: monitor.example.com — โดเมนของคุณ; 203.0.113.10 — IP จริงของเซิร์ฟเวอร์; /var/www/monitor — รากของแดชบอร์ด (ที่เก็บ public/, assets/, config.php); รหัสผ่านฐานข้อมูลให้ตั้งเอง
ชุดเต็ม (“การป้องกันเต็มรูปแบบ”) ออกแบบมาสำหรับ VPS ใหม่ บน Ubuntu/Debian ที่สะอาดจะตั้งค่าระบบความปลอดภัยตั้งแต่ต้น — Fail2ban (jail.local), root-crontab, กฎ UFW, คอนฟิก Apache หากเซิร์ฟเวอร์ ตั้งค่าไว้แล้ว (แดชบอร์ดที่ใช้งานอยู่, เว็บไซต์, อีเมล, jail ของคุณเอง) — ให้เลือกโปรไฟล์ “เซิร์ฟเวอร์ที่ตั้งค่าแล้ว”: มันจะเปลี่ยนแปลงแบบเพิ่มเติมเท่านั้นและไม่แตะไฟร์วอลล์, Fail2ban, อีเมล, SSH และ sysctl ของคุณ เมื่อพบแผงควบคุมโฮสติ้ง สคริปต์จะสลับไปโหมดนี้เอง ก่อนรันครั้งแรกสามารถเปิด การรันแบบทดลอง (ติ๊กในบัญชีผู้ใช้) — มันจะแสดงสิ่งที่จะทำโดยไม่เปลี่ยนแปลงอะไร บนเซิร์ฟเวอร์ที่ใช้งานอยู่ควรทำสแนปช็อต (snapshot) ไว้เผื่อไว้

01. คำสั่งตั้งค่าอัตโนมัติจากบัญชีผู้ใช้

คุณรับคำสั่งได้ในบัญชีผู้ใช้ของคุณ my.arciveo.com → หัวข้อ “ตั้งค่าเซิร์ฟเวอร์” (ใช้งานได้หลังสมัคร Arcivéo Security Monitor) คำสั่งนี้ผูกกับบัญชีของคุณและมีโทเคนส่วนตัว

สคริปต์จะเตรียมเซิร์ฟเวอร์ทั้งหมด: เว็บสแตก (Apache + PHP), ฐานข้อมูล, เครื่องมือสำหรับ SSL, ชุดเครื่องมือป้องกันครบชุด และงาน cron (Lynis, SMART, debsums, Logwatch, รายงานประจำวัน, อัปเดต ipsum)

1) เลือกระดับการป้องกัน (ในบัญชีผู้ใช้ ก่อนคัดลอกคำสั่ง):

  • ป้องกันเต็มรูปแบบ (แนะนำ) — UFW (ไฟร์วอลล์), Fail2ban, CrowdSec + bouncer, ipsum (บล็อกลิสต์ IP), Suricata (IDS/IPS), Falco, ModSecurity + OWASP CRS (WAF), PSAD, mod_evasive (ป้องกัน DoS), AIDE (ความสมบูรณ์ของไฟล์), debsums, ClamAV + maldet (แอนติไวรัส), Auditd, AppArmor, Monit, Lynis (ตรวจสอบ), Logwatch, อัปเดตความปลอดภัยอัตโนมัติ
  • แบบเบา — สำหรับ VPS ที่มี RAM น้อย: ชุดพื้นฐานโดยไม่มีคอมโพเนนต์ที่หนัก
  • เซิร์ฟเวอร์ที่ตั้งค่าแล้ว (แผงควบคุมโฮสติ้ง) — สำหรับเซิร์ฟเวอร์ที่ทำงานอยู่แล้วพร้อมแผงควบคุม (HestiaCP ฯลฯ), เว็บไซต์และอีเมล: เปลี่ยนแปลงแบบเพิ่มเติมเท่านั้น (ติดตั้งเครื่องมือเพิ่ม, cron, กฎ sudo) ส่วนไฟร์วอลล์, Fail2ban, อีเมล, SSH และ sysctl คงไว้ตามเดิม บนเซิร์ฟเวอร์ที่มีแผงควบคุม สคริปต์จะเลือกโหมดนี้เอง
การรันแบบทดสอบ ในบัญชีผู้ใช้ คุณสามารถติ๊ก “การรันแบบทดสอบ” ได้ — จากนั้นคำสั่งจะแสดงเพียงว่าสคริปต์จะติดตั้งและเปลี่ยนแปลงอะไรบ้าง แล้วจบการทำงานโดยไม่แตะต้องอะไรเลย มีประโยชน์บนเซิร์ฟเวอร์ที่ตั้งค่าแล้ว: รันทดสอบก่อน แล้วค่อยรันจริงโดยไม่ต้องติ๊ก

2) รันบนเซิร์ฟเวอร์ในสิทธิ์ root ด้วยคำสั่งจากบัญชีผู้ใช้ — มีลักษณะดังนี้:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
เก็บคำสั่งไว้เป็นความลับ — เพราะผูกกับบัญชีของคุณ ลิงก์มีอายุการใช้งานจำกัด หากหมดอายุ ให้กด “ขอลิงก์ใหม่” ในบัญชีผู้ใช้
หลังตั้งค่าอัตโนมัติ เว็บเซิร์ฟเวอร์คือ Apache + PHP-FPM ส่วนเครื่องมือความปลอดภัยและงาน cron ติดตั้งและทำงานได้ทันที

3) อ่านผลลัพธ์ตอนจบ — ตรงนั้นบอกว่ามีอะไรเหลือให้คุณทำเอง สคริปต์จบการทำงานด้วยบล็อกการตรวจสอบและรายการ “ขั้นถัดไป — ติดตั้งแดชบอร์ด” บางขั้นตอนสคริปต์ตั้งใจไม่ทำให้: ส่วนใดบ้างขึ้นอยู่กับโปรไฟล์ที่เลือกและสิ่งที่พบบนเซิร์ฟเวอร์ ให้เทียบกับรายการด้านล่าง — ทำเฉพาะข้อที่บรรทัดของมันปรากฏในผลลัพธ์ของคุณเท่านั้น

  • Control panel detected (…) — เว็บไซต์ถูกสร้างด้วยเครื่องมือของแผงควบคุมโฮสติ้งเอง สคริปต์จึงไม่สร้าง vhost ให้ ดูขั้นตอน 03 กรณี “เซิร์ฟเวอร์ที่มีแผงควบคุมโฮสติ้ง”
  • No vhost created (no domain given) — โปรไฟล์ “เซิร์ฟเวอร์ที่ตั้งค่าแล้ว” โดยไม่ระบุโดเมน: vhost ที่ไม่มีชื่อจะกลายเป็นเว็บไซต์ค่าเริ่มต้นและดักเว็บไซต์อื่นของคุณเอง จึงไม่ถูกสร้างขึ้น ดูขั้นตอน 03 กรณี “สร้าง vhost ด้วยตนเอง”
  • sudo rules NOT written — สคริปต์ระบุไม่ได้ว่าแผงควบคุมทำงานภายใต้บัญชีใด นี่เป็นสถานการณ์ปกติ: ไฟล์ของแผงควบคุมถูกอัปโหลดหลังการตั้งค่าอัตโนมัติ จึงยังไม่มีอะไรให้ตรวจสอบในตอนนั้น หากไม่มีกฎเหล่านี้ โมดูลจะมองไม่เห็นข้อมูลระบบ ดูขั้นตอน 04 บล็อก “sudo สำหรับเว็บเซิร์ฟเวอร์”
  • ! Nginx does not read .htaccess — มี Nginx อยู่หน้า Apache และเขียนกฎห้ามลงในคอนฟิกของมันโดยอัตโนมัติไม่สำเร็จ ต้องทำเองให้เรียบร้อย: มิฉะนั้น data/, keys/, database/ และ config.php จะถูกเปิดออกสู่ภายนอกโดยข้าม .htaccess ดูขั้นตอน 03 บล็อก “หากมี Nginx อยู่หน้า Apache”
  • UFW installed but inactive — ไฟร์วอลล์ติดตั้งแล้วแต่ปิดอยู่: บนเซิร์ฟเวอร์ที่ตั้งค่าแล้ว สคริปต์จะไม่เปิดให้เอง เพื่อไม่ให้ตัดการเข้าถึงของคุณ ให้เปิดเอง โดยต้องอนุญาตพอร์ต SSH ของคุณด้วยเสมอ:
    sudo ufw allow OpenSSH # พอร์ต SSH ที่ไม่ใช่ค่ามาตรฐาน: sudo ufw allow 2222/tcp sudo ufw allow 80,443/tcp sudo ufw enable
  • Fail2ban installed but not running — ให้เริ่มทำงาน: sudo systemctl enable --now fail2ban
  • Database server present … but not running — เริ่มระบบฐานข้อมูลก่อนขั้นตอน 04: sudo systemctl enable --now mariadb (หรือ mysql แล้วแต่ว่าติดตั้งตัวใดไว้)
  • Certbot skipped — issue SSL in … — ใบรับรองออกด้วยสวิตช์ Let's Encrypt ในแผงควบคุมโฮสติ้ง คุณจึงไม่ต้องทำขั้นตอน 06
หากทุกอย่างในบล็อกการตรวจสอบเรียบร้อย บรรทัดสุดท้ายจะเป็น All checks passed ข้อที่มีเครื่องหมาย ! ต้องได้รับการดูแล รายละเอียดจะถูกเขียนลงบันทึก ซึ่งสคริปต์พิมพ์พาธไว้ตอนท้ายสุด (Log: …)

02. โดเมนและ DNS

เพื่อเปิดแดชบอร์ดที่แอดเดรสอย่าง monitor.example.com และรับ SSL ฟรี โดเมนต้องชี้มาที่เซิร์ฟเวอร์ ในแดชบอร์ดจัดการ DNS (ที่ผู้รับจดทะเบียนหรือผู้ให้บริการโฮสต์) ให้สร้าง A-record:

ชนิด: A ชื่อ: monitor (ซับโดเมน → monitor.example.com) หรือ @ (รูทของโดเมน → example.com) ค่า: 203.0.113.10 ← IP ของเซิร์ฟเวอร์คุณ TTL: 3600

หลังจากผ่านไปไม่กี่นาที (บางครั้งอาจถึงหนึ่งชั่วโมง) ให้ตรวจสอบว่าโดเมนชี้มาที่เซิร์ฟเวอร์แล้ว:

dig +short monitor.example.com # ควรคืนค่า IP ของคุณ # หรือถ้าไม่มี dig: getent hosts monitor.example.com
ใบรับรอง SSL (ขั้นตอน 06) ออกให้เฉพาะโดเมนเท่านั้น ดังนั้น DNS ต้องชี้มาที่เซิร์ฟเวอร์ ก่อน การออกใบรับรอง

03. อัปโหลดไฟล์แผงควบคุม

กรณีปกติ (VPS ใหม่) การตั้งค่าอัตโนมัติได้สร้างไดเรกทอรีแผงควบคุม /var/www/monitor และตั้งค่าเว็บไซต์ Apache ไว้แล้ว (DocumentRoot ชี้ไปที่รากของแผงควบคุม, PHP-FPM, AllowOverride สำหรับ .htaccess) ในผลลัพธ์ของสคริปต์คือบรรทัด vhost … → DocumentRoot … ไม่ต้องสร้างไดเรกทอรีและ vhost แยกต่างหาก — เพียงอัปโหลดไฟล์และตั้งสิทธิ์
มีสองกรณีที่ vhost ไม่ถูกสร้าง — สคริปต์จะแจ้งไว้ตรง ๆ ตอนจบการทำงาน ในกรณีนั้นให้ทำตามกรณีที่ตรงกันด้านล่างก่อน แล้วจึงอัปโหลดไฟล์

กรณี “เซิร์ฟเวอร์ที่มีแผงควบคุมโฮสติ้ง” (ในผลลัพธ์: Control panel detected (…)) เว็บไซต์บนเซิร์ฟเวอร์แบบนี้อยู่ในความดูแลของแผงควบคุม สคริปต์จึงตั้งใจไม่สร้าง vhost ของตัวเอง — เพราะจะถูกเขียนทับทันทีที่แผงควบคุมสร้างคอนฟิกใหม่ ลำดับการทำงานคือ:

  1. สร้างเว็บโดเมนในแผงควบคุมโฮสติ้ง (HestiaCP ฯลฯ) — DocumentRoot ของมันคงไว้ตามเดิม
  2. อัปโหลดชุดติดตั้งทั้งหมดไปที่ public_html ของโดเมนนั้น: นอกจาก index.php, api/, assets/ แล้ว ต้องมี config.php, includes/, data/, tmp/, logs/, keys/, cron/, database/ อยู่ด้วย ไม่ต้องย้ายอะไรออกไปเหนือเว็บรูท: โฟลเดอร์ระบบถูกปิดกั้นด้วยไฟล์ .htaccess จากชุดติดตั้ง ส่วนภายใต้ Nginx ใช้กฎห้ามที่สคริปต์เขียนไว้ในคอนฟิกของโดเมน
  3. SSL ออกด้วยสวิตช์ Let's Encrypt ในแผงควบคุมเอง — ข้ามขั้นตอน 06
  4. ถัดไป — สิทธิ์ไฟล์ (ด้านล่างในขั้นตอนนี้), ฐานข้อมูล (ขั้นตอน 04) และ config.php (ขั้นตอน 05) พาธในคำสั่งให้เปลี่ยนเป็น /home/บัญชี/web/โดเมน/public_html และเจ้าของไฟล์ให้เปลี่ยนเป็นผู้ใช้ของโดเมนนั้นแทน www-data

กรณี “สร้าง vhost ด้วยตนเอง” (ในผลลัพธ์: No vhost created (no domain given)) เกิดขึ้นเฉพาะกับโปรไฟล์ “เซิร์ฟเวอร์ที่ตั้งค่าแล้ว” เมื่อไม่ได้ส่งโดเมนเข้าไป วิธีที่ง่ายที่สุดคือรันคำสั่งจากบัญชีผู้ใช้อีกครั้งพร้อมระบุโดเมน:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo bash -s -- monitor.example.com

การรันซ้ำปลอดภัย: สิ่งที่ทำไปแล้วจะไม่ถูกทำซ้ำ แต่หากต้องการสร้าง vhost ด้วยมือ — นี่คือคอนฟิกเดียวกันกับที่ตัวติดตั้งเขียนให้:

sudo mkdir -p /var/www/monitor # ตรวจหาซ็อกเก็ต PHP-FPM อัตโนมัติ — เวอร์ชัน PHP บนแต่ละเซิร์ฟเวอร์ต่างกัน PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) sudo tee /etc/apache2/sites-available/arciveo-monitor.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName monitor.example.com DocumentRoot /var/www/monitor <Directory /var/www/monitor> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch "\.php$"> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/arciveo-monitor_error.log CustomLog ${APACHE_LOG_DIR}/arciveo-monitor_requests.log combined </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/arciveo-monitor.conf sudo a2ensite arciveo-monitor.conf sudo apache2ctl configtest sudo systemctl reload apache2
ServerName ตรงนี้จำเป็นต้องมี vhost ที่ไม่มีชื่อจะกลายเป็นเว็บไซต์ค่าเริ่มต้นของ Apache และเริ่มตอบแทนโดเมนอื่นบนเซิร์ฟเวอร์เดียวกัน ด้วยเหตุผลเดียวกัน อย่าปิด 000-default.conf บนเซิร์ฟเวอร์ที่ตั้งค่าแล้ว: เว็บไซต์นั้นอาจถูกดัดแปลงไปใช้งานจริงของใครบางคน — บน VPS ใหม่ตัวติดตั้งจะปิดให้เอง ตรงนี้ไม่ต้องทำ
หากมี Nginx อยู่หน้า Apache (ในผลลัพธ์: ! Nginx does not read .htaccess) Nginx ส่งไฟล์สแตติกจากดิสก์โดยตรงและไม่อ่าน .htaccess — โฟลเดอร์ระบบจึงเปิดออกสู่ภายนอก แม้ Apache จะปิดกั้นไว้อย่างถูกต้องก็ตาม สคริปต์ได้เตรียมไฟล์กฎห้ามไว้ล่วงหน้าแล้ว เพียงนำไปรวมในบล็อก server{} ของเว็บไซต์คุณ แล้วรีโหลด Nginx:
include /etc/nginx/snippets/arciveo-deny.conf;
sudo nginx -t && sudo systemctl reload nginx # ตรวจสอบ: ควรคืนค่า 403 ไม่ใช่เนื้อหาของไฟล์ curl -sI https://monitor.example.com/config.php | head -1
ไฟล์แผงควบคุม (ไฟล์บีบอัดของชุดติดตั้ง) ดาวน์โหลดได้หลังการซื้อในบัญชีผู้ใช้ที่ my.arciveo.com → “ดาวน์โหลด” แตกไฟล์บีบอัดก่อนอัปโหลดขึ้นเซิร์ฟเวอร์

อัปโหลดเนื้อหาของชุดติดตั้งไปที่ /var/www/monitor (เพื่อให้ภายในมี public/, assets/, config.php ฯลฯ) — ผ่าน SFTP/SCP (FileZilla / WinSCP) หรือใช้คำสั่ง scp จากคอมพิวเตอร์ของคุณ:

scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
เพื่อให้โดเมนของคุณถูกกำหนดใน vhost ทันที (ServerName) ให้ส่งโดเมนเข้าไปในคำสั่งตั้งค่าอัตโนมัติตั้งแต่ขั้นตอน 01: … | sudo bash -s -- monitor.example.com (หรือระบุโดเมนในช่อง “โดเมนแผงควบคุม” ในบัญชีผู้ใช้) หากไม่ได้ส่งโดเมน — แผงควบคุมจะตอบสนองทุกโฮสต์และผ่าน IP ส่วน ServerName นั้น certbot จะกำหนดให้ตอนออก SSL (ขั้นตอน 06) ไม่ต้องติดตั้งใหม่แต่อย่างใด
ตั้งสิทธิ์ให้ไฟล์ — เป็นขั้นตอนบังคับ หากอัปโหลดในนาม root หรือผ่าน SFTP ไฟล์จะเป็นของ root และเว็บเซิร์ฟเวอร์ (www-data) จะอ่านไม่ได้ — แผงควบคุมจะเปิดขึ้นมาว่างเปล่าหรือแสดงข้อผิดพลาด 403 (ในบันทึก: .htaccess unreadable / directory not executable) คำสั่งด้านล่างแก้ปัญหานี้ได้:
# ปรับสิทธิ์ของ webroot ทั้งหมดให้เป็นมาตรฐาน: ไดเรกทอรีที่ root สร้างไว้ # เว็บเซิร์ฟเวอร์ (www-data) เข้าไม่ได้ — หากไม่ทำ แผงควบคุมจะแสดงหน้าว่างหรือ 403 cd /var/www/monitor # สร้างโฟลเดอร์ทำงานก่อน chown — ไม่เช่นนั้นไดเรกทอรีใหม่จะยังเป็น root:root # และเมื่อ chmod 750 เว็บเซิร์ฟเวอร์ (www-data) จะเขียนลงในนั้นไม่ได้ sudo mkdir -p data/lynis data/logwatch tmp logs sudo chown -R www-data:www-data /var/www/monitor sudo find /var/www/monitor -type d -exec chmod 755 {} \; sudo find /var/www/monitor -type f -exec chmod 644 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 750 data tmp logs

เปิดสิทธิ์อัปโหลดไฟล์ผ่าน SFTP ให้ตัวเอง หลังคำสั่งด้านบน ไฟล์ทั้งหมดเป็นของ www-data ขณะที่ FileZilla / WinSCP เชื่อมต่อด้วยผู้ใช้ของคุณเอง การอัปโหลดจึงล้มเหลวด้วย SSH_FX_PERMISSION_DENIED (Permission denied) เลือกหนึ่งในสองทางเลือกต่อไปนี้

ทางเลือก A — ACL เฉพาะผู้ใช้ของคุณ (แนะนำ) สิทธิ์เขียนมีเฉพาะคุณคนเดียว เว็บเซิร์ฟเวอร์ยังคงเขียนทับโค้ดของแผงควบคุมไม่ได้:

sudo apt install -y acl # สิทธิ์เขียนให้ผู้ใช้ของคุณทั้งไดเรกทอรีของแผงควบคุม: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # กฎเดียวกันเป็นค่าเริ่มต้น — สำหรับไฟล์และโฟลเดอร์ที่สร้างขึ้นภายหลัง: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

ทางเลือก B — ผ่านกลุ่ม www-data ง่ายกว่า แต่เว็บเซิร์ฟเวอร์ก็ได้สิทธิ์เขียนไฟล์ของแผงควบคุมด้วย หากมีช่องโหว่ใน PHP โค้ดอาจถูกสับเปลี่ยนได้ ลำดับคำสั่งมีความสำคัญ — config.php และโฟลเดอร์ทำงานจะถูกปิดเป็นลำดับสุดท้าย:

sudo usermod -aG www-data deploy # สิทธิ์เขียนของกลุ่ม + setgid (บิต 2): ไฟล์ที่อัปโหลดผ่าน SFTP จะยังอยู่ # ในกลุ่ม www-data มิฉะนั้นแผงควบคุมจะเขียนทับไม่ได้ sudo find /var/www/monitor -type d -exec chmod 2775 {} \; sudo find /var/www/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
หลังทางเลือก B ให้ เชื่อมต่อใหม่ใน FileZilla (เซิร์ฟเวอร์ → ตัดการเชื่อมต่อ แล้วเข้าสู่ระบบอีกครั้ง) กลุ่มใหม่จะมีผลเมื่อเข้าสู่ระบบใหม่เท่านั้น ก่อนหน้านั้นก็ยังไม่มีสิทธิ์ ตรวจสอบ: id deploy — ในรายการกลุ่มต้องปรากฏ www-data; ls -ld /var/www/monitor — สิทธิ์ drwxrwsr-x โดยตัวอักษร s แทน x หมายความว่าตั้ง setgid แล้ว

04. ฐานข้อมูล

สร้างฐานข้อมูลและผู้ใช้ จากนั้นนำเข้าสคีมา บล็อกที่มีฐานข้อมูลต้องวางลงในเทอร์มินัลทั้งหมด (sudo mysql เข้าเป็น root ผ่าน unix-socket ไม่ต้องใช้รหัสผ่าน root) monitor_db และ monitor_user เป็นชื่อตัวอย่าง จะตั้งชื่อของคุณเองก็ได้ จำชื่อฐานข้อมูล ผู้ใช้ และรหัสผ่านไว้ เพราะต้องกรอกลงใน config.php ในขั้นถัดไป:

# 1. ฐานข้อมูล กำหนดชื่อฐานข้อมูล ผู้ใช้ และรหัสผ่านเพียงครั้งเดียวด้านล่าง แล้วจะถูกแทนในทุกบรรทัด # วางบล็อกลงในเทอร์มินัลทั้งหมด; sudo mysql เข้าเป็น root ผ่าน unix-socket # (ไม่ต้องใช้รหัสผ่าน root) อย่าใช้ `sudo mysql -u root -p` แบบโต้ตอบ # ด้วยการคัดลอกวาง — เพราะบรรทัด SQL จะถูกส่งเข้าไปเป็นรหัสผ่านและหายไป DBNAME='monitor_db' # ← ชื่อฐานข้อมูล คงไว้ได้ DBUSER='monitor_user' # ← ผู้ใช้ฐานข้อมูล คงไว้ได้ DBPASS='CHOOSE_A_PASSWORD' # ← รหัสผ่าน กำหนดเอง sudo mysql <<SQL CREATE DATABASE IF NOT EXISTS $DBNAME CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS '$DBUSER'@'localhost' IDENTIFIED BY '$DBPASS'; GRANT ALL ON $DBNAME.* TO '$DBUSER'@'localhost'; FLUSH PRIVILEGES; SQL # ตรวจสอบ (ควรแสดง $DBNAME): mysql -u "$DBUSER" -p"$DBPASS" -e "SHOW DATABASES;" # นำสามค่านี้ไปกรอกใน config.php → DB_NAME, DB_USER, DB_PASS.
โดยทั่วไปไม่จำเป็นต้องนำเข้าสคีมา — แดชบอร์ดจะสร้างตารางและบัญชี admin ให้เองเมื่อเปิดในเบราว์เซอร์ครั้งแรก (จาก database/db.sql) หากฐานข้อมูลว่างเปล่า

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

# นำเข้าสคีมา: cd /var/www/monitor && mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" < database/db.sql # ตรวจสอบ — ควรปรากฏรายการตาราง: mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" -e "SHOW TABLES;"
หากตัวแปร $DBNAME / $DBUSER / $DBPASS “หายไป” แล้ว (เปิดเซสชันเทอร์มินัลใหม่) — ให้ใส่ค่าลงในคำสั่งด้วยมือ หรือกำหนดใหม่ด้วยสามบรรทัดเดิมจากบล็อกด้านบน
sudo สำหรับเว็บเซิร์ฟเวอร์ โดยปกติกฎถูกเขียนไว้แล้วโดยการตั้งค่าอัตโนมัติ และโมดูลจะเห็นข้อมูลระบบทันที แต่หากในผลลัพธ์ของสคริปต์มีบรรทัด sudo rules NOT written — แปลว่ายังไม่มีอะไรให้ระบุบัญชีของแผงควบคุมได้ (ไฟล์ยังไม่ถูกอัปโหลด) และกฎยังไม่ถูกสร้าง หากไม่มีกฎเหล่านี้ หัวข้ออย่างไฟร์วอลล์, Fail2ban และ CrowdSec จะว่างเปล่า ตอนนี้เมื่อไฟล์อยู่ครบแล้ว ให้รันคำสั่งจากบัญชีผู้ใช้อีกครั้งพร้อมระบุบัญชีอย่างชัดเจน:
curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo ARCIVEO_USER=www-data bash -s -- monitor.example.com
www-data ให้เปลี่ยนเป็นผู้ใช้ที่ PHP ของเว็บไซต์คุณทำงานอยู่ (บนแผงควบคุมโฮสติ้งมักเป็นเจ้าของโดเมน) ดูได้ดังนี้:
ps -o user= -C php-fpm8.3 | sort -u # ใส่เวอร์ชันของคุณเอง # หรือ: ps aux | grep -m3 '[p]hp-fpm'
ตรวจสอบหลังรันซ้ำ: ไฟล์ /etc/sudoers.d/monitor มีอยู่จริง และภายในมีบรรทัดที่ระบุผู้ใช้ของคุณ

05. การตั้งค่า config.php

config.php ที่รากของแดชบอร์ด (/var/www/monitor/config.php) — เป็นไฟล์เดียวที่ต้องแก้ไขด้วยมือ การตั้งค่าทั้งหมดของแดชบอร์ดถูกกำหนดไว้ในไฟล์นี้ด้วยค่าคงที่ define() เปิดไฟล์นี้ในโปรแกรมแก้ไข:

sudo nano /var/www/monitor/config.php

ใส่ค่าของคุณลงในตำแหน่งที่ไฮไลต์ไว้; ส่วนที่เหลือปล่อยไว้ตามเดิม:

// --- ฐานข้อมูล (จากขั้นตอน 04) --- define('DB_HOST', 'localhost'); // ปล่อยไว้ define('DB_NAME', 'db_name'); // ที่สร้างในขั้นตอน 04 define('DB_USER', 'user'); // ที่สร้างในขั้นตอน 04 define('DB_PASS', 'db_password'); // ที่ตั้งในขั้นตอน 04 define('DB_CHARSET', 'utf8mb4'); // ปล่อยไว้ // --- แอปพลิเคชัน --- define('APP_URL', 'https://monitor.example.com'); // ที่อยู่แดชบอร์ด ไม่มีสแลชปิดท้าย define('TIMEZONE', 'Asia/Bangkok'); // เขตเวลาของคุณ // --- เวลาเซสชัน --- define('SESSION_LIFETIME', 28800); // เวลาว่างจนต้องเข้าสู่ระบบใหม่, วินาที (28800 = 8 ชม.)

สิ่งที่ต้องเปลี่ยน:

  • DB_NAME, DB_USER, DB_PASS — ชื่อฐานข้อมูล ผู้ใช้ และรหัสผ่านที่ตรงกันกับที่คุณตั้งไว้ตอนสร้างฐานข้อมูลในขั้นตอน 04 (หากปล่อยเป็นตัวอย่างไว้ — monitor_db / monitor_user) อย่าแก้ DB_HOST และ DB_CHARSET
  • APP_URL — ที่อยู่แดชบอร์ดแบบเต็มพร้อม https:// ไม่มีสแลชปิดท้ายและไม่มี www ต้องตรงกับโดเมนที่คุณเปิดใช้งานลิขสิทธิ์ (ขั้นตอน 07) มิฉะนั้นคีย์จะถูกปฏิเสธ
  • TIMEZONE — เขตเวลาของคุณ (ดูรายการ — timedatectl list-timezones) มีผลเฉพาะกับการแสดงวันที่ของแดชบอร์ดเท่านั้น ไม่มีผลต่อเวลาที่งาน cron ทำงาน (ตรงนั้นใช้เขตเวลาของระบบ)
  • SESSION_LIFETIME — จำนวนวินาทีที่ไม่มีการใช้งานก่อนที่แดชบอร์ดจะขอให้เข้าสู่ระบบใหม่ (ค่าเริ่มต้น 8 ชั่วโมง) เช่น 3600 = 1 ชั่วโมง, 86400 = หนึ่งวัน
  • บล็อกบันทึกข้อผิดพลาด (display_errors, log_errors, error_log) — ปล่อยไว้ตามค่าเริ่มต้น

บันทึกไฟล์ (Ctrl+O, Enter แล้ว Ctrl+X) และรีสตาร์ท PHP-FPM — มิฉะนั้นการเปลี่ยนแปลงจะไม่มีผลเพราะ OPcache:

sudo systemctl restart php*-fpm
config.php — เป็นไฟล์ลับ (มีรหัสผ่านฐานข้อมูลอยู่ในนั้น) ไฟล์นี้อยู่ที่รากของแดชบอร์ดซึ่งเป็นเว็บรูท แต่ถูกปิดกั้นไว้: สิทธิ์ 640 (ตั้งไว้ในขั้นตอน 03) และการห้ามอย่างชัดเจนใน .htaccess ที่ราก อย่านำไปวางในรีโพซิทอรีสาธารณะและอย่าส่งให้ฝ่ายสนับสนุนพร้อมรหัสผ่านจริง
รายละเอียดของพารามิเตอร์ทั้งหมด — ดูใน FAQ: “ไฟล์ config.php — การตั้งค่าทั้งหมดของแดชบอร์ด”

06. ออกใบรับรอง SSL (HTTPS)

แดชบอร์ดทำงานผ่าน HTTPS เท่านั้น เซสชันการเข้าสู่ระบบใช้คุกกี้แบบปลอดภัย และ WebAuthn (2FA) ตามมาตรฐานจะทำงานเฉพาะบน HTTPS เท่านั้น คุณจะไม่สามารถเข้าสู่ระบบผ่าน http:// ได้
บนเซิร์ฟเวอร์ที่มีแผงควบคุมโฮสติ้ง ไม่ต้องทำขั้นตอนนี้ (ในผลลัพธ์ของสคริปต์: Certbot skipped — issue SSL in …) ใบรับรองออกด้วยสวิตช์ Let's Encrypt บนเว็บโดเมนในแผงควบคุมเอง การต่ออายุจึงเป็นหน้าที่ของแผงควบคุมด้วยเช่นกัน

certbot และปลั๊กอินสำหรับ Apache ถูกติดตั้งไว้แล้วโดยการตั้งค่าอัตโนมัติ DNS ของโดเมนควรชี้มาที่เซิร์ฟเวอร์แล้ว (ขั้นตอน 02) ออกใบรับรองในคำสั่งเดียว:

sudo certbot --apache -d monitor.example.com

หากต้องการให้แดชบอร์ดเปิดได้ด้วย www. ด้วย — ให้ระบุทั้งสองชื่อในคำสั่งเดียว มิฉะนั้นเบราว์เซอร์จะเตือนเรื่องใบรับรองที่แอดเดรสที่สอง:

sudo certbot --apache -d monitor.example.com -d www.monitor.example.com
เพิ่มชื่อที่สองเฉพาะเมื่อชื่อนั้นมี A-record ที่ชี้มาที่เซิร์ฟเวอร์นี้ด้วย (ขั้นตอน 02) มิฉะนั้น Let's Encrypt จะตรวจสอบไม่ได้ และจะไม่ออกใบรับรองทั้งชุด — รวมถึงโดเมนหลักด้วย
สิ่งที่ certbot จะถาม:
  1. Enter email address — อีเมลของคุณ (การแจ้งเตือนใบรับรองหมดอายุจะส่งไปที่นี่)
  2. Terms of Service … (Y)es/(N)o — Y
  3. Share email with the EFF … (Y)es/(N)o — ตามที่คุณต้องการ
จากนั้น certbot จะออกใบรับรองเอง เขียน <VirtualHost *:443> ตั้งค่าการเปลี่ยนเส้นทาง http→https และการต่ออายุอัตโนมัติ ท้ายสุดจะขึ้น Successfully enabled HTTPS
หากการออกใบรับรองล้มเหลว — ตรวจสอบว่า dig +short monitor.example.com คืนค่า IP ของเซิร์ฟเวอร์ และเปิดพอร์ต 80/443 แล้ว (sudo ufw allow 80,443/tcp)

หลังออกใบรับรอง: https://monitor.example.com เปิดได้พร้อมไอคอนแม่กุญแจ, http:// จะเปลี่ยนเส้นทางไปยัง https://

07. การเข้าสู่ระบบและการตั้งค่าเริ่มต้น

เปิด https://monitor.example.com เข้าสู่ระบบด้วย admin / useradmin แล้วทำตามเช็กลิสต์:

  1. เปลี่ยนรหัสผ่าน admin — เมนู “ผู้ใช้”
  2. เปิดใช้ WebAuthn (2FA) — “คีย์ WebAuthn” → ลงทะเบียนคีย์/passkey (ต้องใช้ HTTPS) ลงทะเบียนสองคีย์ทันที: หากทำคีย์เดียวที่มีหาย จะเข้าสู่ระบบด้วยคีย์นั้นไม่ได้ รายละเอียด
  3. จำกัดการเข้าถึงตาม IP — “การตั้งค่า” → “การจำกัดการเข้าถึงตาม IP” (ใส่ IP ของคุณก่อนเปิดใช้ ไม่เช่นนั้นจะปิดกั้นการเข้าถึงของตัวเอง)
  4. กรอกลิขสิทธิ์ — นำรหัสเปิดใช้งาน ARCIVEO-… จากบัญชีผู้ใช้ไปเปิดใช้กับโดเมนของคุณ แล้ววางคีย์ใน “การตั้งค่า” → “ลิขสิทธิ์” รายละเอียด
  5. ตั้งค่าการแจ้งเตือน — Telegram และ/หรือ Email ใน “การตั้งค่า” รายละเอียด
  6. ลบตัวติดตั้ง public/start_db.php หากยังเหลืออยู่: มันให้สร้างฐานข้อมูลใหม่ได้โดยไม่ต้องล็อกอิน ตราบใดที่ไฟล์ยังอยู่ในรูทของแดชบอร์ดหรือใน public/ แดชบอร์ดจะเตือนด้วยแบนเนอร์สีแดง
  7. รันการตรวจสอบชุดแรกด้วยตนเอง — มิฉะนั้นบางหัวข้อจะว่างเปล่าจนถึงกลางคืน (ดูบล็อกด้านล่าง)
ทำไม “การตรวจสอบ Lynis” และ “Logwatch” จึงว่างเปล่าในตอนแรก การตั้งค่าอัตโนมัติติดตั้งเครื่องมือและสร้างงาน cron ไว้แล้ว แต่ยังไม่ได้รันการตรวจสอบเอง — มันจะทำงานตามตาราง: Lynis เวลา 03:00, Logwatch เวลา 06:00, debsums เวลา 04:30, ClamAV เวลา 01:30 ก่อนถึงเวลานั้น หัวข้อต่าง ๆ จะแสดงตามจริงว่ายังไม่มีรายงาน หากไม่อยากรอทั้งวัน ให้รันด้วยมือหนึ่งครั้ง:
# การตรวจสอบ Lynis — รายงานฉบับแรก (ใช้เวลาไม่กี่นาที): sudo /usr/local/bin/lynis-scan.sh # รายงาน Logwatch ของรอบวัน: sudo /usr/local/bin/logwatch_daily.sh # ความสมบูรณ์ของแพ็กเกจ (debsums) — บนเซิร์ฟเวอร์ขนาดใหญ่จะใช้เวลานาน: sudo /usr/local/bin/debsums-scan.sh
Lynis ยังรันได้จากในแดชบอร์ดโดยตรง — ปุ่ม “เริ่มการตรวจสอบ” ในหน้า “การตรวจสอบ Lynis”: มันรันสคริปต์เดียวกันในเบื้องหลังและอัปเดตรายงานให้เอง หลังจากนั้นทุกอย่างจะทำงานตามตาราง ไม่ต้องรันด้วยมืออีก
การสแกนแอนติไวรัสครั้งแรก (sudo /usr/local/bin/clamav-scan.sh) ใช้ดิสก์และซีพียูอย่างหนัก และอาจใช้เวลาหนึ่งชั่วโมงขึ้นไป — บนเซิร์ฟเวอร์ที่ใช้งานจริงควรรอรอบกลางคืนเวลา 01:30 ส่วนหัวข้อ “ดิสก์ (SMART)”, “ประสิทธิภาพ” และ “อัปเดตความปลอดภัย” จะเติมข้อมูลเอง: ทุก 30 นาที, ทุก 5 นาที และชั่วโมงละครั้ง ตามลำดับ
เสร็จแล้ว คู่มือของแต่ละเครื่องมืออยู่ใน FAQ
หากต้องการวางเว็บไซต์อีกหนึ่งแห่งพร้อมโดเมนของตัวเองบนเซิร์ฟเวอร์นี้ — ดู FAQ: “เว็บไซต์ที่สองบนเซิร์ฟเวอร์นี้ (อีกหนึ่งโดเมน)”