Cài đặt tự động

Cách tự động: một script từ tài khoản cá nhân sẽ chuẩn bị toàn bộ máy chủ (web-stack Apache + PHP, cơ sở dữ liệu, công cụ bảo mật, cron). Tiếp theo — triển khai dashboard, cấp SSL và nhập license. Hoạt động trên Ubuntu/Debian: trên VPS mới, script thiết lập mọi thứ từ đầu; trên máy chủ đã cấu hình — chỉ bổ sung thêm (hồ sơ “Máy chủ đã cấu hình”, bước 01). Tất cả lệnh bên dưới theo thứ tự, chỉ cần cuộn từ trên xuống dưới. Trên VPS mới, mọi bước đều áp dụng lần lượt; nếu máy chủ đã được cấu hình hoặc có cài bảng điều khiển hosting, script cố ý để lại một phần công việc cho bạn — chính xác là phần nào, script ghi ở cuối quá trình chạy (phân tích kết quả xuất ra — ở bước 01).

Các giá trị mẫu trong lệnh hãy thay bằng giá trị của bạn: monitor.example.com — domain của bạn; 203.0.113.10 — IP thật của máy chủ; /var/www/monitor — thư mục gốc của dashboard (nơi chứa public/, assets/, config.php); mật khẩu DB hãy tự đặt.
Bộ đầy đủ (“Bảo vệ toàn diện”) dành cho VPS mới. Trên Ubuntu/Debian sạch, script thiết lập hệ thống bảo mật từ đầu — Fail2ban (jail.local), root-crontab, quy tắc UFW, cấu hình Apache. Nếu máy chủ đã được cấu hình (dashboard đang chạy, các trang web, email, các jail riêng) — hãy chọn hồ sơ “Máy chủ đã cấu hình”: nó chỉ thực hiện các thay đổi bổ sung và không đụng đến firewall, Fail2ban, email, SSH và sysctl của bạn. Khi phát hiện có hosting-panel, script tự chuyển sang chế độ này. Trước lần chạy đầu tiên, bạn có thể bật chạy thử (đánh dấu trong tài khoản) — nó sẽ cho thấy những gì sẽ được làm mà không thay đổi gì. Trên máy chủ đang hoạt động, để chắc chắn hãy tạo một snapshot.

01. Lệnh tự động cấu hình từ tài khoản

Lệnh được lấy trong tài khoản cá nhân của bạn my.arciveo.com → mục “Cấu hình máy chủ” (khả dụng sau khi đăng ký Arcivéo Security Monitor). Lệnh gắn với tài khoản của bạn và chứa token cá nhân.

Tập lệnh chuẩn bị toàn bộ máy chủ: web-stack (Apache + PHP), cơ sở dữ liệu, công cụ cho SSL, bộ công cụ bảo vệ đầy đủ và các tác vụ cron (Lynis, SMART, debsums, Logwatch, báo cáo hằng ngày, cập nhật ipsum).

1) Chọn mức độ bảo vệ (trong tài khoản, trước khi sao chép lệnh):

  • Bảo vệ toàn diện (khuyến nghị) — UFW (tường lửa), Fail2ban, CrowdSec + bouncer, ipsum (danh sách chặn IP), Suricata (IDS/IPS), Falco, ModSecurity + OWASP CRS (WAF), PSAD, mod_evasive (chống DoS), AIDE (toàn vẹn tập tin), debsums, ClamAV + maldet (chống virus), Auditd, AppArmor, Monit, Lynis (kiểm toán), Logwatch, tự động cập nhật bảo mật.
  • Nhẹ — cho VPS ít RAM: bộ cơ bản không có các thành phần nặng.
  • Máy chủ đã cấu hình (bảng điều khiển hosting) — cho máy chủ đang chạy có bảng điều khiển (HestiaCP v.v.), các website và email: chỉ thay đổi bổ sung (cài thêm công cụ, cron, quy tắc sudo), còn tường lửa, Fail2ban, email, SSH và sysctl giữ nguyên. Trên máy chủ có bảng điều khiển, tập lệnh tự chọn chế độ này.
Chạy thử. Trong tài khoản có thể tích chọn “Chạy thử” — khi đó lệnh chỉ hiển thị những gì tập lệnh sẽ cài đặt và thay đổi rồi kết thúc mà không tác động gì. Hữu ích trên máy chủ đã cấu hình: chạy thử trước, sau đó chạy thật không tích chọn.

