├── .gitignore ├── README.md ├── images-guide ├── laravel-github-webhook │ ├── .DS_Store │ ├── langkah-1.png │ ├── langkah-10.png │ ├── langkah-11.png │ ├── langkah-12.png │ ├── langkah-13.png │ ├── langkah-14.png │ ├── langkah-15.png │ ├── langkah-16.png │ ├── langkah-17.png │ ├── langkah-2.png │ ├── langkah-3.png │ ├── langkah-4.png │ ├── langkah-5.png │ ├── langkah-6.png │ ├── langkah-7.png │ ├── langkah-8.png │ └── langkah-9.png ├── laravel-gitlab-webhook │ ├── langkah-1.png │ ├── langkah-2.png │ ├── langkah-3.png │ ├── langkah-4.png │ ├── langkah-5.png │ ├── langkah-6.png │ ├── langkah-7.png │ ├── langkah-8.png │ └── langkah-9.png └── laravel-gitlab-deployment │ ├── langkah-1.jpg │ ├── langkah-10.png │ ├── langkah-2.png │ ├── langkah-3.png │ ├── langkah-4.png │ ├── langkah-5.png │ ├── langkah-6.png │ ├── langkah-7.png │ ├── langkah-8.png │ └── langkah-9.png ├── esensi-web-modern-progresif.md ├── setting-api-in-laravel.md ├── right-click-command-prompt.md ├── catatan-android.md ├── file-manager-via-ssh.md ├── menggunakan-openfire.md ├── memory-exhausted.md ├── penamaan-fungsi.md ├── https-wordpress.md ├── codeigniter-config.md ├── ubah-password-mysql.md ├── remote-mysql.md ├── import-sql-besar.md ├── catatan-git.md ├── vps-centos7.md ├── 0.intro-a11y.md ├── tantangan-menjadi-android-developer.md ├── laravel-gitlab-deployment.md ├── laravel-gitlab-webhook.md └── laravel-github-webhook.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | images-guide/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Catatan Programmer 2 | Ini catatan yang saya buat untuk diri saya sendiri. Jika kamu mendapat manfaatnya, terima kasih. 3 | -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/.DS_Store -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-1.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-10.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-11.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-12.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-13.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-14.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-15.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-16.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-17.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-2.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-3.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-4.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-5.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-6.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-7.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-8.png -------------------------------------------------------------------------------- /images-guide/laravel-github-webhook/langkah-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-github-webhook/langkah-9.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-1.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-2.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-3.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-4.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-5.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-6.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-7.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-8.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-webhook/langkah-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-webhook/langkah-9.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-1.jpg -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-10.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-2.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-3.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-4.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-5.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-6.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-7.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-8.png -------------------------------------------------------------------------------- /images-guide/laravel-gitlab-deployment/langkah-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kresnasatya/panduan-teknis/HEAD/images-guide/laravel-gitlab-deployment/langkah-9.png -------------------------------------------------------------------------------- /esensi-web-modern-progresif.md: -------------------------------------------------------------------------------- 1 | # Esensi Web Modern yang Progresif 2 | 3 | 1. Web harus pakai HTTPS 4 | 2. Jangan pasang service worker, web app manifest, push notification dan fitur kerennya 5 | hingga kamu tahu kalau itu benar-benar diperlukan. -------------------------------------------------------------------------------- /setting-api-in-laravel.md: -------------------------------------------------------------------------------- 1 | # Create API in Laravel 2 | 3 | ## Response 4 | ``` 5 | // For success response 6 | "status": "ok" 7 | or 8 | "status": "success" 9 | 10 | // Renungan, di antara dua respon di atas, yang mana menurut Anda 11 | ringkas dari dua opsi tersebut dari segi suku kata? 12 | ``` -------------------------------------------------------------------------------- /right-click-command-prompt.md: -------------------------------------------------------------------------------- 1 | # Klik kanan command prompt 2 | Kemarin saya bingung bagaimana cara menampilkan opsi menggunakan command prompt a.k.a cmd ketika kita klik kanan sebuah folder. Akhirnya saya menemukan caranya yakni: tekan tombol `shift` + klik kanan pada folder dan akan muncul pilihan `Open command window here`. 3 | -------------------------------------------------------------------------------- /catatan-android.md: -------------------------------------------------------------------------------- 1 | # Catatan Android 2 | Berkaitan dengan yang saya bookmark dan saya perlukan. 3 | 4 | ## Bookmarks 5 | 1. [What I look for in a Junior Android Dev](https://dev.to/ditn/what-i-look-for-in-a-junior-android-dev) 6 | 2. [Android Networking Tutorial](https://www.raywenderlich.com/126770/android-networking-tutorial-getting-started) 7 | 3. [Popular Movies Implementation Guide](https://docs.google.com/document/d/1ZlN1fUsCSKuInLECcJkslIqvpKlP7jWL2TP9m6UiA6I/pub?embedded=true) 8 | 4. [Hiding your API Key](https://www.linkedin.com/pulse/how-hide-your-api-key-android-apps-allan-caine) 9 | 5. [Introduction to MVP](http://konmik.com/post/introduction_to_model_view_presenter_on_android/) 10 | 6. [Genymotion vs Android Emulator](https://www.plightofbyte.com/android/2017/09/03/genymotion-vs-android-emulator/) -------------------------------------------------------------------------------- /file-manager-via-ssh.md: -------------------------------------------------------------------------------- 1 | # Koneksi ke FILE MANAGER via SSH 2 | Buka commandline di Mac > Masukkan perintah ```ssh username@hostname``` > Masukkan perintah **yes** untuk meregistrasi ke *known hosts* > Masukkan password hostname anda. 3 | 4 | ## Catatan 5 | Secara default port SSH adalah 22. Jika port anda berbeda maka formatnya adalah ```ssh -p 123 username@hostname```. **123** adalah contoh port (bisa sesuaikan dengan kebutuhan anda). 6 | 7 | ## Detail 8 | 1. Username > username di Cpanel 9 | 2. Hostname > nama domain anda 10 | 3. Password > password di Cpanel 11 | 12 | ## Sumber 13 | 1. [Klikhost - Cara login SSH via command line Mac OS](https://klikhost.com/cara-login-ssh-menggunakan-terminal-pada-mac-os-x/) 14 | 2. [IDCloudhost - Mengaktifkan dan menggunakan SSH hosting via putty (windows)](https://idcloudhost.com/panduan/mengaktifkan-dan-menggunakan-ssh-pada-hosting/) -------------------------------------------------------------------------------- /menggunakan-openfire.md: -------------------------------------------------------------------------------- 1 | # Openfire 2 | Openfire is a powerful instant messaging (IM) and chat server that implements the XMPP protocol. 3 | 4 | # Cara Install 5 | Di windows cukup download aplikasi Openfire dan `run as administrator` untuk menjalankan proses instalasi. 6 | Setelah selesai, klik kanan pada Openfire server dan `run as administrator`. Hal ini dikarenakan fitur UAC yang enabled, maka dari itulah harus `run as administrator`. 7 | 8 | # Setup database 9 | Karena kita akan pakai setup database external (MySQL) maka harus mengikuti tahap-tahap berikut: 10 | 1. Pastikan kalau menggunakan MySQL 4.1.18 atau yang terbaru (5.x recommended). 11 | 2. Buat database untuk Openfire tables. Misalnya: `CREATE DATABASE openfire`. 12 | 3. Import schema database openfire yang berada di root aplikasi openfire `resource/database`. 13 | - Aktifkan MySQL Commandline > `USE openfire` > `source ` 14 | 4. Jalankan XAMPP (run apache dan mysql) > Run openfire as administrator dan start openfire server. 15 | -------------------------------------------------------------------------------- /memory-exhausted.md: -------------------------------------------------------------------------------- 1 | Saya menggunakan database yang ukurannya lebih dari 2 MB dan CI sebagai frameworknya. Namun, ketika menjalankan di localhost, muncul error di bawah ini:
2 | 3 | `Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 47 bytes) in C:\xampp\htdocs\e-registrasi\system\database\drivers\mysqli\mysqli_result.php on line 183` 4 | 5 | Saya melakukan googling dan menemukan solusi di stackoverflow [CodeIgniter Allowed memory exhausted](http://stackoverflow.com/questions/14701398/codeigniter-allowed-memory-exhausted). 6 | 7 | Namun hal tersebut tidak membuat saya puas. Saya mencoba meningkatkan `memory_limit` di file **php.ini**, namun gagal. Berhari-hari akhirnya saya menemukan penyebabnya. Hal ini disebabkan karena saya mencoba menampilkan lebih dari 1000 rows tanpa system paging. 8 | 9 | Dengan menggunakan system paging atau pagination, maka kita bisa menampilkan data 1000 rows tersebut dengan dibagi per page. Misalnya: 10 | 11 | ``1 page = 25 rows. 12 | 40 page = 1000 rows`` 13 | 14 | Saya telah membuat contohnya di github. Berikut [linknya](https://github.com/satyakresna/e-registrasi) 15 | -------------------------------------------------------------------------------- /penamaan-fungsi.md: -------------------------------------------------------------------------------- 1 | Penamaan function/method Controller ketika membuat CRUD: 2 | Dulu, ketika saya membuat sebuah controller untuk melakukan proses CRUD pada CodeIgniter, saya menggunakan opsi A. 3 | Tetapi, sekarang saya mulai beralih kepada opsi B. Karena prosesnya terpisah-pisah seperti 4 | 1 fungsi mempunyai 1 tugas. 5 | 6 | A. 7 | 1. create -> untuk menampilkan form tambah data dan sekaligus memproses penyimpanan data. 8 | 2. update -> untuk menampilkan form ubah data dan sekalgus memproses pengubahan data. 9 | 3. delete -> untuk melakukan penghapusan data 10 | 11 | B. 12 | 1. create -> untuk menampilkan form tambah data 13 | 2. store -> untuk melakukan proses penyimpanan data 14 | 3. edit -> untuk menampilkan form ubah data 15 | 4. update -> untuk melakukan proses pengubahan data 16 | 5. delete -> untuk melakukan penghapusan data 17 | 18 | Saya mendapat ide dari opsi B ketika latihan membuat aplikasi sederhana menggunakan Laravel 19 | (Buku Seminggu belajar Laravel). Di dalam buku tersebut, penulis menjelaskan bahwa penerapan opsi B 20 | ini merupakan salah satu hal yang baik ketika ingin menerapkan Restful atau sesuatu yang berkaitan 21 | dengan API (mohon maaf saya lupa di halaman berapa). 22 | 23 | Link terkait: https://sekolahkoding.com/forum/ask-share-penamaan-function-controller-ketika-membuat-crud 24 | -------------------------------------------------------------------------------- /https-wordpress.md: -------------------------------------------------------------------------------- 1 | # Membuat WordPress menjadi HTTPS 2 | Dengan menggunakan fitur Let's Encrypt (gratis) dari Cpanel kita, kita dapat membuat website kita menjadi HTTPS. Saya mencoba membuat website pribadi saya (CMS WordPress) menjadi HTTPS 3 | 4 | ## Langkah-langkah 5 | - Masuk ke WP Admin > Settings > General Settings: 6 | - Ubah WordPress Address (URL) anda dari `http://domainanda.com` menjadi `https://domainanda.com` 7 | - Ubah Side Address (URL) anda dari `http://domainanda.com` menjadi `https://domainanda.com` 8 | - Setelah itu save changes dan cari file .htaccess kamu dan tambahkan script untuk redirect ke https di atas setting defaultnya WordPress. 9 | ``` 10 | # BEGIN HTTPS Redirection 11 | 12 | RewriteEngine On 13 | RewriteCond %{HTTPS} off 14 | RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 15 | 16 | # END HTTPS Redirection 17 | 18 | # BEGIN WordPress 19 | 20 | RewriteEngine On 21 | RewriteBase / 22 | RewriteRule ^index\.php$ - [L] 23 | RewriteCond %{REQUEST_FILENAME} !-f 24 | RewriteCond %{REQUEST_FILENAME} !-d 25 | RewriteRule . /index.php [L] 26 | 27 | ``` 28 | - Save perubahan .htaccess tadi dan selamat website kamu sudah bisa menggunakan HTTPS. ;) 29 | 30 | ## Sumber 31 | [Cara Membuat WordPress Menggunakan HTTPS (SSL) Redirect dari HTTP](https://situsali.com/other/cms/2015/11/07/cara-membuat-wordpress-menggunakan-https-ssl-redirect-dari-http/) -------------------------------------------------------------------------------- /codeigniter-config.md: -------------------------------------------------------------------------------- 1 | # CodeIgniter Config 2 | Konfigurasi sederhana CodeIgniter 3.X 3 | 4 | ## Setting Dynamic Base URL 5 | Secara umum, kita harus men-setting base URL secara manual misalnya `$config['base_url']= 'http://localhost/namaproject';`.
6 | Tetapi, kita bisa men-setting secara dinamis dengan mengubah `$config['base_url']` seperti pada sintaks di bawah ini:
7 | 8 | ``` 9 | $config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http"); 10 | $config['base_url'] .= "://".$_SERVER['HTTP_HOST']; 11 | $config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']); 12 | ``` 13 | Silahkan di **copy paste** ke dalam file `config.php` . Dengan Base URL yang dinamis, kita tidak perlu men-setting secara manual. :) 14 | 15 | ## Clean and Pretty URL 16 | Ketika men-download framework CodeIgniter dan menjalankannya di browser biasanya formatnya seperti berikut:
17 | `http://namaproject/index.php/namacontroller/namamethod`.
18 | Untuk menghilangkan `index.php` kita ubah `$config['index_page'] = 'index.php';` menjadi `$config['index_page'] = '';`. dan membuat file .htaccess di root project utama kita dengan sintaks di bawah ini (Silahkan di **copy paste**):
19 | 20 | ``` 21 | 22 | Options -Indexes 23 | 24 | RewriteEngine On 25 | RewriteCond $1 !^(index\\.php|resources|robots\\.txt) 26 | RewriteCond %{REQUEST_FILENAME} !-f 27 | RewriteCond %{REQUEST_FILENAME} !-d 28 | RewriteRule ^(.+)$ index.php?/$1 [L,QSA] 29 | 30 | ``` 31 | 32 | ## Terima Kasih 33 | 1. [Avenir](http://avenir.ro/codeigniter-tutorials/removing-the-index-php-from-the-url-and-allow-the-use-of-search-engine-friendly-urls/)
34 | 2. [MbahCoding](http://mbahcoding.com/php/codeigniter/codeigniterdynamic-base-url.html)
35 | -------------------------------------------------------------------------------- /ubah-password-mysql.md: -------------------------------------------------------------------------------- 1 | # Mengubah password MySQL di XAMPP 2 | Langkah - langkah: 3 | 1. Pastikan server `Apache` dan `MySQL` sudah dinyalakan. 4 | 2. Klik tombol `Shell` yang berada di sebelah kanan XAMPP. 5 | 3. Masukan perintah `mysqladmin --user=root password "newpassword"`. 6 | Contoh: `mysqladmin --user=root password "0000"` 7 | Atau jika sebelumnya sudah pernah memasang password dan ingin mengubahnya 8 | dengan yang baru maka perintahnya seperti berikut: `mysqladmin --user=root --password=oldpassword password = "newpassword"`. 9 | Contoh: `mysqladmin --user=root --password=0000 password = "meow"`. 10 | 4. Setelah mengubah password di `Shell`, kamu harus mengubah password di file `config.inc.php`. 11 | Kamu harus melakukannya untuk menghindari error saat koneksi ke database. 12 | Silahkan buka `C:\xampp\phpMyAdmin` dan cari file tersebut. Carilah baris kode seperti di bawah ini: 13 | 14 | ``` 15 | /* Authentication type and info */ 16 | $cfg['Servers'][$i]['auth_type'] = 'config'; 17 | $cfg['Servers'][$i]['user'] = 'root'; 18 | $cfg['Servers'][$i]['password'] = ''; 19 | $cfg['Servers'][$i]['extension'] = 'mysqli'; 20 | $cfg['Servers'][$i]['AllowNoPassword'] = true; 21 | $cfg['Lang'] = ''; 22 | ``` 23 | 24 | Berikan isi dalam `$cfg['Servers'][$i]['password'] = '';` dan ubah nilai di dalam 25 | `$cfg['Servers'][$i]['AllowNoPassword'] = true;` menjadi seperti ini: 26 | ``` 27 | /* Authentication type and info */ 28 | $cfg['Servers'][$i]['auth_type'] = 'config'; 29 | $cfg['Servers'][$i]['user'] = 'root'; 30 | $cfg['Servers'][$i]['password'] = '0000'; 31 | $cfg['Servers'][$i]['extension'] = 'mysqli'; 32 | $cfg['Servers'][$i]['AllowNoPassword'] = false; 33 | $cfg['Lang'] = ''; 34 | ``` 35 | 5. Matikan koneksi `Apache` dan `MySQL`. Hidupkan kembali dan akses `localhost/phpMyAdmin` di browser kamu. Yeay~ 36 | 37 | 38 | ## Referensi 39 | [How to configure root password for phpMyAdmin MySQL in XAMPP](https://www.roodex.com/blog/change-password-phpmyadmin-mysql-xampp/) 40 | -------------------------------------------------------------------------------- /remote-mysql.md: -------------------------------------------------------------------------------- 1 | # Remote MySQL 2 | Cara agar database di server (internet) bisa di bawa ke komputer atau laptop kita tanpa harus buka Cpanel. 3 | 4 | ## Langkah-langkah 5 | - Buka Cpanel > Pilih opsi ``remote mysql`` di bagian **Databases**. 6 | - Saat berada di opsi tersebut, telah tersedia sebuah IP address atau host (default) yang akan kita pakai untuk 7 | melakukan remote MySQL. Namun, kita perlu membuat host lagi agar bisa diterima oleh server Cpanel. 8 | - Masukkan host IP address yang kita gunakan saat berinternet ke form `Add an Access Host`. Cara mengecek IP address buka web [whatismyip.com](http://whatismyip.com). 9 | - Saat masukkan host, gunakan tanda `%` sebagai wildcard. Contoh IP yang terbaca di **whatismyip** adalah `112.210.172.107`. Kemudian kita ubah menjadi `112.210.%.%`. Kemudian klik `Add host` 10 | - Tujuan menggunakan tanda `%` adalah supaya IP yang kita pakai untuk berinternet diterima oleh server Cpanel saat melakukan remote. Hal ini dikarenakan IP yang kita gunakan untuk berinternet berubah-ubah dalam waktu tertentu dan tergantung dari provider kita. 11 | - **Opsi pertama**: Buka SQLyog > klik new connection > pilih tab MySQL. 12 | - Masukkan **host atau IP address** yang di langkah kedua ke dalam kolom `MySQL Host Address`. 13 | - Masukkan **username** ke dalam kolom `username`. 14 | - Masukkan **password** ke dalam kolom `password`. 15 | - Biarkan port nya default 16 | - Klik **Test connection**. Jika berhasil maka klik **Connect**. 17 | - **Opsi kedua**: Buka XAMPP > Klik **config** pada section **Apache** > pilih `config.inc.php`. 18 | - Pada baris terakhir sebelum tanda `?>` masukkan script berikut: 19 | ``` 20 | /* Remote server */ 21 | $i++; 22 | $cfg['Servers'][$i]['auth_type'] = 'config'; 23 | $cfg['Servers'][$i]['user'] = 'yourusername'; 24 | $cfg['Servers'][$i]['password'] = 'yourpass'; 25 | $cfg['Servers'][$i]['host'] = 'your host or IP address di langkah kedua'; 26 | $cfg['Servers'][$i]['connect_type'] = 'tcp'; 27 | ``` 28 | - Save file > hidupkan Apache > hidupkan MySQL > masuk ke `localhost/phpMyAdmin` > Cek combobox yang berada di pojok kiri atas > Pilih opsi server anda. 29 | -------------------------------------------------------------------------------- /import-sql-besar.md: -------------------------------------------------------------------------------- 1 | # Import File SQL besar 2 | Di PHPMyadmin, kita tidak bisa mengimport .sql file lebih dari 2MB (2048kiB). Berikut adalah solusi jika kita ingin mengimport data lebih dari itu. 3 | 4 | 1. Pertama matikan module ***Apache*** dan ***MySQL*** di XAMPP.
5 | 2. Di module ***Apache*** klik menu ***config*** dan cari file ***php.ini***:
6 | a. Cari (CTRL + F) `post_max_size` dan `upload_max_filesize`.
Jika kita ingin mengupload data sekitar 128MB maka ubah nilainya menjadi:
7 | `post_max_size=128M 8 | upload_max_filesize=128M`
9 | 3. Di module ***MySQL*** klik menu ***config*** dan cari file ***my.ini***:
10 | a. Cari (CTRL + F) `max_allowed_packet`. Jika ukuran SQL kita sekitar 128MB atau lebih maka ubah nilainya menjadi:
11 | `max_allowed_packet=1024M` dengan tujuan agar mempercepat proses import data SQL.
12 | 4. Hidupkan kembali ***Apache*** dan ***MySQL***. Kita sudah bisa mengupload SQL lebih dari 2MB. 13 | 14 | ***Ingat*** Ini hanya berlaku pada server local saja. Kalau server sungguhan (cPanel) saya belum tahu. 15 | 16 | ***UPDATE!!!*** Di server sungguhan (cPanel), PHPMyadmin dapat menerima import file SQL kita maksimal 50MB 17 | 18 | Link terkait: [phpMyAdmin: Can't import huge database file, any suggestions?](http://stackoverflow.com/questions/5051253/phpmyadmin-cant-import-huge-database-file-any-suggestions) 19 | 20 | # Import SQL file dengan command prompt. 21 | Saya telah mencoba menggunakan command prompt (windows) untuk mengimport sql file yang berukurannya besar 22 | (ukurannya lebih dari 500 MB sudah saya coba dan berhasil) tanpa hacking mysql.ini dan php.ini seperti yang saya jelaskan di atas. Berikut langkah-langkahnya: 23 | 1. Aktifkan XAMPP dan hidupkan opsi untuk `mysql` saja. 24 | 2. Buka cmd dan masukkan perintah `mysql -u root -p` dan tekan `enter`. Masukkan password, jika tidak ada 25 | maka kosongkan. 26 | 3. Pilih database yang akan diimport datanya perintahnya `use nama_database_kamu;`. 27 | 4. Kemudian ketik `source path_import_sql_kamu_berada`. Contoh `source C:\Users\xyz\Documents\BACKUP DB KANTOR\nama_database_yg_diimport`. Ingat jangan masukkan tanda `;` di akhir perintahnya karena akan error. 28 | 5. Ketik enter dan tunggu sampai proses import ke dalam database selesai. 29 | **NB** : Saya kira untuk sistem operasi `macOS` dan `distro linux` bisa menyesuaikan. 30 | -------------------------------------------------------------------------------- /catatan-git.md: -------------------------------------------------------------------------------- 1 | ## Git Commit 2 | Standards conventions of commit messages: 3 | 1. Must be in quotation marks. 4 | 2. Written in the present tense. 5 | 3. Should be brief (singkat) (50 characters or less) when using -m 6 | 7 | ------------------------------------------------------ **GIT GLOSSARY** ---------------------------------------------------------------- 8 | 9 | ```git checkout HEAD filename```: Discards changes in the working directory 10 | 11 | ```git reset HEAD filename```: Unstages file changes in the staging area 12 | 13 | ```git checkout SHA```: Used for back to previous commit or specific 14 | 15 | ```git branch```: List all a Git projects branches 16 | 17 | ```git branch branch_name```: Create a new branch 18 | 19 | ```git checkout branch_name```: Used to switch from one branch to master or from one branch to another branch 20 | 21 | ```git init```: Creates a new git repository 22 | 23 | ```git status```: Inspects the contents of the working directory and staging area 24 | 25 | ```git add```: Adds files from working area to the staging area 26 | 27 | ```git diff```: Shows the difference between the working area and staging area 28 | 29 | ```git commit```: Permanently stores file changes from staging area in repository 30 | 31 | ```git log```: Shows lists of all previous commits 32 | 33 | ```git branch -d name_branch```: Delete non active branch 34 | 35 | ```git branch -m ```: Rename non active branch 36 | 37 | ```git branch -m ```: Rename active branch 38 | 39 | ***CHANGE REMOTE GIT*** 40 | ```git remote set-url origin git://new.url.here``` 41 | 42 | ***DELETE BRANCH REMOTE AND LOCAL*** 43 | ```git push origin --delete 44 | git branch -d ``` 45 | 46 | ------------------------------------------------------ **GIT WORKFLOW** ---------------------------------------------------------------- 47 | 48 | 1. WORKING AREA => Make changes to: +additions, -deletions, modifications 49 | 2. STAGING AREA => Bring changes into the staging area 50 | 3. REPOSITORY => Save changes to the repository as a 'commit' 51 | 52 | ------------------------------------------------------ **MERGE CASE** ---------------------------------------------------------------- 53 | 54 | ```git merge branch_name```: Used to join file changes from one branch to another
55 | Contoh:
56 | Ada 2 branch:
57 | * dev <= aku ada di sini
58 | * master
59 | Aku ingin memasukkan yang ada di branch dev ke branch master.
60 | Langkah-langkahnya: 61 | 1. Pastikan yang ada di branch **dev** sudah di commit.
62 | 2. Lakukan ```git checkout master``` untuk pindah ke branch **master**.
63 | 3. Lakukan ```git merge dev``` untuk menggabungkan yang ada di **dev** ke dalam **master** 64 | -------------------------------------------------------------------------------- /vps-centos7.md: -------------------------------------------------------------------------------- 1 | # Link-link penting saat setting VPS dengan Centos 7 2 | Tujuannya agar tidak kepenuhan bookmark di browser. :D 3 | 4 | 1. [Introduction to DO DNS](https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-dns) 5 | 1. [Fixed failed to set locale](https://www.cyberciti.biz/faq/failed-to-set-locale-defaulting-to-c-warning-message-on-centoslinux/) 6 | 1. [Inital server setup](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7) 7 | 1. [Additional recommended steps](https://www.digitalocean.com/community/tutorials/additional-recommended-steps-for-new-centos-7-servers) 8 | 1. [Setup nginx server block](https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-on-centos-7) 9 | 1. [Secure nginx with let's encrypt](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-centos-7) 10 | 1. [Fixing 403 forbidden nginx errors](https://vexxhost.com/resources/tutorials/fixing-403-forbidden-nginx-errors/) 11 | 1. [Fixed SELinux according 403 forbidden nginx](https://github.com/northbright/Notes/blob/master/nginx/configure-selinux-to-fix-403-forbidden-error-of-nginx-on-centos.md) 12 | 1. [Nginx - failed to open stream: Permission denied in /var/www/example.com](https://stackoverflow.com/questions/37710979/nginx-failed-to-open-stream-permission-denied-in-var-www-example-com) 13 | 1. [Cant run any commands - -bash: ls: command not found](https://askubuntu.com/questions/891943/cant-run-any-commands-bash-ls-command-not-found/891955) 14 | 1. [Install Git](https://www.digitalocean.com/community/tutorials/how-to-install-git-on-centos-7) 15 | 1. [Membuat SWAP](https://sekolahlinux.com/create-swap-pada-centos-7/) 16 | 1. [Can't enable SWAP](https://unix.stackexchange.com/questions/294600/i-cant-enable-swap-space-on-centos-7) 17 | 1. [Install new MARIA DB](https://linuxhostsupport.com/blog/how-to-upgrade-mariadb-on-centos-7/) 18 | 1. [Install PHP 7.2](https://www.cyberciti.biz/faq/how-to-install-php-7-2-on-centos-7-rhel-7/) 19 | 1. [Install Composer](https://www.vultr.com/docs/install-composer-on-centos-7) 20 | 1. [Install FTP server](https://www.tecmint.com/install-ftp-server-in-centos-7/) 21 | 1. [Secure VSFTPD](https://www.tecmint.com/secure-vsftpd-using-ssl-tls-on-centos/) 22 | 1. [WordPress NGINX 404 errors](https://www.digitalocean.com/community/questions/wordpress-and-nginx-404-errors-all-but-home-page) 23 | 1. [WordPress FTP Credentials](https://support.cloudways.com/how-to-resolve-wordpress-asking-for-ftp-credentials-error/) 24 | 1. [Php extensions on centos7 php7.x](https://unix.stackexchange.com/questions/410788/php-extensions-on-centos7-php7-x) 25 | 1. [Laravel 5 Installation in Ubuntu: laravel command not found](https://stackoverflow.com/questions/28597648/laravel-5-installation-in-ubuntu-laravel-command-not-found/37483332) 26 | 1. [Laravel Nginx Conf](https://gist.github.com/ashleydw/afd389b1e763d3c1cf1f) 27 | 1. [Laravel.log couldn't be opened](https://stackoverflow.com/questions/23411520/how-to-fix-error-laravel-log-could-not-be-opened) 28 | -------------------------------------------------------------------------------- /0.intro-a11y.md: -------------------------------------------------------------------------------- 1 | # Perkenalan Accessibility 2 | *Penjelasan Accessibility akan saya arahkan ke platform web.* 3 | Sebagai seorang web developer, selain urusan performance dan interface pada website yang dibuat, kita perlu memperhatikan siapa user kita. Apakah user kita lahir tidak ada kekurangan fisik atau sebaliknya (disabilitas). Jika user yang mengakses website kita adalah kalangan disabiilitas maka kita perlu memberikan perhatian ekstra terhadap website kita. Lalu bagaimana caranya? Accessibility adalah jawaban dari hal tersebut. 4 | 5 | ## Definisi 6 | Accessibility secara garis besar adalah bagaimana user yang disabilitas bisa mengakses aplikasi kita layaknya orang normal (*making disability users able to access our website*). Accessibility sering disingkat dengan `a11y` layaknya localization (l10n) dan intenationalization (i18n). Dengan bantuan teknologi pembantu (assitive technology) seperti screen reader dan mengubah website kita ke arah `a11y` maka orang disabilitas bisa mengakses website kita layaknya orang normal. 7 | Perlu dipahami bahwa `a11y` bukanlah sebuah fitur tetapi sebuah kebutuhan bahkan keharusan (*It's not a feature but a requirement even must*) 8 | 9 | ## Tools untuk Accessibility 10 | Saya akan menggunakan `Lighthouse` yang ada pada Chrome browser untuk menganalisa apakah website kita sudah bisa dikatakan `Accessibility`. Kita akan bahas dipertemuan selanjutnya. 11 | 12 | ## Panduan mempelajari Accessibility 13 | 1. [WebAIM WCAG 2.0 Checklist](https://webaim.org/standards/wcag/checklist). 14 | 2. [Web Content Accessibility Guidelines](https://www.w3.org/WAI/WCAG20/quickref/) 15 | 3. [Udacity - Intro to Accessibility](https://classroom.udacity.com/courses/ud891). 16 | 17 | ## Kriteria Accessibility 18 | 1. Perceivable (Konten website tersedia bagi indera - penglihatan, pendengaran dan atau sentuhan). 19 | 2. Operable (Tampilan form, kendali dan navigasi dapat dioperasikan). 20 | 3. Understandable (Konten dan tampilan dapat dimengerti). 21 | 4. Robust (Konten dapat digunakan dengan baik oleh berbagai platform termasuk teknologi bantu).
22 | Kita sebut dengan *POUR* 23 | 24 | ## Alasan membuat konten Accessibility dalam bahasa Indonesia 25 | 1. Merupakan kesempatan bagi saya untuk memperkenalkan konten Accessibility dalam bahasa Indonesia. *Sejauh yang saya lihat di forum komunitas web developer belum ada yang membahas tentang hal ini apalagi dalam konten bahasa Indonesia.* Masih ada beberapa orang yang belum bisa mencerna sebuah materi dengan baik dengan bahasa Inggris maka dari itulah saya membuatkan artikel Accessibility dalam bahasa Indonesia. 26 | 2. Menurut sudut pandang saya rata-rata web developer jauh lebih mempentingkan performance website dibandingkan Accessibility. Tetapi, perlu dipahami bahwa kita harus tahu siapa user kita. Apakah mereka lahir tanpa cacat fisik atau sebaliknya (disabilitas). Sehingga Accessibility wajib ada disetiap website. **Accessibility adalah prioritas utama anda jika anda ingin mencapai [billion users on the web](https://developers.google.com/web/billions/).** 27 | 28 | Dibagian selanjutnya saya akan menjelaskan implementasi Accessibility di dunia web. 29 | 30 | ## Publikasi 31 | Artikel ini telah dipublish ke dalam [Medium](https://medium.com/@satyakresna/perkenalan-accessibility-c9d893318567) 32 | -------------------------------------------------------------------------------- /tantangan-menjadi-android-developer.md: -------------------------------------------------------------------------------- 1 | # Tantangan menjadi Android Developer 2 | 3 | ## Narasi 4 | Sekitar 1 minggu lalu, saya bersama teman-teman saya mengadakan workshop membuat aplikasi Android menggunakan Android Studio. Studi kasus yang kami buat sederhana yakni membuat aplikasi [pemesanan tiket](https://github.com/wdharmana/CinemaTix). Bahasa pemrograman yang dipakai adalah Java dan target peserta adalah mahasiswa yang baru masuk bangku perkuliahan. Sebagian besar mereka belum terbiasa dengan bahasa pemrograman dan merupakan tantangan tersendiri untuk membuat **TODO** sesederhana mungkin agar mereka mengerti. 5 | 6 | ## Tantangan pertama (Workshop) 7 | Saat workshop berlangsung muncul beberapa tantangan diantaranya: 8 | 1. Spesifikasi laptop peserta. Rata-rata yang saya temukan laptop peserta seperti laptop kantoran. Layaknya RAM mulai 2GB - 4GB dengan Hard disk drive bukan Solid state drive dan dengan OS Windows (OS bukan masalah terlalu besar di bagian ini (mungkin)). Bagi anda seorang developer mobile dengan spesifikasi laptop tersebut harus membuat anda **ekstra bersabar** ketika membuka IDE seperti Android Studio. Ditambah dengan mendownload library saat membuat project dan mengunduh sesuatu menggunakan **Gradle** yang kadang terasa *lie-fi* bagi saya. Ditambah pula menjalankan emulator murni dari Android yang disediakan oleh Android Studio dengan spesifikasi laptop di atas (Saat ini anda bisa mencoba Nox emulator sebagai emulator yang ringan untuk men-test aplikasi Android anda). 9 | 2. Peserta belum paham dengan bahasa pemrograman Java. Saya rasa ini perlu dimaklumi karena latar belakang peserta adalah mahasiswa yang baru masuk perkuliahan alias maba dengan lulusan SMA / SMK. Jika anda lulusan SMK anda beruntung karena anda sudah pernah berhadapan dengan bahasa pemrograman. 10 | Jika anda ingin belajar bahasa pemrograman Java silahkan cari di Udacity [Intro Java Programming](https://classroom.udacity.com/courses/ud282) & [Object Oriented Java](https://classroom.udacity.com/courses/ud283). Ingat yang namanya belajar hal baru itu tidak gampang, jadi harap bersabar. :) 11 | 3. Sebagian peserta belum menginstall tools untuk membuat aplikasi Android (JDK, Android SDK, Android Studio dan emulator) dan belum mencoba mengetest apakah Android Studio berjalan dengan baik dengan mencoba membuat Hello World Application pertama kali. Jadi, waktu workshop semakin lama selesainya. 12 | 13 | ## Solusi 14 | 1. Silahkan ikut gerakan [Indonesia Android Kejar](https://events.withgoogle.com/indonesia-android-kejar/) yang terbagi menjadi 3 level (Beginner, Intermediate dan Advance). 15 | 2. Bagi anda yang ingin menjadi seorang Android developer, mari sisihkan uang saku anda untuk mengganti spare part laptop anda (RAM diupgrade ke 8 GB dan ganti ke SSD 256 GB **bukan** 128 GB) atau mengganti ke laptop baru seperti Macbook Pro atau Macbook Air. *Jangan sisihkan uang saku anda hanya untuk membeli gadget yang aduhai tetapi laptop anda masih kantoran.*. Untuk processor laptop saya sarankan Intel mulai dari core i3 - core i7 yang mulai dari tahun 2014. Kenapa tahun 2014? Karena saya menggunakan laptop dengan core i3 generasi keempat, RAM 8 GB dan SSD 128 GB (silahkan upgrade SSD ke 256 GB karena *128 GB* itu tidak cukup demi kenyamanan anda) 16 | 3. Mari bergabung di komunitas atau media pembelajaran untuk berdiskusi tentang hal-hal teknis yang anda alami saat mendevelop program. Rekomendasi saya: [Code Android Indonesia](https://web.facebook.com/groups/codeandroidin), [Bali Android Developers](https://web.facebook.com/groups/331528353933101), 17 | [CodePolitan](https://www.codepolitan.com/) 18 | 19 | ## Tantangan kedua (developer) 20 | Bagi anda seorang Android developer yang sudah berpengalaman pastinya ingin memberikan aplikasi kepada pengguna dengan kriteria seperti berikut: 21 | 1. UI yang sesuai dengan OS mobile pengguna 22 | 2. UX yang benar-benar UX 23 | 3. Menyesuaikan layar mulai dari phone sampai tablet. 24 | 4. Size aplikasi anda relatif kecil (5 - 10 MB) << poin krusial. 25 | 26 | Untuk memenuhi hal tersebut anda harus: 27 | 1. Mempersiapkan senjata canggih anda (laptop yang sesuai / melampaui kriteria disertai dengan smartphone anda untuk testing yang sesungguhnya). 28 | 2. Mempelajari bahasa pemrograman. Android (Java / Kotlin), iOS (Objective C / Swift). 29 | 3. Dan hal-hal lain yang belum saya ketahui. 30 | 31 | Biasanya pada poin kedua merupakan momok sebagian besar dari anda. Karena, saya amati banyak yang ingin semacam shortcut untuk mempelajari 1 bahasa seperti JavaScript untuk menciptakan aplikasi di iOS dan Android. Bisa saja anda menggunakan Ionic (WebView yang dibungkus dengan cordova) atau React Native yang disediakan facebook. Namun, apakah benar-benar mampu melampaui real UX dari yang menggunakan 1 bahasa untuk 1 platform (Java/Kotlin X Android) (Objective C/Swift)? Saya mendapatkan sebuah artikel menarik yakni [WORA, Write Once Run Away](https://android.jlelse.eu/why-we-are-not-cross-platform-developers-fd7ef70e976d) sebagai bahan pertimbangan bagi anda belum memutuskan menggunakan Ionic, React Native atau pure Native. 32 | 33 | ## Tantangan (End User) 34 | 1. User Budget > Smartphone > Storage. Kita tidak tahu seberapa besar penyimpanan internal di smartphone user dan bisa jadi mereka tidak bisa mendowload aplikasi kita karena internal storage mereka terbatas atau ukuran aplikasi yang kita buat besar. Meskipun bisa di root atau bisa diatur untuk diarahkan ke penyimpanan eksternal namun tidak semua Android OS dan vendor memberi perlakuan seperti itu. 35 | 36 | ## Solusi (End User) 37 | 1. Anda bisa mencoba Android Instant Apps, membuat kodingan anda rapi dengan MVP dan menggunakan Kotlin. Mengapa Kotlin? Karena saya lihat kodingan yang dituliskan dengan Kotlin lebih sedikit dibanding Java, sehingga menaikkan kemungkinan ukuran aplikasi anda semakin kecil. 38 | 2. Atau anda bisa menggunakan Progressive Web Apps. :) -------------------------------------------------------------------------------- /laravel-gitlab-deployment.md: -------------------------------------------------------------------------------- 1 | # Cara deploy web Laravel dengan Gitlab CI/CD 2 | Bagi teman-teman yang memiliki VPS, mempunyai repository Github yang berisikan web Laravel serta kebingungan cara menyebarkan aplikasi Anda (deploy) secara terintegrasi dan otomatis maka Anda berada di tempat yang tepat. Pada bagian ini kita akan menggunakan Gitlab sebagai CI/CD deployment Laravel + Laravel Deployer. 3 | 4 | # Catatan penting 5 | Sebenarnya jika Anda sudah memiliki project di Gitlab maka Anda bisa langsung saja menggunakan Gitlab CI/CD nya. Namun, sebagai saya akan menggunakan Github sebagai contoh dan ada batasan yang perlu Anda ketahui. Saat ini kita bisa melakukan CI/CD via Gitlab di luar Gitlab (seperti Github atau Bitbucket) tetapi hanya berlaku sampai tanggal 22 Maret 2019. Jika lewat dari itu maka kita harus menggunakan layanan berbayar dari Gitlab. 6 | 7 | ![Langkah 1](images-guide/laravel-gitlab-deployment/langkah-1.jpg) 8 | 9 | ## Mulai tahap 1 10 | 1. Koneksikan repository Github yang ingin menggunakan CI/CD Gitlab dengan login ke website Gitlab seperti gambar di bawah. 11 | 12 | ![Langkah 2](images-guide/laravel-gitlab-deployment/langkah-2.png) 13 | 14 | ![Langkah 3](images-guide/laravel-gitlab-deployment/langkah-3.png) 15 | 16 | ![Langkah 4](images-guide/laravel-gitlab-deployment/langkah-4.png) 17 | 18 | ![Langkah 5](images-guide/laravel-gitlab-deployment/langkah-5.png) 19 | 20 | ![Langkah 6](images-guide/laravel-gitlab-deployment/langkah-6.png) 21 | 22 | 2. Membuat user bernama deployer dan memberikan akses baca tulis dan eksekusi ke user deployer. Anda bisa menggunakan user selain deployer. 23 | ```bash 24 | # Lakukan ini di terminal VPS Anda 25 | # Membuat user deployer 26 | sudo adduser deployer 27 | # Memberikan akses baca tulis dan eksekusi ke user deployer untuk directori /var/www 28 | sudo setfacl -R -m u:deployer:rwx /var/www 29 | ``` 30 | Jika Anda tidak bisa membuat user hal ini dikarenakan Anda belum menginstall ACL, silahkan install terlebih dahulu di server Ubuntu Anda dengan perintah berikut: 31 | ```bash 32 | sudo apt install acl 33 | ``` 34 | 35 | 3. Membuat SSH key sebagai user deployer. Pastikan Anda berpindah user ke user deployer. Kemudian buatlah SSH key sesuai [artikel yang disediakan oleh Github](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/). 36 | 37 | 4. Setelah berhasil membuat SSH key, selanjutnya lakukan duplikat konten public key SSH ke authorized keys. 38 | ```bash 39 | # As the deployer user on server 40 | # 41 | # Copy the content of public key to authorized_keys 42 | cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 43 | ``` 44 | 45 | 5. Berikutnya duplikat isi private key dan kita akan taruh di project Gitlab kita. 46 | ```bash 47 | # Copy the private key text block 48 | cat ~/.ssh/id_rsa 49 | # Blok isi dari private key tadi, copy dan tempel di Gitlab project kita seperti gambar di bawah. 50 | ``` 51 | ![Langkah 7](images-guide/laravel-gitlab-deployment/langkah-7.png) 52 | 53 | ![Langkah 8](images-guide/laravel-gitlab-deployment/langkah-8.png) 54 | 55 | 6. Melakukan duplikat isi public key dan kita taruh di project Gitlab kita. 56 | ```bash 57 | # As the deployer user on the server 58 | # 59 | # Copy the public key 60 | cat ~/.ssh/id_rsa.pub 61 | # Blok isi dari public key tadi, copy dan tempel di Gitlab project kita seperti gambar di bawah. 62 | ``` 63 | ![Langkah 9](images-guide/laravel-gitlab-deployment/langkah-9.png) 64 | 65 | ## Mulai tahap 2 66 | 1. Langkah berikutnya memasang pustaka Laravel Deployer di project Laravel dengan perintah berikut. 67 | 68 | ```bash 69 | composer require lorisleiva/laravel-deployer 70 | ``` 71 | 72 | 2. Menjalankan perintah ```php artisan deploy:init``` dan Anda akan dihadapkan dengan beberapa pertanyaan serta setelah itu hasil pertanyaan tersebut akan di simpan dalam file ```config/deploy.php```. 73 | 74 | 3. Di dalam file deploy.php, kita buat konfigurasi seperti gist di bawah. 75 | 76 | [Deploy with Laravel Deployer Setup](https://gist.github.com/satyakresna/f9b82fc7d599a34e61c37d43a47e28bf) 77 | 78 | 4. Di dalam file `deploy.php` tadi, kita memasukkan resep bernama `deploy_secrets.php`. Berikut konfigurasi gist nya. 79 | 80 | [Deploy secrets setup for Laravel Deployer](https://gist.github.com/satyakresna/1acf9a1838b01c5f529c3b8ad1a24488) 81 | 82 | ## Mulai tahap 3 83 | 1. Membuat file ```.gitlab-ci.yml``` dan isinya Anda bisa lihat di [gist Github milik saya](https://gist.github.com/satyakresna/2091cc46a6dcef094d3f9ace4ae75d45). 84 | 85 | 2. Selanjutnya commit file ```.gitlab-ci.yml``` dan lakukan Git push dan hasilnya akan muncul **pipelines** seperti gambar di bawah. 86 | 87 | ![Langkah 9](images-guide/laravel-gitlab-deployment/langkah-9.png) 88 | 89 | Catatan: 90 | 1. "$SSH_PRIVATE_KEY" diambil dari private key di CI/CD Gitlab kita tadi. 91 | 2. Perhatikan script bagian terakhir pada file ```.gitlab-ci.yml```. 92 | ```yml 93 | production: 94 | stage: deploy 95 | script: 96 | - *init_ssh 97 | - *change_file_permissions 98 | - php artisan deploy yourdomain.com -vvv 99 | environment: 100 | name: production 101 | url: http://yourdomain.com 102 | when: manual # Perhatikan 103 | only: 104 | - master 105 | ``` 106 | Di sana fungsi manual adalah menyediakan fasilitas trigger manual untuk deployment, jika Anda menghilangkannya maka akan otomatis deploy. Untuk fasilitas trigger manual, Gitlab menyediakan tombol "play" pada gambar nomor 10. Jika Anda yakin dengan commit Anda buat dan lolos tes maka silahkan tekan tombol tersebut. 107 | 108 | ## Catatan 109 | 110 | Ketika menggunakan teknik ini dan menggunakan server Nginx, tidak serta merta konten berubah. Hal ini dikarenakan OPcache tidak mampu mendeteksi perubahan file PHP secara akurat. Silakan buka tautan di bawah ini. 111 | 112 | [Laravel (PHP 7.3) nginx conf](https://gist.github.com/satyakresna/9d59afb47a3ff64ab1d3bb3ba353f4cd) 113 | 114 | ## Sumber referensi 115 | 1. [Test and deploy Laravel applications with GitLab CI/CD and Envoy](https://docs.gitlab.com/ee/ci/examples/laravel_with_gitlab_and_envoy/#configure-the-production-server) 116 | 1. [Using GitLab's pipeline with Laravel](http://lorisleiva.com/using-gitlabs-pipeline-with-laravel/) 117 | 1. [Laravel Deployer Troubleshooting](https://github.com/lorisleiva/laravel-deployer/blob/master/docs/troubleshooting.md) 118 | 119 | ## Ucapan terima kasih dan mohon maaf 120 | Terima kasih bagi Anda yang telah membaca tutorial ini dan jika berhasil mencobanya selamat! Mohon maaf bila tutorial ini saya buat buru-buru. Intinya saya membuat catatan kecil untuk diri saya jika saya lupa. 121 | -------------------------------------------------------------------------------- /laravel-gitlab-webhook.md: -------------------------------------------------------------------------------- 1 | # Cara deploy web Laravel dengan Gitlab Webhook. 2 | Bagi teman-teman yang memiliki VPS, mempunyai repository Gitlab yang berisikan web Laravel serta kebingungan cara menyebarkan aplikasi Anda (deploy) maka Anda berada di tempat yang tepat. Di tulisan ini saya akan berbagi cara konfigurasinya. 3 | 4 | ## Persiapan 5 | 1. Mempunyai VPS dan saya menggunakan Ubuntu 6 | 1. Membuat SSH key di VPS dan menaruh public key di repository yang Anda punya. 7 | 1. Melakukan konfigurasi `sudo` tanpa password untuk reload php-fpm untuk group www-data 8 | 1. Memasang port custom di firewall. 9 | 10 | ## Setup ACL dan Menambahkannya ke www-data 11 | 1. Membuat user bernama **deployer** dan menambahkannya ke grup www-data ke **deployer** 12 | ``` 13 | # as root 14 | adduser deployer 15 | 16 | # Append (-a) a secondary group (-G) "www-data" to user "deployer" 17 | usermod -a -G www-data deployer 18 | 19 | # See groups assigned to user "deployer" 20 | groups deployer 21 | ``` 22 | 1. Menambahkan ACL permissions di `/var/www` 23 | ``` 24 | # check setfacl exists 25 | which setfacl 26 | 27 | # If doesn't exist: 28 | sudo apt-get install -y acl 29 | 30 | # Inspect current ACL's 31 | getfacl /var/www 32 | 33 | # Set current and default ACL's for /var/www 34 | sudo setfacl -Rm g:www-data:rwx,d:g:www-data:rwx /var/www 35 | ``` 36 | 37 | Sekarang user deployer (bagian dari grup www-data) dapat membaca, menulis dan mengeksekusi direktori file di root `/var/www`. 38 | 39 | ### Membuat SSH key di VPS dan menaruhnya di repository yang Anda punya. 40 | Jika Anda belum membuat SSH key di VPS dengan user yang Anda butuhkan (misalnya: ```deployer```), 41 | silahkan ikuti [panduan dari Github tentang cara membuat SSH key](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/). 42 | Bagi Anda yang sudah membuat lanjut ke langkah di bawah ini untuk mencetak public key: 43 | 44 | ```bash 45 | cd ~/.ssh 46 | cat id_rsa.pub 47 | ``` 48 | 49 | Selanjutnya, copy paste hasil keluaran tersebut dan taruh di repository Github Anda => Settings => Repository. Saya akan ambil repository ```laravel-6``` sebagai contoh. 50 | 51 | ![Langkah 1](images-guide/laravel-gitlab-webhook/langkah-1.png) 52 | 53 | ![Langkah 2](images-guide/laravel-gitlab-webhook/langkah-2.png) 54 | 55 | ### Melakukan konfigurasi `sudo` tanpa password untuk reload php-fpm 56 | Silahkan login dengan user yang memiliki akses sudo atau user root dan ketik perintah ```sudo visudo``` dan sisipkan baris ini di paling bawah. 57 | 58 | ```bash 59 | # For reload php 7.2 60 | %www-data ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service php7.2-fpm reload 61 | ``` 62 | 63 | ### Memasang port custom di firewall. 64 | Karena kita akan menggunakan package Github Webhook dan NodeJS, pastikan Anda memasang port custom di firewall agar firewall membuka akses custom port. Kita bisa memasangnya langsung di terminal server kita. 65 | 66 | ```bash 67 | # nomor 3420 hanyalah contoh, Anda bisa menggantinya sesuai kebutuhan 68 | sudo ufw allow 3420/tcp 69 | # Melakukan pengecekan bila port 3420 masuk dalam daftar 70 | sudo ufw status verbose 71 | ``` 72 | 73 | Catatan: Setelah itu, silahkan logout dari server dan login ke server. 74 | 75 | ## Mulai tahap 1 76 | 1. Membuat direktori untuk deploy hook. Saya membuat folder bernama **laravel-6-basic-deploy** di direktori ```/home/deployer/deploy/laravel-6-basic-deploy``` 77 | 2. Menginstall nodejs dan npm di VPS dengan cara: 78 | ```bash 79 | sudo apt update 80 | sudo apt install nodejs 81 | sudo apt install npm 82 | # test nodejs 83 | nodejs -v 84 | ``` 85 | 3. Init NPM project dengan cara: ```npm init``` dan masukkan data-data yang diperlukan serta pastikan "main" diisi dengan value "index.js". 86 | 4. Download package github hook dengan perintah: ```npm install --save node-gitlab-webhook``` 87 | 5. Membuat file index.js dan isilah script di bawah ini 88 | 89 | ```js 90 | const http = require('http'); 91 | const createHandler = require('node-gitlab-webhook'); 92 | // single handler 93 | const handler = createHandler({ path: '/webhook1', secret: 'secret1' }); 94 | const execFile = require('child_process').execFile; 95 | 96 | http.createServer(function (req, res) { 97 | handler(req, res, function (err) { 98 | res.statusCode = 404; 99 | res.end('no such location'); 100 | }); 101 | }).listen(3420); 102 | 103 | handler.on('error', function (err) { 104 | console.error('Error:', err.message); 105 | }); 106 | 107 | handler.on('push', function (event) { 108 | console.log( 109 | 'Received a push event for %s to %s', 110 | event.payload.repository.name, 111 | event.payload.ref 112 | ); 113 | 114 | // Exec a shell script 115 | const execOptions = { 116 | maxBuffer: 1024 * 1024 // Increase max buffer to 1mb 117 | }; 118 | 119 | // '/home/deployer/deploy/laravel-basic-deploy/deploy.sh' adalah direktori untuk menjalankan shell script 120 | // Tergantung di mana Anda mau taruh. 121 | execFile('/home/deployer/deploy/laravel-6-basic-deploy/deploy.sh', execOptions, function(error, stdout, stderr) { 122 | if( error ) 123 | { 124 | console.log(error) 125 | } 126 | }); 127 | }); 128 | ``` 129 | 6. Membuat file deploy.sh dan isilah script di bawah ini 130 | 131 | ```bash 132 | #!/usr/bin/env bash 133 | 134 | REPO='git@gitlab.com:satyakresna/laravel-6.git'; #nama repo saya 135 | RELEASE_DIR='/var/www/laravel-6/releases'; # direktori aplikasi saya 136 | APP_DIR='/var/www/laravel-6/app'; # direktori aplikasi saya 137 | RELEASE="release_`date +%Y%m%d%H%M%s`"; 138 | # tempat saya menaruh .env production file 139 | # Jika Anda tidak ingin mengikuti cara ini pastikan Anda hapus perintah 140 | # yang ada komentar # Copy .env file 141 | ENV_PRODUCTION='/home/deployer/env-laravel/laravel-6/production/.env'; 142 | ROOT_DIR='/var/www/laravel-6'; 143 | SHARED_DIR='/var/www/laravel-6/shared'; 144 | 145 | # Fetch Latest Code 146 | [ -d $RELEASE_DIR ] || mkdir -p $RELEASE_DIR; 147 | cd $RELEASE_DIR; 148 | git clone -b master $REPO $RELEASE; 149 | 150 | # Composer 151 | cd $RELEASE_DIR/$RELEASE; 152 | composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader; 153 | php artisan clear-compiled --env=production; 154 | php artisan optimize --env=production; 155 | 156 | # Update permissions 157 | cd $RELEASE_DIR; 158 | chgrp -R www-data $RELEASE; 159 | chmod -R ug+rwx $RELEASE; 160 | 161 | # Check if shared directory is not exist 162 | if [ ! -d "$SHARED_DIR" ]; then 163 | # Create shared directory 164 | mkdir $ROOT_DIR/shared; 165 | cd $ROOT_DIR/shared && (mkdir -p storage storage/app storage/app/public storage/framework storage/framework/cache storage/framework/sessions storage/framework/views storage/logs); 166 | fi 167 | 168 | # Copy .env file 169 | cp $ENV_PRODUCTION $ROOT_DIR/shared; 170 | 171 | ## Env File 172 | cd $RELEASE_DIR/$RELEASE; 173 | ln -nfs ../../shared/.env .env; 174 | chgrp -h www-data .env; 175 | 176 | ## Storage 177 | rm -r $RELEASE_DIR/$RELEASE/storage; 178 | cd $RELEASE_DIR/$RELEASE; 179 | ln -nfs ../../shared/storage storage; 180 | chgrp -h www-data storage; 181 | 182 | ## Update Current Site 183 | ln -nfs $RELEASE_DIR/$RELEASE $APP_DIR; 184 | chgrp -h www-data $APP_DIR; 185 | 186 | ## PHP 187 | sudo service php7.2-fpm reload; 188 | 189 | ## Setup artisan key generate command 190 | cd $APP_DIR; 191 | php artisan key:generate 192 | 193 | # Clear conf 194 | php artisan config:clear 195 | php artisan config:cache 196 | 197 | # Run migration if you need 198 | php artisan migrate --force 199 | 200 | # Symlink storage folder with public folder 201 | php artisan storage:link 202 | ``` 203 | 6. Berikan akses execute untuk deploy.sh dengan perintah: 204 | ```bash 205 | chmod ug+x deploy.sh 206 | ``` 207 | 7. Hasil akhir seperti gambar di bawah 208 | 209 | ![Langkah 3](images-guide/laravel-gitlab-webhook/langkah-3.png) 210 | 211 | 8. Coba jalankan perintah ```bash deploy.sh``` dan apakah berjalan dengan lancar? 212 | Semoga berhasil. 213 | 214 | ## Mulai tahap 2 215 | 1. Lakukan konfigurasi webhook di Gitlab dari repository kita ke menu Settings => Integerations dan hasilnya seperti gambar di bawah ini. 216 | 217 | ![Langkah 4](images-guide/laravel-gitlab-webhook/langkah-4.png) 218 | 219 | ![Langkah 5](images-guide/laravel-gitlab-webhook/langkah-5.png) 220 | 221 | 2. Jalankan perintah ```node index.js``` di dalam direktori tadi dan lakukan testing git push pada dropdown `test` di Webhooks yang disediakan Gitlab. Hasilnya akan seperti gambar di bawah di terminal maupun di Gitlab webhook. 222 | 223 | ![Langkah 6](images-guide/laravel-gitlab-webhook/langkah-6.png) 224 | 225 | ![Langkah 7](images-guide/laravel-gitlab-webhook/langkah-7.png) 226 | 227 | ![Langkah 8](images-guide/laravel-gitlab-webhook/langkah-8.png) 228 | 229 | **Catatan:** *Jika Anda mengalami service time out di Github hooks, kemungkinan besar adalah Anda tidak memasang port 230 | di VPS Anda atau port Anda pasang salah. Mohon dicek lebih teliti lagi.* 231 | 232 | ## Mulai tahap 3 233 | Tentunya kita tidak ingin setiap kali buka terminal dan menjalankan perintah ```node index.js```. 234 | Salah satu cara untuk menghindari ini adalah dengan membuat service yang menjalankan perintah node tadi. 235 | Pada tutorial ini saya akan menggunakan `systemd` dari Ubuntu. 236 | 237 | 1. Login sebagai user yang memiliki akses sudo atau user root dan masukkan perintah di bawah ini: 238 | ```bash 239 | # perintah ini bertujuan untuk mengarahkan Anda ke direktori system dan dari sinilah kita akan membuat service 240 | cd /lib/systemd/system 241 | ``` 242 | 2. Kemudian buat file bernama **laravel-6-deploy.service** dan isinya seperti berikut: 243 | ``` 244 | [Unit] 245 | Description=Laravel 6 Gitlab Webhook 246 | 247 | [Service] 248 | User=deployer 249 | Group=www-data 250 | Restart=on-failure 251 | ExecStart=/usr/bin/node /home/deployer/deploy/laravel-6-basic-deploy/index.js 252 | 253 | [Install] 254 | WantedBy=multi-user.target 255 | ``` 256 | 3. Simpan isi file tersebut dan jalankan perintah ```sudo systemctl enable laravel-basic-deploy.service``` 257 | 4. Jalankan lagi perintah ```sudo systemctl start laravel-basic-deploy.service``` 258 | 5. Berikutnya kita cek apakah service yang kita buat berjalan atau tidak dengan cara ```sudo systemctl status laravel-basic-deploy.service``` dan hasilnya seperti gambar di bawah 259 | 260 | ![Langkah 9](images-guide/laravel-github-webhook/langkah-9.png) 261 | 262 | 6. Coba ubah kodingan Anda dan lakukan git push apakah hasilnya sesuai atau tidak? Jika sesuai berarti service kita berjalan dengan lancar. 263 | 264 | ## Tambahan 265 | Jika butuh setup deploy dengan nginx silahkan buka [link ini](https://gist.github.com/satyakresna/9d59afb47a3ff64ab1d3bb3ba353f4cd) 266 | 267 | ## Sumber referensi 268 | 1. [Servers for hacker auto deploy with Github](https://serversforhackers.com/c/automating-deployment-from-github) 269 | 1. [Servers for hacker enhancing envoy deployment](https://serversforhackers.com/c/enhancing-envoy-deployment) 270 | 1. [Node Gitlab Webhook](https://github.com/excaliburhan/node-gitlab-webhook) -------------------------------------------------------------------------------- /laravel-github-webhook.md: -------------------------------------------------------------------------------- 1 | # Cara deploy web Laravel dengan Github Webhook. 2 | Bagi teman-teman yang memiliki VPS, mempunyai repository Github yang berisikan web Laravel serta kebingungan cara menyebarkan aplikasi Anda (deploy) maka Anda berada di tempat yang tepat. Di tulisan ini saya akan berbagi cara konfigurasinya. 3 | 4 | ## Persiapan 5 | 1. Mempunyai VPS dan saya menggunakan Ubuntu 6 | 1. Membuat SSH key di VPS dan menaruh public key di repository yang Anda punya. 7 | 1. Melakukan konfigurasi `sudo` tanpa password untuk reload php-fpm untuk group www-data 8 | 1. Memasang port custom di firewall. 9 | 10 | ## Setup ACL dan Menambahkannya ke www-data 11 | 1. Membuat user bernama **deployer** dan menambahkannya ke grup www-data ke **deployer** 12 | ``` 13 | # as root 14 | adduser deployer 15 | 16 | # Append (-a) a secondary group (-G) "www-data" to user "deployer" 17 | usermod -a -G www-data deployer 18 | 19 | # See groups assigned to user "deployer" 20 | groups deployer 21 | ``` 22 | 1. Menambahkan ACL permissions di `/var/www` 23 | ``` 24 | # check setfacl exists 25 | which setfacl 26 | 27 | # If doesn't exist: 28 | sudo apt-get install -y acl 29 | 30 | # Inspect current ACL's 31 | getfacl /var/www 32 | 33 | # Set current and default ACL's for /var/www 34 | sudo setfacl -Rm g:www-data:rwx,d:g:www-data:rwx /var/www 35 | ``` 36 | 37 | Sekarang user deployer (bagian dari grup www-data) dapat membaca, menulis dan mengeksekusi direktori file di root `/var/www`. 38 | 39 | ### Membuat SSH key di VPS dan menaruhnya di repository yang Anda punya. 40 | Jika Anda belum membuat SSH key di VPS dengan user yang Anda butuhkan (misalnya: ```deployer```), 41 | silahkan ikuti [panduan dari Github tentang cara membuat SSH key](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/). 42 | Bagi Anda yang sudah membuat lanjut ke langkah di bawah ini untuk mencetak public key: 43 | 44 | ```bash 45 | cd ~/.ssh 46 | cat id_rsa.pub 47 | ``` 48 | 49 | Selanjutnya, copy paste hasil keluaran tersebut dan taruh di repository Github Anda => Settings => Deploy keys. Saya akan ambil repository ```laravel-basic``` sebagai contoh. 50 | 51 | ![Langkah 1](images-guide/laravel-github-webhook/langkah-1.png) 52 | 53 | ![Langkah 2](images-guide/laravel-github-webhook/langkah-2.png) 54 | 55 | ![Langkah 3](images-guide/laravel-github-webhook/langkah-3.png) 56 | 57 | ![Langkah 4](images-guide/laravel-github-webhook/langkah-4.png) 58 | 59 | ### Melakukan konfigurasi `sudo` tanpa password untuk reload php-fpm 60 | Silahkan login dengan user yang memiliki akses sudo atau user root dan ketik perintah ```sudo visudo``` dan sisipkan baris ini di paling bawah. 61 | 62 | ```bash 63 | # For reload php 7.2 64 | %www-data ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service php7.2-fpm reload 65 | ``` 66 | 67 | ### Memasang port custom di firewall. 68 | Karena kita akan menggunakan package Github Webhook dan NodeJS, pastikan Anda memasang port custom di firewall agar firewall membuka akses custom port. Kita bisa memasangnya langsung di terminal server kita. 69 | 70 | ```bash 71 | # nomor 3420 hanyalah contoh, Anda bisa menggantinya sesuai kebutuhan 72 | sudo ufw allow 3420/tcp 73 | # Melakukan pengecekan bila port 3420 masuk dalam daftar 74 | sudo ufw status verbose 75 | ``` 76 | 77 | Catatan: Setelah itu, silahkan logout dari server dan login ke server. 78 | 79 | ## Mulai tahap 1 80 | 1. Membuat direktori untuk deploy hook. Saya membuat folder bernama **laravel-basic-deploy** di direktori ```/home/deployer/deploy/laravel-basic-deploy``` 81 | 2. Menginstall nodejs dan npm di VPS dengan cara: 82 | ```bash 83 | sudo apt update 84 | sudo apt install nodejs 85 | sudo apt install npm 86 | # test nodejs 87 | nodejs -v 88 | ``` 89 | 3. Init NPM project dengan cara: ```npm init``` dan masukkan data-data yang diperlukan serta pastikan "main" diisi dengan value "index.js". 90 | 4. Download package github hook dengan perintah: ```npm install --save githubhook``` 91 | 5. Membuat file index.js dan isilah script di bawah ini 92 | 93 | ```js 94 | var execFile = require('child_process').execFile; 95 | var githubhook = require('githubhook'); 96 | var github = githubhook({ 97 | host: '0.0.0.0', 98 | port: 3420, 99 | path: '/gitback', 100 | secret: 'my-secret', 101 | logger: console, 102 | }); 103 | 104 | github.listen(); 105 | 106 | // laravel-basic adalah nama repo saya. 107 | // Anda bisa ganti dengan nama repo Anda di Github. 108 | github.on('laravel-basic:refs/heads/master', function (data) { 109 | // Exec a shell script 110 | var execOptions = { 111 | maxBuffer: 1024 * 1024 // Increase max buffer to 1mb 112 | }; 113 | 114 | // '/home/deployer/deploy/laravel-basic-deploy/deploy.sh' adalah direktori untuk menjalankan shell script 115 | // Tergantung di mana Anda mau taruh. 116 | execFile('/home/deployer/deploy/laravel-basic-deploy/deploy.sh', execOptions, function(error, stdout, stderr) { 117 | if( error ) 118 | { 119 | console.log(error) 120 | } 121 | }); 122 | }); 123 | ``` 124 | 6. Membuat file deploy.sh dan isilah script di bawah ini 125 | 126 | ```bash 127 | #!/usr/bin/env bash 128 | 129 | REPO='git@github.com:satyakresna/laravel-basic.git'; #nama repo saya 130 | RELEASE_DIR='/var/www/laravel-basic/releases'; # direktori aplikasi saya 131 | APP_DIR='/var/www/laravel-basic/app'; # direktori aplikasi saya 132 | RELEASE="release_`date +%Y%m%d%H%M%s`"; 133 | # tempat saya menaruh .env production file 134 | # Jika Anda tidak ingin mengikuti cara ini pastikan Anda hapus perintah 135 | # yang ada komentar # Copy .env file 136 | ENV_PRODUCTION='/home/deployer/env-laravel/laravel-basic/production/.env'; 137 | ROOT_DIR='/var/www/laravel-basic'; 138 | SHARED_DIR='/var/www/laravel-basic/shared'; 139 | 140 | # Fetch Latest Code 141 | [ -d $RELEASE_DIR ] || mkdir -p $RELEASE_DIR; 142 | cd $RELEASE_DIR; 143 | git clone -b master $REPO $RELEASE; 144 | 145 | # Composer 146 | cd $RELEASE_DIR/$RELEASE; 147 | composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader; 148 | php artisan clear-compiled --env=production; 149 | php artisan optimize --env=production; 150 | 151 | # Update permissions 152 | cd $RELEASE_DIR; 153 | chgrp -R www-data $RELEASE; 154 | chmod -R ug+rwx $RELEASE; 155 | 156 | # Check if shared directory is not exist 157 | if [ ! -d "$SHARED_DIR" ]; then 158 | # Create shared directory 159 | mkdir $ROOT_DIR/shared; 160 | cd $ROOT_DIR/shared && (mkdir -p storage storage/app storage/app/public storage/framework storage/framework/cache storage/framework/sessions storage/framework/views storage/logs); 161 | fi 162 | 163 | # Copy .env file 164 | cp $ENV_PRODUCTION $ROOT_DIR/shared; 165 | 166 | ## Env File 167 | cd $RELEASE_DIR/$RELEASE; 168 | ln -nfs ../../shared/.env .env; 169 | chgrp -h www-data .env; 170 | 171 | ## Storage 172 | rm -r $RELEASE_DIR/$RELEASE/storage; 173 | cd $RELEASE_DIR/$RELEASE; 174 | ln -nfs ../../shared/storage storage; 175 | chgrp -h www-data storage; 176 | 177 | ## Update Current Site 178 | ln -nfs $RELEASE_DIR/$RELEASE $APP_DIR; 179 | chgrp -h www-data $APP_DIR; 180 | 181 | ## PHP 182 | sudo service php7.2-fpm reload; 183 | 184 | ## Setup artisan key generate command 185 | cd $APP_DIR; 186 | php artisan key:generate 187 | 188 | # Clear conf 189 | php artisan config:clear 190 | php artisan config:cache 191 | 192 | # Run migration if you need 193 | php artisan migrate --force 194 | 195 | # Symlink storage folder with public folder 196 | php artisan storage:link 197 | ``` 198 | 6. Berikan akses execute untuk deploy.sh dengan perintah: 199 | ```bash 200 | chmod ug+x deploy.sh 201 | ``` 202 | 7. Hasil akhir seperti gambar di bawah 203 | 204 | ![Langkah 11](images-guide/laravel-github-webhook/langkah-11.png) 205 | 206 | 8. Coba jalankan perintah ```bash deploy.sh``` dan apakah berjalan dengan lancar? 207 | Semoga berhasil. 208 | 209 | ## Mulai tahap 2 210 | 1. Lakukan konfigurasi webhook di Github seperti gambar di bawah ini 211 | 212 | ![Langkah 12](images-guide/laravel-github-webhook/langkah-12.png) 213 | 214 | ![Langkah 13](images-guide/laravel-github-webhook/langkah-13.png) 215 | 216 | ![Langkah 14](images-guide/laravel-github-webhook/langkah-14.png) 217 | 218 | 2. Jalankan perintah ```node index.js``` di dalam direktori tadi dan coba Anda perbaharui kodingan project Anda. 219 | Misalnya membuat routing yang terhubung dengan Controller. 220 | Kemudian lakukan git push. Hasilnya akan seperti gambar di bawah di terminal maupun di Github webhook. 221 | 222 | ![Langkah 15](images-guide/laravel-github-webhook/langkah-15.png) 223 | 224 | ![Langkah 16](images-guide/laravel-github-webhook/langkah-16.png) 225 | 226 | **Catatan:** *Jika Anda mengalami service time out di Github hooks, kemungkinan besar adalah Anda tidak memasang port 227 | di VPS Anda atau port Anda pasang salah. Mohon dicek lebih teliti lagi.* 228 | 229 | ## Mulai tahap 3 230 | Tentunya kita tidak ingin setiap kali buka terminal dan menjalankan perintah ```node index.js```. 231 | Salah satu cara untuk menghindari ini adalah dengan membuat service yang menjalankan perintah node tadi. 232 | Pada tutorial ini saya akan menggunakan `systemd` dari Ubuntu. 233 | 234 | 1. Login sebagai user yang memiliki akses sudo atau user root dan masukkan perintah di bawah ini: 235 | ```bash 236 | # perintah ini bertujuan untuk mengarahkan Anda ke direktori system dan dari sinilah kita akan membuat service 237 | cd /lib/systemd/system 238 | ``` 239 | 2. Kemudian buat file bernama **laravel-basic-deploy.service** dan isinya seperti berikut: 240 | ``` 241 | [Unit] 242 | Description=Laravel Basic Github Webhook 243 | 244 | [Service] 245 | User=deployer 246 | Group=www-data 247 | Restart=on-failure 248 | ExecStart=/usr/bin/node /home/deployer/deploy/laravel-basic-deploy/index.js 249 | 250 | [Install] 251 | WantedBy=multi-user.target 252 | ``` 253 | 3. Simpan isi file tersebut dan jalankan perintah ```sudo systemctl enable laravel-basic-deploy.service``` 254 | 4. Jalankan lagi perintah ```sudo systemctl start laravel-basic-deploy.service``` 255 | 5. Berikutnya kita cek apakah service yang kita buat berjalan atau tidak dengan cara ```sudo systemctl status laravel-basic-deploy.service``` dan hasilnya seperti gambar di bawah 256 | 257 | ![Langkah 17](images-guide/laravel-github-webhook/langkah-17.png) 258 | 259 | 6. Coba ubah kodingan Anda dan lakukan git push apakah hasilnya sesuai atau tidak? Jika sesuai berarti service kita berjalan dengan lancar. 260 | 261 | ## Tambahan 262 | Jika butuh setup deploy dengan nginx silahkan buka [link ini](https://gist.github.com/satyakresna/9d59afb47a3ff64ab1d3bb3ba353f4cd) 263 | 264 | ## Sumber referensi 265 | 1. [Servers for hacker auto deploy with Github](https://serversforhackers.com/c/automating-deployment-from-github) 266 | 1. [Servers for hacker enhancing envoy deployment](https://serversforhackers.com/c/enhancing-envoy-deployment) 267 | 268 | ## Ucapan terima kasih 269 | Terima kasih saya ucapkan kepada [Wayan Jimmy Gunawan](https://github.com/wayanjimmy) sudah memberikan masukan dan saran saat saya mencoba dan menyusun tutorial deployment Laravel dengan Github webhook ini. Semoga bermanfaat. 270 | --------------------------------------------------------------------------------