• 28/06 cập nhật đăng ký đăng nhập qua Google & Facebook

aaPanel Note

TenHoshi

Administrator
Staff member
Trusted Uploader

1. Tạo file script ramcheck​

Chạy lệnh này trên server:

nano /usr/local/bin/ramcheck

Rồi dán nguyên khối dưới đây vào:

Code:
#!/bin/bash
# ===========================
# ramcheck - Clean RAM Report
# ===========================
# Lấy số liệu từ free -k
read _ total used free shared buff_cache available <<< "$(free -k | awk '/Mem:/ {print $1,$2,$3,$4,$5,$6,$7}')"
swap_used_kb=$(free -k | awk '/Swap:/ {print $3}')
# Đổi KB → MB/GB
fmt() { local kb=$1 if [ "$kb" -ge 1048576 ]; then awk -v v="$kb" 'BEGIN {printf "%.2f GB", v/1048576}' else awk -v v="$kb" 'BEGIN {printf "%.0f MB", v/1024}' fi
}
# Sum RSS theo pattern (case-insensitive)
sum_rss() { ps axo rss,args --no-headers | awk -v p="$1" 'BEGIN{IGNORECASE=1} $0 ~ p {sum+=$1} END{print sum}'
}
# MySQL
mysql_kb=$(sum_rss "mariadbd|mysqld")
# Node.js
node_kb=$(sum_rss " node ")
# PHP-FPM
php_kb=$(sum_rss "php-fpm")
# aaPanel – lọc đúng process, KHÔNG cộng trùng
aapanel_kb=$( ps axo rss,args --no-headers | awk ' BEGIN {sum=0} /\/www\/server\/panel\/pyenv\/bin\/python3/ {sum+=$1; next} /BT-Panel/ {sum+=$1; next} /BT-Task/ {sum+=$1; next} /spawn_main/ && /venv\/bin\/python/ {sum+=$1; next} END {print sum}'
)
# App RAM (không tính cache)
app_used_kb=$(( used - buff_cache ))
[ "$app_used_kb" -lt 0 ] && app_used_kb=0
# RAM unknown
known_kb=$(( mysql_kb + node_kb + php_kb + aapanel_kb ))
others_kb=$(( app_used_kb - known_kb ))
[ "$others_kb" -lt 0 ] && others_kb=0
# Bảng đẹp
line="──────────────────────────────────────────────"
printf "┌$line┬───────────────┐\n"
printf "│ %-44s │ %-13s │\n" "Thành phần" "RAM dùng"
printf "├$line┼───────────────┤\n"
printf "│ %-44s │ %-13s │\n" "MySQL / MariaDB" "$(fmt "$mysql_kb")"
printf "│ %-44s │ %-13s │\n" "Node.js (PM2 / node)" "$(fmt "$node_kb")"
printf "│ %-44s │ %-13s │\n" "PHP-FPM" "$(fmt "$php_kb")"
printf "│ %-44s │ %-13s │\n" "aaPanel Python (BT-Panel/Task)" "$(fmt "$aapanel_kb")"
printf "│ %-44s │ %-13s │\n" "Linux file cache" "$(fmt "$buff_cache")"
printf "│ %-44s │ %-13s │\n" "System + nền tảng khác" "$(fmt "$others_kb")"
printf "│ %-44s │ %-13s │\n" "Swap used" "$(fmt "$swap_used_kb")"
printf "├$line┼───────────────┤\n"
printf "│ %-44s │ %-13s │\n" "Tổng RAM used (theo free)" "$(fmt "$used")"
printf "└$line┴───────────────┘\n"

Save lại:

Ctrl + O → Enter → Ctrl + X

Cấp quyền:

chmod +x /usr/local/bin/ramcheck

Chạy thử:

ramcheck

🎉 Giao diện bạn sẽ nhận được:​

┌──────────────────────────────────────────────┬───────────────┐
│ Thành phần │ RAM dùng │
├──────────────────────────────────────────────┼───────────────┤
│ MySQL / MariaDB │ 430 MB │
│ Node.js (PM2 / node) │ 458 MB │
│ PHP-FPM │ 184 MB │
│ aaPanel Python (BT-Panel/Task) │ 360 MB │
│ Linux file cache │ 1.7 GB │
│ System + nền tảng khác │ 1.8 GB │
│ Swap used │ 908 MB │
├──────────────────────────────────────────────┼───────────────┤
│ Tổng RAM used (theo free) │ 5.8 GB │
└──────────────────────────────────────────────┴───────────────┘
 

TenHoshi

Administrator
Staff member
Trusted Uploader

Lỗi: file /.well-known/assetlinks.json (Android App Links) bị trả Content-Type: text/plain, trong khi Google bắt buộc application/json.​


Nguyên nhân thường gặp:
- Server là nginx: nginx không đọc .htaccess, nên sửa .htaccess không có tác dụng. Phải sửa trong cấu hình nginx.
- Panel quản lý hosting (aaPanel/BT Panel...): panel thường tự thêm một đoạn cấu hình để xác thực SSL.