2) Chạy trên máy chủ dưới quyền root lệnh từ tài khoản — nó trông như sau:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
Giữ bí mật lệnh này — nó gắn với tài khoản của bạn. Liên kết có thời hạn giới hạn; nếu hết hạn, hãy nhấn “Lấy liên kết mới” trong tài khoản.
Sau khi tự động cấu hình, web-server là Apache + PHP-FPM, còn các công cụ bảo mật và tác vụ cron đã được cài đặt và hoạt động sẵn.

3) Hãy đọc phần kết quả xuất ra ở cuối — ở đó ghi rõ những gì còn lại thuộc về bạn. Tập lệnh kết thúc bằng một khối kiểm tra và danh sách “Tiếp theo — cài đặt bảng điều khiển”. Một phần các bước, tập lệnh cố ý không thực hiện: chính xác là phần nào thì tùy vào hồ sơ đã chọn và vào những gì nó tìm thấy trên máy chủ. Hãy đối chiếu với danh sách dưới đây — chỉ cần thực hiện những mục mà dòng tương ứng đã xuất hiện trong kết quả của bạn.

  • Control panel detected (…) — website được tạo bằng chính bảng điều khiển hosting, tập lệnh không tạo vhost. Bước 03, nhánh “Máy chủ có bảng điều khiển hosting”.
  • No vhost created (no domain given) — hồ sơ “Máy chủ đã cấu hình” mà không có domain: một vhost không có tên sẽ trở thành website mặc định và chặn mất chính các website của bạn, nên nó không được tạo. Bước 03, nhánh “Tạo vhost thủ công”.
  • sudo rules NOT written — tập lệnh không xác định được bảng điều khiển chạy dưới tài khoản nào. Đây là tình huống bình thường: tệp của bảng điều khiển được tải lên sau khi tự động cấu hình, nên lúc đó chưa có gì để xác định. Thiếu các quy tắc này, các module sẽ không thấy dữ liệu hệ thống. Bước 04, khối “sudo cho máy chủ web”.
  • ! Nginx does not read .htaccess — phía trước Apache có Nginx, và việc tự động ghi lệnh cấm vào cấu hình của nó đã không thành công. Nhất định hãy làm điều này: nếu không, data/, keys/, database/ và config.php sẽ bị lộ ra ngoài, bỏ qua .htaccess. Bước 03, khối “Nếu phía trước Apache có Nginx”.
  • UFW installed but inactive — tường lửa đã được cài nhưng đang tắt: trên máy chủ đã cấu hình, tập lệnh không tự bật nó để không cắt mất quyền truy cập của bạn. Hãy tự bật, nhất thiết phải cho phép cổng SSH của bạn:
    sudo ufw allow OpenSSH # cổng SSH không chuẩn: sudo ufw allow 2222/tcp sudo ufw allow 80,443/tcp sudo ufw enable
  • Fail2ban installed but not running — hãy khởi động: sudo systemctl enable --now fail2ban.
  • Database server present … but not running — hãy khởi động hệ quản trị cơ sở dữ liệu trước bước 04: sudo systemctl enable --now mariadb (hoặc mysql — tùy loại đang được cài).
  • Certbot skipped — issue SSL in … — chứng chỉ được cấp bằng công tắc Let's Encrypt trong bảng điều khiển hosting; bước 06 bạn không cần đến.
Nếu trong khối kiểm tra mọi thứ đều ổn, dòng cuối cùng sẽ là All checks passed. Các mục có dấu ! cần được chú ý; chi tiết được ghi vào log, đường dẫn của log được tập lệnh in ra ở ngay cuối (Log: …).

02. Tên miền và DNS

Để mở dashboard tại địa chỉ dạng monitor.example.com và nhận SSL miễn phí, tên miền phải trỏ về máy chủ. Trong bảng quản lý DNS (tại nhà đăng ký hoặc nhà cung cấp hosting), hãy tạo một bản ghi A:

Loại: A Tên: monitor (tên miền phụ → monitor.example.com) hoặc @ (tên miền gốc → example.com) Giá trị: 203.0.113.10 ← IP máy chủ của bạn TTL: 3600

