Cecep Purwana

I am a Personal fun

Cecep Purwana

Seorang Driver Dump Truck Yang Menjadikan Computer Sebagai Hobi Dan Memiliki Ketertarikan Akan Dunia IT,Serta Ingin Selalu Mencoba Sesuatu Yang Baru Untuk Menambah Pengetahuan Dan Pengalaman Diri. "Computer is my hobby, the street is my life"

  • Jalan Raya Badau Km.11 Rt.006.Rw.002 Tanjung Pandan Belitung 33451
  • +628197887769
  • purwana.cecep@gmail.com
  • www.ceceppurwana.blogspot.co.id
Me

My Professional Skills

Web Development 90%
Internet Marketing 95%
Computer Technician 95%
Blogger 95%
Driver 97%

Jasa Pembuatan Website

Menerima jasa pembuatan website Usaha,Pribadi,Organisasi,Sekolah,Berita,Iklan Online,Toko Online,dll sesuai dengan permintaan anda

Service Computer

Jasa Service komputer belitung terpercaya dan berpengalaman.Kami memberikan service dan layanan terbaik sehingga customer merasa puas akan layanan yang kami berikan

Perakitan Computer

Jasa Perakitan Komputer kantor, pribadi, maupun game/warnet, Kami Memenuhi kebutuhan anda berdasarkan budget dengan mengutamakan kualitas

Internet Marketing

Merancang cara pemasaran atau modern marketing plan yang fokus mendapatkan prospek atau leads hingga meningkatkan convertion rate merupakan pilihan yang cepat, tepat dan murah.

Pemasangan CCTV

Menerima Jasa Setting CCTV , Jasa Pemasangan CCTV dan Perawatan CCTV untuk Rumah, Kafe, Hotel, Penginapan, Rumah Makan, Kantor, Warnet dan lain-lainnya.Keterangan lebih lanjut hubungi kami.

Maintenance Computer

Jasa Maintenance komputer untuk perkantoran,sekolah atau warnet,khusus bagi anda yang menghargai waktu berharga anda.Serahkan urusan ini kepada kami.Yang terbaik hanya untuk anda

