2.5 Pembangunan Aplikasi SPBE Tips Pengelolaan Aplikasi Server Berisikan Tips yang sering lupa dalam pengelolaan aplikasi penunjang server Buat User Root di Ubuntu Buat Pengguna Baru : sudo adduser kominfox Tambahkan Pengguna ke Grup Sudo: sudo usermod -aG sudo kominfox Cek Akses sebagai Root: groups kominfox Ekstensi PHP yang perlu diinstall PHP 8.3 php8.3-mysql php8.3-gd php8.3-xml php8.3-redis php8.3-intl php8.3-mbstring php8.3-curl php8.3-phpdbg php8.3-fpm php8.3-cli php8.3-cgi libphp8.3-embed libapache2-mod-php8.3 ±800 Koneksi Simultan Pengguna Konfigurasi ini untuk kasus 700 koneksi pengguna bersamaan pada suatu waktu tertentu. Konfig ini telah diterapkan pada presensi online dan berjalan efektif untuk lebih dari 3500 pengguna. Alih-alih menggunakan modul mpm_prefork, admin menggunakan modul mpm_event yang jauh lebih efektif menangani koneksi non-blok yang lebih efisien. 1. Nonaktifkan Modul PHP Apache: a2dismod php8.2 2. Nonaktifkan mpm_prefork dan Aktifkan mpm_event : a2dismod mpm_prefork a2enmod mpm_event systemctl restart apache2 3. Konfigurasi mpm_event di /etc/apache2/mods-available/mpm_event.conf     StartServers             5     MinSpareThreads          75     MaxSpareThreads          250     ThreadsPerChild          25     MaxRequestWorkers        800     MaxConnectionsPerChild   0     ServerLimit                           35 4. Konfigurasi PHP-FPM www.conf pada /etc/php/8.2/fpm/pool.d/www.conf catatan : ini adalah koneksi untuk website. jika membebani cpu server mesti dikurangi. terutama pada pm.max_requests dan pm.max_children [www] user = www-data group = www-data listen = /run/php/php8.3-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = dynamic pm.max_children = 100 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 pm.process_idle_timeout = 10s pm.max_requests = 500 request_terminate_timeout = 60s 5. Restart Apache dan PHP-FPM: systemctl restart php8.2-fpm systemctl restart apache2 catatan tambahan: jika terjadi permasalahan web tidak bisa dibuka. coba non aktifkan modul mpm_event dan aktifkan ke mpm_prefork. setelah normal baru kemudian kembalikan ke mpm_event. jika ada pid yang belum tercover sehingga mpm_event penuh, maka lakukan stop apache lalu hapus pid apache pada /var/run/apache/ Permasalahan proses anak terjebak dalam apache Cek isi proses anak: ps aux | grep apache bersihkan proses anak: killall -9 apache2 pkill -9 apache2 pastikan jumlah proses anak yang berjalan normal, jika masih banyak yang terjebak ulangi terus hingga jumlah normal Cara kirim data dari /var/log/apache2/error.log ke Database Perintah untuk Manual: php artisan read:apachelog Perintah untuk Live: php artisan read:apachelog --live Monitoring Penggunaan CPU Server 1. Monitoring dilakukan menggunakan webmin. diperoleh penggunakan CPU server berlebihan (96%) dari hasil ps aux | grep php  diketahui adalah: www-data 912356 99.6 0.1 85792 25116 ? R 05:51 247:50 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvLmdpdC9pbmZvZXJyb3JfNDA0LWhhbmRsZXI= www-data 912364 99.6 0.1 85792 25032 ? R 05:51 247:49 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvLmdpdC9pbmZvZXJyb3JfNDA0LWhhbmRsZXI= www-data 912372 99.6 0.1 85792 25124 ? R 05:51 247:48 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvLmdpdC9pbmZvZXJyb3JfNDA0LWhhbmRsZXI= www-data 912378 99.8 0.1 85792 25044 ? R 05:53 246:47 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL2ZydWl0Y2FrZS9waHAtY29ycy9zcmMvRXhjZXB0aW9uc2Vycm9yXzQwNC1oYW5kbGVy www-data 912386 99.8 0.1 85792 25048 ? R 05:53 246:46 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL2ZydWl0Y2FrZS9waHAtY29ycy9zcmMvRXhjZXB0aW9uc2Vycm9yXzQwNC1oYW5kbGVy www-data 912395 99.8 0.1 85792 25144 ? R 06:03 236:04 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL3JhbXNleS91dWlkL3NyYy9HZW5lcmF0b3JlcnJvcl80MDQtaGFuZGxlcg== www-data 912403 99.8 0.1 85792 25340 ? R 06:03 236:04 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL3JhbXNleS91dWlkL3NyYy9HZW5lcmF0b3JlcnJvcl80MDQtaGFuZGxlcg== setelah dilakukan pengecekan pada salah satu file tmp sessions tersebut sudo cat /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL2ZydWl0Y2FrZS9waHAtY29ycy9zcmMvRXhjZXB0aW9uc2Vycm9yXzQwNC1oYW5kbGVy melakukan akses terhadap file error_404.php dimana file tersebut adalah backdoor yang ditanamkan untuk menyisipkan coding lain pada website. lalu kill sesuai PID nya sudo kill -9 912356 sudo kill -9 912364 sudo kill -9 912372 sudo kill -9 912378 sudo kill -9 912386 sudo kill -9 912395 sudo kill -9 912403 Hasilnya CPU server normal kembali 2. Pemeriksaan Terhadap File Mencurigakan Kata kunci: error_404.php , .htaccess , html cari file tersebut pada lokasi yang folder public , vendor dan system  dimana seharusnya file tersebut tidak seharusnya berada di lokasi tersebut. cek rutin tail -f /var/log/apache2/error.log untuk memantau aktivitas ip yang mengakses server mencurigakan. lakukan blok ip tersebut jika fail2ban tidak mendeteksinya, dengan cara: 1. Blok IP dengan IPTABLES untuk tambah ip yang diblok sudo iptables -A INPUT -s 36.70.12.0/24 -j DROP   untuk menghapus ip yang diblok sudo iptables -D INPUT -s 36.70.12.0/24 -j DROP  untuk menghapus ip yang diblok dalam daftar contoh: 5   DROP       all  --  192.168.1.100        0.0.0.0/0 7   DROP       all  --  203.0.113.45         0.0.0.0/0 sudo iptables -D INPUT 7 sudo iptables -D INPUT 5 untuk melihat ip yang sudah diblok sudo iptables -L INPUT -n sudo iptables -L -n sudo iptables -L INPUT -n --line-numbers | grep DROP 2. Blok IP dengan UFW untuk tambah ip yang diblok ufw deny from 36.70.12.0/24 untuk menghapus ip yang diblok ufw status numbered ufw delete untuk melihat ip yang sudah diblok ufw status 3. Pemeriksaan Terhadap Log Apache tail -f /var/log/apache2/error.log ditemukan koneksi seperti gambar berikut: dari log diatas akses yang tidak normal adalah: [Tue Jun 18 16:42:30.675064 2024] [authz_core:error] [pid 2187:tid 140011890530048] [client 49.229.89.23:54361] AH01630: client denied by server configuration: /var/www/html/presensi/.https:, referer: https://presensi.baritotimurkab.go.id/login Jaringan ip 49.229.89.23 wajib diblok: ufw deny from 349.229.0.0/16 sedangkan, log lain seperti: [Tue Jun 18 17:35:58.026576 2024] [proxy_fcgi:error] [pid 2263:tid 140011865351936] (104)Connection reset by peer: [client 36.75.65.115:19429] AH01075: Error dispatching request to : (reading response body) adalah log koneksi normal dimana pengguna sedang mengakses page aplikasi ATEI. 4. Batasi Akses ke bin/sh Batas ke bin/sh agar pengguna lain selain root tidak bisa mengaksesnya (kemungkinkan pengguna exploit): chmod 700 /bin/sh dan menambah rule pada .htaccess pada root web, untuk mencegah metode traversal directoy: # Prevent directory traversal attacks     RewriteCond %{REQUEST_URI} \.\. [NC]     RewriteRule ^ - [F] 5. Buat rule untuk serve-cgi-bin.conf serve-cgi-bin.conf terletak pada /etec/apache2/conf-available. Tambahkan aturan berikut: ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/          AllowOverride None          Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch          Require all granted                     # Menambahkan aturan untuk mencegah serangan traversal direktori         RewriteEngine On         RewriteCond %{REQUEST_URI} \.\. [NC]         RewriteRule ^ - [F] Cek error log Apache2 1. Cek error log apache tail -f /var/log/apache2/error.log 2. Kosongkan error log apache truncate -s 0 /var/log/apache2/error.log Fix Severity: 8192 Message: Creation of dynamic property CI_URI::$config is deprecated CodeIgniter adalah masalah yang sering terjadi jika aplikasi menggunakan CI yang sudah tidak kompetible dengan versi PHP terbaru. Cara mengataasinya dengan dengan cara menambahkan code: [\AllowDynamicProperties] 1. Folder /system/core/ pada file  URI.php -> di atas class CI_URL { Router.php -> di atas class CI_Router { Loader.php -> di atas class CI_Loader { Controller.php  -> di atas class CI_Loader { 2. Folder /system/database pada file  DB_driver.php  -> di atas abstract class CI_DB_driver { [\ReturnTypeWillChange] Folder /system/libraries/Session/drivers/ pada file Session_files_driver.php - > di atas public function open($save_path, $name) - > di atas public function read($session_id) - > di atas public function write($session_id, $session_data) - > di atas public function close() - > di atas public function destroy($session_id) - > di atas public function gc($maxlifetime) Terima kasih pada sumber referensi : Raja Coding https://www.youtube.com/watch?v=rM1C-88cYVc Cara mengembalikan tema wordpress kembali semula karena tema yang baru diaktifkan error Cara mengembalikan tema wordpress kembali semula karena tema yang baru diaktifkan error sedangkan tidak bisa login ke halaman admin wordpress (dalam kondisi blank): Masuk ke dalam database wordpress Buka Tabel wp_options Cari template dan stylesheet pada Kolom option_name Ubah/isi dengan tema sebelumnya yang normal misal: twentysixteen Simpan perubahan Perintah CLI untuk ekspor database Untuk melakukan ekspor data dari MySQL dapat menggunakan perintah mysqldump . Perintah ini memungkinkan Anda untuk membuat salinan dari struktur database, tabel, atau data tertentu ke dalam file SQL. Berikut adalah contoh penggunaannya: mysqldump -u username - p database_name > nama_file_dump .sql -u username : Nama user MySQL yang memiliki hak akses untuk database yang akan diekspor. -p : Opsi password. database_name : Nama database yang ingin Anda ekspor. nama_file_dump.sql : Nama file untuk menyimpan dump data. Contoh: mysqldump -u root - p dbdiskominfo > dbdiskominfo .sql Perintah CLI untuk import database Untuk melakukan impor data dari MySQL dapat menggunakan perintah mysql . Terlebih dahulu pastikan file dump mysql sudah tersedia. Berikut adalah contoh penggunaannya: mysql -u username - p database_name < nama_file_dump .sql -u username : Nama user MySQL yang memiliki hak akses ke database yang akan diimpor. -p : Opsi permintaan password. database_name : Nama database di mana Anda ingin mengimpor dump SQL. nama_dump_file.sql : Nama file dump SQL yang berisi struktur dan data yang ingin Anda impor. Lokasinya harus disesuaikan dengan lokasi file tersebut di sistem file Anda. Contoh: mysql -u root - p dbdiskominfo < dbdiskominfo_dump .sql Perintah untuk transfer file dan folder antar server Perintah ini menggunakan CLI linux yang diketik pada Terminal atau Putty. Sebelum itu pastikan akses SSH sudah tersedia. Anda dapat menggunakan perintah scp atau secure copy seperti contoh berikut: scp -r username@hostname:/path/to/directory /path/to/destination -r : Mengindikasikan bahwa scp harus meng-kopi direktori secara rekursif, termasuk semua file dan sub-direktori di dalamnya. username : Nama user pada server tujuan. hostname : Nama atau alamat IP server tujuan. /path/to/directory : Lokasi direktori di server tujuan yang ingin Anda download. /path/to/destination : Lokasi direktori di mana Anda ingin menyimpan direktori yang didownload di server lokal. Contoh: scp -r root@36.67.22.18:/var/www/html/diskominfo_1 /var/www/html/diskominfo_2 root : Nama user pada server tujuan. 36.67.22.18 : Alamat IP server tujuan. /var/www/html/diskominfo_1 : Lokasi folder yang ingin didownload pada di server tujuan yaitu folder  diskominfo_1 . /var/www/html/diskominfo_2 : Lokasi penempatan folder yang akan diupload pada server lokal yaitu folder diskominfo_2 . jika menggunakan port 2022 maka: scp -r -P 2022 root@36.67.22.22:/var/www/html/diskominfo_1 /var/www/html/diskominfo_2 Query Menampilan Unit Kerja yang Pegawainya Cuti Untuk menampilkan Unit Kerja yang Pegawainya cuti kategori 7 SELECT   tbl_unit.nm_unit   FROM tbl_unit   JOIN users ON tbl_unit.id = users.id_unit   JOIN   tbl_absen ON users.id = tbl_absen.id_user   WHERE tbl_absen.id_ket_in = '7' AND tbl_absen.tgl_in BETWEEN '2024-04-01' AND '2024-04-30'; SELECT      users.name, tbl_unit.nm_unit  FROM      tbl_unit  JOIN      users ON tbl_unit.id = users.id_unit  JOIN      tbl_absen ON users.id = tbl_absen.id_user  WHERE      tbl_absen.id_ket_in = '7' AND tbl_absen.tgl_in BETWEEN '2024-04-01' AND '2024-04-30'; Cek Pegawai Status Cuti SELECT      users.name,      tbl_unit.nm_unit,      tbl_absen.tgl_in FROM      tbl_absen JOIN      users ON tbl_absen.id_user = users.id JOIN      tbl_unit ON users.id_unit = tbl_unit.id WHERE      tbl_absen.id_user = '475'      AND tbl_absen.id_ket_in = '1'     AND tbl_absen.tgl_in BETWEEN '2024-06-03' AND '2024-06-30'; Query untuk menampilkan hasil database mysql Contoh untuk menampilkan data tertentu. Dalam hal ini ingin menampilkan Daftar nama pegawai pada unit kerja Inspektorat yang absen dari tanggal 1 Maret 2024 sampai tanggal sekarang. SELECT   users.name,   users.nip,   tbl_absen.tgl_in,   tbl_absen.jam_in,   tbl_absen.tgl_out,   tbl_absen.jam_out,   tbl_unit.nm_unit FROM   users JOIN   tbl_unit ON users.id_unit = tbl_unit.id JOIN   tbl_absen ON users.id = tbl_absen.id_user WHERE   tbl_absen.tgl_in BETWEEN '2024-03-01' AND CURDATE()   AND tbl_unit.nm_unit = 'INSPEKTORAT'; Sedangkan untuk mengekspor ke file .csv SELECT   users.name,   users.nip,   tbl_absen.tgl_in,   tbl_absen.jam_in,   tbl_absen.tgl_out,   tbl_absen.jam_out,   tbl_unit.nm_unit INTO OUTFILE '/tmp/hasil.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM   users JOIN   tbl_unit ON users.id_unit = tbl_unit.id JOIN   tbl_absen ON users.id = tbl_absen.id_user WHERE   tbl_absen.tgl_in BETWEEN '2024-03-01' AND CURDATE()   AND tbl_unit.nm_unit = 'INSPEKTORAT'; Cara merubah events pada perubahan qrcode presensi per 1 jam: mysql> set global event_scheduler = ON;   mysql> ALTER EVENT db_presensi.qr_refresh ON SCHEDULE EVERY 1 HOUR STARTS '2024-03-03 00:00:00'; karna STARTS bersifat opsional bisa juga langsung dengan: mysql> ALTER EVENT db_presensi.qr_refresh ON SCHEDULE EVERY 1 HOUR; untuk perubahan per 30 menit: mysql>ALTER EVENT db_presensi.qr_refresh ON SCHEDULE EVERY 30 MINUTE STARTS '2024-03-03 00:00:00'; Gagal Update Data Umum pada OpenDK Kecamatan Gagal!! Update Data Umum gagal! Peringatan ini muncul pada saat simpan data umum aplikasi opendk kecamatan. Padahal semua inputan data sudah terisi, koordinat lokasi kantor juga sudah terisi. Solusinya adalah: Buat Kolom lat dan lng pada Tabel das_data_umum, dengan tipe data DOUBLE Query Hapus isi data tabel dalam database menggunakan Terminal Masuk ke MySQL melalui terminal mysql -u root -p Pilih database yang ingin digunakan USE db_presensi_25; Hapus isi data dari tabel DELETE FROM tpp; Wordpress Tips Pemanfaatan Wordpres sebagai website Perangkat Daerah Cara Mengaktifkan FTP pada Wordpress Sebagai informasi Wordpress yang digunakan sebagai website OPD adalah wordpress yang diinstall pada server Webmin Kabupaten. Sehingga konfigurasi FTP pada server perlu diperhatikan. Sebelum cara ini diberlakukan, admin OPD diberikan hak akses untuk Webmin dan diberikan akses modul File Manager. Sehingga Admin OPD dapat mengupload file yang diperlukan baik untuk update wordpress, tema dan plugin. Berikut tahapan cara agar FTP wordpress otomatis dapat melakukan update wordpress, tambah tema dan plugin. 1. Buka file wp-config.php pada root website OPD. sudo nano /var/www/html/wordpress/wp-config.php 2. Tambahkan baris berikut  sebelum baris /* That's all, stop editing! */ : define('FS_METHOD', 'direct'); 3. Berikan Permission Folder pada folder wp-content sudo chown -R www-data:www-data /var/www/html/wordpress/wp-content Pastikan folder chmod 755 dan file chmod 644 4. Install FTP server sudo apt install vsftpd -y 5. Buka file vsftpd.conf sudo nano /etc/vsftpd.conf 6. Konfigurasi berikut pada vsftpd.conf write_enable=YES local_umask=022 chroot_local_user=YES 7. Lalu Restart FTP Server sudo systemctl restart vsftpd 8. Jangan lupa berikan rule NAT pada Mikrotik untuk membukan port 21 agar dapat diakses dari luar dst-nat chain=dstnat in-interface=etherWAN protocol=tcp dst-port=21 action=dst-nat to-addresses= to-ports=21 9. Jangan lupa juga berikan buka firewall untuk port 21 ufw allow 21 Cara Update Wordpress secara Manual Berikut tahapan update Wordpress secara manual: 1. Backup File Wordpress dan database. 2. Download File Wordpress terbaru di  https://id.wordpress.org/download/ 3. Upload File Zip Wordpress terbaru pada root direktori Web 4. Rename Folder Wordpress lama (contoh bpkad.old). 5. Extract pada root direktori. 6. Rename Folder Wordpress hasil Extract tadi sesuai nama Folder Wordpress lama (bpkad). 7. Masuk ke Folder bpkd. lalu Hapus Folder wp-content. 8. Copy Folder wp-content, File .htaccess dan File wp-config.php. 9. Paste pada Folder bpkad. 10. Login admin web wordpress. Update database. Lanjutkan untuk pembaruan database. 11. Selesai