Cara Mudah Deploy Laravel ke VPS

Cara Mudah Deploy Laravel ke VPS

Sebagai seorang programmer, terkadang tidak hanya dibebankan untuk membuat sebuah aplikasi agar dapat berfungsi sebagaimana mestinya. Akan tetapi, kerapkali dihadapkan dengan sebuah kondisi, dimana harus ikut andil dalam proses instalasi agar dapat digunakan oleh end user. Misalnya saja, dengan case membuat aplikasi berbasis website, khususnya menggunakan framework Laravel, kita diminta untuk melakukan konfigurasi ke dalam server agar dapat digunakan oleh client.

Maka pada kesempatan kali ini, pembahasan yang akan diangkat adalah bagaimana men-deploy Laravel menggunakan VPS, dalam hal ini yang akan digunakan adalah sistem operasi Ubuntu 16.04. Adapun point of content yang akan dibahas, diantaranya:

  1. Konfigurasi Web Server

  2. Konfigurasi DNS Server

  3. Membuat Vhost

  4. Install dan Konfigurasi SSL

Baca Juga: Serial Spring Boot: Crud Dengan Spring Data JPA

Konfigurasi Web Server

Konfigurasi web server adalah hal utama yang akan dilakukan agar Laravel dapat berjalan sesuai dengan kebutuhan yang harus dipenuhi. Adapun kebutuhan yang akan digunakan sebagai pelengkap dari web server ini, diantaranya:

  1. Apache2

  2. PHP 7.2

  3. OpenSSL PHP Extension

  4. PDO PHP Extension

  5. Mbstring PHP Extension

  6. Tokenizer PHP Extension

  7. XML PHP Extension

  8. MariaDB

  9. Phpmyadmin

  10. Composer & Git

Pertama, untuk meng-install Apache2, gunakan command:

# apt-get install apache2

Selanjutnya, untuk meng-install PHP, gunakan command:

# apt-get install python-software-properties
# add-apt-repository ppa:ondrej/php
# apt-get update
# apt-get install php7.2

Karena yang akan di-deploy adalah Laravel, maka sesuai requirements yang tercantum di official documentation, diwajibkan untuk meng-install module php, diantaranya: OpenSSL PHP Extension, PDO PHP Extension, Mbstring PHP Extension, Tokenizer PHP Extension, XML PHP Extension.

# apt-get install php7.2-common php7.2-curl php7.2-mysql php7.2-gd php7.2-xml php7.2-xmlrpc php7.2-mbstring php7.2-cli php7.2-sqlite3 php7.2-zip

Apabila kamu ingin meng-install module lainnya, kamu dapat melihat list-nya dengan command:

# apt-cache search php7.2-

Setelah instalasi PHP selesai, langkah selanjutnya adalah meng-install mariaDB yang berfungsi untuk meng-handle database.

# apt-get install mariadb-server mariadb-client
# mysql_secure_installation

Kamu akan diminta untuk memasukkan password, jangan lupa untuk menge-set-nya sebagai password root database, selain itu pilih Y atau tekan enter saja. Apabila instalasi telah selesai, kamu dapat mengaksesnya dengan menggunakan command:

# mysql -u root -p

Kemudian install phpmyadmin untuk mempermudah dalam me-manage database karena telah disuguhkan berbentuk GUI.

# apt-get install phpmyadmin

Ikuti setiap step dalam proses instalasinya, pilih apache2 kemudian masukkan password yang akan digunakan untuk login kedalam phpmyadmin. Apabila telah selesai, kamu dapat mengaksesnya dengan url: http://ip_server/phpmyadmin, kemudian masukkan user: phpmyadmin dan password: password yang anda masukkan saat instalasi.

Optional, kamu juga dapat membuat user baru untuk dapat mengakses phpmyadmin. Masukkan command berikut:

//login ke mysql 
# mysql --user=root mysql
​
//create user
create user 'USERNAMEKAMU'@'localhost' IDENTIFIED BY 'PASSWORDKAMU';
grant all privileges on *.* to 'USERNAMEKAMU'@'localhost' with grant option;
flush privileges;