Sau vài phút (đôi khi tới một giờ), hãy kiểm tra tên miền đã trỏ về máy chủ chưa:

dig +short monitor.example.com # phải trả về IP của bạn # hoặc, nếu không có dig: getent hosts monitor.example.com
Chứng chỉ SSL (bước 06) chỉ được cấp cho tên miền — nên DNS phải trỏ về máy chủ trước khi phát hành chứng chỉ.

03. Tải lên tệp của bảng điều khiển

Trường hợp thông thường (VPS mới). Trình tự động cấu hình đã tạo sẵn thư mục bảng điều khiển /var/www/monitor và thiết lập trang Apache (DocumentRoot trỏ vào gốc bảng điều khiển, PHP-FPM, AllowOverride cho .htaccess). Trong kết quả xuất ra của tập lệnh, đó là dòng vhost … → DocumentRoot …. Không cần tạo riêng thư mục hay vhost — chỉ cần tải tệp lên và cấp quyền.
Hai trường hợp vhost KHÔNG được tạo — tập lệnh thông báo thẳng điều đó ở cuối quá trình chạy. Khi đó hãy thực hiện nhánh tương ứng bên dưới trước, rồi mới tải tệp lên.

Nhánh “Máy chủ có bảng điều khiển hosting” (trong kết quả xuất ra: Control panel detected (…)). Trên máy chủ như vậy, các website do bảng điều khiển quản lý, và tập lệnh cố ý không tạo vhost riêng — nó sẽ bị ghi đè ngay ở lần bảng điều khiển dựng lại cấu hình đầu tiên. Trình tự như sau:

  1. Hãy tạo một web-domain trong bảng điều khiển hosting (HestiaCP v.v.) — DocumentRoot của nó giữ nguyên như cũ.
  2. Tải toàn bộ gói phân phối vào public_html của domain đó: cạnh index.php, api/, assets/ cũng phải có các thư mục dịch vụ config.php, includes/, data/, tmp/, logs/, keys/, cron/, database/. Không cần đưa gì ra ngoài web-root: các thư mục dịch vụ đã được đóng bằng tệp .htaccess trong gói phân phối, còn dưới Nginx — bằng lệnh cấm mà tập lệnh đã ghi vào cấu hình của domain.
  3. SSL được cấp bằng công tắc Let's Encrypt ngay trong bảng điều khiển — hãy bỏ qua bước 06.
  4. Tiếp theo — quyền (ở phần dưới của bước này), cơ sở dữ liệu (bước 04) và config.php (bước 05). Trong các lệnh, hãy thay đường dẫn bằng /home/tài_khoản/web/domain/public_html, còn chủ sở hữu — bằng người dùng của domain đó thay cho www-data.

Nhánh “Tạo vhost thủ công” (trong kết quả xuất ra: No vhost created (no domain given)). Điều này chỉ xảy ra với hồ sơ “Máy chủ đã cấu hình”, khi domain không được truyền vào. Cách đơn giản nhất — chạy lại lệnh từ tài khoản cá nhân và chỉ rõ domain:

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

Chạy lại là an toàn: những gì đã làm sẽ không bị lặp lại. Còn nếu cần tạo vhost bằng tay — dưới đây chính là cấu hình mà trình cài đặt ghi ra:

sudo mkdir -p /var/www/monitor # Socket PHP-FPM được xác định tự động — phiên bản PHP trên mỗi máy chủ mỗi khác. 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 ở đây là bắt buộc. Một vhost không có tên sẽ trở thành website mặc định của Apache và bắt đầu trả lời thay cho các domain khác trên cùng máy chủ. Cũng vì lý do đó, đừng tắt 000-default.conf trên máy chủ đã cấu hình: website này có thể đã được sửa lại cho một dự án đang chạy — trên VPS mới, trình cài đặt tự gỡ nó, còn ở đây thì không cần làm vậy.
Nếu phía trước Apache có Nginx (trong kết quả xuất ra: ! Nginx does not read .htaccess). Nginx trả các tệp tĩnh trực tiếp từ đĩa và không đọc .htaccess — các thư mục dịch vụ sẽ bị mở ra ngoài, dù Apache đóng chúng đúng cách. Tập lệnh đã chuẩn bị sẵn tệp chứa các lệnh cấm; cần khai báo nó trong khối server{} của website và tải lại Nginx:
include /etc/nginx/snippets/arciveo-deny.conf;
sudo nginx -t && sudo systemctl reload nginx # Kiểm tra: phải trả về 403, chứ không phải nội dung tệp curl -sI https://monitor.example.com/config.php | head -1
Tệp của bảng điều khiển (gói phân phối nén) được tải về sau khi mua trong tài khoản cá nhân my.arciveo.com → “Tải xuống”. Hãy giải nén gói trước khi tải lên máy chủ.