0
completed project
0
my client
0
facebook like
0
work partners
  • Cara Membuat Cloud Drive Pribadi Di VPS

    Sebagai bahan percobaan praktek di sini saya menggunakan vps dengan spek yang super kecil,karena ini hanya sekedar contoh.
    Berikut spesifikasi beserta nama domain yang akan saya gunakan :
    Spesifikasi VPS: 1 CPU, 1 GB RAM, 20 GB HDD
    OS : ubuntu server 20.04 lts
    Domain: cloud.cpcorps.my.id (melalui Cloudflare)
    Hasil Akhir: https://cloud.cpcorps.my.id
    Ada banyak cara untuk bisa membuat cloud drive di vps,namun di sini saya akan menggunakan filebrowser ,karena sangat ringan dan mudah di gunakan dan sangat ramah sumber daya sehingga cocok di gunakan pada vps kecil.
    Berikut Panduan Lengkap Instalasi FileBrowser di VPS Ubuntu 20.04 lts
    Langkah 1 — Login SSH ke VPS
    ssh root@203.194.115.25
    #Ganti 203.194.115.25 dengan ip server atau vps kamu.
    Verifikasi:
    whoami
    Langkah 2 — Update Sistem
    apt update && apt upgrade -y
    Langkah 3 — Buat/Tambah Swap File (1 GB)
    VPS hanya punya 1 GB RAM, jadi swap tambahan sangat diperlukan.
    # Matikan dan hapus swap lama jika sudah ada
    swapoff /swapfile
    rm /swapfile
    # Buat swap baru 1 GB
    fallocate -l 1G /swapfile
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    # Pastikan swap sudah aktif
    free -h
    #Pastikan di output ada: Swap: 1.0Gi
    Pastikan swap otomatis aktif saat restart (cek /etc/fstab):
    grep swap /etc/fstab
    Jika belum ada baris /swapfile swap swap defaults 0 0, tambahkan:
    echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
    Langkah 4 — Install FileBrowser
    curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash
    Verifikasi instalasi:
    filebrowser version
    # Output: 2.63.3 (atau versi terbaru)
    Langkah 5 — Buat Folder Data & Konfigurasi FileBrowser
    Buat folder-folder untuk menyimpan file:
    mkdir -p /srv/cloud-data/Dokumen
    mkdir -p /srv/cloud-data/Foto
    mkdir -p /srv/cloud-data/Video
    mkdir -p /srv/cloud-data/Music
    Buat folder konfigurasi dan file settings.json secara manual:
    mkdir -p /root/.config/filebrowser
    Buat file konfigurasi:
    cat > /root/.config/filebrowser/settings.json << 'EOF'
    {
      "port": 8080,
      "baseURL": "",
      "address": "0.0.0.0",
      "log": "stdout",
      "database": "/srv/cloud-data/filebrowser.db",
      "root": "/srv/cloud-data"
    }
    EOF
    Inisialisasi database (wajib setelah buat config):
    filebrowser config init --config /root/.config/filebrowser/settings.json
    Langkah 6 — Buat User Admin
    Ganti CecepCloud1234 dengan password yang kamu inginkan:
    filebrowser users add admin "Cecepcloud13#" --perm.admin --config /root/.config/filebrowser/settings.json
    #PENTING: Jangan lupa flag --config di setiap perintah filebrowser!
    Langkah 7 — Buat Systemd Service (Auto-start saat Boot)
    Buat file service:
    cat > /etc/systemd/system/filebrowser.service << 'EOF'
    [Unit]
    Description=FileBrowser Service
    After=network.target
    
    [Service]
    ExecStart=/usr/local/bin/filebrowser -c /root/.config/filebrowser/settings.json
    Restart=on-failure
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
    EOF
    Aktifkan dan jalankan:
    systemctl daemon-reload
    systemctl enable filebrowser
    systemctl enable filebrowser
    systemctl start filebrowser
    Verifikasi:
    systemctl status filebrowser
    #Pastikan output menunjukkan Active: active (running).
    Langkah 8 — Install & Konfigurasi Firewall (UFW)
    apt install ufw -y
    Izinkan port yang diperlukan:
    ufw allow 22/tcp
    #SH (jangan pernah blokir)
    ufw allow 80/tcp
    #HTTP
    ufw allow 443/tcp
    #HTTPS
    Aktifkan firewall:
    ufw --force enable
    Verifikasi:
    ufw status
    #Catatan: Port 8080 (FileBrowser langsung) akan terblokir. Itu normal karena kita akan mengaksesnya melalui Nginx di port 80.
    Langkah 9 — Install & Konfigurasi Nginx Reverse Proxy
    Install Nginx:
    apt install nginx -y
    Buat konfigurasi reverse proxy:
    cat > /etc/nginx/sites-available/filebrowser << 'EOF'
    server {
        listen 80;
        server_name cloud.cpcorps.my.id 203.194.115.25;
    
        client_max_body_size 500M;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    EOF
    #Pastikan output: syntax is ok dan test is successful.
    Restart Nginx:
    systemctl enable nginx
    systemctl restart nginx
    Verifikasi proxy bekerja:
    curl -I http://127.0.0.1
    Jika output menunjukkan HTTP/1.1 404 Not Found dari FileBrowser (bukan dari Nginx), berarti proxy sudah bekerja.
    Sekarang buka browser: http://203.194.115.25 — seharusnya redirect ke halaman login FileBrowser.
    Langkah 10 — Setup HTTPS via Cloudflare (Flexible SSL)
    Di Cloudflare:
    1.Buat DNS Record:
    Type: A
    Name: cloud
    Content: 203.194.115.25
    Proxy status: Proxied (awan orange)
    TTL: Auto
    2.Set SSL/TLS Mode:
    Masuk ke SSL/TLS → Overview
    Pilih Flexible
    Di VPS:
    Konfigurasi Nginx sudah menggunakan server_name cloud.cpcorps.my.id, jadi tidak perlu diubah lagi. Cukup restart:
    systemctl restart nginx
    Buka browser: https://cloud.cpcorps.my.id — seharusnya sudah bisa diakses dengan HTTPS!
    Ringkasan Perintah Penting (Cheatsheet)
    KEGUNAAN PERINTAH
    Cek status FileBrowser systemctl status filebrowser
    Restart FileBrowser systemctl restart filebrowser
    Stop FileBrowser systemctl stop filebrowser
    Cek status Nginx systemctl status nginx
    Restart Nginx systemctl restart nginx
    Test konfigurasi Nginx nginx -t
    Cek firewall ufw status
    Cek RAM Dan Swap free -h
    Cek disk usage df -h
    Lihat log FileBrowser journalctl -u filebrowser -f
    Lihat log Nginx journalctl -u nginx -f
    Edit konfigurasi FileBrowser nano /root/.config/filebrowser/settings.json
    Edit konfigurasi Nginx nano /etc/nginx/sites-available/filebrowser

    Lokasi File-File Penting
    FILE LOKASI
    Konfigurasi FileBrowser /root/.config/filebrowser/settings.json
    Database FileBrowser /srv/cloud-data/filebrowser.db
    Folder Data /srv/cloud-data/
    Service FileBrowser /etc/systemd/system/filebrowser.service
    Konfigurasi Nginx /etc/nginx/sites-available/filebrowser
    Swap File /swapfile
  • Mengatasi Error -ama Pada Limiter Registry Panel UDP 2.5 Lite

    Halo Sobat,kali ini kita saya akan membuat sebuah artikel tentang bagai mana mengatasi Mengatasi Error -ama Pada Limiter Registry Panel UDP 2.5 Lite.
    Artikel ini saya buat untuk menjawab pertanyaan seorang teman kepada saya melalui akun media sosial saya.
    Dan juga tulisan ini adalah kelanjutan dari postingan sebelumnya yang berjudul : Memperbaiki Dan Mengaktifkan Fitur Multi-Login Limiter di Panel UDP.
    Jadi jika sobat belum membaca artikel tersebut saya sarankan untuk membacanya terlebih dahulu untuk lebih memahami apa yang akan kita bahas pada topik kali ini.
    Teman-teman mungkin bertanya dari mana tulisan -ama ini bisa muncul pada menu registry udp 2.5 lite ?
    Jawaban nya , tulisan ini muncul ketika teman-teman melakukan penghapusan daftar nama user yang melakukan multilogin dari daftar.Setelah melakukan penghapusan dengan menekan angka 0 ,tiba-tiba tulisan -ama akan muncul dan fungsi dari fitur multilogin limiter akan berhenti bekerja.
    Teman-teman juga akan bertanya kenapa hal ini bisa terjadi ?
    1.1. Munculnya tulisan -ama: Saat Anda menekan 0 to clear record, script asli menjalankan perintah ini: print_center -ama "" >/etc/limit.log. Fungsi print_center -ama adalah perintah untuk mewarnai tulisan (biasanya warna kuning). Saat perintah warna itu disuruh menulis ke dalam file teks biasa (/etc/limit.log), dia bingung. Dia tidak bisa menulis warna di file teks, jadi dia hanya menuliskan sisa kodenya, yaitu spasi dan teks -ama. File log Anda bukan kosong, tapi isinya sampah warna.
    2.Kenapa Log Berhenti Tercatat? Ini yang paling licik. Di dalam kode menu asli, ada baris pemantau tersembunyi: "Jika user masuk ke menu Limit Accounts, cek apakah limiter sedang berjalan. Jika ya, MATIKAN". Jadi, ketika Anda masuk ke menu Limit Accounts hanya untuk sekedar melihat log (Limit Registry), si script menu langsung membunuh proses limiter kita di belakang layar secara diam-diam! Itulah kenapa setelah itu tidak ada lagi yang terblokir.
    Disini saya akan memberikan langkah perbaikan dengan 2 cara,kamu bisa memilih cara mana yang paling mudah untuk kamu gunakan.
    Cara 1
    Cara Memperbaikinya (Langkah Demi Langkah)
    Kita harus menyadap dan memperbaiki 2 baris kode di dalam file menu utama Anda.
    Langkah 1: Buka Script Menu Utama
    Ketik perintah ini di SSH:
    nano /usr/bin/udp
    Langkah 2: Cari dan Nonaktifkan "Pembunuh Limiter"
    Di dalam file yang sangat panjang itu, tekan Ctrl+W di keyboard (fungsi pencarian), lalu ketik: Check if limiter is already running lalu tekan Enter.
    Anda akan menemukan baris kode yang mirip seperti ini:
        # Check if limiter is already running and remove from scheduled tasks if so
        for i in $(atq | awk '{print $1}'); do
          if [[ ! $(at -c $i | grep '/etc/limiter.sh') = "" ]]; then
            atrm $i
            sed -i '/etc/limiter.sh/d' /var/spool/cron/crontabs/root
            print_center -verd "Limiter stopped"
            enter
            return
          fi
        done
    GANTI kode di atas menjadi komentar (dinonaktifkan) dengan menambahkan tanda # di depan setiap barisnya, sehingga hasilnya persis seperti ini:
        # PERBAIKAN Z: Nonaktifkan auto-kill supaya limiter tidak dimatikan saat buka menu
        # for i in $(atq | awk '{print $1}'); do
        #   if [[ ! $(at -c $i | grep '/etc/limiter.sh') = "" ]]; then
        #     atrm $i
        #     sed -i '/etc/limiter.sh/d' /var/spool/cron/crontabs/root
        #     print_center -verd "Limiter stopped"
        #     enter
        #     return
        #   fi
        # done
    Langkah 3: Perbaiki Cara Mengosongkan Log
    Sekarang, tekan Ctrl+W lagi untuk mencari, ketik: option = "0" lalu tekan Enter.
    Anda akan menemukan 2 hasil. Cari yang ada di dalam fungsi log(), bentuknya seperti ini:
        read option
        [[ $option = "0" ]] && print_center -ama "" >/etc/limit.log
      }
    GANTI baris [[ $option... tersebut dengan perintah pengosongan file yang bersih:
        read option
        [[ $option = "0" ]] && echo "" > /etc/limit.log
      }
    Langkah 4: Simpan dan Bersihkan
    1.Simpan file yang sudah diperbaiki: Tekan Ctrl+O, lalu Enter, lalu Ctrl+X.
    2.Sekarang, bersihkan tulisan -ama yang nyangkut di log tadi dengan ketik:
    echo "" > /etc/limit.log
    Tes Akhir
    Sekarang sistem sudah bersih dari jebakan. Mari kita pastikan semuanya bekerja mulus:
    1.Nyalakan kembali limiter lewat menu:
    udp
    2.Pilih: 1 (UDP Custom) -> 7 (Limit Accounts) -> 1 (Multi-Login Limiter). Isi waktu cek 1 dan unblock 5 seperti biasa. (Jika muncul tulisan Limiter started, berarti sukses).
    3.Buka Menu Log untuk Membuktikan:
    Masuk lagi ke menu: udp -> 1 -> 7 -> 3 (Limiter Log).
    Pastikan sekarang tidak ada tulisan -ama lagi, dan log pemblokiran user Anda muncul dengan rapi.
    4.Tes Clear Record:
    Saat di dalam menu Log tadi, tekan 0 lalu Enter. Keluar dari menu, lalu masuk lagi ke menu Log. Sekarang seharusnya sudah muncul tulisan "no account limiter record" yang bersih!
    Cara 2
    Mengedit file panjang pakai nano memang sangat rentan salah letak, apalagi harus cari kata per kata.
    Kali ini saya akan memberikan perintah otomatis (Sihir Linux) yang akan mengedit sendiri file tersebut secara presisi tanpa Anda harus membuka nano sama sekali. Anda hanya perlu Copy-Paste perintahnya.
    Ikuti langkah ini persis seperti yang tertulis:
    LANGKAH 1: Cadangkan File Asli (Biar Aman)
    Ketik perintah ini untuk membackup file menu Anda sebelum diubah otomatis:
    cp /usr/bin/udp /usr/bin/udp.backup
    (Tidak akan muncul pesan apa-apa jika berhasil, langsung lanjut ke langkah 2)
    LANGKAH 2: Otomatis Nonaktifkan "Pembunuh Limiter"
    Copy perintah panjang ini, lalu paste di SSH lalu tekan Enter:
    sed -i '/Check if limiter is already running/,/done/ s/^/    # /' /usr/bin/udp
    Penjelasan: Perintah ini secara otomatis mencari blok kode "Check if limiter..." sampai kata "done", lalu menambahkan tanda # di depan setiap barisnya sehingga dinonaktifkan.
    LANGKAH 3: Otomatis Perbaiki Pengosongan Log
    Copy perintah ini, lalu paste di SSH lalu tekan Enter:
    sed -i 's/print_center -ama "" >\/etc\/limit.log/echo "" > \/etc\/limit.log/' /usr/bin/udp
    Penjelasan: Perintah ini secara otomatis mencari perintah sampah lama, dan langsung menggantinya dengan perintah echo yang bersih.
    LANGKAH 4: Bersihkan Tulisan Sampah "-ama"
    Sekarang kita bersihkan file log yang kemarin terkontaminasi tulisan aneh:
    echo "" > /etc/limit.log
    LANGKAH 5: Matikan Sisa Proses dan Nyalakan Ulang
    Karena tadi menu sempat mematikan limiter secara paksa, kita harus menghidupkannya lagi lewat menu.
    1.Matikan dulu semua proses limiter yang mungkin nyangkut:
    pkill -f limiter.sh
    2.Sekarang Reboot vps,tunggu beberapa saat hingga proses reboot selesai dan vps hidup kembali.
    3.Setelah vps hidup kembali,buka menu Anda:
    udp
    4.Masuk ke menu seperti biasa:
    Pilih 1 (UDP Custom) -> Pilih 7 (Limit Accounts) -> Pilih 1 (Multi-Login Limiter).
    Isi waktu cek: 1 -> Isi waktu unblock: 5.
    Cara Membuktikan Sekarang
    1.Tes Clear Record:
    Dari menu utama, masuk ke: 7 (Limit Accounts) -> 3 (Limiter Log).
    Jika muncul tulisan "no account limiter record", berarti tulisan -ama sudah berhasil dibersihkan. Tekan 0 lalu Enter. Masuk lagi ke menu Log, pastikan tetap bersih.
    2.Tes Multilogin:
    Hubungkan 2 HP. Tunggu 1-2 menit sampai putus.
    Lalu masuk lagi ke menu Limiter Log. Sekarang log akan tercatat dengan rapi tanpa error, dan sistem tetap berjalan di background meskipun Anda bolak-balik buka menu!
    Selamat mencoba dan sampai jumpa di artikel selanjutnya.See you...
  • Memperbaiki Dan Mengaktifkan Fitur Multi-Login Limiter di Panel UDP

    Pendahuluan:
    Jika Anda menggunakan script UDP Custom Manager, Anda mungkin menyadari bahwa fitur "Account Limiter" atau "Multi-Login Limiter" di dalam menu tidak bekerja sama sekali saat digunakan untuk tunnel UDP Custom. User tetap bisa login menggunakan 2 HP atau lebih tanpa terputus.
    Mengapa bisa begitu?
    Karena script limiter bawaan adalah warisan dari tunnel SSH/Dropbear. Cara kerjanya adalah menghitung proses sshd milik user. Sedangkan pada UDP Custom, ketika 2 HP login, sistem Linux tidak membuat proses baru. Semua data masuk ke satu pintu utama yaitu binary udp-custom. Akibatnya, script limiter menganggap user tidak melakukan apa-apa.
    Solusi :
    Kita akan membuang logika lama tersebut dan membuat ulang "Mesin Limiter" yang cara kerjanya memata-matai Log Sistem (journalctl) milik service udp-custom. Jika mesin menemukan 2 alamat IP berbeda yang login menggunakan 1 username yang sama, sistem akan langsung mengunci akunnya dan memblokir IP-nya menggunakan Firewall (iptables).
    Berikut adalah langkah-langkah dari NOL sampai selesai:
    Langkah 1: Membersihkan Sisa Limiter Lama
    Sebelum memasang yang baru, kita harus memastikan tidak ada proses limiter lama yang nyangkut di sistem (agar tidak bentrok). Buka SSH/Putty, lalu ketik perintah ini:
    pkill -f limiter.sh
    for i in $(atq | awk '{print $1}'); do atrm $i; done
    Langkah 2: Membuat Script Pembersih (Auto-Unblock)
    Script ini bertugas membuka kembali akun user dan menghapus blokiran IP secara otomatis setelah masa hukuman selesai (sesuai waktu yang diatur di menu).
    1.Ketik perintah ini untuk membuat file baru:
    nano /etc/UDPCustom/unblock_user.sh
    2.Copy kode di bawah ini, lalu klik kanan di layar Putty untuk menempelkannya:
    #!/bin/bash
    user=$1
    usermod -U $user
    if [ -f /etc/UDPCustom/blocked_ips_${user}.txt ]; then
        while read ip; do
            iptables -D INPUT -s $ip -j DROP 2>/dev/null
        done < /etc/UDPCustom/blocked_ips_${user}.txt
        rm -f /etc/UDPCustom/blocked_ips_${user}.txt
    fi
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $user Unblocked" >> /etc/limit.log
    3.Simpan file dengan cara: Tekan Ctrl+O di keyboard, lalu tekan Enter, lalu tekan Ctrl+X untuk keluar dari nano.
    Langkah 3: Membuat Script Utama (Mesin Deteksi Multi-Login)
    Ini adalah inti dari sistem pembatasan kita. Script ini akan berjalan terus-menerus di background.
    1.Ketik perintah ini untuk membuka file limiter utama:
    nano /etc/UDPCustom/limiter.sh
    2.HAPUS SEMUA ISI LAMA yang ada di dalamnya (Anda bisa menekan tombol Ctrl+K berulang kali sampai layar kosong).
    3.Copy kode baru di bawah ini, lalu klik kanan untuk menempelkannya:
    Terminal
    4.Simpan file: Tekan Ctrl+O, lalu tekan Enter, lalu tekan Ctrl+X.
    Langkah 4: Memberikan Izin Eksekusi
    Secara default, file yang baru kita buat hanya bisa dibaca. Kita harus mengubahnya menjadi file yang bisa "dijalankan" oleh sistem Linux.
    Ketik kedua perintah ini satu per satu:
    chmod +x /etc/UDPCustom/unblock_user.sh
    chmod +x /etc/UDPCustom/limiter.sh
    Langkah 5: Mengaktifkan Melalui Menu Panel UDP Mesin sudah siap. Sekarang kita tinggal menggunakan User Interface (UI) menu UDP yang sudah ada untuk menghidupkannya.
    1.Ketik perintah ini untuk membuka menu utama:
    udp
    2.Pilih UDP Custom (Ketik 1 lalu Enter).
    3.Pilih Limit Accounts (Ketik 7 lalu Enter).
    4.Pilih MULTI-LOGIN LIMITER (Ketik 1 lalu Enter).
    5.Run limiter every (in minutes): Masukkan angka 1 (artinya sistem akan mengecek setiap 1 menit), lalu Enter.
    6.Unblock users every (in minutes):
    => Jika ingin diblokir selamanya sampai Anda buka manual, ketik 0.
    => Jika ingin diblokir otomatis selama 5 menit lalu hidup lagi, ketik 5, lalu Enter.
    Jika muncul tulisan "Limiter started", berarti sistem sudah berjalan di background VPS Anda.
    Bagaimana Cara Menguji / Membuktikannya?
    1.Ambil 2 buah HP.
    2.Hubungkan keduanya menggunakan 1 akun yang sama (Pastikan di menu create user, Connection Limit-nya diisi angka 1).
    3.Tunggu sekitar 1-2 menit.
    4.Kedua HP akan langsung kehilangan koneksi internet (Tidak bisa browsing).
    5.Jika Anda mencoba connect lagi, akan gagal (Karena akun terkunci).
    Cara Melihat Log Aktivitas:
    Anda bisa melihat siapa saja yang tertangkap melanggar aturan dengan mengetik perintah ini di SSH:
    cat /etc/limit.log
    Catatan Penting:
    Jika suatu hari Anda menghapus user tersebut dari menu panel, sistem akan otomatis membersihkan dirinya sendiri. Namun, jika Anda ingin menghapus semua jejak blokiran IP di firewall secara paksa, cara paling aman adalah dengan melakukan Reboot VPS.
    Penutup:
    Dengan modifikasi ini, fitur limiter yang tadinya hanya "Hiasan" di script Anda, kini telah menjadi senjata nyata untuk menjaga kestabilan VPS dari user yang membagi akun.
    Selamat mencoba !!!
  • UDP Script NO Multilogin VFinal

    udp script no multilogin
    Panduan Membuat Penjaga Koneksi UDP Anti Multi-Login 
     Tujuan : 
     1.Mencegah satu user terhubung dari beberapa IP secara bersamaan. 
    2.Otomatis melepas blokir IP setelah 15 menit tidak aktif (sistem yang adil). 
    3.Memiliki "memori" koneksi saat pertama kali dijalankan. 
    4.Dapat diaktifkan/dinonaktifkan secara manual, dan statusnya akan diingat setelah reboot VPS.
    Langkah 1: Buat Struktur Direktori yang Diperlukan
    Sistem Operasi Ubuntu Server 20.04 lts s/d Ubuntu Server 24.04 lts
    Instal conntrack (jika belum ada). Ini adalah alat penting untuk memutus koneksi secara paksa.
    sudo apt update && sudo apt install conntrack -y
    Pastikan tool kalkulasi (bc) terinstall (biasanya sudah ada, tapi ini untuk jaga-jaga):
    sudo apt install bc -y
    Jalan kan perintah berikut :
    sudo mkdir -p /opt/udp-proxy/bin
    sudo mkdir -p /opt/udp-proxy/log
    Langkah 2: Membuat Skrip Utama Penjaga
    1.Buat file skrip:
    sudo nano /opt/udp-proxy/bin/enforcer_service.sh
    2.Salin dan tempel seluruh skrip di bawah ini.
    Terminal
    3.Simpan dan keluar (Ctrl+X, Y, Enter).
    4.Berikan izin eksekusi:
    sudo chmod +x /opt/udp-proxy/bin/enforcer_service.sh
    Langkah 3: Membuat Layanan systemd
    1.Buat file layanan:
    sudo nano /etc/systemd/system/udp-enforcer.service
    2.Salin dan tempel konfigurasi berikut:
    [Unit]
    Description=UDP Enforcer Service
    After=network.target udp-custom.service
    
    [Service]
    Type=simple
    ExecStart=/opt/udp-proxy/bin/enforcer_service.sh
    Restart=always
    RestartSec=5
    User=root
    
    [Install]
    WantedBy=multi-user.target
    3.Simpan dan keluar (Ctrl+X, Y, Enter).
    Catatan :
    Perintah di bawah ini hanya di gunakan untuk mengedit Layanan systemd saja. Jika tidak , Jangan Gunakan !!! Lewati langkah ini dan lanjutkan ke Langkah 4: Membuat Perintah Kontrol Manual (enforcer-on / enforcer-off) .
    Perintah Untuk Mengedit Layanan systemd
    sudo nano /etc/systemd/system/udp-enforcer.service
    # Paste konfigurasi atau Edit konfigurasi, lalu Simpan dan keluar (Ctrl+X, Y, Enter)
    # Jalan kan satu persatu perintah ini : 
    sudo systemctl daemon-reload
    sudo systemctl enable udp-enforcer.service
    sudo systemctl restart udp-enforcer.service
    Langkah 4: Membuat Perintah Kontrol Manual (enforcer-on / enforcer-off)
    Ini adalah kunci untuk kontrol yang "ber-ingat".
    1.Buat perintah enforcer-on:
    sudo nano /usr/local/bin/enforcer-on
    Salin dan tempel:
    #!/bin/bash
    FLAG_FILE="/opt/udp-proxy/log/enforcer.enabled"
    SERVICE_NAME="udp-enforcer.service"
    
    echo "Mengaktifkan Penjaga Koneksi..."
    
    # Buat direktori log jika belum ada untuk mencegah error
    sudo mkdir -p "$(dirname "$FLAG_FILE")"
    
    sudo touch "$FLAG_FILE"
    sudo systemctl start "$SERVICE_NAME"
    sudo systemctl enable "$SERVICE_NAME"
    echo "Penjaga telah diaktifkan. Statusnya akan diingat setelah reboot."
    2.Buat perintah enforcer-off:
    sudo nano /usr/local/bin/enforcer-off
    Salin dan tempel:
    #!/bin/bash
    FLAG_FILE="/opt/udp-proxy/log/enforcer.enabled"
    SERVICE_NAME="udp-enforcer.service"
    
    echo "Menonaktifkan Penjaga Koneksi..."
    sudo systemctl stop "$SERVICE_NAME"
    sudo rm -f "$FLAG_FILE"
    echo "Penjaga telah dinonaktifkan. Statusnya akan diingat setelah reboot."
    3.Berikan izin eksekusi pada kedua perintah:
    sudo chmod +x /usr/local/bin/enforcer-on
    sudo chmod +x /usr/local/bin/enforcer-off
    5.Langkah 5: Finalisasi dan Aktivasi Awal
    Langkah terakhir untuk menyelesaikan setup dan mengaktifkan Penjaga untuk pertama kalinya.
    1.Muat ulang systemd untuk mengenali layanan baru:
    sudo systemctl daemon-reload
    2.Aktifkan layanan sekali saja
    sudo systemctl enable udp-enforcer.service
    3.Aktifkan Penjaga untuk pertama kalinya:
    enforcer-on
    4.Verifikasi statusnya:
    sudo systemctl status udp-enforcer.service
    Anda harus melihat Active: active (running).
    Jalankan perintah-perintah ini secara manual untuk pengecekan urutan aturan:
    sudo iptables -D INPUT -p udp --dport 36712 -j UDP_ENFORCER
    sudo iptables -I INPUT 1 -p udp --dport 36712 -j UDP_ENFORCER
    Sekarang, coba lagi perintah :
    sudo iptables -L INPUT -n -v --line-numbers
    Hasilnya harusnya terlihat seperti ini:
    Chain INPUT (policy ACCEPT ...)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        0     0 UDP_ENFORCER  udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:36712
    2    1355K  318M ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:36712
    ...
    Sekarang UDP_ENFORCER ada di posisi #1. Sistem blokir seharusnya sudah bekerja!
    Restart layanan untuk menerapkan perubahan:
    sudo systemctl restart udp-enforcer.service
    Ringkasan Perintah Tanpa Panel/Manual
    Mengaktifkan Penjaga
    enforcer-on
    Menonaktifkan Penjaga
    enforcer-off
    Cek Status Layanan
    sudo systemctl status udp-enforcer.service
    Lihat Log Aktivitas
    sudo journalctl -u udp-enforcer.service -f --no-pager
    Lihat IP yang Diblokir
    sudo iptables -L UDP_ENFORCER -n -v
    Lepas Semua Blokir
    sudo iptables -F UDP_ENFORCER
    Hapus File State (Reset)
    echo "" > /opt/udp-proxy/log/enforcer_state.log

  • Refresh VPS No Reboot

    Refresh VPS No Reboot
    Halo sobat,kali ini kita akan membuat sebuah panel menu auto refresh dengan penjadwalan yang bisa di atur,mulai dari 1 jam sampai dengan 1 bulan.Sebagai admin sebuah server atau VPS terkadang kita perlu merefresh cpu.ram dan ruang swap untuk suatu tujuan tetapi tanpa perlu mereboot server atau VPS.
    Sebelum kita memulai langkah-langkah pembuatan panel menu Refresh VPS No Reboot,anda harus berada pada akses root,dan sistem operasi yang saya gunakan saat membuat tutorial ini adalah ubuntu server 20.04 lts.Cara ini juga bisa di gunakan sampai pada versi ubuntu 24.04 lts ,untuk versi ubuntu server di atasnya saya belum pernah mencoba nya.
    Berikut Panduan Lengkap Membuat Menu fresh dengan Auto-Refresh dan Status Checker
    Langkah 1: Membuat File Script fresh :
    Kita akan membuat file script baru yang sudah diperbarui dengan opsi penjadwalan yang lebih banyak.
    1.Buka editor teks nano:
    sudo nano /usr/local/bin/fresh
    2.Salin seluruh kode di bawah ini, lalu tempel ke dalam editor nano.
    #!/bin/bash
    
    # --- Script Menu Refresh Sistem dengan Auto-Scheduler & Status Checker (Versi Perbaikan) ---
    # Nama: fresh
    # Fungsi: Menu interaktif untuk merefresh CPU, RAM, Swap, penjadwalan, dan status
    # Author: AI Assistant
    # -------------------------------------------------------------------------
    
    # Fungsi untuk menjalankan refresh otomatis (tanpa interaksi)
    run_auto_refresh() {
        echo "$(date): Memulai auto-refresh..." >> /var/log/fresh-auto.log
        sync
        echo 3 > /proc/sys/vm/drop_caches
        swapoff -a
        swapon -a
        echo "$(date): Auto-refresh selesai." >> /var/log/fresh-auto.log
    }
    
    # Cek argumen --auto untuk mode otomatis
    if [ "$1" == "--auto" ]; then
        run_auto_refresh
        exit 0
    fi
    
    # Cek apakah script dijalankan dengan sudo (untuk mode interaktif)
    if [ "$(id -u)" -ne 0 ]; then
       echo -e "\e[31mError: Script ini harus dijalankan dengan hak akses root (sudo).\e[0m" >&2
       exit 1
    fi
    
    # Fungsi untuk menampilkan menu utama
    tampilkan_menu() {
        clear
        echo -e "\e[36m========================================\e[0m"
        echo -e "\e[1;32m        MENU REFRESH SISTEM VPS       \e[0m"
        echo -e "\e[36m========================================\e[0m"
        echo "Pilih tindakan yang ingin dilakukan:"
        echo "1. Kelola Proses CPU (buka htop)"
        echo "2. Refresh RAM (Hapus Cache)"
        echo "3. Refresh Swap"
        echo "4. Refresh Semua (RAM + Swap)"
        echo "5. Lihat Status Memori Saat Ini"
        echo "6. Jadwalkan Auto Refresh"
        echo "7. Cek Status Auto Refresh"
        echo "0. Keluar"
        echo -e "\e[36m----------------------------------------\e[0m"
    }
    
    # Fungsi untuk menu penjadwalan
    menu_scheduler() {
        while true; do
            clear
            echo -e "\e[36m========================================\e[0m"
            echo -e "\e[1;34m       MENU JADWAL AUTO REFRESH       \e[0m"
            echo -e "\e[36m========================================\e[0m"
            echo "Pilih interval waktu:"
            echo "1. Setiap 1 Jam"
            echo "2. Setiap 3 Jam"
            echo "3. Setiap 6 Jam"
            echo "4. Setiap 12 Jam"
            echo "5. Setiap 24 Jam (1 Hari)"
            echo "6. Setiap 1 Minggu"
            echo "7. Setiap 2 Minggu"
            echo "8. Setiap 1 Bulan"
            echo "9. Hapus Semua Jadwal"
            echo "0. Kembali ke Menu Utama"
            echo -e "\e[36m----------------------------------------\e[0m"
            read -p "Masukkan pilihan Anda: " pilihan_sched
    
            case $pilihan_sched in
                1) cron_interval="0 * * * *"; break ;; # Setiap jam penuh
                2) cron_interval="0 */3 * * *"; break ;; # Setiap 3 jam
                3) cron_interval="0 */6 * * *"; break ;; # Setiap 6 jam
                4) cron_interval="0 */12 * * *"; break ;; # Setiap 12 jam
                5) cron_interval="0 0 * * *"; break ;; # Setiap hari pukul 00:00
                6) cron_interval="0 0 * * 0"; break ;; # Setiap Minggu pukul 00:00
                7) cron_interval="0 0 */14 * *"; break ;; # Setiap 14 hari (2 minggu)
                8) cron_interval="0 0 1 * *"; break ;; # Setiap bulan pukul 00:00
                9)
                    echo "Menghapus semua jadwal 'fresh --auto'..."
                    # Hapus cron job dengan cara yang lebih aman
                    crontab -l 2>/dev/null | grep -v "fresh --auto" | crontab -
                    echo -e "\e[32mSemua jadwal berhasil dihapus.\e[0m"
                    pause
                    return
                    ;;
                0) return ;;
                *) 
                    echo -e "\e[31mPilihan tidak valid.\e[0m"
                    pause
                    ;;
            esac
        done
    
        # Validasi format cron
        if ! echo "$cron_interval" | grep -qE '^([0-5]?[0-9]|\*) [0-2]?[0-9] \* \* \*(|\*)$'; then
            echo -e "\e[31mFormat waktu tidak valid!\e[0m"
            pause
            return
        fi
    
        # Tambahkan cron job dengan metode yang lebih aman
        echo "Menambahkan jadwal baru ke crontab..."
        
        # Hapus cron job lama (jika ada) dan tambahkan yang baru
        (crontab -l 2>/dev/null | grep -v "fresh --auto") | crontab -
        echo "$cron_interval sudo /usr/local/bin/fresh --auto >> /var/log/fresh-auto.log 2>&1" | crontab -
        
        # Verifikasi apakah cron job berhasil ditambahkan
        if crontab -l 2>/dev/null | grep -q "fresh --auto"; then
            echo -e "\e[32mJadwal berhasil dibuat!\e[0m"
            echo "Log akan disimpan di /var/log/fresh-auto.log"
        else
            echo -e "\e[31mGagal membuat jadwal. Periksa format cron.\e[0m"
        fi
        
        pause
    }
    
    # Fungsi untuk mengecek status auto-refresh
    cek_status_auto_refresh() {
        clear
        echo -e "\e[36m========================================\e[0m"
        echo -e "\e[1;35m       STATUS AUTO REFRESH            \e[0m"
        echo -e "\e[36m========================================\e[0m"
        
        # Cek cron job dengan pengecekan yang lebih akurat
        if crontab -l 2>/dev/null | grep -q "fresh --auto.*>> /var/log/fresh-auto.log"; then
            echo -e "\e[32mStatus: AKTIF\e[0m"
            echo ""
            echo "Jadwal yang sedang berjalan:"
            crontab -l 2>/dev/null | grep --color=auto "fresh --auto"
        else
            echo -e "\e[31mStatus: TIDAK AKTIF\e[0m"
            echo ""
            echo "Tidak ada jadwal auto-refresh yang ditemukan."
        fi
        echo ""
        echo -e "\e[33mLog dapat dilihat di: /var/log/fresh-auto.log\e[0m"
        echo -e "\e[36m----------------------------------------\e[0m"
        pause
    }
    
    # Fungsi untuk pause
    pause() {
        read -p "Tekan [Enter] untuk melanjutkan..."
    }
    
    # Loop utama program
    while true; do
        tampilkan_menu
        read -p "Masukkan pilihan Anda [1-7] atau 0 untuk keluar: " pilihan
    
        case $pilihan in
            1)
                echo -e "\e[33mMembuka htop untuk mengelola proses CPU...\e[0m"
                pause
                htop
                ;;
            2)
                echo -e "\e[33mMembersihkan cache RAM...\e[0m"
                sync && echo 3 > /proc/sys/vm/drop_caches
                echo -e "\e[32mCache RAM berhasil dibersihkan.\e[0m"
                pause
                ;;
            3)
                echo -e "\e[31mPERINGATAN: Pastikan RAM Anda mencukupi!\e[0m"
                free -h
                read -p "Apakah Anda yakin ingin melanjutkan? (y/n) " konfirmasi
                if [[ $konfirmasi =~ ^[Yy]$ ]]; then
                    swapoff -a && swapon -a
                    echo -e "\e[32mSwap berhasil direfresh.\e[0m"
                else
                    echo "Operasi dibatalkan."
                fi
                pause
                ;;
            4)
                echo -e "\e[31mPERINGATAN: Ini akan membersihkan cache RAM dan merefresh Swap.\e[0m"
                free -h
                read -p "Apakah Anda yakin ingin melanjutkan? (y/n) " konfirmasi
                if [[ $konfirmasi =~ ^[Yy]$ ]]; then
                    run_auto_refresh
                    echo -e "\e[32mSemua proses refresh selesai!\e[0m"
                else
                    echo "Operasi dibatalkan."
                fi
                pause
                ;;
            5)
                echo -e "\e[33mStatus Memori Saat Ini:\e[0m"
                free -h
                echo ""
                echo -e "\e[33mPenggunaan Swap:\e[0m"
                swapon --show
                pause
                ;;
            6)
                menu_scheduler
                ;;
            7)
                cek_status_auto_refresh
                ;;
            0)
                echo -e "\e[32mTerima kasih! Sampai jumpa.\e[0m"
                exit 0
                ;;
            *)
                echo -e "\e[31mPilihan tidak valid, silakan coba lagi.\e[0m"
                pause
                ;;
        esac
    done
    3.Simpan file dan keluar dari nano:
    Tekan Ctrl + X.
    Tekan Y untuk konfirmasi.
    Tekan Enter.
    Langkah 2: Memberikan Izin Eksekusi
    sudo chmod +x /usr/local/bin/fresh
    Langkah 3: Konfigurasi sudo Tanpa Password (untuk User root)
    Meskipun Anda adalah user root, menambahkan aturan eksplisit ke sudoers adalah praktik yang baik untuk memastikan script berjalan sesuai harapan.
    1.Edit File sudoers:
    sudo visudo
    2.Tambahkan Aturan Baru. Gulir ke bagian bawah dan tambahkan baris ini:
    # Mengizinkan root menjalankan script fresh tanpa password
    root ALL=(ALL) NOPASSWD: /usr/local/bin/fresh
    3.Simpan dan Keluar:
    Tekan Ctrl + X, lalu Y, dan Enter.
    Langkah 4: Cara Menggunakan Menu fresh yang Baru
    1.Jalankan Menu:
    sudo fresh
    2.Eksplorasi Menu:
    Opsi 1-5: Fitur manual seperti sebelumnya.
    Opsi 6: Untuk membuat atau menghapus jadwal auto-refresh.
    Opsi 7 (Baru): Untuk mengecek status.
    Jika aktif, akan menampilkan Status: AKTIF beserta jadwal cron-nya.
    Jika tidak aktif, akan menampilkan Status: TIDAK AKTIF.
    Sekarang, semua fitur sudah siap digunakan.
  • Membuat Menu Panel UDP Hunter

    panel_udp_hunter

    Ini adalah kelanjutan postingan sebelumnya dengan judul : Sistem Anti-MultiLogin UDP dengan Panel On/Off . Jika anda menemukan postingan ini harap untuk membuka dan membaca postingan sebelumnya untuk memahami secara utuh apa yang akan kita bahas di postingan ini.
    Ikuti langkah-langkah di bawah ini untuk membuatnya.
    Langkah 1: Membuat File Skrip hunter
    Kita akan membuat file skrip bernama hunter di direktori /usr/local/bin. Direktori ini ada di PATH sistem, artinya Anda bisa menjalankan skrip dari mana saja dengan cukup mengetik namanya.
    1.Buat file skrip dengan nano:
    sudo nano /usr/local/bin/hunter
    2.Copy-paste seluruh kode di bawah ini ke dalam file nano:
    #!/bin/bash
    
    # =================================================================
    # --- KONFIGURASI PATH ---
    # =================================================================
    FLAG_FILE="/opt/udp-proxy/log/enforcer.enabled"
    STATE_FILE="/opt/udp-proxy/log/enforcer_state.log"
    BANDWIDTH_LOG="/opt/udp-proxy/log/bandwidth_usage.log"
    DAILY_LEDGER="/opt/udp-proxy/log/bw_daily_ledger.log"
    DAILY_LOG_DIR="/opt/udp-proxy/log/daily"
    IPTABLES_CHAIN="UDP_ENFORCER"
    BANDWIDTH_CHAIN="UDP_BW_COUNTER"
    SERVICE_NAME="udp-enforcer.service"
    
    # Warna untuk tampilan
    RED='\033[0;31m'
    GREEN='\033[0;32m'
    YELLOW='\033[1;33m'
    BLUE='\033[0;34m'
    CYAN='\033[0;36m'
    NC='\033[0m' # No Color
    BOLD='\033[1m'
    
    # =================================================================
    # --- FUNGSI HELPER ---
    # =================================================================
    get_status_icon() {
        if sudo systemctl is-active --quiet "$SERVICE_NAME" 2>/dev/null; then
            echo -e "${GREEN}[AKTIF]${NC}"
        else
            echo -e "${RED}[NONAKTIF]${NC}"
        fi
    }
    
    get_blocked_count() {
        # COLUMNS=9999 mencegah wrapping, dan hilangkan || echo "0" karena grep -c sudah default 0
        COLUMNS=9999 sudo iptables -L "$IPTABLES_CHAIN" -n -v 2>/dev/null | grep -c "DROP"
    }
    
    get_online_count() {
        if [ -f "$STATE_FILE" ]; then
            grep -c ":" "$STATE_FILE" 2>/dev/null || echo "0"
        else
            echo "0"
        fi
    }
    
    # =================================================================
    # --- FUNGSI MENU ---
    # =================================================================
    show_menu() {
        clear
        local status_icon=$(get_status_icon)
        local blocked_count=$(get_blocked_count)
        local online_count=$(get_online_count)
        
        echo -e "${CYAN}==========================================${NC}"
        echo -e "${BOLD}     PANEL PENJAGA UDP - HUNTER${NC}"
        echo -e "${CYAN}==========================================${NC}"
        echo -e " Status Layanan : $status_icon"
        echo -e " User Online    : ${GREEN}$online_count${NC}"
        echo -e " IP Diblokir    : ${RED}$blocked_count${NC}"
        echo -e "${CYAN}==========================================${NC}"
        echo " 1. Aktifkan Penjaga UDP"
        echo " 2. Nonaktifkan Penjaga UDP"
        echo " 3. Restart Penjaga UDP"
        echo -e "${CYAN}------------------------------------------${NC}"
        echo " 4. Lihat Status Detail"
        echo " 5. Pantau Log Aktivitas (Live)"
        echo -e "${CYAN}------------------------------------------${NC}"
        echo " 6. Lihat User Sedang Online"
        echo " 7. Lihat IP yang Diblokir (+User)"
        echo " 8. Bersihkan Semua IP Diblokir"
        echo -e "${CYAN}------------------------------------------${NC}"
        echo " 9. Monitor Bandwidth (5 mnt & 1 Jam)"
        echo "10. Daftar User Hari Ini (24 Jam)"
        echo "11. Lihat Riwayat Laporan"
        echo -e "${CYAN}------------------------------------------${NC}"
        echo "12. Reset Data Bandwidth Hari Ini"
        echo "13. Keluar"
        echo -e "${CYAN}==========================================${NC}"
    }
    
    # =================================================================
    # --- MENU 1: AKTIFKAN ---
    # =================================================================
    menu_enable() {
        echo -e "${YELLOW}>> Mengaktifkan Penjaga...${NC}"
        
        if [ -f "/opt/udp-proxy/panel/enable.sh" ]; then
            sudo /opt/udp-proxy/panel/enable.sh
        else
            mkdir -p "$(dirname "$FLAG_FILE")"
            touch "$FLAG_FILE"
            sudo systemctl start "$SERVICE_NAME" 2>/dev/null
            sudo systemctl enable "$SERVICE_NAME" 2>/dev/null
            echo -e "${GREEN}>> Penjaga telah diaktifkan (manual)${NC}"
        fi
        
        sleep 1
    }
    
    # =================================================================
    # --- MENU 2: NONAKTIFKAN ---
    # =================================================================
    menu_disable() {
        echo -e "${YELLOW}>> Menonaktifkan Penjaga...${NC}"
        
        if [ -f "/opt/udp-proxy/panel/disable.sh" ]; then
            sudo /opt/udp-proxy/panel/disable.sh
        else
            rm -f "$FLAG_FILE"
            sudo systemctl stop "$SERVICE_NAME" 2>/dev/null
            echo -e "${GREEN}>> Penjaga telah dinonaktifkan (manual)${NC}"
        fi
        
        sleep 1
    }
    
    # =================================================================
    # --- MENU 3: RESTART ---
    # =================================================================
    menu_restart() {
        echo -e "${YELLOW}>> Merestart Penjaga...${NC}"
        sudo systemctl restart "$SERVICE_NAME"
        sleep 2
        if sudo systemctl is-active --quiet "$SERVICE_NAME"; then
            echo -e "${GREEN}>> Penjaga berhasil direstart${NC}"
        else
            echo -e "${RED}>> Gagal merestart penjaga! Cek log untuk detail.${NC}"
        fi
    }
    
    # =================================================================
    # --- MENU 4: STATUS DETAIL ---
    # =================================================================
    menu_status() {
        echo -e "${CYAN}>> Status Detail Layanan Penjaga:${NC}"
        echo "=============================================="
        sudo systemctl status "$SERVICE_NAME" --no-pager -l
        echo ""
        echo "=============================================="
        echo -e "${CYAN}>> Status Chain IPTables:${NC}"
        echo "--- Chain UDP_ENFORCER (Blokir) ---"
        # Gunakan COLUMNS=9999 agar komentar tidak terputus ke baris baru
        COLUMNS=9999 sudo iptables -L "$IPTABLES_CHAIN" -n -v --line-numbers 2>/dev/null | head -20
        echo ""
        echo "--- Chain UDP_BW_COUNTER (Bandwidth) ---"
        local bw_rules=$(sudo iptables -L "$BANDWIDTH_CHAIN" -n 2>/dev/null | grep -c "user:")
        echo "Jumlah aturan counter: $bw_rules"
        echo "=============================================="
    }
    
    # =================================================================
    # --- MENU 5: LIVE LOG ---
    # =================================================================
    menu_live_log() {
        echo -e "${CYAN}>> Menampilkan log aktivitas (tekan Ctrl+C untuk kembali)${NC}"
        echo "=============================================="
        sudo journalctl -u "$SERVICE_NAME" -f --no-tail
    }
    
    # =================================================================
    # --- MENU 6: USER ONLINE ---
    # =================================================================
    menu_online_users() {
        echo -e "${CYAN}>> Daftar User Sedang Online:${NC}"
        echo "=============================================="
        
        if [ -f "$STATE_FILE" ] && [ -s "$STATE_FILE" ]; then
            local current_time=$(date +%s)
            printf "%-15s %-18s %15s %12s\n" "USER" "IP" "DURASI" "STATUS"
            echo "----------------------------------------------"
            
            while IFS=':' read -r user ip last_seen violation_time; do
                if [[ -z "$user" || -z "$ip" || -z "$last_seen" ]]; then continue; fi
                
                local elapsed=$((current_time - last_seen))
                local hours=$((elapsed / 3600))
                local mins=$(((elapsed % 3600) / 60))
                local duration=""
                
                if [ "$hours" -gt 0 ]; then
                    duration="${hours}j ${mins}m"
                else
                    duration="${mins}m"
                fi
                
                local status="Normal"
                if [[ -n "$violation_time" && "$violation_time" =~ ^[0-9]+$ ]]; then
                    status="${RED}Pelanggaran${NC}"
                fi
                
                printf "%-15s %-18s %15s %12s\n" "$user" "$ip" "$duration" "$status"
            done < "$STATE_FILE"
        else
            echo -e "${YELLOW}>> Tidak ada user yang sedang online.${NC}"
        fi
        echo "=============================================="
    }
    
    # =================================================================
    # --- MENU 7: IP DIBLOKIR (+ USER) ---
    # =================================================================
    menu_blocked_ips() {
        echo -e "${CYAN}>> Daftar IP yang Saat Ini Diblokir:${NC}"
        echo "=============================================================="
        
        # COLUMNS=9999 mencegah komentar iptables terputus ke baris baru
        local rules=$(COLUMNS=9999 sudo iptables -L "$IPTABLES_CHAIN" -n -v --line-numbers 2>/dev/null)
        
        if [ -z "$rules" ]; then
            echo -e "${YELLOW}>> Chain iptables tidak ditemukan atau kosong.${NC}"
            echo "=============================================================="
            return
        fi
        
        # Hapus || echo "0" karena grep -c sudah otomatis mengembalikan 0
        # Hapus tanda ^ pada "^DROP" karena baris dimulai dari angka urutan
        local drop_count=$(echo "$rules" | grep -c "DROP")
        
        if [ "$drop_count" -eq 0 ]; then
            echo -e "${GREEN}>> Tidak ada IP yang diblokir saat ini.${NC}"
        else
            printf "%-6s %-18s %-15s %-30s\n" "NO" "IP" "PACKETS" "KOMENTAR"
            echo "--------------------------------------------------------------"
            echo "$rules" | grep "DROP" | while read -r num pkts bytes target prot opt in out source dest extra; do
                local ip="$source"
                local comment=$(echo "$extra" | grep -oP 'Kicked \K[^ ]+' 2>/dev/null || echo "-")
                local waktu=$(echo "$extra" | grep -oP 'on \K[0-9-]+-[0-9:]+' 2>/dev/null || echo "-")
                printf "%-6s %-18s %-15s User: %-15s Waktu: %s\n" "$num" "$ip" "$pkts" "$comment" "$waktu"
            done
        fi
        echo "=============================================================="
        echo -e "Total: ${RED}$drop_count IP${NC} diblokir"
    }
    
    # =================================================================
    # --- MENU 8: BERSIHKAN BLOKIR ---
    # =================================================================
    menu_clear_blocked() {
        local drop_count=$(get_blocked_count)
        
        if [ "$drop_count" -eq 0 ]; then
            echo -e "${GREEN}>> Tidak ada IP yang perlu dibersihkan.${NC}"
            return
        fi
        
        echo -e "${RED}==============================================${NC}"
        echo -e "${RED}PERINGATAN!${NC}"
        echo -e "Anda akan membersihkan ${BOLD}$drop_count IP${NC} yang diblokir."
        echo -e "Ini juga akan membersihkan file state dan lock."
        echo -e "${RED}==============================================${NC}"
        
        read -p "Yakin ingin melanjutkan? (y/N): " confirm
        
        if [[ "$confirm" =~ ^[Yy]$ ]]; then
            echo -e "${YELLOW}>> Membersihkan aturan iptables...${NC}"
            sudo iptables -F "$IPTABLES_CHAIN" 2>/dev/null
            
            echo -e "${YELLOW}>> Membersihkan state file...${NC}"
            > "$STATE_FILE"
            
            echo -e "${YELLOW}>> Membersihkan lock files...${NC}"
            rm -f /opt/udp-proxy/log/*.lock
            
            echo -e "${GREEN}>> Berhasil! Semua IP telah dibebaskan.${NC}"
        else
            echo -e "${YELLOW}>> Dibatalkan.${NC}"
        fi
    }
    
    # =================================================================
    # --- MENU 9: MONITOR BANDWIDTH ---
    # =================================================================
    menu_bandwidth() {
        echo -e "${CYAN}>> Laporan Bandwidth Akumulasi Per User:${NC}"
        echo "--------------------------------------------------------------"
        
        if [ -f "$BANDWIDTH_LOG" ] && [ -s "$BANDWIDTH_LOG" ]; then
            cat "$BANDWIDTH_LOG"
            echo "--------------------------------------------------------------"
            echo -e "${YELLOW}Catatan:${NC}"
            echo "- Data 5 menit: Pemakaian dalam 5 menit terakhir"
            echo "- Data 1 jam: Pemakaian dalam 1 jam terakhir"
            echo "- Avg Mbps: Rata-rata kecepatan dari data 5 menit"
            echo "- User offline > 1 jam akan otomatis hilang dari sini"
            echo ""
            echo -e "${GREEN}Gunakan Menu 10 untuk melihat total harian yang TIDAK PERNAH HILANG.${NC}"
        else
            echo -e "${YELLOW}>> File log bandwidth belum tersedia atau kosong.${NC}"
            echo ">> Tunggu beberapa menit setelah user online."
        fi
        echo "--------------------------------------------------------------"
    }
    
    # =================================================================
    # --- MENU 10: DAFTAR USER HARI INI ---
    # =================================================================
    menu_daily_users() {
        echo -e "${CYAN}>> Daftar Total Pemakaian Semua User (Hari Ini)${NC}"
        echo "--------------------------------------------------------------"
        
        if [ -f "$DAILY_LEDGER" ] && [ -s "$DAILY_LEDGER" ]; then
            local total_bytes=$(awk -F':' '{sum+=$2} END {print sum}' "$DAILY_LEDGER")
            local total_mb=$(echo "scale=2; $total_bytes / 1048576" | bc 2>/dev/null || echo "0.00")
            local user_count=$(wc -l < "$DAILY_LEDGER")
            
            printf "%-15s %18s %12s\n" "USER" "TOTAL HARI INI (MB)" "PERSEN"
            echo "--------------------------------------------------------------"
            awk -F':' -v total="$total_bytes" '{
                mb = $2/1048576;
                pct = ($2/total)*100;
                printf "%-15s %18.2f MB %10.1f%%\n", $1, mb, pct
            }' "$DAILY_LEDGER" | sort -k2 -rn
            echo "--------------------------------------------------------------"
            echo -e "Total: ${BOLD}$total_mb MB${NC} dari ${BOLD}$user_count user${NC}"
            echo "--------------------------------------------------------------"
            echo -e "${YELLOW}* Semua user yang pernah terhubung hari ini tetap ada${NC}"
            echo -e "${YELLOW}* Daftar ini direset otomatis tepat jam 00:00 malam${NC}"
        else
            echo -e "${YELLOW}>> Belum ada user yang terhubung hari ini.${NC}"
        fi
    }
    
    # =================================================================
    # --- MENU 11: RIWAYAT LAPORAN ---
    # =================================================================
    menu_history() {
        echo -e "${CYAN}>> Riwayat Laporan Harian${NC}"
        echo "--------------------------------------------------------------"
        
        if [ -d "$DAILY_LOG_DIR" ] && ls "$DAILY_LOG_DIR"/*.log 1>/dev/null 2>&1; then
            echo "Tanggal yang tersedia:"
            echo "--------------------------------------------------------------"
            ls -1 "$DAILY_LOG_DIR"/*.log 2>/dev/null | while read -r file; do
                local date_name=$(basename "$file" .log)
                local size=$(du -h "$file" | cut -f1)
                local user_count=$(wc -l < "$file")
                echo "  - $date_name ($size, $user_count user)"
            done
            echo "--------------------------------------------------------------"
        else
            echo -e "${YELLOW}>> Belum ada riwayat laporan tersimpan.${NC}"
            return
        fi
        
        echo ""
        read -p "Masukkan tanggal (Format: YYYY-MM-DD) atau tekan Enter untuk batal: " req_date
        
        if [[ "$req_date" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
            local hist_file="$DAILY_LOG_DIR/${req_date}.log"
            
            if [ -f "$hist_file" ] && [ -s "$hist_file" ]; then
                local total_bytes=$(awk -F':' '{sum+=$2} END {print sum}' "$hist_file")
                local total_mb=$(echo "scale=2; $total_bytes / 1048576" | bc 2>/dev/null || echo "0.00")
                
                echo ""
                echo -e "${CYAN}>> Laporan Total Semua User Pada Tanggal: $req_date${NC}"
                echo "--------------------------------------------------------------"
                printf "%-15s %18s %12s\n" "USER" "TOTAL (MB)" "PERSEN"
                echo "--------------------------------------------------------------"
                awk -F':' -v total="$total_bytes" '{
                    mb = $2/1048576;
                    pct = ($2/total)*100;
                    printf "%-15s %18.2f MB %10.1f%%\n", $1, mb, pct
                }' "$hist_file" | sort -k2 -rn
                echo "--------------------------------------------------------------"
                echo -e "Total hari itu: ${BOLD}$total_mb MB${NC}"
                echo "--------------------------------------------------------------"
            else
                echo -e "${RED}>> Tidak ditemukan data untuk tanggal $req_date.${NC}"
            fi
        else
            echo -e "${YELLOW}>> Batal melihat riwayat.${NC}"
        fi
    }
    
    # =================================================================
    # --- MENU 12: RESET DATA BANDWIDTH ---
    # =================================================================
    menu_reset_bandwidth() {
        echo -e "${RED}==============================================${NC}"
        echo -e "${RED}PERINGATAN!${NC}"
        echo "Anda akan mereset SEMUA data bandwidth hari ini:"
        echo "  - Data akumulasi 5 menit & 1 jam"
        echo "  - Data buku harian (Menu 10)"
        echo ""
        echo -e "${YELLOW}Data riwayat hari sebelumnya TIDAK terpengaruh.${NC}"
        echo -e "${RED}==============================================${NC}"
        
        read -p "Yakin ingin mereset? (y/N): " confirm
        
        if [[ "$confirm" =~ ^[Yy]$ ]]; then
            echo -e "${YELLOW}>> Mereset data bandwidth...${NC}"
            
            > "$BANDWIDTH_LOG"
            > "/opt/udp-proxy/log/bw_accumulator.log"
            > "/opt/udp-proxy/log/bw_history_1h.log"
            > "$DAILY_LEDGER"
            > "/opt/udp-proxy/log/bw_flush_queue.log"
            
            sudo iptables -Z "$BANDWIDTH_CHAIN" 2>/dev/null
            
            echo -e "${GREEN}>> Data bandwidth hari ini berhasil direset.${NC}"
        else
            echo -e "${YELLOW}>> Dibatalkan.${NC}"
        fi
    }
    
    # =================================================================
    # --- LOOP UTAMA MENU ---
    # =================================================================
    while true; do
        show_menu
        read -p "Masukkan pilihan Anda [1-13]: " choice
    
        case $choice in
            1)  menu_enable ;;
            2)  menu_disable ;;
            3)  menu_restart ;;
            4)  menu_status ;;
            5)  menu_live_log ;;
            6)  menu_online_users ;;
            7)  menu_blocked_ips ;;
            8)  menu_clear_blocked ;;
            9)  menu_bandwidth ;;
            10) menu_daily_users ;;
            11) menu_history ;;
            12) menu_reset_bandwidth ;;
            13)
                echo -e "${CYAN}>> Keluar dari menu Hunter. Sampai jumpa!${NC}"
                exit 0
                ;;
            *)
                echo -e "${RED}>> Pilihan tidak valid, silakan coba lagi.${NC}"
                ;;
        esac
    
        echo ""
        read -p "Tekan [Enter] untuk melanjutkan..."
    done
    3.Simpan dan keluar (Ctrl+X, Y, Enter).
    Langkah 2: Jadikan Skrip Dapat Dieksekusi
    Agar skrip hunter bisa dijalankan, kita perlu memberinya izin eksekusi.
    sudo chmod +x /usr/local/bin/hunter
    Langkah 3: Cara Menggunakan Menu hunter
    1.Buka terminal.
    2.Ketik perintah berikut untuk membuka menu:
    sudo hunter
    3.Anda akan melihat menu interaktif seperti ini:
    PANEL PENJAGA UDP - HUNTER========================================== 1.Aktifkan Penjaga UDP
    2.Nonaktifkan Penjaga UDP
    3.Lihat Status Penjaga
    4.Pantau Log Aktivitas (Live)
    5.Lihat IP yang Diblokir
    6.Bersihkan Semua IP yang Diblokir
    7.Keluar
    Masukkan pilihan Anda [1-7]:
    Enter your code here...
    Sekarang, panel interaktif Anda siap digunakan!
  • My Profile In SOSMED

    ADDRESS

    Jalan Raya Badau Km.11 Rt.06/02 Tanjung Pandan Belitung 33451

    EMAIL

    purwana.cecep@gmail.com
    uraxarixteamxxx@gmail.com

    Telephone

    +628197887769