Alright, sampai pada tahap ini sebenarnya web server dengan requirements yang dibutuhkan Laravel sudah dapat digunakan sebagaimana mestinya. Namun, untuk mempermudah meng-handle package, perlu untuk meng-install composer dengan command:

# apt-get install composer

Dan tak ketinggalan untuk menginstall Git.

# apt-get install git

Sebagai penutup section ini, jangan lupa restart web server kamu dengan command:

service apache2 restart

Konfigurasi DNS Server

Saat ini telah banyak layanan yang dapat digunakan untuk me-manage dns. Jika kamu salah satu pengguna Digitalocean, maka telah disediakan fitur tersebut didalam panel untuk mengelola server mereka. Selain itu, Cloudflare juga menyediakan hal yang sama.

Oleh karena itu, pada section ini bisa dikategorikan sebagai section optional, sebab sifatnya tidaklah bersifat wajib. Namun bagi kamu yang ingin menambah pengetahuan bagaimana meng-install dan melakukan konfigurasi dns server sendiri, maka kamu dapat mengikuti section ini tahap demi tahap. Adapun hal-hal yang akan dilakukan diantaranya:

  1. Install Bind

  2. Membuat private nameserver

  3. Konfigurasi Bind

Untuk meng-install bind yang akan berperan dalam meng-handle dns server, gunakan command:

# apt-get install bind9

Sebelum memasuki konfigurasi, buat private name server terlebih dahulu dari panel domain kamu. Whatever, panel domain apapun dan dari registrar manapun, cari menu child name server atau jika dari whmcs terdapat pada menu private nameserver, kemudian buat dua buah name server, dalam hal ini saya akan membuat dua buah name server yakni: ns1.anugrahsandi.com dan ns2.anugrahsandi.com. Seperti contoh berikut

Langkah selanjutnya adalah melakukan konfigurasi dns server, modifikasi file /etc/bind/named.conf.local dengan command berikut:

nano /etc/bind/named.conf.local

Kemudian tambahkan config berikut:

zone "anugrahsandi.com" {
  type master;
  file "/etc/bind/zones/anugrahsandi.com.db";
};
​
zone "147.52.103.in-addr.arpa" {
  type master;
  file "/etc/bind/zones/rev.147.52.103.in-addr.arpa";
};

Catatan: Ganti anugrahsandi.com dengan nama domain kamu. Kemudian untuk reverse dns 147.52.103.in-addr.arpa , ganti dengan 3 deret ip server kamu yang ditulis terbalik (misal: 128.199.154.xx, maka dapat ditulis menjadi 154.199.128.in-addr.arpa).

Seperti yang tertera pada config diatas, dibutuhkan sebuah direktori bernama zones, yang didalamnya terdapat dua buah file anugrahsandi.com.db dan rev.147.52.103.in-addr.arpa.

# cd /etc/bind
# mkdir zones
# cd zones
# nano anugrahsandi.com.db

Kemudian masukkan config berikut kedalam file anugrahsandi.com.db

;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     ns1.anugrahsandi.com. support.daengweb.id. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
; name server
@       IN      NS      ns1.anugrahsandi.com.
@       IN      NS      ns2.anugrahsandi.com.
@       IN      A       IPSERVERKAMU
​
;name server - A records
ns1.anugrahsandi.com.     IN      A       IPSERVERKAMU
ns2.anugrahsandi.com.     IN      A       IPSERVERKAMU
​
www     IN      CNAME       anugrahsandi.com.

Catatan: Ganti ns1.anugrahsandi.com dan ns2.anugrahsandi.com menjadi ns1.namadomainkamu.com dan ns2.namadomainkamu.com. IPSERVERKAMU juga harus disesuaikan dengan IP Server yang akan kamu gunakan.

Buat file config selanjutnya yang bernama rev.147.52.103.in-addr.arpa

# nano rev.147.52.103.in-addr.arpa

Kemudian masukkan konfigurasi berikut:

;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     ns1.anugrahsandi.com. support.daengweb.id. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
;name server
@       IN      NS      ns1.anugrahsandi.com.
@       IN      NS      ns2.anugrahsandi.com.
​
;ptr
60.156       IN      PTR     ns1.anugrahsandi.com.
60.156       IN      PTR     ns2.anugrahsandi.com.
60.156       IN      PTR     www.anugrahsandi.com.

Edit file /etc/resolv.conf dengan command:

# nano /etc/resolv.conf

Lalu tambahkan baris berikut:

search anugrahsandi.com

Catatan: Ganti anugrahsandi.com dengan nama domain kamu.

Jangan lupa untuk memperbaharui service bind9.

# service bind9 restart

Untuk mengecek apakah konfigurasi tersebut telah berjalan sesuai dengan yang di inginkan, maka dapat dilakukan dengan command:

# dig anugrahsandi.com

Cek juga name server yang telah dibuat:

# dig ns1.anugrahsandi.com

Membuat Vhost (Virtual Host)

Virtual host adalah salah satu fitur dari web server agar dapat meng-handle banyak domain didalam satu server yang hanya memiliki 1 ip publik. Untuk membuat virtual host, konfigurasinya berbeda untuk setiap web server. Pada artikel ini, kita menggunakan apache sebagai web server. So untuk membuat virtual hostnya, masuk ke direktori /etc/apache2/sites-available:

# cd /etc/apache2/sites-available
# nano anugrahsandi.com.conf

Catatan: Ganti anugrahsandi.com dengan nama domain kamu.

Kemudian masukkan config berikut:

<VirtualHost *:80>
        ServerName anugrahsandi.com
        ServerAlias www.anugrahsandi.com
​
        ServerAdmin [email protected]
        DocumentRoot /var/www/anugrahsandi.com/public
​
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
​
        <Directory /var/www/anugrahsandi.com/public>
          Options Indexes FollowSymLinks
          AllowOverride All
          Require all granted
        </Directory>
</VirtualHost>

Penjelasan: Pada bagian DocumentRoot /var/www/anugrahsandi.com/public dan <Directory /var/www/anugrahsandi.com/public>, dimana anugrahsandi.com adalah root direktori untuk domain kamu, sedangkan public adalah direktori dari Laravel. Karena di Laravel , untuk dapat mengakses aplikasi yang telah dibuat wajib mengikut sertakan folder public didalam url. Jadi, agar main domain kamu langsung mengakses aplikasi tanpa embel-embel public dan juga tanpa perlu melakukan modifikasi .htaccess, maka virtual host diarahkan langsung kedalam folder public.

Setelah itu, aktifkan virtual host yang telah dibuat dengan command:

# a2ensite anugrahsandi.com.conf
# service apache2 reload

Untuk melakukan uji coba mari kita install Laravel:

composer create-project --prefer-dist laravel/laravel anugrahsandi.com

NB: Saya menggunakan Laravel fresh install, atau jika kamu sudah punya project, kamu bisa langsung meng-upload-nya kedalam folder /var/www dan jangan lupa rename root directory project kamu menjadi nama domain kamu.

Jangan lupa untuk mengatur permission di Laravel

# chown -R www-data:www-data /var/www/anugrahsandi.com

Install & Konfigurasi SSL

SSL (Secure Sockets Layer) merupakan protocol yang telah diwajibkan hampir disemua browser saat ini. Ada berbagai macam SSL yang ditawarkan baik yang bersifat free hingga yang berbayar sekalipun. Untuk melakukan instalasi SSL, tahap pertama generate CSR code dan KEY code terlebih dahulu dengan command:

# openssl req -newkey rsa:2048 -nodes -keyout anugrahsandi.com.key -out anugrahsandi.com.csr

Maka kamu akan disuguhkan beberapa pertanyaan, jawab seperti berikut:

Country Name (2 letter code) [AU]:ID
State or Province Name (full name) [Some-State]:Sulawesi Selatan
Locality Name (eg, city) []:Makassar
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Daengweb
Organizational Unit Name (eg, section) []:Programming
Common Name (e.g. server FQDN or YOUR name) []:anugrahsandi.com
Email Address []:[email protected]
​
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