Hãy tải nội dung gói phân phối vào /var/www/monitor (để bên trong có public/, assets/, config.php v.v.) — qua SFTP/SCP (FileZilla / WinSCP) hoặc bằng lệnh scp từ máy tính cục bộ:

scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Để domain của bạn được ghi ngay vào vhost (ServerName), hãy truyền nó vào lệnh tự động cấu hình ngay ở bước 01: … | sudo bash -s -- monitor.example.com (hoặc nhập domain vào ô “Domain của bảng điều khiển” trong tài khoản cá nhân). Nếu không truyền domain — bảng điều khiển sẽ trả lời mọi host và theo IP, còn ServerName sẽ được certbot ghi khi cấp SSL (bước 06); không cần cài đặt lại gì cả.
Hãy cấp quyền cho tệp — đây là bước bắt buộc. Nếu bạn tải lên dưới quyền root hoặc qua SFTP, tệp thuộc về root, và máy chủ web (www-data) sẽ không đọc được chúng — bảng điều khiển sẽ mở ra trống trơn hoặc báo lỗi 403 (trong log: .htaccess unreadable / directory not executable). Lệnh dưới đây khắc phục điều này:
# Chuẩn hóa quyền cho toàn bộ webroot: thư mục do root tạo không truy cập được # đối với máy chủ web (www-data) — nếu không, bảng điều khiển trả về trang trống hoặc 403. cd /var/www/monitor # Tạo các thư mục làm việc TRƯỚC khi chown — nếu không, thư mục mới sẽ vẫn là root:root # và khi chmod 750, máy chủ web (www-data) sẽ không thể ghi vào đó. 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

Hãy mở quyền tải tệp lên qua SFTP cho chính bạn. Sau lệnh ở trên, mọi tệp đều thuộc về www-data, trong khi FileZilla / WinSCP kết nối bằng người dùng của bạn — khi đó việc tải lên sẽ thất bại với SSH_FX_PERMISSION_DENIED (Permission denied). Hãy chọn một trong hai phương án.

Phương án A — ACL chỉ dành cho người dùng của bạn (khuyến nghị). Chỉ mình bạn có quyền ghi; máy chủ web vẫn không thể ghi đè mã của bảng điều khiển:

sudo apt install -y acl # Quyền ghi cho người dùng của bạn trên toàn bộ thư mục bảng điều khiển: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # Cũng quy tắc đó làm mặc định — cho tệp và thư mục tạo về sau: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

Phương án B — qua nhóm www-data. Đơn giản hơn, nhưng máy chủ web cũng có quyền ghi vào tệp của bảng điều khiển: nếu PHP có lỗ hổng thì mã có thể bị thay thế. Thứ tự các lệnh rất quan trọng — config.php và các thư mục làm việc được đóng lại sau cùng:

sudo usermod -aG www-data deploy # Quyền ghi cho nhóm + setgid (bit 2): tệp tải lên qua SFTP vẫn nằm # trong nhóm www-data — nếu không, bảng điều khiển không ghi đè được. 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
Sau phương án B, hãy kết nối lại trong FileZilla (Máy chủ → Ngắt kết nối, rồi đăng nhập lại) — nhóm mới chỉ có hiệu lực khi đăng nhập mới, trước đó bạn vẫn chưa có quyền. Kiểm tra: id deploy — trong danh sách nhóm phải xuất hiện www-data; ls -ld /var/www/monitor — quyền drwxrwsr-x, chữ s thay cho x nghĩa là setgid đã được đặt.

04. Cơ sở dữ liệu