Đoạn này bắt mọi request /.well-known/* và ép trả text/plain. Nó chạy trước khi nginx xét các location, nên thêm location riêng cho file cũng không ăn.

Cách fix: trong file cấu hình nginx của site, đặt đoạn sau trước dòng include cấu hình well-known của panel:

Code:
if ($uri = /.well-known/assetlinks.json) { break;
}

break làm nginx bỏ qua đoạn của panel cho riêng file này. File được trả như file tĩnh, lấy kiểu theo mime.types nên ra application/json. Các file khác trong /.well-known/, gồm cả file xác thực SSL, vẫn chạy như cũ.

Với apple-app-site-association (iOS) thì file không có đuôi .json, nên cần thêm location riêng để khai báo kiểu:

Code:
if ($uri = /.well-known/apple-app-site-association) { break;
}
location = /.well-known/apple-app-site-association { default_type application/json;
}

Các bước:
1. Backup file cấu hình.
2. Thêm đoạn trên.
3. Chạy nginx -t, báo OK thì nginx -s reload.
4. Kiểm tra: curl -sI https://<domain>/.well-known/assetlinks.json | grep -i content-type, kết quả phải là application/json.
5. Nếu dùng Cloudflare/CDN thì purge cache file đó.
6. Công cụ kiểm tra của Google lưu kết quả khoảng 10 phút, đợi hết thời gian đó rồi test lại.

Lưu ý: panel có thể ghi đè file cấu hình khi đổi setting site, nên sau mỗi lần đổi hãy kiểm tra lại đoạn này còn không.
 

TenHoshi

Administrator
Staff member
Trusted Uploader
aapanel Chuyển thư mục Backup của aaPanel sang ổ đĩa khác bằng Symlink

do vps bị hết dung lượng mình mua thêm nhưng nó ở phân vùng khác nên mới có bài này

Nếu VPS của bạn bị đầy ổ root nhưng đã gắn thêm một ổ đĩa mới (ví dụ mount tại /data), bạn có thể chuyển toàn bộ thư mục backup của aaPanel sang ổ mới mà không cần sửa bất kỳ cấu hình nào của aaPanel.

Ưu điểm của cách này:
    • Không cần chỉnh source aaPanel.
    • Vẫn backup, restore bình thường.
    • Vẫn xóa backup trên giao diện aaPanel.
    • Vẫn hoạt động với tính năng chỉ giữ lại X bản backup.
    • Có thể quay lại trạng thái cũ nếu cần.

Mô hình​

Trước:
/www/backup/site
/www/backup/database/mysql
Sau:
/www/backup/site
│
└──► /data/backup/site

/www/backup/database/mysql
│
└──► /data/backup/database/mysql

aaPanel vẫn sử dụng đường dẫn cũ /www/backup/..., nhưng dữ liệu thực tế được lưu trên ổ /data.

Bước 1. Tạo thư mục trên ổ mới​

mkdir -p /data/backup/site
mkdir -p /data/backup/database/mysql

Bước 2. Sao chép dữ liệu​

Website:
rsync -aHAX --numeric-ids /www/backup/site/ /data/backup/site/
Database:
rsync -aHAX --numeric-ids /www/backup/database/mysql/ /data/backup/database/mysql/

Bước 3. Giữ lại bản cũ để dự phòng​

mv /www/backup/site /www/backup/site.old
mv /www/backup/database/mysql /www/backup/database/mysql.old

Bước 4. Tạo symlink​

ln -s /data/backup/site /www/backup/site
ln -s /data/backup/database/mysql /www/backup/database/mysql

Bước 5. Kiểm tra​

ls -ld /www/backup/site
ls -ld /www/backup/database/mysql

Kết quả:
/www/backup/site -> /data/backup/site
/www/backup/database/mysql -> /data/backup/database/mysql

Bước 6. Kiểm tra backup​

Thử backup một website hoặc database trên aaPanel.
Kiểm tra file có được tạo trong:
/data/backup/site
hoặc
/data/backup/database/mysql

Ví dụ:
find /data/backup/site -type f -mmin -30
find /data/backup/database/mysql -type f -mmin -30

Bước 7. Kiểm tra chức năng xóa​

Xóa một file backup trên giao diện aaPanel.
Nếu file trong /data/backup/... cũng bị xóa thì symlink đã hoạt động chính xác.

Bước 8. Xóa dữ liệu cũ​

Sau khi đã xác nhận backup và xóa hoạt động bình thường:
rm -rf /www/backup/site.old
rm -rf /www/backup/database/mysql.old

Kết quả​

Sau khi chuyển:
    • Backup Website hoạt động.
    • Backup Database hoạt động.
    • Xóa backup trên aaPanel hoạt động.
    • Tính năng "Keep latest X backups" vẫn hoạt động vì aaPanel vẫn thao tác trên cùng đường dẫn /www/backup/..., hệ điều hành sẽ tự chuyển đến thư mục thật trên ổ /data.
Đây là giải pháp đơn giản, an toàn và không cần chỉnh sửa mã nguồn hoặc cấu hình của aaPanel. Chỉ cần đảm bảo ổ /data được mount tự động sau mỗi lần khởi động VPS là hệ thống sẽ hoạt động bình thường.
 

Guest Post 2022

Top