1.Buka editor nano dengan perintah :
sudo nano /usr/local/bin/zivpanel
2.Salin dan tempel seluruh script kedalam nano.
3.Berikan izin eksekusi dengan perintah :
sudo chmod +x /usr/local/bin/zivpanel
4.Jalankan panel dengan perintah :
zivpanel
Script Panel
#!/bin/bash
# --- VARIABEL KONFIGURASI ---
MANUAL_DIR="/root/zivpn_manual"
MANUAL_ACCOUNTS_FILE="$MANUAL_DIR/manual_accounts.txt"
# Buat direktori jika belum ada
mkdir -p "$MANUAL_DIR"
# --- VARIABEL WARNA ---
RESET="\033[0m"
BLACK="\033[0;30m"
RED="\033[0;31m"
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
BLUE="\033[0;34m"
PURPLE="\033[0;35m"
CYAN="\033[0;36m"
WHITE="\033[0;37m"
# --- WARNA TERANG ---
LIGHT_CYAN="\033[1;36m"
LIGHT_GREEN="\033[1;32m"
LIGHT_YELLOW="\033[1;33m"
LIGHT_PURPLE="\033[1;35m"
LIGHT_GRAY="\033[0;37m" # Sama dengan WHITE untuk opsi
# --- FUNGSI-FUNGSI ---
# Fungsi untuk mengambil informasi sistem (IP, CPU, RAM)
get_system_info() {
# Dapatkan IP Publik VPS
VPS_IP=$(curl -s --connect-timeout 3 ifconfig.me)
if [ -z "$VPS_IP" ]; then
VPS_IP="N/A"
fi
# Dapatkan Penggunaan CPU
CPU_USAGE_RAW=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
CPU_USAGE=$(printf "%.1f" "$CPU_USAGE_RAW")
# Dapatkan Penggunaan RAM
RAM_USAGE=$(free -m | awk 'NR==2{printf "%.1f%%", $3*100/$2}')
}
# Fungsi untuk membersihkan layar dan menampilkan menu utama
tampilkan_menu() {
clear
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_CYAN} ZIVPN Management Panel${RESET}"
echo -e "${LIGHT_GRAY} Dekeng Ane Biak Belitong${RESET}" # Subtitle baru
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_PURPLE}IP VPS: ${RESET}${YELLOW}$VPS_IP${RESET} | ${LIGHT_PURPLE}CPU: ${RESET}${GREEN}$CPU_USAGE%${RESET} | ${LIGHT_PURPLE}RAM: ${RESET}${GREEN}$RAM_USAGE${RESET}"
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_GRAY}1. Tambah Akun${RESET}" # Teks diperbarui
echo -e "${LIGHT_GRAY}2. Hapus Akun${RESET}" # Teks diperbarui
echo -e "${LIGHT_GRAY}3. List Akun${RESET}" # Teks diperbarui
echo -e "${LIGHT_GRAY}4. Kelola Akun Manual${RESET}"
echo -e "${CYAN}--------------------------------------------${RESET}"
echo -e "${LIGHT_GRAY}5. Download Script${RESET}" # Teks diperbarui
echo -e "${LIGHT_GRAY}6. Install Script${RESET}" # Teks diperbarui
echo -e "${LIGHT_GRAY}7. Speedtest & Monitor${RESET}"
echo -e "${LIGHT_GRAY}8. Info VPS${RESET}"
echo -e "${CYAN}--------------------------------------------${RESET}"
echo -e "${LIGHT_GRAY}0. Keluar${RESET}"
echo -e "${CYAN}============================================${RESET}"
}
# Fungsi untuk menampilkan menu kelola akun manual
tampilkan_menu_manual() {
clear
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_CYAN} Kelola Akun Manual (Catatan Pribadi)${RESET}"
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_GRAY}1. Tambah Akun Manual${RESET}"
echo -e "${LIGHT_GRAY}2. Hapus Akun Manual${RESET}"
echo -e "${LIGHT_GRAY}3. Lihat Daftar Akun Manual${RESET}"
echo -e "${LIGHT_GRAY}4. Perpanjang Akun Manual${RESET}"
echo -e "${LIGHT_GRAY}0. Kembali ke Menu Utama${RESET}"
echo -e "${CYAN}============================================${RESET}"
}
# Fungsi untuk menampilkan menu monitor
tampilkan_menu_monitor() {
clear
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_CYAN} Speedtest & Monitor${RESET}"
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_GRAY}1. Speedtest (Ookla)${RESET}"
echo -e "${LIGHT_GRAY}2. Monitor Traffic (vnstat)${RESET}"
echo -e "${LIGHT_GRAY}0. Kembali ke Menu Utama${RESET}"
echo -e "${CYAN}============================================${RESET}"
}
# Fungsi untuk menampilkan menu vnstat
tampilkan_menu_vnstat() {
clear
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_CYAN} Monitor Traffic (vnstat)${RESET}"
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_GRAY}1. Traffic Per Jam${RESET}"
echo -e "${LIGHT_GRAY}2. Traffic Per Hari${RESET}"
echo -e "${LIGHT_GRAY}3. Traffic Per Bulan${RESET}"
echo -e "${LIGHT_GRAY}4. Traffic Per Tahun${RESET}"
echo -e "${LIGHT_GRAY}5. Top 10 Hari (Penggunaan Tertinggi)${RESET}"
echo -e "${LIGHT_GRAY}0. Kembali${RESET}"
echo -e "${CYAN}============================================${RESET}"
}
# Fungsi untuk menampilkan menu info VPS
tampilkan_menu_info_vps() {
clear
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_CYAN} Informasi VPS${RESET}"
echo -e "${CYAN}============================================${RESET}"
echo -e "${LIGHT_GRAY}1. System Resource (htop)${RESET}"
echo -e "${LIGHT_GRAY}2. System Overview (neofetch)${RESET}"
echo -e "${LIGHT_GRAY}3. Disk Usage${RESET}"
echo -e "${LIGHT_GRAY}4. Memory Usage${RESET}"
echo -e "${LIGHT_GRAY}5. System Info (uname)${RESET}"
echo -e "${LIGHT_GRAY}0. Kembali ke Menu Utama${RESET}"
echo -e "${CYAN}============================================${RESET}"
}
# --- FUNGSI-FUNGSI AKUN MANUAL ---
# Fungsi untuk menghitung sisa hari
hitung_sisa_hari() {
local expiry_date=$1 # Format: YYYY-MM-DD
local today=$(date +%Y-%m-%d)
local sisa_detik=$(( ($(date -d "$expiry_date" +%s) - $(date -d "$today" +%s)) ))
local sisa_hari=$((sisa_detik / 86400))
if [ "$sisa_hari" -lt 0 ]; then
echo -e "${RED}EXPIRED${RESET}"
else
echo "$sisa_hari"
fi
}
tambah_akun_manual() {
echo -e "${LIGHT_CYAN}--- Tambah Akun Manual Baru ---${RESET}"
read -p "Masukkan Username: " username
read -p "Masukkan masa aktif (dalam hari): " jumlah_hari
if ! [[ "$jumlah_hari" =~ ^[0-9]+$ ]]; then
echo -e "${RED}❌ Input tidak valid. Harap masukkan angka.${RESET}"
read -p "Tekan Enter untuk kembali..."
return
fi
local expiry_date=$(date -d "$jumlah_hari days" +%Y-%m-%d)
echo "$username:$expiry_date" >> "$MANUAL_ACCOUNTS_FILE"
echo ""
echo -e "${GREEN}✅ Akun '$username' berhasil ditambahkan. Expired: $(date -d "$expiry_date" +%d-%m-%Y)${RESET}"
read -p "Tekan Enter untuk kembali..."
}
hapus_akun_manual() {
if [ ! -s "$MANUAL_ACCOUNTS_FILE" ]; then
echo -e "${YELLOW}Belum ada akun manual yang terdaftar.${RESET}"
read -p "Tekan Enter untuk kembali..."
return
fi
echo -e "${LIGHT_CYAN}--- Hapus Akun Manual ---${RESET}"
tampilkan_list_manual
echo ""
read -p "Masukkan Username yang ingin dihapus: " username_to_delete
if ! grep -q "^$username_to_delete:" "$MANUAL_ACCOUNTS_FILE"; then
echo -e "${RED}❌ Akun dengan username '$username_to_delete' tidak ditemukan.${RESET}"
read -p "Tekan Enter untuk kembali..."
return
fi
sed -i "/^$username_to_delete:/d" "$MANUAL_ACCOUNTS_FILE"
if grep -q "^$username_to_delete:" "$MANUAL_ACCOUNTS_FILE"; then
echo -e "${RED}❌ Gagal menghapus akun '$username_to_delete'. Silakan coba lagi.${RESET}"
else
echo ""
echo -e "${GREEN}✅ Akun '$username_to_delete' berhasil dihapus.${RESET}"
fi
read -p "Tekan Enter untuk kembali..."
}
tampilkan_list_manual() {
echo -e "${LIGHT_CYAN}--- Daftar Akun Manual ---${RESET}"
if [ ! -s "$MANUAL_ACCOUNTS_FILE" ]; then
echo -e "${YELLOW}Belum ada akun manual yang terdaftar.${RESET}"
return
fi
printf "%-15s | %-12s | %-10s\n" "Username" "Expired" "Sisa Hari"
echo -e "${CYAN}---------------------------------------------${RESET}"
while IFS=: read -r username expiry_date; do
sisa_hari=$(hitung_sisa_hari "$expiry_date")
formatted_date=$(date -d "$expiry_date" +%d-%m-%Y)
printf "%-15s | %-12s | %-10s\n" "$username" "$formatted_date" "$sisa_hari"
done < "$MANUAL_ACCOUNTS_FILE"
}
renew_akun_manual() {
if [ ! -s "$MANUAL_ACCOUNTS_FILE" ]; then
echo -e "${YELLOW}Belum ada akun manual yang terdaftar.${RESET}"
read -p "Tekan Enter untuk kembali..."
return
fi
echo -e "${LIGHT_CYAN}--- Perpanjang Akun Manual ---${RESET}"
tampilkan_list_manual
echo ""
read -p "Masukkan Username yang ingin diperpanjang: " username_to_renew
local old_expiry=$(grep "^$username_to_renew:" "$MANUAL_ACCOUNTS_FILE" | cut -d':' -f2)
if [ -z "$old_expiry" ]; then
echo -e "${RED}❌ Akun dengan username '$username_to_renew' tidak ditemukan.${RESET}"
read -p "Tekan Enter untuk kembali..."
return
fi
read -p "Masukkan jumlah hari perpanjangan: " jumlah_hari
if ! [[ "$jumlah_hari" =~ ^[0-9]+$ ]]; then
echo -e "${RED}❌ Input tidak valid. Harap masukkan angka.${RESET}"
read -p "Tekan Enter untuk kembali..."
return
fi
local new_expiry=$(date -d "$old_expiry + $jumlah_hari days" +%Y-%m-%d)
sed -i "s|^$username_to_renew:.*|$username_to_renew:$new_expiry|" "$MANUAL_ACCOUNTS_FILE"
echo ""
echo -e "${GREEN}✅ Akun '$username_to_renew' berhasil diperpanjang.${RESET}"
echo -e " Expired baru: $(date -d "$new_expiry" +%d-%m-%Y)"
read -p "Tekan Enter untuk kembali..."
}
kelola_akun_manual() {
while true
do
tampilkan_menu_manual
read -p "Pilih menu [0-4]: " pilihan_manual
case $pilihan_manual in
1) echo ""; tambah_akun_manual ;;
2) echo ""; hapus_akun_manual ;;
3) echo ""; tampilkan_list_manual; echo ""; read -p "Tekan Enter untuk kembali..." ;;
4) echo ""; renew_akun_manual ;;
0) break ;;
*) echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-4.${RESET}"; read -p "Tekan Enter untuk melanjutkan..." ;;
esac
done
}
# --- FUNGSI-FUNGSI FITUR BARU ---
menu_monitor() {
while true
do
tampilkan_menu_monitor
read -p "Pilih menu [0-2]: " pilihan_monitor
case $pilihan_monitor in
1)
echo ""
# PERUBAHAN: Memeriksa perintah 'speedtest' (Ookla)
if ! command -v speedtest &> /dev/null; then
echo -e "${RED}❌ 'speedtest' (Ookla) tidak ditemukan.${RESET}"
echo -e "${YELLOW}Silakan install terlebih dahulu:${RESET}"
echo -e "${CYAN} wget https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz${RESET}"
echo -e "${CYAN} tar -xvf ookla-speedtest-1.2.0-linux-x86_64.tgz${RESET}"
echo -e "${CYAN} sudo mv speedtest /usr/local/bin/${RESET}"
echo -e "${CYAN} sudo chmod +x /usr/local/bin/speedtest${RESET}"
else
echo -e "${LIGHT_CYAN}Menjalankan Speedtest...${RESET}"
# PERUBAHAN: Menjalankan perintah 'speedtest'
speedtest
fi
read -p "Tekan Enter untuk kembali..."
;;
2)
menu_vnstat
;;
0)
break
;;
*)
echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-2.${RESET}"
read -p "Tekan Enter untuk melanjutkan..."
;;
esac
done
}
menu_vnstat() {
while true
do
tampilkan_menu_vnstat
read -p "Pilih menu [0-5]: " pilihan_vnstat
case $pilihan_vnstat in
1) echo ""; echo -e "${LIGHT_CYAN}--- Traffic Per Jam ---${RESET}"; vnstat -h; read -p "Tekan Enter untuk kembali..." ;;
2) echo ""; echo -e "${LIGHT_CYAN}--- Traffic Per Hari ---${RESET}"; vnstat -d; read -p "Tekan Enter untuk kembali..." ;;
3) echo ""; echo -e "${LIGHT_CYAN}--- Traffic Per Bulan ---${RESET}"; vnstat -m; read -p "Tekan Enter untuk kembali..." ;;
4) echo ""; echo -e "${LIGHT_CYAN}--- Traffic Per Tahun ---${RESET}"; vnstat -y; read -p "Tekan Enter untuk kembali..." ;;
5) echo ""; echo -e "${LIGHT_CYAN}--- Top 10 Hari ---${RESET}"; vnstat -t; read -p "Tekan Enter untuk kembali..." ;;
0) break ;;
*) echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-5.${RESET}"; read -p "Tekan Enter untuk melanjutkan..." ;;
esac
done
}
menu_info_vps() {
while true
do
tampilkan_menu_info_vps
read -p "Pilih menu [0-5]: " pilihan_info
case $pilihan_info in
1)
echo ""
echo -e "${LIGHT_CYAN}Menjalankan htop... (tekan 'q' untuk keluar)${RESET}"
htop
;;
2)
echo ""
if ! command -v neofetch &> /dev/null; then
echo -e "${RED}❌ 'neofetch' tidak ditemukan.${RESET}"
echo -e "${YELLOW}Silakan install terlebih dahulu:${RESET}"
echo -e "${CYAN} Ubuntu/Debian: apt install neofetch${RESET}"
echo -e "${CYAN} CentOS/RHEL: yum install neofetch${RESET}"
else
neofetch
fi
read -p "Tekan Enter untuk kembali..."
;;
3) echo ""; echo -e "${LIGHT_CYAN}--- Disk Usage ---${RESET}"; df -h; read -p "Tekan Enter untuk kembali..." ;;
4) echo ""; echo -e "${LIGHT_CYAN}--- Memory Usage ---${RESET}"; free -h; read -p "Tekan Enter untuk kembali..." ;;
5) echo ""; echo -e "${LIGHT_CYAN}--- System Info ---${RESET}"; uname -a; read -p "Tekan Enter untuk kembali..." ;;
0) break ;;
*) echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-5.${RESET}"; read -p "Tekan Enter untuk melanjutkan..." ;;
esac
done
}
# --- PROGRAM UTAMA ---
while true
do
# Ambil data sistem terbaru sebelum menampilkan menu
get_system_info
# Tampilkan menu yang sudah termasuk info sistem
tampilkan_menu
read -p "Pilih menu [0-8]: " pilihan
case $pilihan in
1) echo ""; echo -e "${LIGHT_CYAN}Sedang memproses penambahan akun...${RESET}"; bash <(wget -qO- https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh) add; echo ""; read -p "Tekan Enter untuk kembali ke menu..." ;;
2) echo ""; echo -e "${LIGHT_CYAN}Sedang memproses penghapusan akun...${RESET}"; bash <(wget -qO- https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh) del; echo ""; read -p "Tekan Enter untuk kembali ke menu..." ;;
3) echo ""; echo -e "${LIGHT_CYAN}Menampilkan daftar akun...${RESET}"; bash <(wget -qO- https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh) list; echo ""; read -p "Tekan Enter untuk kembali ke menu..." ;;
4) kelola_akun_manual ;;
5)
echo ""
echo -e "${LIGHT_CYAN}Mendownload script ZIVPN...${RESET}"
wget https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh -O zi.sh
echo -e "${LIGHT_CYAN}Mengubah permission script...${RESET}"
chmod +x zi.sh
echo -e "${LIGHT_CYAN}Menampilkan bantuan script...${RESET}"
./zi.sh help
echo ""
echo -e "${GREEN}✅ Script berhasil didownload. Anda bisa menjalankannya dengan ./zi.sh${RESET}"
read -p "Tekan Enter untuk kembali..."
;;
6)
echo ""
echo -e "${LIGHT_CYAN}Memulai instalasi ZIVPN...${RESET}"
bash <(wget -qO- https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh) install
echo ""
echo -e "${GREEN}✅ Proses instalasi selesai.${RESET}"
read -p "Tekan Enter untuk kembali..."
;;
7)
menu_monitor
;;
8)
menu_info_vps
;;
0) echo -e "${LIGHT_GREEN}Terima kasih, sampai jumpa!${RESET}"; exit 0 ;;
*) echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-8.${RESET}"; read -p "Tekan Enter untuk melanjutkan..." ;;
esac
done