Tạo cơ sở dữ liệu và người dùng, sau đó nhập lược đồ. Khối cấu hình DB được dán vào terminal toàn bộ (sudo mysql đăng nhập root qua unix-socket — không cần mật khẩu root). monitor_db và monitor_user chỉ là tên ví dụ, bạn có thể đặt tên tùy ý; hãy ghi nhớ tên cơ sở dữ liệu, người dùng và mật khẩu — bạn sẽ nhập chúng vào config.php ở bước tiếp theo:

# 1. Cơ sở dữ liệu. Tên cơ sở dữ liệu, người dùng và mật khẩu chỉ đặt MỘT lần bên dưới và được chèn vào mọi dòng. # Khối này được dán vào terminal TOÀN BỘ; sudo mysql đăng nhập root qua unix-socket # (không cần mật khẩu root). ĐỪNG dùng `sudo mysql -u root -p` tương tác # kèm copy-paste — khi dán, các dòng SQL sẽ đi vào phần hỏi mật khẩu và mất. DBNAME='monitor_db' # ← tên cơ sở dữ liệu, có thể giữ nguyên DBUSER='monitor_user' # ← người dùng cơ sở dữ liệu, có thể giữ nguyên DBPASS='CHOOSE_A_PASSWORD' # ← mật khẩu, hãy đặt riêng 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 # Kiểm tra (phải hiển thị $DBNAME): mysql -u "$DBUSER" -p"$DBPASS" -e "SHOW DATABASES;" # Nhập chính ba giá trị này vào config.php → DB_NAME, DB_USER, DB_PASS.
Thông thường không cần nhập lược đồ — bảng điều khiển tự tạo các bảng và tài khoản admin khi truy cập lần đầu trên trình duyệt (từ database/db.sql), nếu DB trống.

Nếu các bảng không được tạo (bảng điều khiển báo lỗi kết nối tới DB hoặc hiện màn hình trống thay cho biểu mẫu đăng nhập) — hãy nhập lược đồ thủ công. Lệnh được chạy ở thư mục gốc của bảng điều khiển, các giá trị lấy từ khối bên trên:

# Nhập lược đồ: cd /var/www/monitor && mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" < database/db.sql # Kiểm tra — phải xuất hiện danh sách các bảng: mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" -e "SHOW TABLES;"
Nếu các biến $DBNAME / $DBUSER / $DBPASS đã “bị quên” (phiên terminal mới) — hãy tự điền giá trị vào lệnh hoặc đặt lại chúng bằng đúng ba dòng từ khối bên trên.
sudo cho máy chủ web. Thông thường các quy tắc đã được trình tự động cấu hình ghi sẵn, và các module thấy dữ liệu hệ thống ngay lập tức. Nhưng nếu trong kết quả xuất ra của tập lệnh có dòng sudo rules NOT written — nghĩa là chưa có gì để xác định tài khoản của bảng điều khiển (tệp chưa được tải lên), và các quy tắc chưa được tạo. Thiếu chúng, các mục như tường lửa, Fail2ban và CrowdSec sẽ trống. Giờ khi tệp đã ở đúng chỗ, hãy chạy lại lệnh từ tài khoản cá nhân, chỉ rõ tài khoản:
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 hãy thay bằng người dùng mà PHP của website bạn đang chạy dưới quyền đó (trên bảng điều khiển hosting, đó thường là chủ sở hữu domain). Có thể xem như sau:
ps -o user= -C php-fpm8.3 | sort -u # hãy thay bằng phiên bản của bạn # hoặc: ps aux | grep -m3 '[p]hp-fpm'
Kiểm tra sau khi chạy lại: tệp /etc/sudoers.d/monitor tồn tại và trong đó có các dòng chứa người dùng của bạn.

05. Cấu hình config.php

config.php ở thư mục gốc của panel (/var/www/monitor/config.php) là tệp duy nhất bạn cần chỉnh sửa thủ công. Mọi thiết lập của panel được khai báo trong đó bằng các hằng define(). Mở tệp bằng trình soạn thảo:

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

Điền giá trị của bạn vào các chỗ được tô sáng; phần còn lại giữ nguyên:

// --- Cơ sở dữ liệu (từ bước 04) --- define('DB_HOST', 'localhost'); // giữ nguyên define('DB_NAME', 'db_name'); // đã tạo ở bước 04 define('DB_USER', 'user'); // đã tạo ở bước 04 define('DB_PASS', 'db_password'); // đã đặt ở bước 04 define('DB_CHARSET', 'utf8mb4'); // giữ nguyên // --- Ứng dụng --- define('APP_URL', 'https://monitor.example.com'); // địa chỉ panel, không có dấu gạch chéo ở cuối define('TIMEZONE', 'Asia/Ho_Chi_Minh'); // múi giờ của bạn // --- Thời gian phiên --- define('SESSION_LIFETIME', 28800); // thời gian rảnh trước khi phải đăng nhập lại, giây (28800 = 8 giờ)

Cần đổi những gì:

  • DB_NAME, DB_USER, DB_PASS — đúng tên cơ sở dữ liệu, người dùng và mật khẩu mà bạn đã đặt khi tạo cơ sở dữ liệu ở bước 04 (nếu giữ ví dụ — monitor_db / monitor_user). Đừng đụng vào DB_HOST và DB_CHARSET.
  • APP_URL — địa chỉ đầy đủ của panel kèm https://, không có dấu gạch chéo ở cuối và không có www. Phải trùng với domain mà bạn kích hoạt license (bước 07), nếu không key sẽ bị từ chối.
  • TIMEZONE — múi giờ của bạn (danh sách — timedatectl list-timezones). Chỉ ảnh hưởng đến cách panel hiển thị ngày tháng; không ảnh hưởng đến thời điểm chạy các tác vụ cron (chỗ đó dùng múi giờ hệ thống).
  • SESSION_LIFETIME — sau bao nhiêu giây không hoạt động thì panel yêu cầu đăng nhập lại (mặc định 8 giờ). Ví dụ 3600 = 1 giờ, 86400 = một ngày.
  • Khối ghi log lỗi (display_errors, log_errors, error_log) — giữ mặc định.

Lưu tệp (Ctrl+O, Enter, rồi Ctrl+X) và khởi động lại PHP-FPM — nếu không thì do OPcache mà các thay đổi sẽ không có hiệu lực:

sudo systemctl restart php*-fpm
config.php là tệp bí mật (trong đó có mật khẩu cơ sở dữ liệu). Nó nằm ở thư mục gốc của panel — cũng chính là web-root — nhưng đã được khóa: quyền 640 (đặt ở bước 03) và cấm rõ ràng trong .htaccess gốc. Đừng đưa nó lên các repository công khai và đừng gửi cho bộ phận hỗ trợ kèm mật khẩu thật.
Phân tích chi tiết tất cả tham số — xem trong FAQ: “Tệp config.php — toàn bộ thiết lập của panel”.

06. Cấp SSL (HTTPS)

Bảng điều khiển chỉ hoạt động qua HTTPS. Phiên đăng nhập dùng cookie bảo mật, còn WebAuthn (2FA) theo chuẩn chỉ chạy trên HTTPS. Qua http:// bạn sẽ không thể đăng nhập.
Trên máy chủ có bảng điều khiển hosting thì không cần bước này (trong kết quả xuất ra của tập lệnh: Certbot skipped — issue SSL in …). Chứng chỉ được cấp bằng công tắc Let's Encrypt trên web-domain ngay trong bảng điều khiển — như vậy việc gia hạn cũng do bảng điều khiển đảm nhiệm.

certbot và plugin cho Apache đã được cài sẵn bởi tự động cấu hình. DNS của tên miền phải trỏ về máy chủ từ trước (bước 02). Cấp chỉ với một lệnh:

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

Nếu bảng điều khiển còn phải mở được cả với www. — hãy liệt kê cả hai tên trong một lệnh, nếu không, ở địa chỉ thứ hai trình duyệt sẽ hiện cảnh báo về chứng chỉ:

sudo certbot --apache -d monitor.example.com -d www.monitor.example.com
Chỉ thêm tên thứ hai nếu nó cũng có bản ghi A trỏ về máy chủ này (bước 02). Nếu không, Let's Encrypt sẽ không xác minh được nó và sẽ không cấp chứng chỉ nào cả — kể cả cho domain chính.
Những gì certbot sẽ hỏi:
  1. Enter email address — e-mail của bạn (thông báo hết hạn chứng chỉ sẽ gửi tới đó).
  2. Terms of Service … (Y)es/(N)o — Y.
  3. Share email with the EFF … (Y)es/(N)o — tùy bạn quyết định.