NB: Untuk password biarkan dalam keadaan kosong. Common Name, pastikan kamu memasukkan nama domain kamu.

Pada penyedia SSL, kamu akan diminta untuk memasukkan CSR code sebagai persyaratan agar penyedia tersebut dapat memberikan CRT code yang kamu butuhkan untuk di-install di server kamu. Untuk mengambil CSR code nya dengan command:

# cat anugrahsandi.com.csr

Setelah itu masukkan CSR code nya kedalam panel SSL provider tempat kamu membeli SSL. Jika berkas SSL dari provider telah kamu dapatkan, maka tiba saatnya untuk melakukan konfigurasi SSL pada server kamu.

Upload berkas yang kamu peroleh ke root direktori server kamu, biasanya terdiri dari dua buah file, yakni:

  1. namafile.crt

  2. namafile.ca-bundle

Buat direktori ssl terlebih dahulu untuk menyimpan file config ssl tersebut:

# mkdir /etc/apache2/ssl

Kemudian pindahkan semua file config tersebut kedalam direktori /etc/apache2/ssl, file tersebut terdiri dari: namafile.com.csr, namafile.com.key, namafile.crt, namafile.ca-bundle.

Buat virtual host baru yang berfungsi untuk meng-handle ssl yang diakses melalui port 443. Masuk ke direktori sites-available

# cd /etc/apache2/sites-available
# nano anugrahsandi.com-ssl.conf

Kemudian masukkan config berikut:

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin [email protected]
        ServerName anugrahsandi.com
        ServerAlias www.anugrahsandi.com
        DocumentRoot /var/www/anugrahsandi.com/public
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
​
        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/anugrahsandi.com.crt
        SSLCertificateKeyFile /etc/apache2/ssl/anugrahsandi.com.key
        SSLCACertificateFile /etc/apache2/ssl/anugrahsandi.com.ca-bundle
​
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                        SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                        SSLOptions +StdEnvVars
        </Directory>
        <Directory /var/www/anugrahsandi.com/public>
          Options Indexes FollowSymLinks
          AllowOverride All
          Require all granted
        </Directory>
        BrowserMatch "MSIE [2-6]" \
                        nokeepalive ssl-unclean-shutdown \
                        downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    </VirtualHost>
</IfModule>

Penjelasan: Penjelasan untuk konfigurasi diatas, hampir serupa dengan config sebelumnya. Namun yang perlu diperhatikan hanya pada bagian:

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/anugrahsandi.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/anugrahsandi.com.key
SSLCACertificateFile /etc/apache2/ssl/anugrahsandi.com.ca-bundle

NB: Sesuaikan nama file config ssl yang kamu miliki.

Jangan lupa untuk mengaktifkan virtual host yang baru dengan command:

# a2ensite anugrahsandi.com-ssl.conf
# service apache2 reload

Modifikasi .htaccess yang dimiliki Laravel agar secara otomatis melakukan force direct ke mode SSL, dengan memasukkan code berikut:

# cd /var/www/anugrahsandi.com/public
​
//Kemudian masukkan code berikut
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Sehingga code lengkap dari .htaccess akan tampak seperti ini:​

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>
​
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
​
    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
​
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]
​
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Jika tidak ingin memodifikasi .htaccess, cara lainnya kamu dapat menambahkan code berikut pada default virtual host domain kamu yang mengakses port 80 (dalam hal ini, anugrahsandi.com.conf):

Redirect permanent / https://anugrahsandi.com/

Baca Juga: Laravel Scout Indexing Menggunakan Algolia Driver

Kesimpulan

Dengan menggunaan VPS / Server sendiri, kita memiliki akses sepenuhnya dalam memodifikasi server sesuai dengan yang dibutuhkan. Dalam hal ini, apapun perkembangan dependecy yang dibutuhkan oleh Laravel, dapat di-install dengan sangat mudah tanpa harus melakukan request ke provider selayaknya jika menggunakan hosting.

Category:
Share:

Comments