Tiếp theo certbot sẽ tự cấp chứng chỉ, ghi <VirtualHost *:443>, thiết lập chuyển hướng http→https và tự động gia hạn. Cuối cùng — Successfully enabled HTTPS.
Nếu việc cấp thất bại — hãy kiểm tra dig +short monitor.example.com có trả về IP máy chủ và các cổng 80/443 đã mở (sudo ufw allow 80,443/tcp).

Sau khi cấp: https://monitor.example.com mở ra kèm biểu tượng ổ khóa, còn http:// chuyển hướng sang https://.

07. Đăng nhập và thiết lập ban đầu

Mở https://monitor.example.com, đăng nhập admin / useradmin và làm theo danh sách kiểm tra:

  1. Đổi mật khẩu admin — mục “Người dùng” trong menu.
  2. Bật WebAuthn (2FA) — “Khóa WebAuthn” → đăng ký khóa/passkey (cần HTTPS). Hãy đăng ký ngay hai khóa: nếu mất khóa duy nhất bạn sẽ không thể đăng nhập bằng nó. Chi tiết.
  3. Giới hạn truy cập theo IP — “Cài đặt” → “Giới hạn truy cập theo IP” (hãy nhập IP của bạn trước khi bật, nếu không bạn sẽ tự khóa quyền truy cập của mình).
  4. Nhập giấy phép — kích hoạt mã ARCIVEO-… từ tài khoản cá nhân cho tên miền của bạn rồi dán khóa vào “Cài đặt” → “Giấy phép”. Chi tiết.
  5. Thiết lập thông báo — Telegram và/hoặc Email trong “Cài đặt”. Chi tiết.
  6. Xóa trình cài đặt public/start_db.php nếu vẫn còn: nó cho phép tạo lại cơ sở dữ liệu mà không cần xác thực. Khi tệp còn nằm trong thư mục gốc của dashboard hoặc trong public/, dashboard sẽ cảnh báo bằng biểu ngữ đỏ.
  7. Chạy các lượt kiểm tra đầu tiên bằng tay — nếu không, một phần các mục sẽ trống cho đến đêm (xem khối bên dưới).
Vì sao “Kiểm toán Lynis” và “Logwatch” trống ngay từ đầu. Trình tự động cấu hình đã cài các công cụ và tạo tác vụ cron, nhưng chưa chạy chính các lượt kiểm tra — chúng sẽ chạy theo lịch: Lynis lúc 03:00, Logwatch lúc 06:00, debsums lúc 04:30, ClamAV lúc 01:30. Trước thời điểm đó, các mục hiển thị đúng thực tế rằng chưa có báo cáo. Để khỏi phải chờ cả ngày, hãy chạy chúng một lần bằng tay:
# Kiểm toán Lynis — báo cáo đầu tiên (vài phút): sudo /usr/local/bin/lynis-scan.sh # Báo cáo Logwatch trong ngày: sudo /usr/local/bin/logwatch_daily.sh # Toàn vẹn các gói (debsums) — trên máy chủ lớn sẽ chạy lâu: sudo /usr/local/bin/debsums-scan.sh
Lynis cũng có thể chạy ngay từ bảng điều khiển — nút “Chạy kiểm toán” trên trang “Kiểm toán Lynis”: nó thực thi đúng tập lệnh đó ở chế độ nền và tự cập nhật báo cáo. Sau đó mọi thứ chạy theo lịch, không cần khởi động bằng tay nữa.
Lượt quét chống virus đầu tiên (sudo /usr/local/bin/clamav-scan.sh) gây tải nặng cho đĩa và bộ xử lý, có thể chạy một giờ hoặc lâu hơn — trên máy chủ đang hoạt động, tốt nhất hãy chờ lượt chạy ban đêm lúc 01:30. Các mục “Đĩa (SMART)”, “Hiệu năng” và “Cập nhật bảo mật” tự đầy lên: tương ứng mỗi 30 phút, 5 phút và mỗi giờ một lần.
Xong. Hướng dẫn cho từng công cụ có trong FAQ.
Nếu trên máy chủ này cần thêm một trang với tên miền riêng — xem FAQ: “Trang thứ hai trên máy chủ này (thêm một tên miền)”.